1a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith// RUN: %clang_cc1 -verify -std=c++11 -fcxx-exceptions -Werror=c++1y-extensions %s 2a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith// RUN: %clang_cc1 -verify -std=c++1y -fcxx-exceptions -DCXX1Y %s 39f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 49f569cca2a4c5fb6026005434e27025b9e71309dRichard Smithnamespace N { 59f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith typedef char C; 69f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith} 79f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 89f569cca2a4c5fb6026005434e27025b9e71309dRichard Smithnamespace M { 99f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith typedef double D; 109f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith} 119f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 129f569cca2a4c5fb6026005434e27025b9e71309dRichard Smithstruct NonLiteral { // expected-note 2{{no constexpr constructors}} 139f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith NonLiteral() {} 149f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith NonLiteral(int) {} 159f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith}; 169f569cca2a4c5fb6026005434e27025b9e71309dRichard Smithstruct Literal { 179f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr Literal() {} 18745f5147e065900267c85a5568785a1991d4838fRichard Smith explicit Literal(int); // expected-note 2 {{here}} 199f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith operator int() const { return 0; } 209f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith}; 219f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 229f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// In the definition of a constexpr constructor, each of the parameter types 239f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// shall be a literal type. 249f569cca2a4c5fb6026005434e27025b9e71309dRichard Smithstruct S { 2586c3ae46250cdcc57778c27826060779a92f3815Richard Smith constexpr S(int, N::C) {} 2686c3ae46250cdcc57778c27826060779a92f3815Richard Smith constexpr S(int, NonLiteral, N::C) {} // expected-error {{constexpr constructor's 2nd parameter type 'NonLiteral' is not a literal type}} 2786c3ae46250cdcc57778c27826060779a92f3815Richard Smith constexpr S(int, NonLiteral = 42) {} // expected-error {{constexpr constructor's 2nd parameter type 'NonLiteral' is not a literal type}} 289f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 299f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith // In addition, either its function-body shall be = delete or = default 309f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr S() = default; 319f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr S(Literal) = delete; 329f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith}; 339f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 349f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// or it shall satisfy the following constraints: 359f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 369f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// - the class shall not have any virtual base classes; 379f569cca2a4c5fb6026005434e27025b9e71309dRichard Smithstruct T : virtual S { // expected-note {{here}} 3886c3ae46250cdcc57778c27826060779a92f3815Richard Smith constexpr T() {} // expected-error {{constexpr constructor not allowed in struct with virtual base class}} 399f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith}; 409f569cca2a4c5fb6026005434e27025b9e71309dRichard Smithnamespace IndirectVBase { 419f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith struct A {}; 429f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith struct B : virtual A {}; // expected-note {{here}} 439f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith class C : public B { 449f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith public: 4586c3ae46250cdcc57778c27826060779a92f3815Richard Smith constexpr C() {} // expected-error {{constexpr constructor not allowed in class with virtual base class}} 469f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith }; 479f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith} 489f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 499f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// - its function-body shall not be a function-try-block; 509f569cca2a4c5fb6026005434e27025b9e71309dRichard Smithstruct U { 519f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr U() 529f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith try // expected-error {{function try block not allowed in constexpr constructor}} 539f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith : u() { 549f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith } catch (...) { 559f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith throw; 569f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith } 579f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith int u; 589f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith}; 599f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 609f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// - the compound-statememt of its function-body shall contain only 619f569cca2a4c5fb6026005434e27025b9e71309dRichard Smithstruct V { 629f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr V() { 639f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith // - null statements, 649f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith ; 659f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 669f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith // - static_assert-declarations, 679f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith static_assert(true, "the impossible happened!"); 689f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 699f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith // - typedef declarations and alias-declarations that do not define classes 709f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith // or enumerations, 719f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith typedef int I; 729f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith typedef struct S T; 739f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith using J = int; 749f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith using K = int[sizeof(I) + sizeof(J)]; 759f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith // Note, the standard requires we reject this. 769f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith struct U; 779f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 789f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith // - using-declarations, 799f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith using N::C; 809f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 819f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith // - and using-directives; 829f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith using namespace N; 839f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith } 849f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 859f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr V(int(&)[1]) { 86a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith for (int n = 0; n < 10; ++n) 879f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith /**/; 88a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith#ifndef CXX1Y 89a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith // expected-error@-3 {{statement not allowed in constexpr constructor}} 90a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith#endif 919f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith } 929f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr V(int(&)[2]) { 93a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith constexpr int a = 0; 94a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith#ifndef CXX1Y 95176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // expected-error@-2 {{variable declaration in a constexpr constructor is a C++14 extension}} 96a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith#endif 979f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith } 989f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr V(int(&)[3]) { 99a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith constexpr int ForwardDecl(int); 100a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith#ifndef CXX1Y 101176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // expected-error@-2 {{use of this statement in a constexpr constructor is a C++14 extension}} 102a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith#endif 1039f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith } 1049f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr V(int(&)[4]) { 105a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith typedef struct { } S1; 106a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith#ifndef CXX1Y 107176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // expected-error@-2 {{type definition in a constexpr constructor is a C++14 extension}} 108a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith#endif 1099f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith } 1109f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr V(int(&)[5]) { 111a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith using S2 = struct { }; 112a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith#ifndef CXX1Y 113176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // expected-error@-2 {{type definition in a constexpr constructor is a C++14 extension}} 114a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith#endif 1159f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith } 1169f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr V(int(&)[6]) { 117a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith struct S3 { }; 118a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith#ifndef CXX1Y 119176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // expected-error@-2 {{type definition in a constexpr constructor is a C++14 extension}} 120a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith#endif 1219f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith } 1229f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr V(int(&)[7]) { 123a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith return; 124a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith#ifndef CXX1Y 125176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // expected-error@-2 {{use of this statement in a constexpr constructor is a C++14 extension}} 126a10b97898ee6339c3110e6ca33f178ff52f05238Richard Smith#endif 1279f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith } 1289f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith}; 1299f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 1309f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// - every non-static data member and base class sub-object shall be initialized 1319f569cca2a4c5fb6026005434e27025b9e71309dRichard Smithstruct W { 1329f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith int n; // expected-note {{member not initialized by constructor}} 1339f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr W() {} // expected-error {{constexpr constructor must initialize all members}} 1349f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith}; 1359f569cca2a4c5fb6026005434e27025b9e71309dRichard Smithstruct AnonMembers { 1369f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith int a; // expected-note {{member not initialized by constructor}} 1379f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith union { // expected-note 2{{member not initialized by constructor}} 1389f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith char b; 1399f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith struct { 1409f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith double c; 1419f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith long d; // expected-note {{member not initialized by constructor}} 1429f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith }; 1439f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith union { 1449f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith char e; 1459f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith void *f; 1469f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith }; 1479f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith }; 1489f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith struct { // expected-note {{member not initialized by constructor}} 1499f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith long long g; 1509f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith struct { 1519f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith int h; // expected-note {{member not initialized by constructor}} 1529f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith double i; // expected-note {{member not initialized by constructor}} 1539f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith }; 1549f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith union { // expected-note 2{{member not initialized by constructor}} 1559f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith char *j; 1569f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith AnonMembers *k; 1579f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith }; 1589f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith }; 1599f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 1609f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr AnonMembers(int(&)[1]) : a(), b(), g(), h(), i(), j() {} // ok 1619f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith // missing d, i, j/k union 1629f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr AnonMembers(int(&)[2]) : a(), c(), g(), h() {} // expected-error {{constexpr constructor must initialize all members}} 1639f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr AnonMembers(int(&)[3]) : a(), e(), g(), h(), i(), k() {} // ok 1649f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith // missing h, j/k union 1659f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr AnonMembers(int(&)[4]) : a(), c(), d(), g(), i() {} // expected-error {{constexpr constructor must initialize all members}} 1669f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith // missing b/c/d/e/f union 1679f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr AnonMembers(int(&)[5]) : a(), g(), h(), i(), k() {} // expected-error {{constexpr constructor must initialize all members}} 1689f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith // missing a, b/c/d/e/f union, g/h/i/j/k struct 1699f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr AnonMembers(int(&)[6]) {} // expected-error {{constexpr constructor must initialize all members}} 1709f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith}; 1719f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 17230ecfad3af057bff74d1c98099eda0677525574eRichard Smithunion Empty { 17330ecfad3af057bff74d1c98099eda0677525574eRichard Smith constexpr Empty() {} // ok 17430ecfad3af057bff74d1c98099eda0677525574eRichard Smith} constexpr empty1; 17530ecfad3af057bff74d1c98099eda0677525574eRichard Smith 17630ecfad3af057bff74d1c98099eda0677525574eRichard Smithstruct EmptyVariant { 17730ecfad3af057bff74d1c98099eda0677525574eRichard Smith union {}; 17830ecfad3af057bff74d1c98099eda0677525574eRichard Smith struct {}; 17930ecfad3af057bff74d1c98099eda0677525574eRichard Smith constexpr EmptyVariant() {} // ok 18030ecfad3af057bff74d1c98099eda0677525574eRichard Smith} constexpr empty2; 18130ecfad3af057bff74d1c98099eda0677525574eRichard Smith 1826e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smithtemplate<typename T> using Int = int; 1836e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smithtemplate<typename T> 1846e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smithstruct TemplateInit { 1856e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith T a; 1866e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith int b; // desired-note {{not initialized}} 1876e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith Int<T> c; // desired-note {{not initialized}} 1886e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith struct { 1896e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith T d; 1906e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith int e; // desired-note {{not initialized}} 1916e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith Int<T> f; // desired-note {{not initialized}} 1926e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith }; 1936e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith struct { 1946e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith Literal l; 1956e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith Literal m; 1966e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith Literal n[3]; 1976e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith }; 1986e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith union { // desired-note {{not initialized}} 1996e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith T g; 2006e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith T h; 2016e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith }; 2026e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith // FIXME: This is ill-formed (no diagnostic required). We should diagnose it. 2036e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith constexpr TemplateInit() {} // desired-error {{must initialize all members}} 2046e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith}; 2056e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smithtemplate<typename T> struct TemplateInit2 { 2066e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith Literal l; 2076e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith constexpr TemplateInit2() {} // ok 2086e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith}; 2096e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith 2106e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smithtemplate<typename T> struct weak_ptr { 2116e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith constexpr weak_ptr() : p(0) {} 2126e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith T *p; 2136e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith}; 2146e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smithtemplate<typename T> struct enable_shared_from_this { 2156e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith weak_ptr<T> weak_this; 2166e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith constexpr enable_shared_from_this() {} // ok 2176e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith}; 2186e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smithconstexpr int f(enable_shared_from_this<int>); 2196e4337556efa700d5b4dceac22fa0dfbd1cdee8fRichard Smith 2209f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// - every constructor involved in initializing non-static data members and base 2219f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// class sub-objects shall be a constexpr constructor. 222745f5147e065900267c85a5568785a1991d4838fRichard Smithstruct ConstexprBaseMemberCtors : Literal { 223745f5147e065900267c85a5568785a1991d4838fRichard Smith Literal l; 224745f5147e065900267c85a5568785a1991d4838fRichard Smith 225745f5147e065900267c85a5568785a1991d4838fRichard Smith constexpr ConstexprBaseMemberCtors() : Literal(), l() {} // ok 226745f5147e065900267c85a5568785a1991d4838fRichard Smith constexpr ConstexprBaseMemberCtors(char) : // expected-error {{constexpr constructor never produces a constant expression}} 227745f5147e065900267c85a5568785a1991d4838fRichard Smith Literal(0), // expected-note {{non-constexpr constructor}} 228745f5147e065900267c85a5568785a1991d4838fRichard Smith l() {} 229745f5147e065900267c85a5568785a1991d4838fRichard Smith constexpr ConstexprBaseMemberCtors(double) : Literal(), // expected-error {{constexpr constructor never produces a constant expression}} 230745f5147e065900267c85a5568785a1991d4838fRichard Smith l(0) // expected-note {{non-constexpr constructor}} 231745f5147e065900267c85a5568785a1991d4838fRichard Smith {} 232745f5147e065900267c85a5568785a1991d4838fRichard Smith}; 2339f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 2347756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith// - every assignment-expression that is an initializer-clause appearing 2359f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// directly or indirectly within a brace-or-equal-initializer for a non-static 2369f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// data member that is not named by a mem-initializer-id shall be a constant 2379f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// expression; and 2389f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// 2399f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// Note, we deliberately do not implement this bullet, so that we can allow the 2409f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// following example. (See N3308). 2419f569cca2a4c5fb6026005434e27025b9e71309dRichard Smithstruct X { 2429f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith int a = 0; 2439f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith int b = 2 * a + 1; // ok, not a constant expression. 2449f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 2459f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr X() {} 2469f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith constexpr X(int c) : a(c) {} // ok, b initialized by 2 * c + 1 2479f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith}; 2489f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 2497756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smithunion XU1 { int a; constexpr XU1() = default; }; // expected-error{{not constexpr}} 2507756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smithunion XU2 { int a = 1; constexpr XU2() = default; }; 2517756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith 2527756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smithstruct XU3 { 2537756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith union { 2547756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith int a; 2557756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith }; 2567756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith constexpr XU3() = default; // expected-error{{not constexpr}} 2577756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith}; 2587756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smithstruct XU4 { 2597756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith union { 2607756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith int a = 1; 2617756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith }; 2627756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith constexpr XU4() = default; 2637756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith}; 2647756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith 2657756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smithstatic_assert(XU2().a == 1, ""); 2667756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smithstatic_assert(XU4().a == 1, ""); 2677756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith 2689f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// - every implicit conversion used in converting a constructor argument to the 2699f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// corresponding parameter type and converting a full-expression to the 2709f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// corresponding member type shall be one of those allowed in a constant 2719f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// expression. 2729f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// 2739f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith// We implement the proposed resolution of DR1364 and ignore this bullet. 274745f5147e065900267c85a5568785a1991d4838fRichard Smith// However, we implement the intent of this wording as part of the p5 check that 275745f5147e065900267c85a5568785a1991d4838fRichard Smith// the function must be able to produce a constant expression. 276745f5147e065900267c85a5568785a1991d4838fRichard Smithint kGlobal; // expected-note {{here}} 277745f5147e065900267c85a5568785a1991d4838fRichard Smithstruct Z { 278745f5147e065900267c85a5568785a1991d4838fRichard Smith constexpr Z(int a) : n(a) {} 279745f5147e065900267c85a5568785a1991d4838fRichard Smith constexpr Z() : n(kGlobal) {} // expected-error {{constexpr constructor never produces a constant expression}} expected-note {{read of non-const}} 280745f5147e065900267c85a5568785a1991d4838fRichard Smith int n; 281745f5147e065900267c85a5568785a1991d4838fRichard Smith}; 2829f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 2839f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith 2849f569cca2a4c5fb6026005434e27025b9e71309dRichard Smithnamespace StdExample { 2859f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith struct Length { 2869f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith explicit constexpr Length(int i = 0) : val(i) { } 2879f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith private: 2889f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith int val; 2899f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith }; 2909f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith} 2917756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith 2927756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smithnamespace CtorLookup { 2937756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith // Ensure that we look up which constructor will actually be used. 2947756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith struct A { 2957756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith constexpr A(const A&) {} 2967756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith A(A&) {} 297b8abff66a8d30356c82314c4734c692cdd479e5eRichard Smith constexpr A(int = 0); 2987756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith }; 2997756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith 3007756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith struct B : A { 3017756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith B() = default; 3027756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith constexpr B(const B&); 3037756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith constexpr B(B&); 3047756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith }; 3057756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith constexpr B::B(const B&) = default; 3067756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith constexpr B::B(B&) = default; // expected-error {{not constexpr}} 3077756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith 3087756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith struct C { 3097756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith A a; 3107756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith C() = default; 3117756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith constexpr C(const C&); 3127756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith constexpr C(C&); 3137756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith }; 3147756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith constexpr C::C(const C&) = default; 3157756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith constexpr C::C(C&) = default; // expected-error {{not constexpr}} 3167756afa6273cf708b5e3fbd6a6478eb2cada27e2Richard Smith} 3173ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith 3183ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smithnamespace PR14503 { 3193ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith template<typename> struct V { 3203ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith union { 3213ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith int n; 3223ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith struct { 3233ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith int x, 3243ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith y; 3253ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith }; 3263ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith }; 3273ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith constexpr V() : x(0) {} 3283ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith }; 3293ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith 3303ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith // The constructor is still 'constexpr' here, but the result is not intended 3313ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith // to be a constant expression. The standard is not clear on how this should 3323ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith // work. 3333ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith constexpr V<int> v; // expected-error {{constant expression}} expected-note {{subobject of type 'int' is not initialized}} 3343ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith 3353ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith constexpr int k = V<int>().x; // FIXME: ok? 3363ed4d1cbaad763c103771bdefb8b986a08f165fcRichard Smith} 337