p3.cpp revision a367e9de80eb05e78f06dc35c1e050799e735282
1// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
2
3struct NonLit { // expected-note 3{{no constexpr constructors}}
4  NonLit();
5};
6
7struct S {
8  static constexpr int a = 0;
9  static constexpr int b; // expected-error {{declaration of constexpr static data member 'b' requires an initializer}}
10
11  static constexpr int c = 0;
12  static const int d;
13  static const int d2 = 0;
14
15  static constexpr double e = 0.0; // ok
16  static const double f = 0.0; // expected-error {{requires 'constexpr' specifier}} expected-note {{add 'constexpr'}}
17  static char *const g = 0; // expected-error {{requires 'constexpr' specifier}}
18  static const NonLit h = NonLit(); // expected-error {{must be initialized out of line}}
19};
20
21constexpr int S::a;
22constexpr int S::b = 0;
23
24const int S::c;
25constexpr int S::d = 0;
26constexpr int S::d2;
27
28template<typename T>
29struct U {
30  static constexpr int a = 0;
31  static constexpr int b; // expected-error {{declaration of constexpr static data member 'b' requires an initializer}}
32  static constexpr NonLit h = NonLit(); // expected-error {{cannot have non-literal type 'const NonLit'}}
33  static constexpr T c = T(); // expected-error {{cannot have non-literal type}}
34  static const T d;
35};
36
37template<typename T> constexpr T U<T>::d = T(); // expected-error {{non-literal type 'const NonLit'}}
38
39U<int> u1;
40U<NonLit> u2; // expected-note {{here}}
41
42static_assert(U<int>::a == 0, "");
43
44constexpr int outofline = (U<NonLit>::d, 0); // expected-note {{here}} expected-warning {{unused}}
45