blob: 8bf2a4f78addbd6b0c95f57d1819390644c862c0 [file] [log] [blame]
Eli Friedmanaffd5fd2009-12-27 22:31:18 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s
2
3template<typename T> struct A {};
4
5// Check for template argument lists followed by junk
6// FIXME: The diagnostics here aren't great...
7A<int+> int x; // expected-error {{expected '>'}} expected-error {{expected unqualified-id}}
Richard Smith9ce302e2013-07-11 05:10:21 +00008A<int x; // expected-error {{type-id cannot have a name}} expected-error {{expected '>'}}
Eli Friedmanaffd5fd2009-12-27 22:31:18 +00009
Douglas Gregor94a32472011-01-11 00:33:19 +000010// PR8912
11template <bool> struct S {};
12S<bool(2 > 1)> s;
Richard Smith7b3f3222012-06-18 06:11:04 +000013
14// Test behavior when a template-id is ended by a token which starts with '>'.
15namespace 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}
Richard Smith4f605af2012-08-18 00:55:03 +000028
29namespace 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
37namespace 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}
Serge Pavlovb716b3c2013-08-10 05:54:47 +000045
46// Don't emit spurious messages
47namespace 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}