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