brintos

brintos / llvm-project-archived public Read only

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