xref: /llvm-project/lldb/test/API/commands/expression/expr_inside_lambda/main.cpp (revision 8184b252cdab2fbe44f766d6de28b29ebe4c8753)
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 Buch int 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