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