| #include <cassert> | |
| #include <cstdio> | |
| namespace { | |
| int global_var = -5; | |
| } // namespace | |
| struct Baz { | |
| virtual ~Baz() = default; | |
| virtual int baz_virt() = 0; | |
| int base_base_var = 12; | |
| }; | |
| struct Bar : public Baz { | |
| virtual ~Bar() = default; | |
| virtual int baz_virt() override { | |
| base_var = 10; | |
| return 1; | |
| } | |
| int base_var = 15; | |
| }; | |
| struct Foo : public Bar { | |
| int class_var = 9; | |
| int shadowed = -137; | |
| int *class_ptr; | |
| virtual ~Foo() = default; | |
| virtual int baz_virt() override { | |
| shadowed = -1; | |
| return 2; | |
| } | |
| void method() { | |
| int local_var = 137; | |
| int shadowed; | |
| class_ptr = &local_var; | |
| auto lambda = [&shadowed, this, &local_var, | |
| local_var_copy = local_var]() mutable { | |
| int lambda_local_var = 5; | |
| shadowed = 5; | |
| class_var = 109; | |
| --base_var; | |
| --base_base_var; | |
| std::puts("break here"); | |
| auto nested_lambda = [this, &lambda_local_var, local_var] { | |
| std::puts("break here"); | |
| lambda_local_var = 0; | |
| }; | |
| nested_lambda(); | |
| --local_var_copy; | |
| std::puts("break here"); | |
| struct LocalLambdaClass { | |
| int lambda_class_local = -12345; | |
| Foo *outer_ptr; | |
| void inner_method() { | |
| auto lambda = [this] { | |
| std::puts("break here"); | |
| lambda_class_local = -2; | |
| outer_ptr->class_var *= 2; | |
| }; | |
| lambda(); | |
| } | |
| }; | |
| LocalLambdaClass l; | |
| l.outer_ptr = this; | |
| l.inner_method(); | |
| }; | |
| lambda(); | |
| } | |
| void non_capturing_method() { | |
| int local = 5; | |
| int local2 = 10; | |
| class_var += [=] { | |
| std::puts("break here"); | |
| return local + local2; | |
| }(); | |
| } | |
| }; | |
| int main() { | |
| Foo f; | |
| f.method(); | |
| f.non_capturing_method(); | |
| return global_var; | |
| } |