xref: /aosp_15_r20/external/clang/test/SemaTemplate/instantiate-static-var.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li void 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 Li void 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 Li void 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 Li void testStaticVarWithTypedefString() {
136*67e74705SXin Li   (void)StaticVarWithTypedefString<int>::str;
137*67e74705SXin Li }
138