1c4fe0a62ad5909c996b4edaa725772c0116b7deaFaisal Vali// RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -emit-llvm-only %s
232b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali// RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fdelayed-template-parsing %s -DDELAYED_TEMPLATE_PARSING
332b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali// RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fms-extensions %s -DMS_EXTENSIONS
432b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali// RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fdelayed-template-parsing -fms-extensions %s -DMS_EXTENSIONS -DDELAYED_TEMPLATE_PARSING
5d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<class F, class ...Rest> struct first_impl { typedef F type; };
7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<class ...Args> using first = typename first_impl<Args...>::type;
8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace simple_explicit_capture {
10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void test() {
11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int i;
12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    auto L = [i](auto a) { return i + a; };
13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    L(3.14);
14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
17d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Valinamespace explicit_call {
18d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Valiint test() {
19d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  auto L = [](auto a) { return a; };
20d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  L.operator()(3);
21d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  L.operator()<char>(3.14); //expected-warning{{implicit conversion}}
22d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  return 0;
23d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali}
24d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali} //end ns
25d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
26c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Valinamespace test_conversion_to_fptr_2 {
27c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali
28c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Valitemplate<class T> struct X {
29c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali
30c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  T (*fp)(T) = [](auto a) { return a; };
31c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali
32c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali};
33c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali
34c00e4194296e994efab0e4bf64ca66737850bdf0Faisal ValiX<int> xi;
35c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali
36c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Valitemplate<class T>
37c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Valivoid fooT(T t, T (*fp)(T) = [](auto a) { return a; }) {
38c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fp(t);
39c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali}
40c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali
41c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Valiint test() {
42c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali{
43c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  auto L = [](auto a) { return a; };
44c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  int (*fp)(int) = L;
45c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fp(5);
46c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  L(3);
47c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  char (*fc)(char) = L;
48c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fc('b');
49c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  L('c');
50c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  double (*fd)(double) = L;
51c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fd(3.14);
52c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fd(6.26);
53c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  L(4.25);
54c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali}
55c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali{
56c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  auto L = [](auto a) ->int { return a; }; //expected-note 2{{candidate template ignored}}
57c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  int (*fp)(int) = L;
58c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  char (*fc)(char) = L; //expected-error{{no viable conversion}}
59c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  double (*fd)(double) = L; //expected-error{{no viable conversion}}
60c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali}
61c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali{
62c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  int x = 5;
63c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  auto L = [=](auto b, char c = 'x') {
64c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali    int i = x;
65c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali    return [](auto a) ->decltype(a) { return a; };
66c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  };
67c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  int (*fp)(int) = L(8);
68c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fp(5);
69c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  L(3);
70c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  char (*fc)(char) = L('a');
71c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fc('b');
72c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  L('c');
73c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  double (*fd)(double) = L(3.14);
74c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fd(3.14);
75c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fd(6.26);
76c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali
77c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali}
78c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali{
79c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali auto L = [=](auto b) {
80c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali    return [](auto a) ->decltype(b)* { return (decltype(b)*)0; };
81c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  };
82c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  int* (*fp)(int) = L(8);
83c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fp(5);
84c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  L(3);
85c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  char* (*fc)(char) = L('a');
86c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fc('b');
87c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  L('c');
88c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  double* (*fd)(double) = L(3.14);
89c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fd(3.14);
90c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fd(6.26);
91c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali}
92c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali{
93c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali auto L = [=](auto b) {
94c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali    return [](auto a) ->decltype(b)* { return (decltype(b)*)0; }; //expected-note{{candidate template ignored}}
95c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  };
96c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  char* (*fp)(int) = L('8');
97c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fp(5);
98c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  char* (*fc)(char) = L('a');
99c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fc('b');
100c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  double* (*fi)(int) = L(3.14);
101c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fi(5);
102c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  int* (*fi2)(int) = L(3.14); //expected-error{{no viable conversion}}
103c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali}
104c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali
105c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali{
106c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali auto L = [=](auto b) {
107c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali    return [](auto a) {
108c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali      return [=](auto c) {
109c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali        return [](auto d) ->decltype(a + b + c + d) { return d; };
110c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali      };
111c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali    };
112c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  };
113c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  int (*fp)(int) = L('8')(3)(short{});
114c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  double (*fs)(char) = L(3.14)(short{})('4');
115c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali}
116c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali
117c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fooT(3);
118c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fooT('a');
119c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fooT(3.14);
120c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  fooT("abcdefg");
121c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  return 0;
122c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali}
123c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Valiint run2 = test();
124c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali
125c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali}
126c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali
127c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali
128d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Valinamespace test_conversion_to_fptr {
129d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
130d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Valivoid f1(int (*)(int)) { }
131d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Valivoid f2(char (*)(int)) { } // expected-note{{candidate}}
132d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Valivoid g(int (*)(int)) { } // #1 expected-note{{candidate}}
133d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Valivoid g(char (*)(char)) { } // #2 expected-note{{candidate}}
134d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Valivoid h(int (*)(int)) { } // #3
135d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Valivoid h(char (*)(int)) { } // #4
136d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
137d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Valiint test() {
138d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali{
139d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  auto glambda = [](auto a) { return a; };
140d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  glambda(1);
141d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  f1(glambda); // OK
142d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  f2(glambda); // expected-error{{no matching function}}
143d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  g(glambda); // expected-error{{call to 'g' is ambiguous}}
144d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  h(glambda); // OK: calls #3 since it is convertible from ID
145d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
146d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  int& (*fpi)(int*) = [](auto* a) -> auto& { return *a; }; // OK
147d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
148d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali}
149d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali{
150d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
151d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  auto L = [](auto a) { return a; };
152d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  int (*fp)(int) = L;
153d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  fp(5);
154d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  L(3);
155d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  char (*fc)(char) = L;
156d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  fc('b');
157d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  L('c');
158d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  double (*fd)(double) = L;
159d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  fd(3.14);
160d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  fd(6.26);
161d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  L(4.25);
162d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali}
163d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali{
164d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  auto L = [](auto a) ->int { return a; }; //expected-note 2{{candidate template ignored}}
165d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  int (*fp)(int) = L;
166d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  char (*fc)(char) = L; //expected-error{{no viable conversion}}
167d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  double (*fd)(double) = L; //expected-error{{no viable conversion}}
168d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali}
1699bd1c1332f7b2a82ed7b328b216a35a299a5945aFaisal Vali{
1709bd1c1332f7b2a82ed7b328b216a35a299a5945aFaisal Vali  int* (*fp)(int*) = [](auto *a) -> auto* { return a; };
1719bd1c1332f7b2a82ed7b328b216a35a299a5945aFaisal Vali  fp(0);
1729bd1c1332f7b2a82ed7b328b216a35a299a5945aFaisal Vali}
173d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali}
174d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
175d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Valinamespace more_converion_to_ptr_to_function_tests {
176d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
177d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
178d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Valiint test() {
179d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  {
180d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali    int& (*fpi)(int*) = [](auto* a) -> auto& { return *a; }; // OK
181d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali    int (*fp2)(int) = [](auto b) -> int {  return b; };
182d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali    int (*fp3)(char) = [](auto c) -> int { return c; };
183d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali    char (*fp4)(int) = [](auto d) { return d; }; //expected-error{{no viable conversion}}\
184d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali                                                 //expected-note{{candidate template ignored}}
185d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali    char (*fp5)(char) = [](auto e) -> int { return e; }; //expected-error{{no viable conversion}}\
186d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali                                                 //expected-note{{candidate template ignored}}
187d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
188d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali    fp2(3);
189d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali    fp3('\n');
190d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali    fp3('a');
191d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali    return 0;
192d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  }
193d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali} // end test()
194d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
195d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Valitemplate<class ... Ts> void vfun(Ts ... ) { }
196d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
197d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Valiint variadic_test() {
198d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
199d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali int (*fp)(int, char, double) = [](auto ... a) -> int { vfun(a...); return 4; };
200d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali fp(3, '4', 3.14);
201d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
202d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali int (*fp2)(int, char, double) = [](auto ... a) { vfun(a...); return 4; };
203d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali fp(3, '4', 3.14);
204d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali return 2;
205d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali}
206d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
207d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali} // end ns
208d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
209d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Valinamespace conversion_operator {
210d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Valivoid test() {
211d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali    auto L = [](auto a) -> int { return a; };
212d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali    int (*fp)(int) = L;
213d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali    int (&fp2)(int) = [](auto a) { return a; };  // expected-error{{non-const lvalue}}
214d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali    int (&&fp3)(int) = [](auto a) { return a; };  // expected-error{{no viable conversion}}\
215d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali                                                  //expected-note{{candidate}}
216d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  }
217d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali}
218d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali}
219d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
220d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Valinamespace return_type_deduction_ok {
221d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali auto l = [](auto a) ->auto { return a; }(2);
222d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali auto l2 = [](auto a) ->decltype(auto) { return a; }(2);
223d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali auto l3 = [](auto a) { return a; }(2);
224d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
225d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali}
226d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali
227d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Valinamespace generic_lambda_as_default_argument_ok {
228d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  void test(int i = [](auto a)->int { return a; }(3)) {
229d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali  }
230d6992ab33b7113e1bd7af51c0c52d17c23706c01Faisal Vali}
231a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
232a3d311e468bce37defb97ed75105f8d36942b651Faisal Valinamespace nested_non_capturing_lambda_tests {
233a3d311e468bce37defb97ed75105f8d36942b651Faisal Valitemplate<class ... Ts> void print(Ts ...) { }
234a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiint test() {
235a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali{
236a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto L = [](auto a) {
237a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    return [](auto b) {
238a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      return b;
239a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
240a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  };
241a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto M = L(3);
242a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  M(4.15);
243a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali }
244a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali{
245c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  int i = 10; //expected-note 3{{declared here}}
246a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto L = [](auto a) {
247c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali    return [](auto b) { //expected-note 3{{begins here}}
248c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali      i = b;  //expected-error 3{{cannot be implicitly captured}}
249a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      return b;
250a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
251a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  };
252c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  auto M = L(3); //expected-note{{instantiation}}
253a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  M(4.15); //expected-note{{instantiation}}
254a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali }
255a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali {
256c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  int i = 10;
257c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  auto L = [](auto a) {
258c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali    return [](auto b) {
259c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali      b = sizeof(i);  //ok
260c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali      return b;
261c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali    };
262c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  };
263c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali }
264c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali {
265a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto L = [](auto a) {
266a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    print("a = ", a, "\n");
267a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    return [](auto b) ->decltype(a) {
268a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      print("b = ", b, "\n");
269a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      return b;
270a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
271a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  };
272a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto M = L(3);
273a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  M(4.15);
274a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali }
275a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
276a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali{
277a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto L = [](auto a) ->decltype(a) {
278a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    print("a = ", a, "\n");
279a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    return [](auto b) ->decltype(a) { //expected-error{{no viable conversion}}\
280a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali                                      //expected-note{{candidate template ignored}}
281a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      print("b = ", b, "\n");
282a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      return b;
283a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
284a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  };
285a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto M = L(3); //expected-note{{in instantiation of}}
286a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali }
287a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali{
288a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto L = [](auto a) {
289a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    print("a = ", a, "\n");
290a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    return [](auto ... b) ->decltype(a) {
291a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      print("b = ", b ..., "\n");
292a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      return 4;
293a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
294a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  };
295a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto M = L(3);
296a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  M(4.15, 3, "fv");
297a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali}
298a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
299a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali{
300a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto L = [](auto a) {
301a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    print("a = ", a, "\n");
302a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    return [](auto ... b) ->decltype(a) {
303a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      print("b = ", b ..., "\n");
304a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      return 4;
305a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
306a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  };
307a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto M = L(3);
308a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  int (*fp)(double, int, const char*) = M;
309a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  fp(4.15, 3, "fv");
310a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali}
311a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
312a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali{
313a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto L = [](auto a) {
314a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    print("a = ", a, "\n");
315a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    return [](char b) {
316a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      return [](auto ... c) ->decltype(b) {
317a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        print("c = ", c ..., "\n");
318a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        return 42;
319a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      };
320a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
321a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  };
322a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  L(4);
323a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto M = L(3);
324a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  M('a');
325a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto N = M('x');
326a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  N("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
327a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  char (*np)(const char*, int, const char*, double, const char*, int) = N;
328a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  np("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
329a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali}
330a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
331a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
332a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali{
333a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto L = [](auto a) {
334a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    print("a = ", a, "\n");
335a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    return [](decltype(a) b) {
336a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      return [](auto ... c) ->decltype(b) {
337a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        print("c = ", c ..., "\n");
338a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        return 42;
339a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      };
340a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
341a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  };
342a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  L('4');
343a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto M = L('3');
344a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  M('a');
345a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto N = M('x');
346a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  N("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
347a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  char (*np)(const char*, int, const char*, double, const char*, int) = N;
348a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  np("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
349a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali}
350a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
351a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
352a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali{
353a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali struct X {
354a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  static void foo(double d) { }
355a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  void test() {
356a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    auto L = [](auto a) {
357a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      print("a = ", a, "\n");
358a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      foo(a);
359a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      return [](decltype(a) b) {
360a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        foo(b);
361a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        foo(sizeof(a) + sizeof(b));
362a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        return [](auto ... c) ->decltype(b) {
363a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          print("c = ", c ..., "\n");
364a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          foo(decltype(b){});
365a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
366a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          return 42;
367a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        };
368a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      };
369a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
370a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    L('4');
371a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    auto M = L('3');
372a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    M('a');
373a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    auto N = M('x');
374a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    N("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
375a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    char (*np)(const char*, int, const char*, double, const char*, int) = N;
376a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    np("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
377a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  }
378a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali};
379a3d311e468bce37defb97ed75105f8d36942b651Faisal ValiX x;
380a3d311e468bce37defb97ed75105f8d36942b651Faisal Valix.test();
381a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali}
382a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali// Make sure we can escape the function
383a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali{
384a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali struct X {
385a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  static void foo(double d) { }
386a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto test() {
387a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    auto L = [](auto a) {
388a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      print("a = ", a, "\n");
389a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      foo(a);
390a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      return [](decltype(a) b) {
391a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        foo(b);
392a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        foo(sizeof(a) + sizeof(b));
393a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        return [](auto ... c) ->decltype(b) {
394a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          print("c = ", c ..., "\n");
395a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          foo(decltype(b){});
396a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
397a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          return 42;
398a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        };
399a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      };
400a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
401a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    return L;
402a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  }
403a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali};
404a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  X x;
405a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto L = x.test();
406a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  L('4');
407a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto M = L('3');
408a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  M('a');
409a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto N = M('x');
410a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  N("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
411a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  char (*np)(const char*, int, const char*, double, const char*, int) = N;
412a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  np("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
413a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali}
414a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
415a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali{
416a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali struct X {
417a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  static void foo(double d) { }
418a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto test() {
419a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    auto L = [](auto a) {
420a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      print("a = ", a, "\n");
421a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      foo(a);
422a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      return [](decltype(a) b) {
423a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        foo(b);
424a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        foo(sizeof(a) + sizeof(b));
425a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        return [](auto ... c) {
426a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          print("c = ", c ..., "\n");
427a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          foo(decltype(b){});
428a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
429a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          return [](decltype(c) ... d) ->decltype(a) { //expected-note{{candidate}}
430a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali            print("d = ", d ..., "\n");
431a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali            foo(decltype(b){});
432a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali            foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
433a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali            return decltype(a){};
434a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          };
435a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        };
436a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      };
437a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
438a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    return L;
439a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  }
440a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali};
441a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  X x;
442a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto L = x.test();
443a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  L('4');
444a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto M = L('3');
445a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  M('a');
446a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto N = M('x');
447a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto O = N("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
448a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  char (*np)(const char*, int, const char*, double, const char*, int) = O;
449a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  np("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
450a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  int (*np2)(const char*, int, const char*, double, const char*, int) = O; // expected-error{{no viable conversion}}
451a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
452a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali}
453a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali} // end test()
454a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
455a3d311e468bce37defb97ed75105f8d36942b651Faisal Valinamespace wrapped_within_templates {
456a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
457a3d311e468bce37defb97ed75105f8d36942b651Faisal Valinamespace explicit_return {
458a3d311e468bce37defb97ed75105f8d36942b651Faisal Valitemplate<class T> int fooT(T t) {
459a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto L = [](auto a) -> void {
460a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    auto M = [](char b) -> void {
461a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      auto N = [](auto c) -> void {
462a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        int x = 0;
463a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        x = sizeof(a);
464a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        x = sizeof(b);
465a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        x = sizeof(c);
466a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      };
467a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      N('a');
468a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      N(decltype(a){});
469a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
470a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  };
471a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  L(t);
472a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  L(3.14);
473a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  return 0;
474a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali}
475a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
476a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiint run = fooT('a') + fooT(3.14);
477a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
478a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali} // end explicit_return
479a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
480a3d311e468bce37defb97ed75105f8d36942b651Faisal Valinamespace implicit_return_deduction {
481a3d311e468bce37defb97ed75105f8d36942b651Faisal Valitemplate<class T> auto fooT(T t) {
482a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto L = [](auto a)  {
483a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    auto M = [](char b)  {
484a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      auto N = [](auto c)  {
485a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        int x = 0;
486a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        x = sizeof(a);
487a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        x = sizeof(b);
488a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        x = sizeof(c);
489a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      };
490a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      N('a');
491a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      N(decltype(a){});
492a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
493a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  };
494a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  L(t);
495a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  L(3.14);
496a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  return 0;
497a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali}
498a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
499a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiint run = fooT('a') + fooT(3.14);
500a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
501a3d311e468bce37defb97ed75105f8d36942b651Faisal Valitemplate<class ... Ts> void print(Ts ... ts) { }
502a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
503a3d311e468bce37defb97ed75105f8d36942b651Faisal Valitemplate<class ... Ts> auto fooV(Ts ... ts) {
504a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto L = [](auto ... a) {
505a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    auto M = [](decltype(a) ... b) {
506a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      auto N = [](auto c) {
507a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        int x = 0;
508a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        x = sizeof...(a);
509a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        x = sizeof...(b);
510a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        x = sizeof(c);
511a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      };
512a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      N('a');
513a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      N(N);
514a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      N(first<Ts...>{});
515a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
516a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    M(a...);
517a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    print("a = ", a..., "\n");
518a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  };
519a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  L(L, ts...);
520a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  print("ts = ", ts..., "\n");
521a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  return 0;
522a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali}
523a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
524a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiint run2 = fooV(3.14, " ", '4', 5) + fooV("BC", 3, 2.77, 'A', float{}, short{}, unsigned{});
525a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
526a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali} //implicit_return_deduction
527a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
528a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
529a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali} //wrapped_within_templates
530a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
531a3d311e468bce37defb97ed75105f8d36942b651Faisal Valinamespace at_ns_scope {
532a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  void foo(double d) { }
533a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto test() {
534a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    auto L = [](auto a) {
535a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      print("a = ", a, "\n");
536a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      foo(a);
537a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      return [](decltype(a) b) {
538a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        foo(b);
539a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        foo(sizeof(a) + sizeof(b));
540a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        return [](auto ... c) {
541a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          print("c = ", c ..., "\n");
542a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          foo(decltype(b){});
543a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
544a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          return [](decltype(c) ... d) ->decltype(a) { //expected-note{{candidate}}
545a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali            print("d = ", d ..., "\n");
546a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali            foo(decltype(b){});
547a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali            foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
548a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali            return decltype(a){};
549a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          };
550a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        };
551a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      };
552a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
553a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    return L;
554a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  }
555a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiauto L = test();
556a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiauto L_test = L('4');
557a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiauto M = L('3');
558a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiauto M_test = M('a');
559a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiauto N = M('x');
560a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiauto O = N("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
561a3d311e468bce37defb97ed75105f8d36942b651Faisal Valichar (*np)(const char*, int, const char*, double, const char*, int) = O;
562a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiauto NP_result = np("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
563a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiint (*np2)(const char*, int, const char*, double, const char*, int) = O; // expected-error{{no viable conversion}}
564a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
565a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
566a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
567a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali}
568a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
569a3d311e468bce37defb97ed75105f8d36942b651Faisal Valinamespace variadic_tests_1 {
570a3d311e468bce37defb97ed75105f8d36942b651Faisal Valitemplate<class ... Ts> void print(Ts ... ts) { }
571a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
572a3d311e468bce37defb97ed75105f8d36942b651Faisal Valitemplate<class F, class ... Rest> F& FirstArg(F& f, Rest...) { return f; }
573a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
574a3d311e468bce37defb97ed75105f8d36942b651Faisal Valitemplate<class ... Ts> int fooV(Ts ... ts) {
575a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto L = [](auto ... a) -> void {
576a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    auto M = [](decltype(a) ... b) -> void {
577a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      auto N = [](auto c) -> void {
578a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        int x = 0;
579a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        x = sizeof...(a);
580a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        x = sizeof...(b);
581a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        x = sizeof(c);
582a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      };
583a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      N('a');
584a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      N(N);
585651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      N(first<Ts...>{});
586a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
587a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    M(a...);
588a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    print("a = ", a..., "\n");
589a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  };
590a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  L(L, ts...);
591a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  print("ts = ", ts..., "\n");
592a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  return 0;
593a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali}
594a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
595a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiint run2 = fooV(3.14, " ", '4', 5) + fooV("BC", 3, 2.77, 'A', float{}, short{}, unsigned{});
596a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
597a3d311e468bce37defb97ed75105f8d36942b651Faisal Valinamespace more_variadic_1 {
598a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
599a3d311e468bce37defb97ed75105f8d36942b651Faisal Valitemplate<class ... Ts> int fooV(Ts ... ts) {
600a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto L = [](auto ... a) {
601a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    auto M = [](decltype(a) ... b) -> void {
602a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      auto N = [](auto c) -> void {
603a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        int x = 0;
604a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        x = sizeof...(a);
605a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        x = sizeof...(b);
606a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        x = sizeof(c);
607a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      };
608a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      N('a');
609a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      N(N);
610651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      N(first<Ts...>{});
611a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
612a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    M(a...);
613a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    return M;
614a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  };
615a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto M = L(L, ts...);
616a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  decltype(L(L, ts...)) (*fp)(decltype(L), decltype(ts) ...) = L;
617a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  void (*fp2)(decltype(L), decltype(ts) ...) = L(L, ts...);
618a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
619a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  {
620a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    auto L = [](auto ... a) {
621a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      auto M = [](decltype(a) ... b) {
622a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        auto N = [](auto c) -> void {
623a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          int x = 0;
624a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          x = sizeof...(a);
625a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          x = sizeof...(b);
626a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          x = sizeof(c);
627a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        };
628a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        N('a');
629a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        N(N);
630651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        N(first<Ts...>{});
631a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        return N;
632a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      };
633a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      M(a...);
634a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      return M;
635a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
636a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    auto M = L(L, ts...);
637a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    decltype(L(L, ts...)) (*fp)(decltype(L), decltype(ts) ...) = L;
638a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    fp(L, ts...);
639a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    decltype(L(L, ts...)(L, ts...)) (*fp2)(decltype(L), decltype(ts) ...) = L(L, ts...);
640a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    fp2 = fp(L, ts...);
641a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    void (*fp3)(char) = fp2(L, ts...);
642a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    fp3('a');
643a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  }
644a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  return 0;
645a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali}
646a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
647a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiint run2 = fooV(3.14, " ", '4', 5) + fooV("BC", 3, 2.77, 'A', float{}, short{}, unsigned{});
648a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
649a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
650a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali} //end ns more_variadic_1
651a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
652a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali} // end ns variadic_tests_1
653a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
654a3d311e468bce37defb97ed75105f8d36942b651Faisal Valinamespace at_ns_scope_within_class_member {
655a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali struct X {
656a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  static void foo(double d) { }
657a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto test() {
658a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    auto L = [](auto a) {
659a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      print("a = ", a, "\n");
660a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      foo(a);
661a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      return [](decltype(a) b) {
662a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        foo(b);
663a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        foo(sizeof(a) + sizeof(b));
664a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        return [](auto ... c) {
665a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          print("c = ", c ..., "\n");
666a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          foo(decltype(b){});
667a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
668a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          return [](decltype(c) ... d) ->decltype(a) { //expected-note{{candidate}}
669a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali            print("d = ", d ..., "\n");
670a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali            foo(decltype(b){});
671a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali            foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
672a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali            return decltype(a){};
673a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali          };
674a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali        };
675a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      };
676a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
677a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    return L;
678a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  }
679a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali};
680a3d311e468bce37defb97ed75105f8d36942b651Faisal ValiX x;
681a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiauto L = x.test();
682a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiauto L_test = L('4');
683a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiauto M = L('3');
684a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiauto M_test = M('a');
685a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiauto N = M('x');
686a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiauto O = N("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
687a3d311e468bce37defb97ed75105f8d36942b651Faisal Valichar (*np)(const char*, int, const char*, double, const char*, int) = O;
688a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiauto NP_result = np("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
689a3d311e468bce37defb97ed75105f8d36942b651Faisal Valiint (*np2)(const char*, int, const char*, double, const char*, int) = O; // expected-error{{no viable conversion}}
69032b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali
69132b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali} //end at_ns_scope_within_class_member
69232b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali
69332b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali
69432b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valinamespace at_ns_scope_within_class_template_member {
69532b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali struct X {
69632b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali  static void foo(double d) { }
69732b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali  template<class T = int>
69832b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali  auto test(T = T{}) {
69932b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali    auto L = [](auto a) {
70032b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali      print("a = ", a, "\n");
70132b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali      foo(a);
70232b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali      return [](decltype(a) b) {
70332b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali        foo(b);
70432b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali        foo(sizeof(a) + sizeof(b));
70532b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali        return [](auto ... c) {
70632b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali          print("c = ", c ..., "\n");
70732b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali          foo(decltype(b){});
70832b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali          foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
70932b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali          return [](decltype(c) ... d) ->decltype(a) { //expected-note{{candidate}}
71032b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali            print("d = ", d ..., "\n");
71132b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali            foo(decltype(b){});
71232b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali            foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
71332b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali            return decltype(a){};
71432b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali          };
71532b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali        };
71632b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali      };
71732b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali    };
71832b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali    return L;
71932b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali  }
72032b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali
72132b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali};
72232b5ca012c42d418c9ff0d4175b17f174459e187Faisal ValiX x;
72332b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiauto L = x.test();
72432b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiauto L_test = L('4');
72532b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiauto M = L('3');
72632b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiauto M_test = M('a');
72732b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiauto N = M('x');
72832b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiauto O = N("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
72932b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valichar (*np)(const char*, int, const char*, double, const char*, int) = O;
73032b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiauto NP_result = np("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
73132b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiint (*np2)(const char*, int, const char*, double, const char*, int) = O; // expected-error{{no viable conversion}}
732a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
733a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali} //end at_ns_scope_within_class_member
734a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
735a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
736a3d311e468bce37defb97ed75105f8d36942b651Faisal Valinamespace nested_generic_lambdas_123 {
737a3d311e468bce37defb97ed75105f8d36942b651Faisal Valivoid test() {
738a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto L = [](auto a) -> int {
739a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    auto M = [](auto b, decltype(a) b2) -> int {
740a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali      return 1;
741a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    };
742a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    M(a, a);
743a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  };
744a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  L(3);
745a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali}
746a3d311e468bce37defb97ed75105f8d36942b651Faisal Valitemplate<class T> void foo(T) {
747a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali auto L = [](auto a) { return a; };
748a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali}
749a3d311e468bce37defb97ed75105f8d36942b651Faisal Valitemplate void foo(int);
750a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali} // end ns nested_generic_lambdas_123
751a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
752605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Valinamespace nested_fptr_235 {
753605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Valiint test()
754605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali{
755605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali  auto L = [](auto b) {
756605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali    return [](auto a) ->decltype(a) { return a; };
757605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali  };
758605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali  int (*fp)(int) = L(8);
759605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali  fp(5);
760605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali  L(3);
761605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali  char (*fc)(char) = L('a');
762605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali  fc('b');
763605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali  L('c');
764605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali  double (*fd)(double) = L(3.14);
765605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali  fd(3.14);
766605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali  fd(6.26);
767605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali  return 0;
768605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali}
769605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Valiint run = test();
770605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali}
771605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali
772605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali
773605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Valinamespace fptr_with_decltype_return_type {
774605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Valitemplate<class F, class ... Rest> F& FirstArg(F& f, Rest& ... r) { return f; };
775605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Valitemplate<class ... Ts> auto vfun(Ts&& ... ts) {
776605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali  print(ts...);
777605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali  return FirstArg(ts...);
778605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali}
779605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Valiint test()
780605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali{
781605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali {
782605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali   auto L = [](auto ... As) {
783605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali    return [](auto b) ->decltype(b) {
784651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      vfun([](decltype(As) a) -> decltype(a) { return a; } ...)(first<decltype(As)...>{});
785605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali      return decltype(b){};
786605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali    };
787605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali   };
788605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali   auto LL = L(1, 'a', 3.14, "abc");
789605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali   LL("dim");
790605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali }
791605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali  return 0;
792605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali}
793605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Valiint run = test();
794605f91ffd18f35ffcb5fcdd38379bd09b67a6cb8Faisal Vali}
795a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
796a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali} // end ns nested_non_capturing_lambda_tests
797a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
798a3d311e468bce37defb97ed75105f8d36942b651Faisal Valinamespace PR17476 {
799a3d311e468bce37defb97ed75105f8d36942b651Faisal Valistruct string {
800a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  string(const char *__s) { }
801a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  string &operator+=(const string &__str) { return *this; }
802a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali};
803a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
804a3d311e468bce37defb97ed75105f8d36942b651Faisal Valitemplate <class T>
805a3d311e468bce37defb97ed75105f8d36942b651Faisal Valivoid finalizeDefaultAtomValues() {
806a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto startEnd = [](const char * sym) -> void {
807a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    string start("__");
808a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    start += sym;
809a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  };
810a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  startEnd("preinit_array");
811a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali}
812a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
813a3d311e468bce37defb97ed75105f8d36942b651Faisal Valivoid f() { finalizeDefaultAtomValues<char>(); }
814a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
815a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali}
816a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
817a3d311e468bce37defb97ed75105f8d36942b651Faisal Valinamespace PR17476_variant {
818a3d311e468bce37defb97ed75105f8d36942b651Faisal Valistruct string {
819a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  string(const char *__s) { }
820a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  string &operator+=(const string &__str) { return *this; }
821a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali};
822a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
823a3d311e468bce37defb97ed75105f8d36942b651Faisal Valitemplate <class T>
824a3d311e468bce37defb97ed75105f8d36942b651Faisal Valivoid finalizeDefaultAtomValues() {
825a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  auto startEnd = [](const T *sym) -> void {
826a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    string start("__");
827a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali    start += sym;
828a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  };
829a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali  startEnd("preinit_array");
830a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali}
831a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
832a3d311e468bce37defb97ed75105f8d36942b651Faisal Valivoid f() { finalizeDefaultAtomValues<char>(); }
833a3d311e468bce37defb97ed75105f8d36942b651Faisal Vali
834394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Vali}
835394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Vali
836394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Valinamespace PR17877_lambda_declcontext_and_get_cur_lambda_disconnect {
837394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Vali
838394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Vali
839394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Valitemplate<class T> struct U {
840394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Vali  int t = 0;
841394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Vali};
842394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Vali
843394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Valitemplate<class T>
844394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Valistruct V {
845394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Vali  U<T> size() const { return U<T>{}; }
846394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Vali};
847394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Vali
848394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Valitemplate<typename T>
849394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Valivoid Do() {
850394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Vali  V<int> v{};
851394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Vali  [=] { v.size(); };
852394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Vali}
853394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Vali
854b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling}
855b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling
856b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendlingnamespace inclass_lambdas_within_nested_classes {
857b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendlingnamespace ns1 {
858b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling
859b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendlingstruct X1 {
860b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling  struct X2 {
861b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    enum { E = [](auto i) { return i; }(3) }; //expected-error{{inside of a constant expression}}\
86287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                          //expected-error{{constant}}\
863176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                          //expected-note{{non-literal type}}
864b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    int L = ([] (int i) { return i; })(2);
865b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    void foo(int i = ([] (int i) { return i; })(2)) { }
866b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    int B : ([](int i) { return i; })(3); //expected-error{{inside of a constant expression}}\
867176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                          //expected-error{{not an integral constant}}\
868176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                          //expected-note{{non-literal type}}
869b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    int arr[([](int i) { return i; })(3)]; //expected-error{{inside of a constant expression}}\
870b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling                                           //expected-error{{must have a constant size}}
871b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    int (*fp)(int) = [](int i) { return i; };
872b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    void fooptr(int (*fp)(char) = [](char c) { return 0; }) { }
873b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    int L2 = ([](auto i) { return i; })(2);
874b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    void fooG(int i = ([] (auto i) { return i; })(2)) { }
875b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    int BG : ([](auto i) { return i; })(3); //expected-error{{inside of a constant expression}}  \
876176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                            //expected-error{{not an integral constant}}\
877176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                            //expected-note{{non-literal type}}
878b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    int arrG[([](auto i) { return i; })(3)]; //expected-error{{inside of a constant expression}}\
879176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                             //expected-error{{must have a constant size}}
880b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    int (*fpG)(int) = [](auto i) { return i; };
881b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    void fooptrG(int (*fp)(char) = [](auto c) { return 0; }) { }
882b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling  };
883b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling};
884b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling} //end ns
885b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling
886b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendlingnamespace ns2 {
887b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendlingstruct X1 {
888b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling  template<class T>
889b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling  struct X2 {
890b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    int L = ([] (T i) { return i; })(2);
891b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    void foo(int i = ([] (int i) { return i; })(2)) { }
892b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    int B : ([](T i) { return i; })(3); //expected-error{{inside of a constant expression}}\
893176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                        //expected-error{{not an integral constant}}\
894176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                        //expected-note{{non-literal type}}
895b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    int arr[([](T i) { return i; })(3)]; //expected-error{{inside of a constant expression}}\
896176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                         //expected-error{{must have a constant size}}
897b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    int (*fp)(T) = [](T i) { return i; };
898b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    void fooptr(T (*fp)(char) = [](char c) { return 0; }) { }
899b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    int L2 = ([](auto i) { return i; })(2);
900b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    void fooG(T i = ([] (auto i) { return i; })(2)) { }
901176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int BG : ([](auto i) { return i; })(3); //expected-error{{not an integral constant}}\
902b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                                            //expected-note{{non-literal type}}\
903b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                                            //expected-error{{inside of a constant expression}}
904b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    int arrG[([](auto i) { return i; })(3)]; //expected-error{{must have a constant size}} \
905b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                                             //expected-error{{inside of a constant expression}}
906b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    int (*fpG)(T) = [](auto i) { return i; };
907b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    void fooptrG(T (*fp)(char) = [](auto c) { return 0; }) { }
908b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    template<class U = char> int fooG2(T (*fp)(U) = [](auto a) { return 0; }) { return 0; }
909b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling    template<class U = char> int fooG3(T (*fp)(U) = [](auto a) { return 0; });
910b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling  };
911b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling};
912b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendlingtemplate<class T>
913b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendlingtemplate<class U>
914b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendlingint X1::X2<T>::fooG3(T (*fp)(U)) { return 0; }
915b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill WendlingX1::X2<int> x2; //expected-note 3{{in instantiation of}}
916b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendlingint run1 = x2.fooG2();
917b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendlingint run2 = x2.fooG3();
918b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling} // end ns
919b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling
920b7accd0f5690bdeb4bfa23380f33b0c38bfb4e52Bill Wendling
921394558e6a1329b791de69d0fc7c618eac0dbc982Faisal Vali
922651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} //end ns inclass_lambdas_within_nested_classes
9230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
9240e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesnamespace pr21684_disambiguate_auto_followed_by_ellipsis_no_id {
9250e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesint a = [](auto ...) { return 0; }();
9260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
9270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
9280e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesnamespace PR22117 {
9290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int x = [](auto) {
9300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    return [](auto... run_args) {
9310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      using T = int(decltype(run_args)...);
9320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      return 0;
9330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    };
9340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  }(0)(0);
9350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
93687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
93787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarnamespace PR23716 {
93887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate<typename T>
93987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarauto f(T x) {
94087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  auto g = [](auto&&... args) {
94187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    auto h = [args...]() -> int {
94287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return 0;
94387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    };
94487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return h;
94587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  };
94687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return g;
94787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
94887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
94987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarauto x = f(0)();
95087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
95187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
95287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarnamespace PR13987 {
95387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass Enclosing {
95487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void Method(char c = []()->char {
95587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int d = [](auto x)->int {
95687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        struct LocalClass {
95787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar          int Method() { return 0; }
95887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        };
95987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return 0;
96087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    }(0);
96187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return d; }()
96287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  );
96387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
96487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
96587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass Enclosing2 {
96687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void Method(char c = [](auto x)->char {
96787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int d = []()->int {
96887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        struct LocalClass {
96987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar          int Method() { return 0; }
97087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        };
97187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return 0;
97287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    }();
97387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return d; }(0)
97487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  );
97587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
97687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
97787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass Enclosing3 {
97887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void Method(char c = [](auto x)->char {
97987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int d = [](auto y)->int {
98087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        struct LocalClass {
98187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar          int Method() { return 0; }
98287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        };
98387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return 0;
98487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    }(0);
98587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return d; }(0)
98687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  );
98787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
98887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
989