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