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