brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · 415c3d8 Raw
132 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++1y -DCXX1Y 2 3namespace test_factorial {4 5auto Fact = [](auto Self, unsigned n) -> unsigned {6    return !n ? 1 : Self(Self, n - 1) * n;7};8 9auto six = Fact(Fact, 3);10 11}12 13namespace overload_generic_lambda {14  template <class F1, class F2> struct overload : F1, F2 {15    using F1::operator();16    using F2::operator();17    overload(F1 f1, F2 f2) : F1(f1), F2(f2) { }18  };19 20  auto NumParams = [](auto Self, auto h, auto ... rest) -> unsigned {21    return 1 + Self(Self, rest...);22  };23  auto Base = [](auto Self, auto h) -> unsigned {24      return 1;25  };26  overload<decltype(Base), decltype(NumParams)> O(Base, NumParams);27  int num_params =  O(O, 5, 3, "abc", 3.14, 'a');28}29 30 31namespace overload_generic_lambda_return_type_deduction {32  template <class F1, class F2> struct overload : F1, F2 {33    using F1::operator();34    using F2::operator();35    overload(F1 f1, F2 f2) : F1(f1), F2(f2) { }36  };37 38  auto NumParams = [](auto Self, auto h, auto ... rest) {39    return 1 + Self(Self, rest...);40  };41  auto Base = [](auto Self, auto h) {42      return 1;43  };44  overload<decltype(Base), decltype(NumParams)> O(Base, NumParams);45  int num_params =  O(O, 5, 3, "abc", 3.14, 'a');46}47 48namespace test_standard_p5 {49// FIXME: This test should eventually compile without an explicit trailing return type50auto glambda = [](auto a, auto&& b) ->bool { return a < b; };51bool b = glambda(3, 3.14); // OK52 53}54namespace test_deduction_failure {55 int test() {56   auto g = [](auto *a) { //expected-note{{candidate template ignored}}57    return a;58   };59   struct X { };60   X *x;61   g(x);62   g(3); //expected-error{{no matching function}}63   return 0;64 }65 66}67  68namespace test_instantiation_or_sfinae_failure {69int test2() {70  {71    auto L = [](auto *a) { 72                return (*a)(a); }; //expected-error{{called object type 'double' is not a function}}73    double d;74    L(&d); //expected-note{{in instantiation of}}75    auto M = [](auto b) { return b; };76    L(&M); // ok77  }78  {79    auto L = [](auto *a) ->decltype (a->foo()) { //expected-note2{{candidate template ignored:}}80                return (*a)(a); }; 81    double d;82    L(&d); //expected-error{{no matching function for call}} 83    auto M = [](auto b) { return b; };84    L(&M); //expected-error{{no matching function for call}} 85 86  }87  return 0;88}89 90 91}92  93namespace test_misc {94auto GL = [](auto a, decltype(a) b) //expected-note{{candidate function}} 95                -> int { return a + b; };96 97void test() {98   struct X { };99   GL(3, X{}); //expected-error{{no matching function}}100}101 102void test2() {103  auto l = [](auto *a) -> int { 104              (*a)(a); return 0; }; //expected-error{{called object type 'double' is not a function}}105  l(&l);106  double d;107  l(&d); //expected-note{{in instantiation of}}108}109 110}111 112namespace nested_lambdas {113  int test() {114    auto L = [](auto a) {115                 return [=](auto b) {  116                           return a + b;117                        };118              };119  }120  auto get_lambda() {121    return [](auto a) {122      return a; 123    };124  };125  126  int test2() {127    auto L = get_lambda();128    L(3);129  }130}131 132