1*8184b252SMichael Buch #include <cassert> 2*8184b252SMichael Buch #include <cstdio> 3*8184b252SMichael Buch 4*8184b252SMichael Buch namespace { 5*8184b252SMichael Buch int global_var = -5; 6*8184b252SMichael Buch } // namespace 7*8184b252SMichael Buch 8*8184b252SMichael Buch struct Baz { 9*8184b252SMichael Buch virtual ~Baz() = default; 10*8184b252SMichael Buch 11*8184b252SMichael Buch virtual int baz_virt() = 0; 12*8184b252SMichael Buch 13*8184b252SMichael Buch int base_base_var = 12; 14*8184b252SMichael Buch }; 15*8184b252SMichael Buch 16*8184b252SMichael Buch struct Bar : public Baz { 17*8184b252SMichael Buch virtual ~Bar() = default; 18*8184b252SMichael Buch baz_virtBar19*8184b252SMichael Buch virtual int baz_virt() override { 20*8184b252SMichael Buch base_var = 10; 21*8184b252SMichael Buch return 1; 22*8184b252SMichael Buch } 23*8184b252SMichael Buch 24*8184b252SMichael Buch int base_var = 15; 25*8184b252SMichael Buch }; 26*8184b252SMichael Buch 27*8184b252SMichael Buch struct Foo : public Bar { 28*8184b252SMichael Buch int class_var = 9; 29*8184b252SMichael Buch int shadowed = -137; 30*8184b252SMichael Buch int *class_ptr; 31*8184b252SMichael Buch 32*8184b252SMichael Buch virtual ~Foo() = default; 33*8184b252SMichael Buch baz_virtFoo34*8184b252SMichael Buch virtual int baz_virt() override { 35*8184b252SMichael Buch shadowed = -1; 36*8184b252SMichael Buch return 2; 37*8184b252SMichael Buch } 38*8184b252SMichael Buch methodFoo39*8184b252SMichael Buch void method() { 40*8184b252SMichael Buch int local_var = 137; 41*8184b252SMichael Buch int shadowed; 42*8184b252SMichael Buch class_ptr = &local_var; 43*8184b252SMichael Buch auto lambda = [&shadowed, this, &local_var, 44*8184b252SMichael Buch local_var_copy = local_var]() mutable { 45*8184b252SMichael Buch int lambda_local_var = 5; 46*8184b252SMichael Buch shadowed = 5; 47*8184b252SMichael Buch class_var = 109; 48*8184b252SMichael Buch --base_var; 49*8184b252SMichael Buch --base_base_var; 50*8184b252SMichael Buch std::puts("break here"); 51*8184b252SMichael Buch 52*8184b252SMichael Buch auto nested_lambda = [this, &lambda_local_var, local_var] { 53*8184b252SMichael Buch std::puts("break here"); 54*8184b252SMichael Buch lambda_local_var = 0; 55*8184b252SMichael Buch }; 56*8184b252SMichael Buch 57*8184b252SMichael Buch nested_lambda(); 58*8184b252SMichael Buch --local_var_copy; 59*8184b252SMichael Buch std::puts("break here"); 60*8184b252SMichael Buch 61*8184b252SMichael Buch struct LocalLambdaClass { 62*8184b252SMichael Buch int lambda_class_local = -12345; 63*8184b252SMichael Buch Foo *outer_ptr; 64*8184b252SMichael Buch 65*8184b252SMichael Buch void inner_method() { 66*8184b252SMichael Buch auto lambda = [this] { 67*8184b252SMichael Buch std::puts("break here"); 68*8184b252SMichael Buch lambda_class_local = -2; 69*8184b252SMichael Buch outer_ptr->class_var *= 2; 70*8184b252SMichael Buch }; 71*8184b252SMichael Buch 72*8184b252SMichael Buch lambda(); 73*8184b252SMichael Buch } 74*8184b252SMichael Buch }; 75*8184b252SMichael Buch 76*8184b252SMichael Buch LocalLambdaClass l; 77*8184b252SMichael Buch l.outer_ptr = this; 78*8184b252SMichael Buch l.inner_method(); 79*8184b252SMichael Buch }; 80*8184b252SMichael Buch lambda(); 81*8184b252SMichael Buch } 82*8184b252SMichael Buch non_capturing_methodFoo83*8184b252SMichael Buch void non_capturing_method() { 84*8184b252SMichael Buch int local = 5; 85*8184b252SMichael Buch int local2 = 10; 86*8184b252SMichael Buch 87*8184b252SMichael Buch class_var += [=] { 88*8184b252SMichael Buch std::puts("break here"); 89*8184b252SMichael Buch return local + local2; 90*8184b252SMichael Buch }(); 91*8184b252SMichael Buch } 92*8184b252SMichael Buch }; 93*8184b252SMichael Buch main()94*8184b252SMichael Buchint main() { 95*8184b252SMichael Buch Foo f; 96*8184b252SMichael Buch f.method(); 97*8184b252SMichael Buch f.non_capturing_method(); 98*8184b252SMichael Buch return global_var; 99*8184b252SMichael Buch } 100