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