1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s 3*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 4*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s -fdelayed-template-parsing 5*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s -fdelayed-template-parsing 6*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s -fdelayed-template-parsing 7*67e74705SXin Li 8*67e74705SXin Li template<typename T> struct A {}; 9*67e74705SXin Li 10*67e74705SXin Li // Check for template argument lists followed by junk 11*67e74705SXin Li // FIXME: The diagnostics here aren't great... 12*67e74705SXin Li A<int+> int x; // expected-error {{expected '>'}} expected-error {{expected unqualified-id}} 13*67e74705SXin Li A<int x; // expected-error {{type-id cannot have a name}} expected-error {{expected '>'}} 14*67e74705SXin Li 15*67e74705SXin Li // PR8912 16*67e74705SXin Li template <bool> struct S {}; 17*67e74705SXin Li S<bool(2 > 1)> s; 18*67e74705SXin Li 19*67e74705SXin Li // Test behavior when a template-id is ended by a token which starts with '>'. 20*67e74705SXin Li namespace greatergreater { 21*67e74705SXin Li template<typename T> struct S { S(); S(T); }; 22*67e74705SXin Li void f(S<int>=0); // expected-error {{a space is required between a right angle bracket and an equals sign (use '> =')}} 23*67e74705SXin Li void f(S<S<int>>=S<int>()); // expected-error {{use '> >'}} expected-error {{use '> ='}} 24*67e74705SXin Li template<typename T> void t(); g()25*67e74705SXin Li void g() { 26*67e74705SXin Li void (*p)() = &t<int>; 27*67e74705SXin Li (void)(&t<int>==p); // expected-error {{use '> ='}} 28*67e74705SXin Li (void)(&t<int>>=p); // expected-error {{use '> >'}} 29*67e74705SXin Li (void)(&t<S<int>>>=p); 30*67e74705SXin Li #if __cplusplus <= 199711L 31*67e74705SXin Li // expected-error@-2 {{use '> >'}} 32*67e74705SXin Li #endif 33*67e74705SXin Li (void)(&t<S<int>>==p); // expected-error {{use '> >'}} expected-error {{use '> ='}} 34*67e74705SXin Li } 35*67e74705SXin Li } 36*67e74705SXin Li 37*67e74705SXin Li namespace PR5925 { 38*67e74705SXin Li template <typename x> 39*67e74705SXin Li class foo { // expected-note {{here}} 40*67e74705SXin Li }; bar(foo * X)41*67e74705SXin Li void bar(foo *X) { // expected-error {{requires template arguments}} 42*67e74705SXin Li } 43*67e74705SXin Li } 44*67e74705SXin Li 45*67e74705SXin Li namespace PR13210 { 46*67e74705SXin Li template <class T> 47*67e74705SXin Li class C {}; // expected-note {{here}} 48*67e74705SXin Li f()49*67e74705SXin Li void f() { 50*67e74705SXin Li new C(); // expected-error {{requires template arguments}} 51*67e74705SXin Li } 52*67e74705SXin Li } 53*67e74705SXin Li 54*67e74705SXin Li // Don't emit spurious messages 55*67e74705SXin Li namespace pr16225add { 56*67e74705SXin Li 57*67e74705SXin Li template<class T1, typename T2> struct Known { }; // expected-note 3 {{template is declared here}} 58*67e74705SXin Li template<class T1, typename T2> struct X; 59*67e74705SXin Li template<class T1, typename T2> struct ABC; // expected-note {{template is declared here}} 60*67e74705SXin Li template<int N1, int N2> struct ABC2 {}; 61*67e74705SXin Li 62*67e74705SXin Li template<class T1, typename T2> struct foo : 63*67e74705SXin Li UnknownBase<T1,T2> // expected-error {{unknown template name 'UnknownBase'}} 64*67e74705SXin Li { }; 65*67e74705SXin Li 66*67e74705SXin Li template<class T1, typename T2> struct foo2 : 67*67e74705SXin Li UnknownBase<T1,T2>, // expected-error {{unknown template name 'UnknownBase'}} 68*67e74705SXin Li Known<T1> // expected-error {{too few template arguments for class template 'Known'}} 69*67e74705SXin Li { }; 70*67e74705SXin Li 71*67e74705SXin Li template<class T1, typename T2> struct foo3 : 72*67e74705SXin Li UnknownBase<T1,T2,ABC<T2,T1> > // expected-error {{unknown template name 'UnknownBase'}} 73*67e74705SXin Li { }; 74*67e74705SXin Li 75*67e74705SXin Li template<class T1, typename T2> struct foo4 : 76*67e74705SXin Li UnknownBase<T1,ABC<T2> >, // expected-error {{unknown template name 'UnknownBase'}} \ 77*67e74705SXin Li // expected-error {{too few template arguments for class template 'ABC'}} 78*67e74705SXin Li Known<T1> // expected-error {{too few template arguments for class template 'Known'}} 79*67e74705SXin Li { }; 80*67e74705SXin Li 81*67e74705SXin Li template<class T1, typename T2> struct foo5 : 82*67e74705SXin Li UnknownBase<T1,T2,ABC<T2,T1>> // expected-error {{unknown template name 'UnknownBase'}} 83*67e74705SXin Li #if __cplusplus <= 199711L 84*67e74705SXin Li // expected-error@-2 {{use '> >'}} 85*67e74705SXin Li #endif 86*67e74705SXin Li { }; 87*67e74705SXin Li 88*67e74705SXin Li template<class T1, typename T2> struct foo6 : 89*67e74705SXin Li UnknownBase<T1,ABC<T2,T1>>, // expected-error {{unknown template name 'UnknownBase'}} 90*67e74705SXin Li #if __cplusplus <= 199711L 91*67e74705SXin Li // expected-error@-2 {{use '> >'}} 92*67e74705SXin Li #endif 93*67e74705SXin Li Known<T1> // expected-error {{too few template arguments for class template 'Known'}} 94*67e74705SXin Li { }; 95*67e74705SXin Li 96*67e74705SXin Li template<class T1, typename T2, int N> struct foo7 : 97*67e74705SXin Li UnknownBase<T1,T2,(N>1)> // expected-error {{unknown template name 'UnknownBase'}} 98*67e74705SXin Li { }; 99*67e74705SXin Li 100*67e74705SXin Li template<class T1, typename T2> struct foo8 : 101*67e74705SXin Li UnknownBase<X<int,int>,X<int,int>> // expected-error {{unknown template name 'UnknownBase'}} 102*67e74705SXin Li #if __cplusplus <= 199711L 103*67e74705SXin Li // expected-error@-2 {{use '> >'}} 104*67e74705SXin Li #endif 105*67e74705SXin Li { }; 106*67e74705SXin Li 107*67e74705SXin Li template<class T1, typename T2> struct foo9 : 108*67e74705SXin Li UnknownBase<Known<int,int>,X<int,int>> // expected-error {{unknown template name 'UnknownBase'}} 109*67e74705SXin Li #if __cplusplus <= 199711L 110*67e74705SXin Li // expected-error@-2 {{use '> >'}} 111*67e74705SXin Li #endif 112*67e74705SXin Li { }; 113*67e74705SXin Li 114*67e74705SXin Li template<class T1, typename T2> struct foo10 : 115*67e74705SXin Li UnknownBase<Known<int,int>,X<int,X<int,int>>> // expected-error {{unknown template name 'UnknownBase'}} 116*67e74705SXin Li #if __cplusplus <= 199711L 117*67e74705SXin Li // expected-error@-2 {{use '> >'}} 118*67e74705SXin Li #endif 119*67e74705SXin Li { }; 120*67e74705SXin Li 121*67e74705SXin Li template<int N1, int N2> struct foo11 : 122*67e74705SXin Li UnknownBase<2<N1,N2<4> // expected-error {{unknown template name 'UnknownBase'}} 123*67e74705SXin Li { }; 124*67e74705SXin Li 125*67e74705SXin Li } 126*67e74705SXin Li 127*67e74705SXin Li namespace PR18793 { 128*67e74705SXin Li template<typename T, T> struct S {}; 129*67e74705SXin Li template<typename T> int g(S<T, (T())> *); 130*67e74705SXin Li } 131