1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
2c6d990a767150b02337de1136fdb55ccf349f4d1Richard Smith
37ca4850a3e3530fa6c93b64b740446e32c97f992Richard Smithstruct NonLit { // expected-note 3{{no constexpr constructors}}
4c6d990a767150b02337de1136fdb55ccf349f4d1Richard Smith  NonLit();
5c6d990a767150b02337de1136fdb55ccf349f4d1Richard Smith};
6c6d990a767150b02337de1136fdb55ccf349f4d1Richard Smith
7c6d990a767150b02337de1136fdb55ccf349f4d1Richard Smithstruct S {
8c6d990a767150b02337de1136fdb55ccf349f4d1Richard Smith  static constexpr int a = 0;
966f85713bd0d22f867efa8e9fb0037befdd6b151Richard Smith  static constexpr int b; // expected-error {{declaration of constexpr static data member 'b' requires an initializer}}
10c6d990a767150b02337de1136fdb55ccf349f4d1Richard Smith
11c6d990a767150b02337de1136fdb55ccf349f4d1Richard Smith  static constexpr int c = 0;
12c6d990a767150b02337de1136fdb55ccf349f4d1Richard Smith  static const int d;
13b52c0dddffdb27b3a058913020001afcfc937d8dRichard Smith  static const int d2 = 0;
14c6d990a767150b02337de1136fdb55ccf349f4d1Richard Smith
15c6d990a767150b02337de1136fdb55ccf349f4d1Richard Smith  static constexpr double e = 0.0; // ok
162d23ec29805f54edb3243022c64d752b8fbe5f46Richard Smith  static const double f = 0.0; // expected-warning {{extension}} expected-note {{use 'constexpr' specifier}}
17947be1941e9a1d4233116f51a45799d3904d4231Richard Smith  static char *const g = 0; // expected-error {{requires 'constexpr' specifier}}
18c6d990a767150b02337de1136fdb55ccf349f4d1Richard Smith  static const NonLit h = NonLit(); // expected-error {{must be initialized out of line}}
19c6d990a767150b02337de1136fdb55ccf349f4d1Richard Smith};
20c6d990a767150b02337de1136fdb55ccf349f4d1Richard Smith
21b52c0dddffdb27b3a058913020001afcfc937d8dRichard Smithconstexpr int S::a;
22c6d990a767150b02337de1136fdb55ccf349f4d1Richard Smithconstexpr int S::b = 0;
23c6d990a767150b02337de1136fdb55ccf349f4d1Richard Smith
24c6d990a767150b02337de1136fdb55ccf349f4d1Richard Smithconst int S::c;
25c6d990a767150b02337de1136fdb55ccf349f4d1Richard Smithconstexpr int S::d = 0;
26b52c0dddffdb27b3a058913020001afcfc937d8dRichard Smithconstexpr int S::d2;
27796c1a1e3e63e459e371383ac878aa5f40b02a8cRichard Smith
28796c1a1e3e63e459e371383ac878aa5f40b02a8cRichard Smithtemplate<typename T>
29796c1a1e3e63e459e371383ac878aa5f40b02a8cRichard Smithstruct U {
30796c1a1e3e63e459e371383ac878aa5f40b02a8cRichard Smith  static constexpr int a = 0;
31796c1a1e3e63e459e371383ac878aa5f40b02a8cRichard Smith  static constexpr int b; // expected-error {{declaration of constexpr static data member 'b' requires an initializer}}
3286c3ae46250cdcc57778c27826060779a92f3815Richard Smith  static constexpr NonLit h = NonLit(); // expected-error {{cannot have non-literal type 'const NonLit'}}
337ca4850a3e3530fa6c93b64b740446e32c97f992Richard Smith  static constexpr T c = T(); // expected-error {{cannot have non-literal type}}
34eb96af8a908ea28b2ca76e3848b2476852f592a6Richard Smith  static const T d;
35796c1a1e3e63e459e371383ac878aa5f40b02a8cRichard Smith};
36796c1a1e3e63e459e371383ac878aa5f40b02a8cRichard Smith
377ca4850a3e3530fa6c93b64b740446e32c97f992Richard Smithtemplate<typename T> constexpr T U<T>::d = T(); // expected-error {{non-literal type 'const NonLit'}}
38eb96af8a908ea28b2ca76e3848b2476852f592a6Richard Smith
3986c3ae46250cdcc57778c27826060779a92f3815Richard SmithU<int> u1;
40796c1a1e3e63e459e371383ac878aa5f40b02a8cRichard SmithU<NonLit> u2; // expected-note {{here}}
41796c1a1e3e63e459e371383ac878aa5f40b02a8cRichard Smith
42796c1a1e3e63e459e371383ac878aa5f40b02a8cRichard Smithstatic_assert(U<int>::a == 0, "");
43eb96af8a908ea28b2ca76e3848b2476852f592a6Richard Smith
44eb96af8a908ea28b2ca76e3848b2476852f592a6Richard Smithconstexpr int outofline = (U<NonLit>::d, 0); // expected-note {{here}} expected-warning {{unused}}
45