16180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
26180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
36180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith// If the implicitly-defined constructor would satisfy the requirements of a
46180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith// constexpr constructor, the implicitly-defined constructor is constexpr.
56180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstruct Constexpr1 {
66180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  constexpr Constexpr1() : n(0) {}
76180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  int n;
86180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith};
96180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithconstexpr Constexpr1 c1a = Constexpr1(Constexpr1()); // ok
106180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithconstexpr Constexpr1 c1b = Constexpr1(Constexpr1(c1a)); // ok
116180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
126180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstruct Constexpr2 {
136180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  Constexpr1 ce1;
146180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  constexpr Constexpr2() = default;
156180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  constexpr Constexpr2(const Constexpr2 &o) : ce1(o.ce1) {}
166180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  // no move constructor
176180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith};
186180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
196180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithconstexpr Constexpr2 c2a = Constexpr2(Constexpr2()); // ok
206180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithconstexpr Constexpr2 c2b = Constexpr2(Constexpr2(c2a)); // ok
216180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
226180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstruct Constexpr3 {
236180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  Constexpr2 ce2;
246180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  // all special constructors are constexpr, move ctor calls ce2's copy ctor
256180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith};
266180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
276180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithconstexpr Constexpr3 c3a = Constexpr3(Constexpr3()); // ok
286180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithconstexpr Constexpr3 c3b = Constexpr3(Constexpr3(c3a)); // ok
296180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
306180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstruct NonConstexprCopy {
316180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  constexpr NonConstexprCopy() = default;
326180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  NonConstexprCopy(const NonConstexprCopy &);
336180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  constexpr NonConstexprCopy(NonConstexprCopy &&) = default;
346180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
356180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  int n = 42;
366180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith};
376180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
386180245e9f63d2927b185ec251fb75aba30f1cacRichard SmithNonConstexprCopy::NonConstexprCopy(const NonConstexprCopy &) = default; // expected-note {{here}}
396180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
406180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithconstexpr NonConstexprCopy ncc1 = NonConstexprCopy(NonConstexprCopy()); // ok
416180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithconstexpr NonConstexprCopy ncc2 = ncc1; // expected-error {{constant expression}} expected-note {{non-constexpr constructor}}
426180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
436180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstruct NonConstexprDefault {
446180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  NonConstexprDefault() = default;
456180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  constexpr NonConstexprDefault(int n) : n(n) {}
466180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  int n;
476180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith};
486180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithstruct Constexpr4 {
496180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith  NonConstexprDefault ncd;
506180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith};
516180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith
526180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithconstexpr NonConstexprDefault ncd = NonConstexprDefault(NonConstexprDefault(1));
536180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithconstexpr Constexpr4 c4a = { ncd };
546180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithconstexpr Constexpr4 c4b = Constexpr4(c4a);
556180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithconstexpr Constexpr4 c4c = Constexpr4(static_cast<Constexpr4&&>(const_cast<Constexpr4&>(c4b)));
56de8facc81f505ca7e86022911145271f614b96eaRichard Smith
57de8facc81f505ca7e86022911145271f614b96eaRichard Smithstruct Constexpr5Base {};
58de8facc81f505ca7e86022911145271f614b96eaRichard Smithstruct Constexpr5 : Constexpr5Base { constexpr Constexpr5() {} };
59de8facc81f505ca7e86022911145271f614b96eaRichard Smithconstexpr Constexpr5 ce5move = Constexpr5();
60de8facc81f505ca7e86022911145271f614b96eaRichard Smithconstexpr Constexpr5 ce5copy = ce5move;
613f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith
623f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith// An explicitly-defaulted constructor doesn't become constexpr until the end of
633f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith// its class. Make sure we note that the class has a constexpr constructor when
643f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith// that happens.
653f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smithnamespace PR13052 {
663f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith  template<typename T> struct S {
673f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    S() = default; // expected-note 2{{here}}
683f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    S(S&&) = default;
693f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    S(const S&) = default;
703f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    T t;
713f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith  };
723f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith
733f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith  struct U {
743f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    U() = default;
753f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    U(U&&) = default;
763f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    U(const U&) = default;
773f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith  };
783f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith
793f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith  struct V {
803f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    V(); // expected-note {{here}}
813f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    V(V&&) = default;
823f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    V(const V&) = default;
833f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith  };
843f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith
853f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith  struct W {
863f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    W(); // expected-note {{here}}
873f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith  };
883f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith
893f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith  static_assert(__is_literal_type(U), "");
903f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith  static_assert(!__is_literal_type(V), "");
913f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith  static_assert(!__is_literal_type(W), "");
923f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith  static_assert(__is_literal_type(S<U>), "");
933f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith  static_assert(!__is_literal_type(S<V>), "");
943f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith  static_assert(!__is_literal_type(S<W>), "");
953f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith
963f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith  struct X {
973f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    friend constexpr U::U() noexcept;
983f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    friend constexpr U::U(U&&) noexcept;
993f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    friend constexpr U::U(const U&) noexcept;
1003f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    friend constexpr V::V(); // expected-error {{follows non-constexpr declaration}}
1013f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    friend constexpr V::V(V&&) noexcept;
1023f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    friend constexpr V::V(const V&) noexcept;
1033f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    friend constexpr W::W(); // expected-error {{follows non-constexpr declaration}}
1043f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    friend constexpr W::W(W&&) noexcept;
1053f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    friend constexpr W::W(const W&) noexcept;
1063f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    friend constexpr S<U>::S() noexcept;
1073f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    friend constexpr S<U>::S(S<U>&&) noexcept;
1083f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    friend constexpr S<U>::S(const S<U>&) noexcept;
1093f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    friend constexpr S<V>::S(); // expected-error {{follows non-constexpr declaration}}
1103f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    friend constexpr S<V>::S(S<V>&&) noexcept;
1113f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    friend constexpr S<V>::S(const S<V>&) noexcept;
1123f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    friend constexpr S<W>::S(); // expected-error {{follows non-constexpr declaration}}
1133f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    friend constexpr S<W>::S(S<W>&&) noexcept;
1143f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith    friend constexpr S<W>::S(const S<W>&) noexcept;
1153f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith  };
1163f5f558a4ca08fe952cbbdf69b87487163c9a719Richard Smith}
117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace Mutable {
119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A {
120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    constexpr A(A &);
121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    A(const A &);
122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B {
124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    constexpr B(const B &) = default; // ok
125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    mutable A a;
126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct C {
128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    constexpr C(const C &) = default; // expected-error {{not constexpr}}
129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    A a;
130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
132