Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks %s
      2 // RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fdelayed-template-parsing %s -DDELAYED_TEMPLATE_PARSING
      3 // RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fms-extensions %s -DMS_EXTENSIONS
      4 // RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fdelayed-template-parsing -fms-extensions %s -DMS_EXTENSIONS -DDELAYED_TEMPLATE_PARSING
      5 
      6 namespace explicit_argument_variadics {
      7 
      8 
      9 template<class ... Ts> void print(Ts ... ) { }
     10 
     11 struct X { };
     12 struct Y { };
     13 struct Z { };
     14 
     15 int test() {
     16   {
     17     auto L = [](auto ... as) { };
     18     L.operator()<bool>(true);
     19   }
     20   {
     21     auto L = [](auto a) { };
     22     L.operator()<bool>(false);
     23   }
     24   {
     25     auto L = [](auto a, auto b) { };
     26     L.operator()<bool>(false, 'a');
     27   }
     28   {
     29     auto L = [](auto a, auto b) { };
     30     L.operator()<bool, char>(false, 'a');
     31   }
     32   {
     33     auto L = [](auto a, auto b, auto ... cs) { };
     34     L.operator()<bool, char>(false, 'a');
     35     L.operator()<bool, char, const char*>(false, 'a', "jim");
     36   }
     37 
     38   {
     39     auto L = [](auto ... As) {
     40     };
     41     L.operator()<bool, double>(false, 3.14, "abc");
     42   }
     43   {
     44     auto L = [](auto A, auto B, auto ... As) {
     45     };
     46     L.operator()<bool>(false, 3.14, "abc");
     47     L.operator()<bool, char>(false, 3.14, "abc"); //expected-warning{{implicit conversion}}
     48     L.operator()<X, Y, bool, Z>(X{}, Y{}, 3.14, Z{}, X{}); //expected-warning{{implicit conversion}}
     49   }
     50   {
     51     auto L = [](auto ... As) {
     52       print("\nL::As = ", As ...);
     53       return [](decltype(As) ... as, auto ... Bs) {
     54         print("\nL::Inner::as = ", as ...);
     55         print("\nL::Inner::Bs = ", Bs ...);
     56         return 4;
     57       };
     58     };
     59     auto M = L.operator()<bool, double>(false, 3.14, "abc");
     60     M(false, 6.26, "jim", true);
     61     M.operator()<bool>(true, 6.26, "jim", false, 3.14);
     62   }
     63   {
     64     auto L = [](auto A, auto ... As) {
     65       print("\nL::As = ", As ...);
     66       return [](decltype(As) ... as, decltype(A) a, auto ... Bs) {
     67         print("\nL::Inner::as = ", as ...);
     68         print("\nL::Inner::Bs = ", Bs ...);
     69         return 4;
     70       };
     71     };
     72     auto M = L.operator()<bool, double>(false, 3.14, "abc");
     73     M(6.26, "jim", true);
     74     M.operator()<X>(6.26, "jim", false, X{}, Y{}, Z{});
     75   }
     76 
     77   return 0;
     78 }
     79  int run = test();
     80 } // end ns explicit_argument_extension
     81 
     82 
     83 
     84 #ifdef PR18499_FIXED
     85 namespace variadic_expansion {
     86   void f(int &, char &);
     87 
     88   template <typename ... T> void g(T &... t) {
     89     f([&a(t)]()->decltype(auto) {
     90       return a;
     91     }() ...);
     92     f([&a(f([&b(t)]()->decltype(auto) { return b; }()...), t)]()->decltype(auto) {
     93       return a;
     94     }()...);
     95   }
     96 
     97   void h(int i, char c) { g(i, c); }
     98 }
     99 #endif
    100 
    101