| 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 | 62f19e7 | 2016-06-25 00:15:56 +0000 | [diff] [blame] | 2 | // RUN: %clang_cc1 -fsyntax-only -verify -std=c++1z %s | 
| Richard Smith | 2316cd8 | 2011-09-29 19:11:37 +0000 | [diff] [blame] | 3 |  | 
| Richard Smith | 6331c40 | 2012-02-13 22:16:19 +0000 | [diff] [blame] | 4 | struct NonLit { // expected-note 3{{no constexpr constructors}} | 
| Richard Smith | 2316cd8 | 2011-09-29 19:11:37 +0000 | [diff] [blame] | 5 | NonLit(); | 
|  | 6 | }; | 
|  | 7 |  | 
|  | 8 | struct S { | 
|  | 9 | static constexpr int a = 0; | 
| Richard Smith | 62f19e7 | 2016-06-25 00:15:56 +0000 | [diff] [blame] | 10 | static constexpr int b; // expected-error {{initializ}} expected-note 0-1{{previous}} | 
| Richard Smith | 2316cd8 | 2011-09-29 19:11:37 +0000 | [diff] [blame] | 11 |  | 
|  | 12 | static constexpr int c = 0; | 
|  | 13 | static const int d; | 
| Richard Smith | 43a87fe | 2011-10-06 09:21:12 +0000 | [diff] [blame] | 14 | static const int d2 = 0; | 
| Richard Smith | 2316cd8 | 2011-09-29 19:11:37 +0000 | [diff] [blame] | 15 |  | 
|  | 16 | static constexpr double e = 0.0; // ok | 
| David Blaikie | 8505c29 | 2013-01-29 22:26:08 +0000 | [diff] [blame] | 17 | 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] | 18 | static char *const g = 0; // expected-error {{requires 'constexpr' specifier}} | 
| Richard Smith | 2316cd8 | 2011-09-29 19:11:37 +0000 | [diff] [blame] | 19 | static const NonLit h = NonLit(); // expected-error {{must be initialized out of line}} | 
| Richard Smith | 62f19e7 | 2016-06-25 00:15:56 +0000 | [diff] [blame] | 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; | 
| Richard Smith | 2316cd8 | 2011-09-29 19:11:37 +0000 | [diff] [blame] | 24 | }; | 
|  | 25 |  | 
| Richard Smith | 43a87fe | 2011-10-06 09:21:12 +0000 | [diff] [blame] | 26 | constexpr int S::a; | 
| Richard Smith | 62f19e7 | 2016-06-25 00:15:56 +0000 | [diff] [blame] | 27 | constexpr int S::b = 0; // expected-error 0-1{{redefinition}} | 
| Richard Smith | 2316cd8 | 2011-09-29 19:11:37 +0000 | [diff] [blame] | 28 |  | 
|  | 29 | const int S::c; | 
|  | 30 | constexpr int S::d = 0; | 
| Richard Smith | 43a87fe | 2011-10-06 09:21:12 +0000 | [diff] [blame] | 31 | constexpr int S::d2; | 
| Richard Smith | 45bb455 | 2012-01-19 22:46:17 +0000 | [diff] [blame] | 32 |  | 
| Richard Smith | 62f19e7 | 2016-06-25 00:15:56 +0000 | [diff] [blame] | 33 | int S::i; // expected-error {{redefinition}} | 
|  | 34 | int S::j; // expected-error {{redefinition}} | 
|  | 35 | const int S::k; // ok (deprecated) | 
|  | 36 |  | 
| Richard Smith | 45bb455 | 2012-01-19 22:46:17 +0000 | [diff] [blame] | 37 | template<typename T> | 
|  | 38 | struct U { | 
|  | 39 | static constexpr int a = 0; | 
| Richard Smith | 62f19e7 | 2016-06-25 00:15:56 +0000 | [diff] [blame] | 40 | static constexpr int b; // expected-error {{initializ}} | 
| Richard Smith | 3607ffe | 2012-02-13 03:54:03 +0000 | [diff] [blame] | 41 | 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] | 42 | static constexpr T c = T(); // expected-error {{cannot have non-literal type}} | 
| Richard Smith | ab3fe0f | 2012-01-19 22:50:02 +0000 | [diff] [blame] | 43 | static const T d; | 
| Richard Smith | 45bb455 | 2012-01-19 22:46:17 +0000 | [diff] [blame] | 44 | }; | 
|  | 45 |  | 
| Richard Smith | 6331c40 | 2012-02-13 22:16:19 +0000 | [diff] [blame] | 46 | 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] | 47 |  | 
| Richard Smith | 3607ffe | 2012-02-13 03:54:03 +0000 | [diff] [blame] | 48 | U<int> u1; | 
| Richard Smith | 45bb455 | 2012-01-19 22:46:17 +0000 | [diff] [blame] | 49 | U<NonLit> u2; // expected-note {{here}} | 
|  | 50 |  | 
|  | 51 | static_assert(U<int>::a == 0, ""); | 
| Richard Smith | ab3fe0f | 2012-01-19 22:50:02 +0000 | [diff] [blame] | 52 |  | 
| Richard Smith | 263a0a3 | 2017-09-23 18:27:11 +0000 | [diff] [blame] | 53 | constexpr int outofline = (U<NonLit>::d, 0); // expected-note {{here}} |