1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++1y -DCXX1Y 2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace test_factorial { 4651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesauto Fact = [](auto Self, unsigned n) -> unsigned { 6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return !n ? 1 : Self(Self, n - 1) * n; 7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesauto six = Fact(Fact, 3); 10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace overload_generic_lambda { 14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <class F1, class F2> struct overload : F1, F2 { 15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using F1::operator(); 16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using F2::operator(); 17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines overload(F1 f1, F2 f2) : F1(f1), F2(f2) { } 18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto NumParams = [](auto Self, auto h, auto ... rest) -> unsigned { 21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return 1 + Self(Self, rest...); 22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto Base = [](auto Self, auto h) -> unsigned { 24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return 1; 25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines overload<decltype(Base), decltype(NumParams)> O(Base, NumParams); 27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int num_params = O(O, 5, 3, "abc", 3.14, 'a'); 28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace overload_generic_lambda_return_type_deduction { 32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <class F1, class F2> struct overload : F1, F2 { 33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using F1::operator(); 34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using F2::operator(); 35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines overload(F1 f1, F2 f2) : F1(f1), F2(f2) { } 36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto NumParams = [](auto Self, auto h, auto ... rest) { 39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return 1 + Self(Self, rest...); 40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto Base = [](auto Self, auto h) { 42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return 1; 43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines overload<decltype(Base), decltype(NumParams)> O(Base, NumParams); 45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int num_params = O(O, 5, 3, "abc", 3.14, 'a'); 46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace test_standard_p5 { 49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// FIXME: This test should eventually compile without an explicit trailing return type 50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesauto glambda = [](auto a, auto&& b) ->bool { return a < b; }; 51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool b = glambda(3, 3.14); // OK 52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace test_deduction_failure { 55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int test() { 56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto g = [](auto *a) { //expected-note{{candidate template ignored}} 57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return a; 58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct X { }; 60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines X *x; 61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines g(x); 62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines g(3); //expected-error{{no matching function}} 63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return 0; 64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace test_instantiation_or_sfinae_failure { 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint test2() { 70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines { 71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto L = [](auto *a) { 72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return (*a)(a); }; //expected-error{{called object type 'double' is not a function}} 73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines double d; 74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines L(&d); //expected-note{{in instantiation of}} 75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto M = [](auto b) { return b; }; 76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines L(&M); // ok 77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines { 79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto L = [](auto *a) ->decltype (a->foo()) { //expected-note2{{candidate template ignored:}} 80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return (*a)(a); }; 81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines double d; 82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines L(&d); //expected-error{{no matching function for call}} 83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto M = [](auto b) { return b; }; 84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines L(&M); //expected-error{{no matching function for call}} 85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return 0; 88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace test_misc { 94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesauto GL = [](auto a, decltype(a) b) //expected-note{{candidate function}} 95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines -> int { return a + b; }; 96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid test() { 98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct X { }; 99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines GL(3, X{}); //expected-error{{no matching function}} 100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid test2() { 103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto l = [](auto *a) -> int { 104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (*a)(a); return 0; }; //expected-error{{called object type 'double' is not a function}} 105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines l(&l); 106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines double d; 107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines l(&d); //expected-note{{in instantiation of}} 108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace nested_lambdas { 113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int test() { 114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto L = [](auto a) { 115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return [=](auto b) { 116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return a + b; 117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto get_lambda() { 121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return [](auto a) { 122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return a; 123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int test2() { 127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto L = get_lambda(); 128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines L(3); 129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 132