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