Richard Smith | 9ca5c42 | 2011-10-13 22:29:44 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s |
Richard Smith | 2316cd8 | 2011-09-29 19:11:37 +0000 | [diff] [blame] | 2 | |
| 3 | struct NonLit { |
| 4 | NonLit(); |
| 5 | }; |
| 6 | |
| 7 | struct S { |
| 8 | static constexpr int a = 0; |
Richard Smith | eda3c84 | 2011-11-07 22:16:17 +0000 | [diff] [blame] | 9 | static constexpr int b; // expected-error {{declaration of constexpr static data member 'b' requires an initializer}} |
Richard Smith | 2316cd8 | 2011-09-29 19:11:37 +0000 | [diff] [blame] | 10 | |
| 11 | static constexpr int c = 0; |
| 12 | static const int d; |
Richard Smith | 43a87fe | 2011-10-06 09:21:12 +0000 | [diff] [blame] | 13 | static const int d2 = 0; |
Richard Smith | 2316cd8 | 2011-09-29 19:11:37 +0000 | [diff] [blame] | 14 | |
| 15 | static constexpr double e = 0.0; // ok |
Richard Smith | 7b729cd | 2011-09-30 00:33:19 +0000 | [diff] [blame] | 16 | static const double f = 0.0; // expected-warning {{extension}} expected-note {{use 'constexpr' specifier}} |
Richard Smith | 256336d | 2011-09-29 23:18:34 +0000 | [diff] [blame] | 17 | static char *const g = 0; // expected-error {{requires 'constexpr' specifier}} |
Richard Smith | 2316cd8 | 2011-09-29 19:11:37 +0000 | [diff] [blame] | 18 | static const NonLit h = NonLit(); // expected-error {{must be initialized out of line}} |
| 19 | }; |
| 20 | |
Richard Smith | 43a87fe | 2011-10-06 09:21:12 +0000 | [diff] [blame] | 21 | constexpr int S::a; |
Richard Smith | 2316cd8 | 2011-09-29 19:11:37 +0000 | [diff] [blame] | 22 | constexpr int S::b = 0; |
| 23 | |
| 24 | const int S::c; |
| 25 | constexpr int S::d = 0; |
Richard Smith | 43a87fe | 2011-10-06 09:21:12 +0000 | [diff] [blame] | 26 | constexpr int S::d2; |
Richard Smith | 45bb455 | 2012-01-19 22:46:17 +0000 | [diff] [blame^] | 27 | |
| 28 | template<typename T> |
| 29 | struct 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 | // FIXME: It'd be nice to error on this at template definition time. |
| 33 | static constexpr NonLit h = NonLit(); // expected-error 2{{must be initialized by a constant expression}} expected-note 2{{non-literal type}} |
| 34 | static constexpr T c = T(); // expected-error {{must be initialized by a constant expression}} expected-note {{non-literal type}} |
| 35 | }; |
| 36 | |
| 37 | U<int> u1; // expected-note {{here}} |
| 38 | U<NonLit> u2; // expected-note {{here}} |
| 39 | |
| 40 | static_assert(U<int>::a == 0, ""); |