xref: /aosp_15_r20/external/clang/test/Parser/cxx-template-argument.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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