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