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