// genericLambda.cpp — Phase 2.7 cxxSmoke check 2. // // Exercises a C++14 generic lambda (auto parameter) that captures a local // i32 accumulator by reference. The i32 path is the path most recently // touched by codegen work (most likely place to regress). // // The lambda is invoked twice: once with an i16 argument, once with an // i32 argument. After both calls the accumulator holds the sum, which we // split into two u16 markers. // // $025000 = lo16 of acc (0x100 + 0x12345 = 0x12445; lo = 0x2445) // $025002 = hi16 of acc (hi = 0x0001) // $025004 = 0x0099 success marker #include int main(void) { volatile int32_t acc = 0; auto add = [&](auto x) { acc += (int32_t)x; }; add((int16_t)0x100); add((int32_t)0x12345); uint32_t v = (uint32_t)acc; *(volatile uint16_t *)0x025000UL = (uint16_t)(v & 0xFFFFu); *(volatile uint16_t *)0x025002UL = (uint16_t)((v >> 16) & 0xFFFFu); *(volatile uint16_t *)0x025004UL = 0x0099; return 0; }