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 | |
Richard Smith | 6331c40 | 2012-02-13 22:16:19 +0000 | [diff] [blame] | 3 | struct NonLit { // expected-note 3{{no constexpr constructors}} |
Richard Smith | 2316cd8 | 2011-09-29 19:11:37 +0000 | [diff] [blame] | 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 |
David Blaikie | 8505c29 | 2013-01-29 22:26:08 +0000 | [diff] [blame] | 16 | static const double f = 0.0; // expected-error {{requires 'constexpr' specifier}} expected-note {{add 'constexpr'}} |
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}} |
Richard Smith | 3607ffe | 2012-02-13 03:54:03 +0000 | [diff] [blame] | 32 | static constexpr NonLit h = NonLit(); // expected-error {{cannot have non-literal type 'const NonLit'}} |
Richard Smith | 6331c40 | 2012-02-13 22:16:19 +0000 | [diff] [blame] | 33 | static constexpr T c = T(); // expected-error {{cannot have non-literal type}} |
Richard Smith | ab3fe0f | 2012-01-19 22:50:02 +0000 | [diff] [blame] | 34 | static const T d; |
Richard Smith | 45bb455 | 2012-01-19 22:46:17 +0000 | [diff] [blame] | 35 | }; |
| 36 | |
Richard Smith | 6331c40 | 2012-02-13 22:16:19 +0000 | [diff] [blame] | 37 | template<typename T> constexpr T U<T>::d = T(); // expected-error {{non-literal type 'const NonLit'}} |
Richard Smith | ab3fe0f | 2012-01-19 22:50:02 +0000 | [diff] [blame] | 38 | |
Richard Smith | 3607ffe | 2012-02-13 03:54:03 +0000 | [diff] [blame] | 39 | U<int> u1; |
Richard Smith | 45bb455 | 2012-01-19 22:46:17 +0000 | [diff] [blame] | 40 | U<NonLit> u2; // expected-note {{here}} |
| 41 | |
| 42 | static_assert(U<int>::a == 0, ""); |
Richard Smith | ab3fe0f | 2012-01-19 22:50:02 +0000 | [diff] [blame] | 43 | |
| 44 | constexpr int outofline = (U<NonLit>::d, 0); // expected-note {{here}} expected-warning {{unused}} |