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