| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- // RUN: %clang_cc1 -fsyntax-only -verify %s
- template<typename T, T Divisor>
- class X {
- public:
- static const T value = 10 / Divisor; // expected-error{{in-class initializer for static data member is not a constant expression}}
- };
- int array1[X<int, 2>::value == 5? 1 : -1];
- X<int, 0> xi0; // expected-note{{in instantiation of template class 'X<int, 0>' requested here}}
- template<typename T>
- class Y {
- static const T value = 0; // expected-warning{{in-class initializer for static data member of type 'const float' is a GNU extension}}
- };
- Y<float> fy; // expected-note{{in instantiation of template class 'Y<float>' requested here}}
- // out-of-line static member variables
- template<typename T>
- struct Z {
- static T value;
- };
- template<typename T>
- T Z<T>::value; // expected-error{{no matching constructor}}
- struct DefCon {};
- struct NoDefCon {
- NoDefCon(const NoDefCon&); // expected-note{{candidate constructor}}
- };
- void test() {
- DefCon &DC = Z<DefCon>::value;
- NoDefCon &NDC = Z<NoDefCon>::value; // expected-note{{instantiation}}
- }
- // PR5609
- struct X1 {
- ~X1(); // The errors won't be triggered without this dtor.
- };
- template <typename T>
- struct Y1 {
- static char Helper(T);
- static const int value = sizeof(Helper(T()));
- };
- struct X2 {
- virtual ~X2();
- };
- namespace std {
- class type_info { };
- }
- template <typename T>
- struct Y2 {
- static T &Helper();
- static const int value = sizeof(typeid(Helper()));
- };
- template <int>
- struct Z1 {};
- void Test() {
- Z1<Y1<X1>::value> x;
- int y[Y1<X1>::value];
- Z1<Y2<X2>::value> x2;
- int y2[Y2<X2>::value];
- }
- // PR5672
- template <int n>
- struct X3 {};
- class Y3 {
- public:
- ~Y3(); // The error isn't triggered without this dtor.
- void Foo(X3<1>);
- };
- template <typename T>
- struct SizeOf {
- static const int value = sizeof(T);
- };
- void MyTest3() {
- Y3().Foo(X3<SizeOf<char>::value>());
- }
- namespace PR6449 {
- template<typename T>
- struct X0 {
- static const bool var = false;
- };
- template<typename T>
- const bool X0<T>::var;
- template<typename T>
- struct X1 : public X0<T> {
- static const bool var = false;
- };
- template<typename T>
- const bool X1<T>::var;
- template class X0<char>;
- template class X1<char>;
- }
- typedef char MyString[100];
- template <typename T>
- struct StaticVarWithTypedefString {
- static MyString str;
- };
- template <typename T>
- MyString StaticVarWithTypedefString<T>::str = "";
- void testStaticVarWithTypedefString() {
- (void)StaticVarWithTypedefString<int>::str;
- }
|