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