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 {{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