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