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