1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s 3*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 4*67e74705SXin Li 5*67e74705SXin Li template<typename T, T Divisor> 6*67e74705SXin Li class X { 7*67e74705SXin Li public: 8*67e74705SXin Li static const T value = 10 / Divisor; // expected-error{{in-class initializer for static data member is not a constant expression}} 9*67e74705SXin Li }; 10*67e74705SXin Li 11*67e74705SXin Li int array1[X<int, 2>::value == 5? 1 : -1]; 12*67e74705SXin Li X<int, 0> xi0; // expected-note{{in instantiation of template class 'X<int, 0>' requested here}} 13*67e74705SXin Li 14*67e74705SXin Li 15*67e74705SXin Li template<typename T> 16*67e74705SXin Li class Y { 17*67e74705SXin Li static const T value = 0; 18*67e74705SXin Li #if __cplusplus <= 199711L 19*67e74705SXin Li // expected-warning@-2 {{in-class initializer for static data member of type 'const float' is a GNU extension}} 20*67e74705SXin Li #else 21*67e74705SXin Li // expected-error@-4 {{in-class initializer for static data member of type 'const float' requires 'constexpr' specifier}} 22*67e74705SXin Li // expected-note@-5 {{add 'constexpr'}} 23*67e74705SXin Li #endif 24*67e74705SXin Li }; 25*67e74705SXin Li 26*67e74705SXin Li Y<float> fy; // expected-note{{in instantiation of template class 'Y<float>' requested here}} 27*67e74705SXin Li 28*67e74705SXin Li 29*67e74705SXin Li // out-of-line static member variables 30*67e74705SXin Li 31*67e74705SXin Li template<typename T> 32*67e74705SXin Li struct Z { 33*67e74705SXin Li static T value; 34*67e74705SXin Li }; 35*67e74705SXin Li 36*67e74705SXin Li template<typename T> 37*67e74705SXin Li T Z<T>::value; // expected-error{{no matching constructor}} 38*67e74705SXin Li 39*67e74705SXin Li struct DefCon {}; 40*67e74705SXin Li 41*67e74705SXin Li struct NoDefCon { 42*67e74705SXin Li NoDefCon(const NoDefCon&); // expected-note{{candidate constructor}} 43*67e74705SXin Li }; 44*67e74705SXin Li test()45*67e74705SXin Livoid test() { 46*67e74705SXin Li DefCon &DC = Z<DefCon>::value; 47*67e74705SXin Li NoDefCon &NDC = Z<NoDefCon>::value; // expected-note{{instantiation}} 48*67e74705SXin Li } 49*67e74705SXin Li 50*67e74705SXin Li // PR5609 51*67e74705SXin Li struct X1 { 52*67e74705SXin Li ~X1(); // The errors won't be triggered without this dtor. 53*67e74705SXin Li }; 54*67e74705SXin Li 55*67e74705SXin Li template <typename T> 56*67e74705SXin Li struct Y1 { 57*67e74705SXin Li static char Helper(T); 58*67e74705SXin Li static const int value = sizeof(Helper(T())); 59*67e74705SXin Li }; 60*67e74705SXin Li 61*67e74705SXin Li struct X2 { 62*67e74705SXin Li virtual ~X2(); 63*67e74705SXin Li }; 64*67e74705SXin Li 65*67e74705SXin Li namespace std { 66*67e74705SXin Li class type_info { }; 67*67e74705SXin Li } 68*67e74705SXin Li 69*67e74705SXin Li template <typename T> 70*67e74705SXin Li struct Y2 { 71*67e74705SXin Li static T &Helper(); 72*67e74705SXin Li static const int value = sizeof(typeid(Helper())); 73*67e74705SXin Li }; 74*67e74705SXin Li 75*67e74705SXin Li template <int> 76*67e74705SXin Li struct Z1 {}; 77*67e74705SXin Li Test()78*67e74705SXin Livoid Test() { 79*67e74705SXin Li Z1<Y1<X1>::value> x; 80*67e74705SXin Li int y[Y1<X1>::value]; 81*67e74705SXin Li Z1<Y2<X2>::value> x2; 82*67e74705SXin Li int y2[Y2<X2>::value]; 83*67e74705SXin Li } 84*67e74705SXin Li 85*67e74705SXin Li // PR5672 86*67e74705SXin Li template <int n> 87*67e74705SXin Li struct X3 {}; 88*67e74705SXin Li 89*67e74705SXin Li class Y3 { 90*67e74705SXin Li public: 91*67e74705SXin Li ~Y3(); // The error isn't triggered without this dtor. 92*67e74705SXin Li 93*67e74705SXin Li void Foo(X3<1>); 94*67e74705SXin Li }; 95*67e74705SXin Li 96*67e74705SXin Li template <typename T> 97*67e74705SXin Li struct SizeOf { 98*67e74705SXin Li static const int value = sizeof(T); 99*67e74705SXin Li }; 100*67e74705SXin Li MyTest3()101*67e74705SXin Livoid MyTest3() { 102*67e74705SXin Li Y3().Foo(X3<SizeOf<char>::value>()); 103*67e74705SXin Li } 104*67e74705SXin Li 105*67e74705SXin Li namespace PR6449 { 106*67e74705SXin Li template<typename T> 107*67e74705SXin Li struct X0 { 108*67e74705SXin Li static const bool var = false; 109*67e74705SXin Li }; 110*67e74705SXin Li 111*67e74705SXin Li template<typename T> 112*67e74705SXin Li const bool X0<T>::var; 113*67e74705SXin Li 114*67e74705SXin Li template<typename T> 115*67e74705SXin Li struct X1 : public X0<T> { 116*67e74705SXin Li static const bool var = false; 117*67e74705SXin Li }; 118*67e74705SXin Li 119*67e74705SXin Li template<typename T> 120*67e74705SXin Li const bool X1<T>::var; 121*67e74705SXin Li 122*67e74705SXin Li template class X0<char>; 123*67e74705SXin Li template class X1<char>; 124*67e74705SXin Li 125*67e74705SXin Li } 126*67e74705SXin Li 127*67e74705SXin Li typedef char MyString[100]; 128*67e74705SXin Li template <typename T> 129*67e74705SXin Li struct StaticVarWithTypedefString { 130*67e74705SXin Li static MyString str; 131*67e74705SXin Li }; 132*67e74705SXin Li template <typename T> 133*67e74705SXin Li MyString StaticVarWithTypedefString<T>::str = ""; 134*67e74705SXin Li testStaticVarWithTypedefString()135*67e74705SXin Livoid testStaticVarWithTypedefString() { 136*67e74705SXin Li (void)StaticVarWithTypedefString<int>::str; 137*67e74705SXin Li } 138