1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
2 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++1z %s
3 
4 struct NonLit { // expected-note 3{{no constexpr constructors}}
5   NonLit();
6 };
7 
8 struct S {
9   static constexpr int a = 0;
10   static constexpr int b; // expected-error {{initializ}} expected-note 0-1{{previous}}
11 
12   static constexpr int c = 0;
13   static const int d;
14   static const int d2 = 0;
15 
16   static constexpr double e = 0.0; // ok
17   static const double f = 0.0; // expected-error {{requires 'constexpr' specifier}} expected-note {{add 'constexpr'}}
18   static char *const g = 0; // expected-error {{requires 'constexpr' specifier}}
19   static const NonLit h = NonLit(); // expected-error {{must be initialized out of line}}
20 
21   static inline int i; // expected-note {{previous}} expected-warning 0-1{{extension}}
22   static inline int j; // expected-note {{previous}} expected-warning 0-1{{extension}}
23   static constexpr int k = 0;
24 };
25 
26 constexpr int S::a;
27 constexpr int S::b = 0; // expected-error 0-1{{redefinition}}
28 
29 const int S::c;
30 constexpr int S::d = 0;
31 constexpr int S::d2;
32 
33 int S::i; // expected-error {{redefinition}}
34 int S::j; // expected-error {{redefinition}}
35 const int S::k; // ok (deprecated)
36 
37 template<typename T>
38 struct U {
39   static constexpr int a = 0;
40   static constexpr int b; // expected-error {{initializ}}
41   static constexpr NonLit h = NonLit(); // expected-error {{cannot have non-literal type 'const NonLit'}}
42   static constexpr T c = T(); // expected-error {{cannot have non-literal type}}
43   static const T d;
44 };
45 
46 template<typename T> constexpr T U<T>::d = T(); // expected-error {{non-literal type 'const NonLit'}}
47 
48 U<int> u1;
49 U<NonLit> u2; // expected-note {{here}}
50 
51 static_assert(U<int>::a == 0, "");
52 
53 constexpr int outofline = (U<NonLit>::d, 0); // expected-note {{here}}
54