xref: /aosp_15_r20/external/clang/test/SemaCXX/cxx1y-variable-templates_top_level.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c++98 -verify -fsyntax-only -Wno-c++11-extensions -Wno-c++1y-extensions %s -DPRECXX11
2*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -verify -fsyntax-only -Wno-c++1y-extensions %s
3*67e74705SXin Li // RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only %s
4*67e74705SXin Li 
5*67e74705SXin Li #ifdef PRECXX11
6*67e74705SXin Li   #define CONST const
7*67e74705SXin Li #else
8*67e74705SXin Li   #define CONST constexpr
9*67e74705SXin Li #endif
10*67e74705SXin Li 
11*67e74705SXin Li template<typename T>
12*67e74705SXin Li T pi = T(3.1415926535897932385); // expected-note {{template is declared here}}
13*67e74705SXin Li 
14*67e74705SXin Li template<typename T>
15*67e74705SXin Li CONST T cpi = T(3.1415926535897932385); // expected-note {{template is declared here}}
16*67e74705SXin Li 
17*67e74705SXin Li template<typename T> extern CONST T vc;
18*67e74705SXin Li #ifndef PRECXX11
19*67e74705SXin Li // expected-error@-2 {{constexpr variable declaration must be a definition}}
20*67e74705SXin Li #endif
21*67e74705SXin Li 
22*67e74705SXin Li namespace use_in_top_level_funcs {
23*67e74705SXin Li 
good()24*67e74705SXin Li   void good() {
25*67e74705SXin Li     int ipi = pi<int>;
26*67e74705SXin Li     int icpi = cpi<int>;
27*67e74705SXin Li     double dpi = pi<double>;
28*67e74705SXin Li     double dcpi = cpi<double>;
29*67e74705SXin Li   }
30*67e74705SXin Li 
no_deduce()31*67e74705SXin Li   void no_deduce() {
32*67e74705SXin Li     // template arguments are not deduced for uses of variable templates.
33*67e74705SXin Li     int ipi = pi; // expected-error {{cannot refer to variable template 'pi' without a template argument list}}
34*67e74705SXin Li     int icpi = cpi; // expected-error {{cannot refer to variable template 'cpi' without a template argument list}}
35*67e74705SXin Li   }
36*67e74705SXin Li 
37*67e74705SXin Li   template<typename T>
circular_area(T r)38*67e74705SXin Li   T circular_area(T r) {
39*67e74705SXin Li     return pi<T> * r * r;
40*67e74705SXin Li   }
41*67e74705SXin Li 
42*67e74705SXin Li   template<typename T>
const_circular_area(T r)43*67e74705SXin Li   CONST T const_circular_area(T r) {
44*67e74705SXin Li     return cpi<T> * r * r;
45*67e74705SXin Li   }
46*67e74705SXin Li 
use_circular_area(double r)47*67e74705SXin Li   double use_circular_area(double r) {
48*67e74705SXin Li     CONST float t = const_circular_area(2.0) - 12;
49*67e74705SXin Li #ifndef PRECXX11
50*67e74705SXin Li     static_assert(const_circular_area(2) == 12, "");
51*67e74705SXin Li     CONST int test = (t > 0) && (t < 1);
52*67e74705SXin Li     static_assert(test, "");
53*67e74705SXin Li #endif
54*67e74705SXin Li     return circular_area(r);
55*67e74705SXin Li   }
56*67e74705SXin Li }
57*67e74705SXin Li 
58*67e74705SXin Li namespace shadow {
foo()59*67e74705SXin Li   void foo() {
60*67e74705SXin Li     int ipi0 = pi<int>;
61*67e74705SXin Li     int pi;
62*67e74705SXin Li     int a = pi;
63*67e74705SXin Li     int ipi = pi<int>;  // expected-error {{expected '(' for function-style cast or type construction}} \
64*67e74705SXin Li                         // expected-error {{expected expression}}
65*67e74705SXin Li   }
66*67e74705SXin Li }
67*67e74705SXin Li 
68*67e74705SXin Li namespace odr_tmpl {
69*67e74705SXin Li   namespace pv_cvt {
70*67e74705SXin Li     int v;   // expected-note {{previous definition is here}}
71*67e74705SXin Li     template<typename T> T v; // expected-error {{redefinition of 'v' as different kind of symbol}}
72*67e74705SXin Li   }
73*67e74705SXin Li   namespace pvt_cv {
74*67e74705SXin Li     template<typename T> T v; // expected-note {{previous definition is here}}
75*67e74705SXin Li     int v;   // expected-error {{redefinition of 'v' as different kind of symbol}}
76*67e74705SXin Li   }
77*67e74705SXin Li   namespace pvt_cvt {
78*67e74705SXin Li     template<typename T> T v0; // expected-note {{previous definition is here}}
79*67e74705SXin Li     template<typename T> T v0; // expected-error {{redefinition of 'v0'}}
80*67e74705SXin Li 
81*67e74705SXin Li     template<typename T> T v; // expected-note {{previous definition is here}}
82*67e74705SXin Li     template<typename T> int v; // expected-error {{redefinition of 'v'}}
83*67e74705SXin Li 
84*67e74705SXin Li     template<typename T> extern int v1; // expected-note {{previous template declaration is here}}
85*67e74705SXin Li     template<int I> int v1;      // expected-error {{template parameter has a different kind in template redeclaration}}
86*67e74705SXin Li   }
87*67e74705SXin Li   namespace pvt_use {
88*67e74705SXin Li     template<typename T> T v;
89*67e74705SXin Li     v = 10;  // expected-error {{C++ requires a type specifier for all declarations}}
90*67e74705SXin Li   }
91*67e74705SXin Li 
92*67e74705SXin Li   namespace pvt_diff_params {
93*67e74705SXin Li     template<typename T, typename> T v;   // expected-note 2{{previous template declaration is here}}
94*67e74705SXin Li     template<typename T> T v;   // expected-error {{too few template parameters in template redeclaration}}
95*67e74705SXin Li     template<typename T, typename, typename> T v; // expected-error {{too many template parameters in template redeclaration}}
96*67e74705SXin Li   }
97*67e74705SXin Li 
98*67e74705SXin Li   namespace pvt_extern {
99*67e74705SXin Li     template<typename T> T v = T();
100*67e74705SXin Li     template<typename T> extern T v;      // redeclaration is allowed \
101*67e74705SXin Li                                           // expected-note {{previous declaration is here}}
102*67e74705SXin Li     template<typename T> extern int v;    // expected-error {{redeclaration of 'v' with a different type: 'int' vs 'T'}}
103*67e74705SXin Li 
104*67e74705SXin Li #ifndef PRECXX11
105*67e74705SXin Li     template<typename T> extern auto v;   // expected-error {{declaration of variable 'v' with type 'auto' requires an initializer}}
106*67e74705SXin Li #endif
107*67e74705SXin Li 
108*67e74705SXin Li     template<typename T> T var = T();     // expected-note {{previous definition is here}}
109*67e74705SXin Li     extern int var;                       // expected-error {{redefinition of 'var' as different kind of symbol}}
110*67e74705SXin Li   }
111*67e74705SXin Li 
112*67e74705SXin Li #ifndef PRECXX11
113*67e74705SXin Li   namespace pvt_auto {
114*67e74705SXin Li     template<typename T> auto v0; // expected-error {{declaration of variable 'v0' with type 'auto' requires an initializer}}
115*67e74705SXin Li     template<typename T> auto v1 = T();  // expected-note {{previous definition is here}}
116*67e74705SXin Li     template<typename T> int v1;   // expected-error {{redefinition of 'v1' with a different type: 'int' vs 'auto'}}
117*67e74705SXin Li     template<typename T> auto v2 = T();  // expected-note {{previous definition is here}}
118*67e74705SXin Li     template<typename T> T v2;   // expected-error {{redefinition of 'v2'}}
119*67e74705SXin Li     template<typename T> auto v3 = T();   // expected-note {{previous definition is here}}
120*67e74705SXin Li     template<typename T> extern T v3;     // expected-error {{redeclaration of 'v3' with a different type: 'T' vs 'auto'}}
121*67e74705SXin Li     template<typename T> auto v4 = T();
122*67e74705SXin Li     template<typename T> extern auto v4;   // expected-error {{declaration of variable 'v4' with type 'auto' requires an initializer}}
123*67e74705SXin Li   }
124*67e74705SXin Li #endif
125*67e74705SXin Li 
126*67e74705SXin Li }
127*67e74705SXin Li 
128*67e74705SXin Li namespace explicit_instantiation {
129*67e74705SXin Li   template<typename T>
130*67e74705SXin Li   T pi0a = T(3.1415926535897932385);  // expected-note {{variable template 'pi0a' declared here}}
131*67e74705SXin Li   template float pi0a<int>; // expected-error {{type 'float' of explicit instantiation of 'pi0a' does not match expected type 'int'}}
132*67e74705SXin Li 
133*67e74705SXin Li   template<typename T>
134*67e74705SXin Li   T pi0b = T(3.1415926535897932385);  // expected-note {{variable template 'pi0b' declared here}}
135*67e74705SXin Li   template CONST int pi0b<int>; // expected-error {{type 'const int' of explicit instantiation of 'pi0b' does not match expected type 'int'}}
136*67e74705SXin Li 
137*67e74705SXin Li   template<typename T>
138*67e74705SXin Li   T pi0c = T(3.1415926535897932385);  // expected-note {{variable template 'pi0c' declared here}}
139*67e74705SXin Li   template int pi0c<const int>;  // expected-error {{type 'int' of explicit instantiation of 'pi0c' does not match expected type 'const int'}}
140*67e74705SXin Li 
141*67e74705SXin Li   template<typename T>
142*67e74705SXin Li   T pi0 = T(3.1415926535897932385);
143*67e74705SXin Li   template int pi0<int>;   // expected-note {{previous explicit instantiation is here}}
144*67e74705SXin Li   template int pi0<int>;   // expected-error {{duplicate explicit instantiation of 'pi0<int>'}}
145*67e74705SXin Li 
146*67e74705SXin Li   template<typename T>
147*67e74705SXin Li   CONST T pi1a = T(3.1415926535897932385);  // expected-note {{variable template 'pi1a' declared here}}
148*67e74705SXin Li   template int pi1a<int>; // expected-error {{type 'int' of explicit instantiation of 'pi1a' does not match expected type 'const int'}}
149*67e74705SXin Li 
150*67e74705SXin Li   template<typename T>
151*67e74705SXin Li   CONST T pi1b = T(3.1415926535897932385);  // expected-note {{variable template 'pi1b' declared here}}
152*67e74705SXin Li   template int pi1b<const int>;  // expected-error {{type 'int' of explicit instantiation of 'pi1b' does not match expected type 'const const int'}}
153*67e74705SXin Li 
154*67e74705SXin Li   template<typename T>
155*67e74705SXin Li   CONST T pi1 = T(3.1415926535897932385);
156*67e74705SXin Li   template CONST int pi1<int>;   // expected-note {{previous explicit instantiation is here}}
157*67e74705SXin Li   template CONST int pi1<int>;   // expected-error {{duplicate explicit instantiation of 'pi1<int>'}}
158*67e74705SXin Li 
159*67e74705SXin Li #ifndef PRECXX11
160*67e74705SXin Li   namespace auto_var {
161*67e74705SXin Li     template<typename T> auto var0 = T();
162*67e74705SXin Li     template auto var0<int>;    // expected-error {{'auto' variable template instantiation is not allowed}}
163*67e74705SXin Li 
164*67e74705SXin Li     template<typename T> auto var = T();
165*67e74705SXin Li     template int var<int>;
166*67e74705SXin Li   }
167*67e74705SXin Li #endif
168*67e74705SXin Li 
169*67e74705SXin Li   template<typename=int> int missing_args; // expected-note {{here}}
170*67e74705SXin Li   template int missing_args; // expected-error {{must specify a template argument list}}
171*67e74705SXin Li 
172*67e74705SXin Li   namespace extern_var {
173*67e74705SXin Li     // TODO:
174*67e74705SXin Li   }
175*67e74705SXin Li }
176*67e74705SXin Li 
177*67e74705SXin Li namespace explicit_specialization {
178*67e74705SXin Li 
179*67e74705SXin Li   namespace good {
180*67e74705SXin Li     template<typename T1, typename T2>
181*67e74705SXin Li     CONST int pi2 = 1;
182*67e74705SXin Li 
183*67e74705SXin Li     template<typename T>
184*67e74705SXin Li     CONST int pi2<T,int> = 2;
185*67e74705SXin Li 
186*67e74705SXin Li     template<typename T>
187*67e74705SXin Li     CONST int pi2<int,T> = 3;
188*67e74705SXin Li 
189*67e74705SXin Li     template<> CONST int pi2<int,int> = 4;
190*67e74705SXin Li 
191*67e74705SXin Li #ifndef PRECXX11
foo()192*67e74705SXin Li     void foo() {
193*67e74705SXin Li       static_assert(pi2<int,int> == 4, "");
194*67e74705SXin Li       static_assert(pi2<float,int> == 2, "");
195*67e74705SXin Li       static_assert(pi2<int,float> == 3, "");
196*67e74705SXin Li       static_assert(pi2<int,float> == pi2<int,double>, "");
197*67e74705SXin Li       static_assert(pi2<float,float> == 1, "");
198*67e74705SXin Li       static_assert(pi2<float,float> == pi2<float,double>, "");
199*67e74705SXin Li     }
200*67e74705SXin Li #endif
201*67e74705SXin Li   }
202*67e74705SXin Li 
203*67e74705SXin Li   namespace ambiguous {
204*67e74705SXin Li 
205*67e74705SXin Li     template<typename T1, typename T2>
206*67e74705SXin Li     CONST int pi2 = 1;
207*67e74705SXin Li 
208*67e74705SXin Li     template<typename T>
209*67e74705SXin Li     CONST int pi2<T,int> = 2; // expected-note {{partial specialization matches [with T = int]}}
210*67e74705SXin Li 
211*67e74705SXin Li     template<typename T>
212*67e74705SXin Li     CONST int pi2<int,T> = 3; // expected-note {{partial specialization matches [with T = int]}}
213*67e74705SXin Li 
foo()214*67e74705SXin Li     void foo() {
215*67e74705SXin Li       int a = pi2<int,int>;  // expected-error {{ambiguous partial specializations of 'pi2<int, int>'}}
216*67e74705SXin Li     }
217*67e74705SXin Li   }
218*67e74705SXin Li 
219*67e74705SXin Li   namespace type_changes {
220*67e74705SXin Li 
221*67e74705SXin Li     template<typename T>
222*67e74705SXin Li     T pi0 = T(3.1415926535897932385);
223*67e74705SXin Li 
224*67e74705SXin Li     template<> float pi0<int> = 10;
225*67e74705SXin Li     template<> int pi0<const int> = 10;
226*67e74705SXin Li 
227*67e74705SXin Li     template<typename T>
228*67e74705SXin Li     T pi1 = T(3.1415926535897932385);
229*67e74705SXin Li     template<> CONST int pi1<int> = 10;
230*67e74705SXin Li 
231*67e74705SXin Li     template<typename T>
232*67e74705SXin Li     T pi2 = T(3.1415926535897932385);
233*67e74705SXin Li     template<> int pi2<const int> = 10;
234*67e74705SXin Li 
235*67e74705SXin Li     template<typename T>
236*67e74705SXin Li     CONST T pi4 = T(3.1415926535897932385);
237*67e74705SXin Li     template<> int pi4<int> = 10;
238*67e74705SXin Li   }
239*67e74705SXin Li 
240*67e74705SXin Li   namespace redefinition {
241*67e74705SXin Li     template<typename T>
242*67e74705SXin Li     T pi0 = T(3.1415926535897932385);
243*67e74705SXin Li 
244*67e74705SXin Li     template<> int pi0<int> = 10;   // expected-note 3{{previous definition is here}}
245*67e74705SXin Li #ifndef PRECXX11
246*67e74705SXin Li // expected-note@-2 {{previous definition is here}}
247*67e74705SXin Li #endif
248*67e74705SXin Li     template<> int pi0<int> = 10;   // expected-error {{redefinition of 'pi0<int>'}}
249*67e74705SXin Li     template<> CONST int pi0<int> = 10; // expected-error {{redefinition of 'pi0' with a different type: 'const int' vs 'int'}}
250*67e74705SXin Li     template<> float pi0<int> = 10; // expected-error {{redefinition of 'pi0' with a different type: 'float' vs 'int'}}
251*67e74705SXin Li #ifndef PRECXX11
252*67e74705SXin Li     template<> auto pi0<int> = 10;  // expected-error {{redefinition of 'pi0<int>'}}
253*67e74705SXin Li #endif
254*67e74705SXin Li 
255*67e74705SXin Li 
256*67e74705SXin Li     template<typename T>
257*67e74705SXin Li     CONST T pi1 = T(3.1415926535897932385);
258*67e74705SXin Li 
259*67e74705SXin Li     template<> CONST int pi1<int> = 10;   // expected-note {{previous definition is here}}
260*67e74705SXin Li     template<> CONST int pi1<int> = 10;   // expected-error {{redefinition of 'pi1<int>'}}
261*67e74705SXin Li   }
262*67e74705SXin Li 
263*67e74705SXin Li   namespace before_instantiation {
264*67e74705SXin Li     template<typename T>
265*67e74705SXin Li     T pi0 = T(3.1415926535897932385);   // expected-note {{variable template 'pi0' declared here}}
266*67e74705SXin Li 
267*67e74705SXin Li     template<> int pi0<int> = 10;
268*67e74705SXin Li     template int pi0<int>;
269*67e74705SXin Li     template float pi0<int>;    // expected-error {{type 'float' of explicit instantiation of 'pi0' does not match expected type}}
270*67e74705SXin Li 
271*67e74705SXin Li     template<typename T1, typename T2>
272*67e74705SXin Li     CONST int pi2 = 1;
273*67e74705SXin Li 
274*67e74705SXin Li     template<typename T> CONST int pi2<T,int> = 2;
275*67e74705SXin Li     template CONST int pi2<int,int>;
276*67e74705SXin Li   }
277*67e74705SXin Li   namespace after_instantiation {
278*67e74705SXin Li     template<typename T>
279*67e74705SXin Li     T pi0 = T(3.1415926535897932385);
280*67e74705SXin Li 
281*67e74705SXin Li     template int pi0<int>;   // expected-note 2{{explicit instantiation first required here}}
282*67e74705SXin Li     template<> int pi0<int> = 10; // expected-error {{explicit specialization of 'pi0' after instantiation}}
283*67e74705SXin Li     template<> float pi0<int>;    // expected-error {{explicit specialization of 'pi0' after instantiation}}
284*67e74705SXin Li 
285*67e74705SXin Li     template<typename T1, typename T2>
286*67e74705SXin Li     CONST int pi2 = 1;
287*67e74705SXin Li 
288*67e74705SXin Li     template CONST int pi2<int,int>;
289*67e74705SXin Li     template<typename T> CONST int pi2<T,int> = 2;
290*67e74705SXin Li   }
291*67e74705SXin Li 
292*67e74705SXin Li #ifndef PRECXX11
293*67e74705SXin Li   namespace auto_var {
294*67e74705SXin Li     template<typename T, typename> auto var0 = T();
295*67e74705SXin Li     template<typename T> auto var0<T,int> = T();
296*67e74705SXin Li     template<> auto var0<int,int> = 7;
297*67e74705SXin Li 
298*67e74705SXin Li     template<typename T, typename> auto var = T();
299*67e74705SXin Li     template<typename T> T var<T,int> = T(5);
300*67e74705SXin Li     template<> int var<int,int> = 7;
301*67e74705SXin Li 
foo()302*67e74705SXin Li     void foo() {
303*67e74705SXin Li       int i0 = var0<int,int>;
304*67e74705SXin Li       int b = var<int,int>;
305*67e74705SXin Li     }
306*67e74705SXin Li   }
307*67e74705SXin Li #endif
308*67e74705SXin Li 
309*67e74705SXin Li   namespace extern_var {
310*67e74705SXin Li     // TODO:
311*67e74705SXin Li   }
312*67e74705SXin Li 
313*67e74705SXin Li   namespace diff_type {
314*67e74705SXin Li     // TODO:
315*67e74705SXin Li     template<typename T> T* var = new T();
316*67e74705SXin Li #ifndef PRECXX11
317*67e74705SXin Li     template<typename T> auto var<T*> = T();  // expected-note {{previous definition is here}}
318*67e74705SXin Li     template<typename T> T var<T*> = T();     // expected-error {{redefinition of 'var' with a different type: 'T' vs 'auto'}}
319*67e74705SXin Li #endif
320*67e74705SXin Li   }
321*67e74705SXin Li }
322*67e74705SXin Li 
323*67e74705SXin Li namespace narrowing {
324*67e74705SXin Li   template<typename T> T v = {1234};  // expected-warning {{implicit conversion from 'int' to 'char' changes value from 1234 to}}
325*67e74705SXin Li #ifndef PRECXX11
326*67e74705SXin Li   // expected-error@-2 {{constant expression evaluates to 1234 which cannot be narrowed to type 'char'}}\
327*67e74705SXin Li   // expected-note@-2 {{insert an explicit cast to silence this issue}}
328*67e74705SXin Li #endif
329*67e74705SXin Li   int k = v<char>;        // expected-note {{in instantiation of variable template specialization 'narrowing::v<char>' requested here}}
330*67e74705SXin Li }
331*67e74705SXin Li 
332*67e74705SXin Li namespace use_in_structs {
333*67e74705SXin Li   // TODO:
334*67e74705SXin Li }
335*67e74705SXin Li 
336*67e74705SXin Li namespace attributes {
337*67e74705SXin Li   // TODO:
338*67e74705SXin Li }
339*67e74705SXin Li 
340*67e74705SXin Li #ifndef PRECXX11
341*67e74705SXin Li namespace arrays {
342*67e74705SXin Li   template<typename T>
343*67e74705SXin Li   T* arr = new T[10]{T(10), T(23)};
344*67e74705SXin Li 
345*67e74705SXin Li   float f = 10.5;
346*67e74705SXin Li   template<> float* arr<float> = &f;
347*67e74705SXin Li 
bar()348*67e74705SXin Li   void bar() {
349*67e74705SXin Li     int *iarr = arr<int>;
350*67e74705SXin Li     iarr[0] = 1;
351*67e74705SXin Li     iarr[2] = 3;
352*67e74705SXin Li     iarr[6] = -2;
353*67e74705SXin Li 
354*67e74705SXin Li     float ff = *arr<float>;
355*67e74705SXin Li     float nof = arr<float>[3];  // No bounds-check in C++
356*67e74705SXin Li   }
357*67e74705SXin Li }
358*67e74705SXin Li #endif
359*67e74705SXin Li 
360*67e74705SXin Li namespace nested {
361*67e74705SXin Li 
362*67e74705SXin Li   namespace n0a {
363*67e74705SXin Li     template<typename T>
364*67e74705SXin Li     T pi0a = T(3.1415926535897932385);
365*67e74705SXin Li   }
366*67e74705SXin Li 
367*67e74705SXin Li   using namespace n0a;
368*67e74705SXin Li   int i0a = pi0a<int>;
369*67e74705SXin Li 
370*67e74705SXin Li   template float pi0a<float>;
371*67e74705SXin Li   float f0a = pi0a<float>;
372*67e74705SXin Li 
373*67e74705SXin Li   template<> double pi0a<double> = 5.2;
374*67e74705SXin Li   double d0a = pi0a<double>;
375*67e74705SXin Li 
376*67e74705SXin Li   namespace n0b {
377*67e74705SXin Li     template<typename T>
378*67e74705SXin Li     T pi0b = T(3.1415926535897932385);
379*67e74705SXin Li   }
380*67e74705SXin Li 
381*67e74705SXin Li   int i0b = n0b::pi0b<int>;
382*67e74705SXin Li 
383*67e74705SXin Li   template float n0b::pi0b<float>;
384*67e74705SXin Li   float f0b = n0b::pi0b<float>;
385*67e74705SXin Li 
386*67e74705SXin Li   template<> double n0b::pi0b<double> = 5.2;
387*67e74705SXin Li   double d0b = n0b::pi0b<double>;
388*67e74705SXin Li 
389*67e74705SXin Li   namespace n1 {
390*67e74705SXin Li     template<typename T>
391*67e74705SXin Li     T pi1a = T(3.1415926535897932385); // expected-note {{explicitly specialized declaration is here}}
392*67e74705SXin Li #ifndef PRECXX11
393*67e74705SXin Li // expected-note@-2 {{explicit instantiation refers here}}
394*67e74705SXin Li #endif
395*67e74705SXin Li 
396*67e74705SXin Li     template<typename T>
397*67e74705SXin Li     T pi1b = T(3.1415926535897932385); // expected-note {{explicitly specialized declaration is here}}
398*67e74705SXin Li #ifndef PRECXX11
399*67e74705SXin Li // expected-note@-2 {{explicit instantiation refers here}}
400*67e74705SXin Li #endif
401*67e74705SXin Li   }
402*67e74705SXin Li 
403*67e74705SXin Li   namespace use_n1a {
404*67e74705SXin Li     using namespace n1;
405*67e74705SXin Li     int i1 = pi1a<int>;
406*67e74705SXin Li 
407*67e74705SXin Li     template float pi1a<float>;
408*67e74705SXin Li #ifndef PRECXX11
409*67e74705SXin Li // expected-error@-2 {{explicit instantiation of 'pi1a<float>' not in a namespace enclosing 'n1'}}
410*67e74705SXin Li #endif
411*67e74705SXin Li     float f1 = pi1a<float>;
412*67e74705SXin Li 
413*67e74705SXin Li     template<> double pi1a<double> = 5.2;  // expected-error {{variable template specialization of 'pi1a' must originally be declared in namespace 'n1'}}
414*67e74705SXin Li     double d1 = pi1a<double>;
415*67e74705SXin Li   }
416*67e74705SXin Li 
417*67e74705SXin Li   namespace use_n1b {
418*67e74705SXin Li     int i1 = n1::pi1b<int>;
419*67e74705SXin Li 
420*67e74705SXin Li     template float n1::pi1b<float>;
421*67e74705SXin Li #ifndef PRECXX11
422*67e74705SXin Li // expected-error@-2 {{explicit instantiation of 'pi1b<float>' not in a namespace enclosing 'n1'}}
423*67e74705SXin Li #endif
424*67e74705SXin Li     float f1 = n1::pi1b<float>;
425*67e74705SXin Li 
426*67e74705SXin Li     template<> double n1::pi1b<double> = 5.2;  // expected-error {{cannot define or redeclare 'pi1b' here because namespace 'use_n1b' does not enclose namespace 'n1'}} \
427*67e74705SXin Li                                                // expected-error {{variable template specialization of 'pi1b' must originally be declared in namespace 'n1'}}
428*67e74705SXin Li     double d1 = n1::pi1b<double>;
429*67e74705SXin Li   }
430*67e74705SXin Li }
431*67e74705SXin Li 
432*67e74705SXin Li namespace nested_name {
433*67e74705SXin Li   template<typename T> int a; // expected-note {{variable template 'a' declared here}}
434*67e74705SXin Li   a<int>::b c; // expected-error {{qualified name refers into a specialization of variable template 'a'}}
435*67e74705SXin Li 
436*67e74705SXin Li   class a<int> {}; // expected-error {{identifier followed by '<' indicates a class template specialization but 'a' refers to a variable template}}
437*67e74705SXin Li   enum a<int> {}; // expected-error {{expected identifier or '{'}} expected-warning {{does not declare anything}}
438*67e74705SXin Li }
439*67e74705SXin Li 
440*67e74705SXin Li namespace PR18530 {
441*67e74705SXin Li   template<typename T> int a;
442*67e74705SXin Li   int a<int>; // expected-error {{requires 'template<>'}}
443*67e74705SXin Li }
444*67e74705SXin Li 
445*67e74705SXin Li namespace PR19152 {
446*67e74705SXin Li #ifndef PRECXX11
447*67e74705SXin Li   template<typename T> const auto x = 1;
448*67e74705SXin Li   static_assert(x<int> == 1, "");
449*67e74705SXin Li #endif
450*67e74705SXin Li }
451*67e74705SXin Li 
452*67e74705SXin Li namespace PR19169 {
453*67e74705SXin Li   template <typename T> int* f();
454*67e74705SXin Li   template <typename T> void f();
455*67e74705SXin Li   template<> int f<double>; // expected-error {{no variable template matches specialization; did you mean to use 'f' as function template instead?}}
456*67e74705SXin Li 
457*67e74705SXin Li   template <typename T> void g();
458*67e74705SXin Li   template<> int g<double>; // expected-error {{no variable template matches specialization; did you mean to use 'g' as function template instead?}}
459*67e74705SXin Li }
460*67e74705SXin Li 
461*67e74705SXin Li #ifndef PRECXX11
462*67e74705SXin Li template <typename... Args> struct Variadic_t { };
463*67e74705SXin Li template <typename... Args> Variadic_t<Args...> Variadic;
464*67e74705SXin Li auto variadic1 = Variadic<>;
465*67e74705SXin Li auto variadic2 = Variadic<int, int>;
466*67e74705SXin Li #endif
467