blob: 452fccf2244d7c9ddb71ef058c7ecac7e124ab00 [file] [log] [blame]
Douglas Gregor3d7a12a2009-03-25 23:32:15 +00001// RUN: clang-cc -fsyntax-only -verify %s
Douglas Gregor3d7a12a2009-03-25 23:32:15 +00002template<typename T, T Divisor>
3class X {
4public:
5 static const T value = 10 / Divisor; // expected-error{{in-class initializer is not an integral constant expression}}
6};
7
8int array1[X<int, 2>::value == 5? 1 : -1];
9X<int, 0> xi0; // expected-note{{in instantiation of template class 'class X<int, 0>' requested here}}
10
11
12template<typename T>
13class Y {
14 static const T value = 0; // expected-error{{'value' can only be initialized if it is a static const integral data member}}
15};
16
17Y<float> fy; // expected-note{{in instantiation of template class 'class Y<float>' requested here}}
Douglas Gregor65b90052009-07-27 17:43:39 +000018
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&);
34};
35
36void test() {
37 DefCon &DC = Z<DefCon>::value;
38 NoDefCon &NDC = Z<NoDefCon>::value; // expected-note{{instantiation}}
Owen Anderson08e25242009-07-27 22:29:56 +000039}
Douglas Gregor2afce722009-11-26 00:44:06 +000040
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}