Home | History | Annotate | Download | only in expr.prim.lambda
      1 // RUN: %clang_cc1 -std=c++11 %s -Wunused -verify
      2 
      3 void odr_used() {
      4   int i = 17;
      5   [i]{}();
      6 }
      7 
      8 struct ReachingThis {
      9   static void static_foo() {
     10     (void)[this](){}; // expected-error{{'this' cannot be captured in this context}}
     11 
     12     struct Local {
     13       int i;
     14 
     15       void bar() {
     16         (void)[this](){};
     17         (void)[&](){i = 7; };
     18       }
     19     };
     20   }
     21 
     22   void foo() {
     23     (void)[this](){};
     24 
     25     struct Local {
     26       int i;
     27 
     28       static void static_bar() {
     29         (void)[this](){}; // expected-error{{'this' cannot be captured in this context}}
     30         (void)[&](){i = 7; }; // expected-error{{invalid use of member 'i' in static member function}}
     31       }
     32     };
     33   }
     34 };
     35 
     36 void immediately_enclosing(int i) { // expected-note{{'i' declared here}}
     37   [i]() {
     38     [i] {}();
     39   }();
     40 
     41   [=]() {
     42     [i] {}();
     43   }();
     44 
     45   []() { // expected-note{{lambda expression begins here}}
     46     [i] {}(); // expected-error{{variable 'i' cannot be implicitly captured in a lambda with no capture-default specified}}
     47   }();
     48 }
     49 
     50 void f1(int i) { // expected-note{{declared here}}
     51   int const N = 20;
     52   auto m1 = [=]{
     53     int const M = 30;
     54     auto m2 = [i]{
     55       int x[N][M];
     56       x[0][0] = i;
     57     };
     58     (void)N;
     59     (void)M;
     60     (void)m2;
     61   };
     62   struct s1 {
     63     int f;
     64     void work(int n) { // expected-note{{declared here}}
     65       int m = n*n;
     66       int j = 40; // expected-note{{declared here}}
     67       auto m3 = [this,m] { // expected-note 3{{lambda expression begins here}}
     68         auto m4 = [&,j] { // expected-error{{variable 'j' cannot be implicitly captured in a lambda with no capture-default specified}}
     69           int x = n; // expected-error{{variable 'n' cannot be implicitly captured in a lambda with no capture-default specified}}
     70           x += m;
     71           x += i; // expected-error{{variable 'i' cannot be implicitly captured in a lambda with no capture-default specified}}
     72           x += f;
     73         };
     74       };
     75     }
     76   };
     77 }
     78