Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -std=c++1y %s -verify -emit-llvm-only
      2 
      3 namespace variadic_expansion {
      4   int f(int &, char &) { return 0; }
      5   template<class ... Ts> char fv(Ts ... ts) { return 0; }
      6   // FIXME: why do we get 2 error messages
      7   template <typename ... T> void g(T &... t) { //expected-note3{{declared here}}
      8     f([&a(t)]()->decltype(auto) {
      9       return a;
     10     }() ...);
     11 
     12     auto L = [x = f([&a(t)]()->decltype(auto) { return a; }()...)]() { return x; };
     13     const int y = 10;
     14     auto M = [x = y,
     15                 &z = y](T& ... t) { };
     16     auto N = [x = y,
     17                 &z = y, n = f(t...),
     18                 o = f([&a(t)](T& ... t)->decltype(auto) { return a; }(t...)...), t...](T& ... s) {
     19                   fv([&a(t)]()->decltype(auto) {
     20                     return a;
     21                   }() ...);
     22                 };
     23     auto N2 = [x = y,                     //expected-note3{{begins here}}
     24                 &z = y, n = f(t...),
     25                 o = f([&a(t)](T& ... t)->decltype(auto) { return a; }(t...)...)](T& ... s) {
     26                   fv([&a(t)]()->decltype(auto) { //expected-error 3{{captured}}
     27                     return a;
     28                   }() ...);
     29                 };
     30 
     31   }
     32 
     33   void h(int i, char c) { g(i, c); } //expected-note{{in instantiation}}
     34 }
     35 
     36 namespace odr_use_within_init_capture {
     37 
     38 int test() {
     39 
     40   { // no captures
     41     const int x = 10;
     42     auto L = [z = x + 2](int a) {
     43       auto M = [y = x - 2](char b) {
     44         return y;
     45       };
     46       return M;
     47     };
     48 
     49   }
     50   { // should not capture
     51     const int x = 10;
     52     auto L = [&z = x](int a) {
     53       return a;;
     54     };
     55 
     56   }
     57   {
     58     const int x = 10;
     59     auto L = [k = x](char a) { //expected-note {{declared}}
     60       return [](int b) { //expected-note {{begins}}
     61         return [j = k](int c) { //expected-error {{cannot be implicitly captured}}
     62           return c;
     63         };
     64       };
     65     };
     66   }
     67   {
     68     const int x = 10;
     69     auto L = [k = x](char a) {
     70       return [=](int b) {
     71         return [j = k](int c) {
     72           return c;
     73         };
     74       };
     75     };
     76   }
     77   {
     78     const int x = 10;
     79     auto L = [k = x](char a) {
     80       return [k](int b) {
     81         return [j = k](int c) {
     82           return c;
     83         };
     84       };
     85     };
     86   }
     87 
     88   return 0;
     89 }
     90 
     91 int run = test();
     92 
     93 }
     94 
     95 namespace odr_use_within_init_capture_template {
     96 
     97 template<class T = int>
     98 int test(T t = T{}) {
     99 
    100   { // no captures
    101     const T x = 10;
    102     auto L = [z = x](char a) {
    103       auto M = [y = x](T b) {
    104         return y;
    105       };
    106       return M;
    107     };
    108 
    109   }
    110   { // should not capture
    111     const T x = 10;
    112     auto L = [&z = x](T a) {
    113       return a;;
    114     };
    115 
    116   }
    117   { // will need to capture x in outer lambda
    118     const T x = 10; //expected-note {{declared}}
    119     auto L = [z = x](char a) { //expected-note {{begins}}
    120       auto M = [&y = x](T b) { //expected-error {{cannot be implicitly captured}}
    121         return y;
    122       };
    123       return M;
    124     };
    125 
    126   }
    127   { // will need to capture x in outer lambda
    128     const T x = 10;
    129     auto L = [=,z = x](char a) {
    130       auto M = [&y = x](T b) {
    131         return y;
    132       };
    133       return M;
    134     };
    135 
    136   }
    137   { // will need to capture x in outer lambda
    138     const T x = 10;
    139     auto L = [x, z = x](char a) {
    140       auto M = [&y = x](T b) {
    141         return y;
    142       };
    143       return M;
    144     };
    145   }
    146   { // will need to capture x in outer lambda
    147     const int x = 10; //expected-note 2{{declared}}
    148     auto L = [z = x](char a) { //expected-note 2{{begins}}
    149       auto M = [&y = x](T b) { //expected-error 2{{cannot be implicitly captured}}
    150         return y;
    151       };
    152       return M;
    153     };
    154   }
    155   {
    156     // no captures
    157     const T x = 10;
    158     auto L = [z =
    159                   [z = x, &y = x](char a) { return z + y; }('a')](char a)
    160       { return z; };
    161 
    162   }
    163 
    164   return 0;
    165 }
    166 
    167 int run = test(); //expected-note {{instantiation}}
    168 
    169 }
    170 
    171 namespace classification_of_captures_of_init_captures {
    172 
    173 template <typename T>
    174 void f() {
    175   [a = 24] () mutable {
    176     [&a] { a = 3; }();
    177   }();
    178 }
    179 
    180 template <typename T>
    181 void h() {
    182   [a = 24] (auto param) mutable {
    183     [&a] { a = 3; }();
    184   }(42);
    185 }
    186 
    187 int run() {
    188   f<int>();
    189   h<int>();
    190 }
    191 
    192 }
    193 
    194 namespace N3922 {
    195   struct X { X(); explicit X(const X&); int n; };
    196   auto a = [x{X()}] { return x.n; }; // ok
    197   auto b = [x = {X()}] {}; // expected-error{{<initializer_list>}}
    198 }
    199 
    200 namespace init_capture_non_mutable {
    201 void test(double weight) {
    202   double init;
    203   auto find = [max = init](auto current) {
    204     max = current; // expected-error{{cannot assign to a variable captured by copy in a non-mutable lambda}}
    205   };
    206   find(weight); // expected-note {{in instantiation of function template specialization}}
    207 }
    208 }
    209