1567f917df048d42732997a479b2b257403fc88efLarisse Voufo// RUN: %clang_cc1 -verify -fsyntax-only -Wno-c++11-extensions -Wno-c++1y-extensions %s -DPRECXX11
2567f917df048d42732997a479b2b257403fc88efLarisse Voufo// RUN: %clang_cc1 -std=c++11 -verify -fsyntax-only -Wno-c++1y-extensions %s
3567f917df048d42732997a479b2b257403fc88efLarisse Voufo// RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only %s
4ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
5567f917df048d42732997a479b2b257403fc88efLarisse Voufo#ifdef PRECXX11
6ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  #define CONST const
7567f917df048d42732997a479b2b257403fc88efLarisse Voufo#else
8567f917df048d42732997a479b2b257403fc88efLarisse Voufo  #define CONST constexpr
9ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo#endif
10ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
11ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufotemplate<typename T>
12ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoT pi = T(3.1415926535897932385); // expected-note {{template is declared here}}
13ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
14ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufotemplate<typename T>
15ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoCONST T cpi = T(3.1415926535897932385); // expected-note {{template is declared here}}
16ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
17439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufotemplate<typename T> extern CONST T vc;
18567f917df048d42732997a479b2b257403fc88efLarisse Voufo#ifndef PRECXX11
19439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo// expected-error@-2 {{constexpr variable declaration must be a definition}}
20439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo#endif
21439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
22ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufonamespace use_in_top_level_funcs {
23ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
24ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  void good() {
25ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    int ipi = pi<int>;
26ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    int icpi = cpi<int>;
27ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    double dpi = pi<double>;
28ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    double dcpi = cpi<double>;
29ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
30ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
31ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  void no_deduce() {
32ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    // template arguments are not deduced for uses of variable templates.
33ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    int ipi = pi; // expected-error {{cannot refer to variable template 'pi' without a template argument list}}
34ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    int icpi = cpi; // expected-error {{cannot refer to variable template 'cpi' without a template argument list}}
35ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
36ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
37ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template<typename T>
38ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  T circular_area(T r) {
39ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    return pi<T> * r * r;
40ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
41ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
42ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template<typename T>
43ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  CONST T const_circular_area(T r) {
44ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    return cpi<T> * r * r;
45ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
46ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
47ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  double use_circular_area(double r) {
48ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    CONST float t = const_circular_area(2.0) - 12;
49567f917df048d42732997a479b2b257403fc88efLarisse Voufo#ifndef PRECXX11
50ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    static_assert(const_circular_area(2) == 12, "");
51ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    CONST int test = (t > 0) && (t < 1);
52ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    static_assert(test, "");
53ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo#endif
54ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    return circular_area(r);
55ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
56ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
57ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
58ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufonamespace shadow {
59ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  void foo() {
60ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    int ipi0 = pi<int>;
61ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    int pi;
62ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    int a = pi;
63ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    int ipi = pi<int>;  // expected-error {{expected '(' for function-style cast or type construction}} \
64ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo                        // expected-error {{expected expression}}
65ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
66ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
67ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
68ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufonamespace odr_tmpl {
69ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace pv_cvt {
70ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    int v;   // expected-note {{previous definition is here}}
71ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> T v; // expected-error {{redefinition of 'v' as different kind of symbol}}
72ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
73ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace pvt_cv {
74ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> T v; // expected-note {{previous definition is here}}
754a91989b2dc901a4998fa5443aeba0276a8cfaa6Larisse Voufo    int v;   // expected-error {{redefinition of 'v' as different kind of symbol}}
76ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
77ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace pvt_cvt {
78ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> T v0; // expected-note {{previous definition is here}}
79ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> T v0; // expected-error {{redefinition of 'v0'}}
80ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
81ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> T v; // expected-note {{previous definition is here}}
82ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> int v; // expected-error {{redefinition of 'v'}}
83ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> extern int v1; // expected-note {{previous template declaration is here}}
85ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<int I> int v1;      // expected-error {{template parameter has a different kind in template redeclaration}}
86ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
87ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace pvt_use {
88ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> T v;
89ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    v = 10;  // expected-error {{C++ requires a type specifier for all declarations}}
90ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
91ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
92ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace pvt_diff_params {
93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T, typename> T v;   // expected-note {{previous template declaration is here}}
94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> T v;   // expected-error {{too few template parameters in template redeclaration}} expected-note {{previous template declaration is here}}
95ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T, typename, typename> T v; // expected-error {{too many template parameters in template redeclaration}}
96ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
97ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
98ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace pvt_extern {
99ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> T v = T();
100ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> extern T v;      // redeclaration is allowed \
101ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo                                          // expected-note {{previous definition is here}}
102ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> extern int v;    // expected-error {{redefinition of 'v' with a different type: 'int' vs 'T'}}
103ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
104567f917df048d42732997a479b2b257403fc88efLarisse Voufo#ifndef PRECXX11
105ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> extern auto v;   // expected-error {{declaration of variable 'v' with type 'auto' requires an initializer}}
106ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo#endif
1074a91989b2dc901a4998fa5443aeba0276a8cfaa6Larisse Voufo
1084a91989b2dc901a4998fa5443aeba0276a8cfaa6Larisse Voufo    template<typename T> T var = T();     // expected-note {{previous definition is here}}
1094a91989b2dc901a4998fa5443aeba0276a8cfaa6Larisse Voufo    extern int var;                       // expected-error {{redefinition of 'var' as different kind of symbol}}
110ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
111ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
112567f917df048d42732997a479b2b257403fc88efLarisse Voufo#ifndef PRECXX11
113ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace pvt_auto {
114ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> auto v0; // expected-error {{declaration of variable 'v0' with type 'auto' requires an initializer}}
115ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> auto v1 = T();  // expected-note {{previous definition is here}}
116ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> int v1;   // expected-error {{redefinition of 'v1' with a different type: 'int' vs 'auto'}}
117ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> auto v2 = T();  // expected-note {{previous definition is here}}
118ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> T v2;   // expected-error {{redefinition of 'v2'}}
119ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> auto v3 = T();   // expected-note {{previous definition is here}}
120ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> extern T v3;     // expected-error {{redefinition of 'v3' with a different type: 'T' vs 'auto'}}
121ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> auto v4 = T();
122ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> extern auto v4;   // expected-error {{declaration of variable 'v4' with type 'auto' requires an initializer}}
123ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
124ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo#endif
125ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
126933c66b6956e91ef9017b28dd499b317aba83b7bLarisse Voufo}
127ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
128ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufonamespace explicit_instantiation {
129ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template<typename T>
130ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  T pi0a = T(3.1415926535897932385);  // expected-note {{variable template 'pi0a' declared here}}
131ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template float pi0a<int>; // expected-error {{type 'float' of explicit instantiation of 'pi0a' does not match expected type 'int'}}
132ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
133ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template<typename T>
134ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  T pi0b = T(3.1415926535897932385);  // expected-note {{variable template 'pi0b' declared here}}
135ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template CONST int pi0b<int>; // expected-error {{type 'const int' of explicit instantiation of 'pi0b' does not match expected type 'int'}}
136ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
137ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template<typename T>
138ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  T pi0c = T(3.1415926535897932385);  // expected-note {{variable template 'pi0c' declared here}}
139ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template int pi0c<const int>;  // expected-error {{type 'int' of explicit instantiation of 'pi0c' does not match expected type 'const int'}}
140ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
141ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template<typename T>
142ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  T pi0 = T(3.1415926535897932385);
143ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template int pi0<int>;   // expected-note {{previous explicit instantiation is here}}
144ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template int pi0<int>;   // expected-error {{duplicate explicit instantiation of 'pi0<int>'}}
145ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
146ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template<typename T>
147ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  CONST T pi1a = T(3.1415926535897932385);  // expected-note {{variable template 'pi1a' declared here}}
148ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template int pi1a<int>; // expected-error {{type 'int' of explicit instantiation of 'pi1a' does not match expected type 'const int'}}
149ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
150ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template<typename T>
151ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  CONST T pi1b = T(3.1415926535897932385);  // expected-note {{variable template 'pi1b' declared here}}
152ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template int pi1b<const int>;  // expected-error {{type 'int' of explicit instantiation of 'pi1b' does not match expected type 'const const int'}}
153ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
154ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template<typename T>
155ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  CONST T pi1 = T(3.1415926535897932385);
156ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template CONST int pi1<int>;   // expected-note {{previous explicit instantiation is here}}
157ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template CONST int pi1<int>;   // expected-error {{duplicate explicit instantiation of 'pi1<int>'}}
158ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
159567f917df048d42732997a479b2b257403fc88efLarisse Voufo#ifndef PRECXX11
160ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace auto_var {
161ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> auto var0 = T();
162ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template auto var0<int>;    // expected-error {{'auto' variable template instantiation is not allowed}}
163ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
164ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> auto var = T();
165ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template int var<int>;
166ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
167ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo#endif
1688e6557e57e2b88fd3de8a87e53e30c774497f51dRichard Smith
1698e6557e57e2b88fd3de8a87e53e30c774497f51dRichard Smith  template<typename=int> int missing_args; // expected-note {{here}}
1708e6557e57e2b88fd3de8a87e53e30c774497f51dRichard Smith  template int missing_args; // expected-error {{must specify a template argument list}}
1718e6557e57e2b88fd3de8a87e53e30c774497f51dRichard Smith
172ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace extern_var {
173ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    // TODO:
174ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
175ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
176ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
177ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufonamespace explicit_specialization {
178ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
179ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace good {
180ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T1, typename T2>
181ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    CONST int pi2 = 1;
182ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
183ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T>
184ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    CONST int pi2<T,int> = 2;
185ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
186ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T>
187ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    CONST int pi2<int,T> = 3;
188ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
189ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> CONST int pi2<int,int> = 4;
190ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
191567f917df048d42732997a479b2b257403fc88efLarisse Voufo#ifndef PRECXX11
192ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    void foo() {
193ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo      static_assert(pi2<int,int> == 4, "");
194ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo      static_assert(pi2<float,int> == 2, "");
195ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo      static_assert(pi2<int,float> == 3, "");
196ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo      static_assert(pi2<int,float> == pi2<int,double>, "");
197ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo      static_assert(pi2<float,float> == 1, "");
198ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo      static_assert(pi2<float,float> == pi2<float,double>, "");
199ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    }
200ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo#endif
201ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
202ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
203ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace ambiguous {
204ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
205ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T1, typename T2>
206ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    CONST int pi2 = 1;
207ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
208ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T>
209ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    CONST int pi2<T,int> = 2; // expected-note {{partial specialization matches [with T = int]}}
210ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
211ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T>
212ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    CONST int pi2<int,T> = 3; // expected-note {{partial specialization matches [with T = int]}}
213ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
214ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    void foo() {
215ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo      int a = pi2<int,int>;  // expected-error {{ambiguous partial specializations of 'pi2<int, int>'}}
216ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    }
217ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
218ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
219ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace type_changes {
220ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
221ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T>
222ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    T pi0 = T(3.1415926535897932385);
223ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
224ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> float pi0<int> = 10;
225ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> int pi0<const int> = 10;
226ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
227ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T>
228ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    T pi1 = T(3.1415926535897932385);
229ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> CONST int pi1<int> = 10;
230ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
231ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T>
232ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    T pi2 = T(3.1415926535897932385);
233ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> int pi2<const int> = 10;
234ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
235ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T>
236ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    CONST T pi4 = T(3.1415926535897932385);
237ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> int pi4<int> = 10;
238ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
239ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
240ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace redefinition {
241ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T>
242ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    T pi0 = T(3.1415926535897932385);
243ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
244ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> int pi0<int> = 10;   // expected-note 3{{previous definition is here}}
245567f917df048d42732997a479b2b257403fc88efLarisse Voufo#ifndef PRECXX11
246ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo// expected-note@-2 {{previous definition is here}}
247ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo#endif
248ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> int pi0<int> = 10;   // expected-error {{redefinition of 'pi0<int>'}}
249ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> CONST int pi0<int> = 10; // expected-error {{redefinition of 'pi0' with a different type: 'const int' vs 'int'}}
250ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> float pi0<int> = 10; // expected-error {{redefinition of 'pi0' with a different type: 'float' vs 'int'}}
251567f917df048d42732997a479b2b257403fc88efLarisse Voufo#ifndef PRECXX11
252ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> auto pi0<int> = 10;  // expected-error {{redefinition of 'pi0<int>'}}
253ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo#endif
254ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
255ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
256ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T>
257ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    CONST T pi1 = T(3.1415926535897932385);
258ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
259ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> CONST int pi1<int> = 10;   // expected-note {{previous definition is here}}
260ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> CONST int pi1<int> = 10;   // expected-error {{redefinition of 'pi1<int>'}}
261ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
262ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
263ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace before_instantiation {
264ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T>
265ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    T pi0 = T(3.1415926535897932385);   // expected-note {{variable template 'pi0' declared here}}
266ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
267ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> int pi0<int> = 10;
268ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template int pi0<int>;
269ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template float pi0<int>;    // expected-error {{type 'float' of explicit instantiation of 'pi0' does not match expected type}}
270ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
271ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T1, typename T2>
272ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    CONST int pi2 = 1;
273ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
274ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> CONST int pi2<T,int> = 2;
275ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template CONST int pi2<int,int>;
276ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
277ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace after_instantiation {
278ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T>
279ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    T pi0 = T(3.1415926535897932385);
280ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
281ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template int pi0<int>;   // expected-note 2{{explicit instantiation first required here}}
282ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> int pi0<int> = 10; // expected-error {{explicit specialization of 'pi0' after instantiation}}
283ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> float pi0<int>;    // expected-error {{explicit specialization of 'pi0' after instantiation}}
284ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
285ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T1, typename T2>
286ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    CONST int pi2 = 1;
287ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
288ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template CONST int pi2<int,int>;
289ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> CONST int pi2<T,int> = 2;
290ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
291ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
292567f917df048d42732997a479b2b257403fc88efLarisse Voufo#ifndef PRECXX11
293ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace auto_var {
294ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T, typename> auto var0 = T();
295ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> auto var0<T,int> = T();
296ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> auto var0<int,int> = 7;
297ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
298ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T, typename> auto var = T();
299ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> T var<T,int> = T(5);
300ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> int var<int,int> = 7;
301ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
302ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    void foo() {
303ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo      int i0 = var0<int,int>;
304ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo      int b = var<int,int>;
305ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    }
306ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
307ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo#endif
308ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
309ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace extern_var {
310ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    // TODO:
311ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
312ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
313ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace diff_type {
314ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    // TODO:
315ecbce69e354c77bf2d359111bad0c77c516e16f0Richard Smith    template<typename T> T* var = new T();
316567f917df048d42732997a479b2b257403fc88efLarisse Voufo#ifndef PRECXX11
317ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> auto var<T*> = T();  // expected-note {{previous definition is here}}
318ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T> T var<T*> = T();     // expected-error {{redefinition of 'var' with a different type: 'T' vs 'auto'}}
319ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo#endif
320ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
321ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
322ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
323933c66b6956e91ef9017b28dd499b317aba83b7bLarisse Voufonamespace narrowing {
324933c66b6956e91ef9017b28dd499b317aba83b7bLarisse Voufo  template<typename T> T v = {1234};  // expected-warning {{implicit conversion from 'int' to 'char' changes value from 1234 to}}
325567f917df048d42732997a479b2b257403fc88efLarisse Voufo#ifndef PRECXX11
326933c66b6956e91ef9017b28dd499b317aba83b7bLarisse Voufo  // expected-error@-2 {{constant expression evaluates to 1234 which cannot be narrowed to type 'char'}}\
3276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // expected-note@-2 {{insert an explicit cast to silence this issue}}
328933c66b6956e91ef9017b28dd499b317aba83b7bLarisse Voufo#endif
329933c66b6956e91ef9017b28dd499b317aba83b7bLarisse Voufo  int k = v<char>;        // expected-note {{in instantiation of variable template specialization 'narrowing::v<char>' requested here}}
330933c66b6956e91ef9017b28dd499b317aba83b7bLarisse Voufo}
331933c66b6956e91ef9017b28dd499b317aba83b7bLarisse Voufo
332ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufonamespace use_in_structs {
333ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  // TODO:
334ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
335ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
336ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufonamespace attributes {
337ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  // TODO:
338ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
339ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
340567f917df048d42732997a479b2b257403fc88efLarisse Voufo#ifndef PRECXX11
341ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufonamespace arrays {
342ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template<typename T>
343ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  T* arr = new T[10]{T(10), T(23)};
344ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
345ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  float f = 10.5;
346ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template<> float* arr<float> = &f;
347ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
348ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  void bar() {
349ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    int *iarr = arr<int>;
350ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    iarr[0] = 1;
351ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    iarr[2] = 3;
352ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    iarr[6] = -2;
353ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
354ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    float ff = *arr<float>;
355ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    float nof = arr<float>[3];  // No bounds-check in C++
356ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
357ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
358ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo#endif
359ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
360ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufonamespace nested {
361ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
362ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace n0a {
363ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T>
364ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    T pi0a = T(3.1415926535897932385);
365ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
366ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
367ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  using namespace n0a;
368ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  int i0a = pi0a<int>;
369ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
370ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template float pi0a<float>;
371ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  float f0a = pi0a<float>;
372ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
373ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template<> double pi0a<double> = 5.2;
374ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  double d0a = pi0a<double>;
375ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
376ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace n0b {
377ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T>
378ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    T pi0b = T(3.1415926535897932385);
379ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
380ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
381ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  int i0b = n0b::pi0b<int>;
382ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
383ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template float n0b::pi0b<float>;
384ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  float f0b = n0b::pi0b<float>;
385ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
386ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  template<> double n0b::pi0b<double> = 5.2;
387ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  double d0b = n0b::pi0b<double>;
388ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
389ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace n1 {
390ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T>
391651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    T pi1a = T(3.1415926535897932385); // expected-note {{explicitly specialized declaration is here}}
392567f917df048d42732997a479b2b257403fc88efLarisse Voufo#ifndef PRECXX11
393ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo// expected-note@-2 {{explicit instantiation refers here}}
394ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo#endif
395ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
396ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<typename T>
397ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    T pi1b = T(3.1415926535897932385); // expected-note {{explicitly specialized declaration is here}}
398567f917df048d42732997a479b2b257403fc88efLarisse Voufo#ifndef PRECXX11
399ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo// expected-note@-2 {{explicit instantiation refers here}}
400ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo#endif
401ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
402ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
403ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace use_n1a {
404ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    using namespace n1;
405ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    int i1 = pi1a<int>;
406ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
407ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template float pi1a<float>;
408567f917df048d42732997a479b2b257403fc88efLarisse Voufo#ifndef PRECXX11
409ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo// expected-error@-2 {{explicit instantiation of 'pi1a<float>' not in a namespace enclosing 'n1'}}
410ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo#endif
411ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    float f1 = pi1a<float>;
412ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
413651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<> double pi1a<double> = 5.2;  // expected-error {{variable template specialization of 'pi1a' must originally be declared in namespace 'n1'}}
414ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    double d1 = pi1a<double>;
415ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
416ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
417ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  namespace use_n1b {
418ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    int i1 = n1::pi1b<int>;
419ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
420ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template float n1::pi1b<float>;
421567f917df048d42732997a479b2b257403fc88efLarisse Voufo#ifndef PRECXX11
422ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo// expected-error@-2 {{explicit instantiation of 'pi1b<float>' not in a namespace enclosing 'n1'}}
423ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo#endif
424ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    float f1 = n1::pi1b<float>;
425ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
426ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    template<> double n1::pi1b<double> = 5.2;  // expected-error {{cannot define or redeclare 'pi1b' here because namespace 'use_n1b' does not enclose namespace 'n1'}} \
427ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo                                               // expected-error {{variable template specialization of 'pi1b' must originally be declared in namespace 'n1'}}
428ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    double d1 = n1::pi1b<double>;
429ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
430ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
431ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
432651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace nested_name {
433651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> int a; // expected-note {{variable template 'a' declared here}}
434651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  a<int>::b c; // expected-error {{qualified name refers into a specialization of variable template 'a'}}
435651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
436651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class a<int> {}; // expected-error {{identifier followed by '<' indicates a class template specialization but 'a' refers to a variable template}}
437651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  enum a<int> {}; // expected-error {{expected identifier or '{'}} expected-warning {{does not declare anything}}
438651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
439651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
440651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace PR18530 {
441651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> int a;
442651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int a<int>; // expected-error {{requires 'template<>'}}
443651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
444651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
445651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace PR19152 {
446651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#ifndef PRECXX11
447651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> const auto x = 1;
448651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static_assert(x<int> == 1, "");
449651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
450651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
4516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace PR19169 {
4536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template <typename T> int* f();
4546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template <typename T> void f();
4556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<> int f<double>; // expected-error {{no variable template matches specialization; did you mean to use 'f' as function template instead?}}
4566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template <typename T> void g();
4586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<> int g<double>; // expected-error {{no variable template matches specialization; did you mean to use 'g' as function template instead?}}
4596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
4606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
461