1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -verify %s 2*67e74705SXin Li 3*67e74705SXin Li template<typename ...T> struct X {}; 4*67e74705SXin Li 5*67e74705SXin Li template<typename T, typename U> struct P {}; 6*67e74705SXin Li 7*67e74705SXin Li namespace Nested { 8*67e74705SXin Li template<typename ...T> int f1(X<T, T...>... a); // expected-note +{{conflicting types for parameter 'T'}} 9*67e74705SXin Li template<typename ...T> int f2(P<X<T...>, T> ...a); // expected-note +{{conflicting types for parameter 'T'}} 10*67e74705SXin Li 11*67e74705SXin Li int a1 = f1(X<int, int, double>(), X<double, int, double>()); 12*67e74705SXin Li int a2 = f1(X<int, int>()); 13*67e74705SXin Li int a3 = f1(X<int>(), X<double>()); // expected-error {{no matching}} 14*67e74705SXin Li int a4 = f1(X<int, int>(), X<int>()); // expected-error {{no matching}} 15*67e74705SXin Li int a5 = f1(X<int>(), X<int, int>()); // expected-error {{no matching}} 16*67e74705SXin Li int a6 = f1(X<int, int, int>(), X<int, int, int>(), X<int, int, int, int>()); // expected-error {{no matching}} 17*67e74705SXin Li 18*67e74705SXin Li int b1 = f2(P<X<int, double>, int>(), P<X<int, double>, double>()); 19*67e74705SXin Li int b2 = f2(P<X<int, double>, int>(), P<X<int, double>, double>(), P<X<int, double>, char>()); // expected-error {{no matching}} 20*67e74705SXin Li } 21*67e74705SXin Li 22*67e74705SXin Li namespace PR14841 { 23*67e74705SXin Li template<typename T, typename U> struct A {}; 24*67e74705SXin Li template<typename ...Ts> void f(A<Ts...>); // expected-note {{substitution failure [with Ts = <char, short, int>]: too many template arg}} 25*67e74705SXin Li g(A<char,short> a)26*67e74705SXin Li void g(A<char, short> a) { 27*67e74705SXin Li f(a); 28*67e74705SXin Li f<char>(a); 29*67e74705SXin Li f<char, short>(a); 30*67e74705SXin Li f<char, short, int>(a); // expected-error {{no matching function}} 31*67e74705SXin Li } 32*67e74705SXin Li } 33*67e74705SXin Li 34*67e74705SXin Li namespace RetainExprPacks { 35*67e74705SXin Li int f(int a, int b, int c); 36*67e74705SXin Li template<typename ...Ts> struct X {}; 37*67e74705SXin Li template<typename ...Ts> int g(X<Ts...>, decltype(f(Ts()...))); 38*67e74705SXin Li int n = g<int, int>(X<int, int, int>(), 0); 39*67e74705SXin Li } 40*67e74705SXin Li 41*67e74705SXin Li namespace PR14615 { 42*67e74705SXin Li namespace comment0 { 43*67e74705SXin Li template <class A, class...> struct X {}; 44*67e74705SXin Li template <class... B> struct X<int, B...> { 45*67e74705SXin Li typedef int type; 46*67e74705SXin Li struct valid {}; 47*67e74705SXin Li }; 48*67e74705SXin Li template <typename A, typename... B, typename T = X<A, B...>, 49*67e74705SXin Li typename = typename T::valid> 50*67e74705SXin Li typename T::type check(int); 51*67e74705SXin Li int i = check<int, char>(1); 52*67e74705SXin Li } 53*67e74705SXin Li 54*67e74705SXin Li namespace comment2 { 55*67e74705SXin Li template <class...> struct X; 56*67e74705SXin Li template <typename... B, typename X<B...>::type I = 0> 57*67e74705SXin Li char check(B...); // expected-note {{undefined template 'PR14615::comment2::X<char, int>'}} f()58*67e74705SXin Li void f() { check<char>(1, 2); } // expected-error {{no matching function}} 59*67e74705SXin Li } 60*67e74705SXin Li 61*67e74705SXin Li namespace comment3 { 62*67e74705SXin Li template <class...> struct X; 63*67e74705SXin Li template <typename... B, typename X<B...>::type I = (typename X<B...>::type)0> 64*67e74705SXin Li char check(B...); // expected-note {{undefined template 'PR14615::comment3::X<char, int>'}} f()65*67e74705SXin Li void f() { check<char>(1, 2); } // expected-error {{no matching function}} 66*67e74705SXin Li } 67*67e74705SXin Li } 68