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;
61