1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2 3 // If the implicitly-defined constructor would satisfy the requirements of a 4 // constexpr constructor, the implicitly-defined constructor is constexpr. 5 struct Constexpr1 { Constexpr1Constexpr16 constexpr Constexpr1() : n(0) {} 7 int n; 8 }; 9 constexpr Constexpr1 c1a = Constexpr1(Constexpr1()); // ok 10 constexpr Constexpr1 c1b = Constexpr1(Constexpr1(c1a)); // ok 11 12 struct Constexpr2 { 13 Constexpr1 ce1; 14 constexpr Constexpr2() = default; Constexpr2Constexpr215 constexpr Constexpr2(const Constexpr2 &o) : ce1(o.ce1) {} 16 // no move constructor 17 }; 18 19 constexpr Constexpr2 c2a = Constexpr2(Constexpr2()); // ok 20 constexpr Constexpr2 c2b = Constexpr2(Constexpr2(c2a)); // ok 21 22 struct Constexpr3 { 23 Constexpr2 ce2; 24 // all special constructors are constexpr, move ctor calls ce2's copy ctor 25 }; 26 27 constexpr Constexpr3 c3a = Constexpr3(Constexpr3()); // ok 28 constexpr Constexpr3 c3b = Constexpr3(Constexpr3(c3a)); // ok 29 30 struct NonConstexprCopy { 31 constexpr NonConstexprCopy() = default; 32 NonConstexprCopy(const NonConstexprCopy &); 33 constexpr NonConstexprCopy(NonConstexprCopy &&) = default; 34 35 int n = 42; 36 }; 37 38 NonConstexprCopy::NonConstexprCopy(const NonConstexprCopy &) = default; // expected-note {{here}} 39 40 constexpr NonConstexprCopy ncc1 = NonConstexprCopy(NonConstexprCopy()); // ok 41 constexpr NonConstexprCopy ncc2 = ncc1; // expected-error {{constant expression}} expected-note {{non-constexpr constructor}} 42 43 struct NonConstexprDefault { 44 NonConstexprDefault() = default; NonConstexprDefaultNonConstexprDefault45 constexpr NonConstexprDefault(int n) : n(n) {} 46 int n; 47 }; 48 struct Constexpr4 { 49 NonConstexprDefault ncd; 50 }; 51 52 constexpr NonConstexprDefault ncd = NonConstexprDefault(NonConstexprDefault(1)); 53 constexpr Constexpr4 c4a = { ncd }; 54 constexpr Constexpr4 c4b = Constexpr4(c4a); 55 constexpr Constexpr4 c4c = Constexpr4(static_cast<Constexpr4&&>(const_cast<Constexpr4&>(c4b))); 56 57 struct Constexpr5Base {}; Constexpr5Constexpr558struct Constexpr5 : Constexpr5Base { constexpr Constexpr5() {} }; 59 constexpr Constexpr5 ce5move = Constexpr5(); 60 constexpr Constexpr5 ce5copy = ce5move; 61 62 // An explicitly-defaulted constructor doesn't become constexpr until the end of 63 // its class. Make sure we note that the class has a constexpr constructor when 64 // that happens. 65 namespace PR13052 { 66 template<typename T> struct S { 67 S() = default; // expected-note 2{{here}} 68 S(S&&) = default; 69 S(const S&) = default; 70 T t; 71 }; 72 73 struct U { 74 U() = default; 75 U(U&&) = default; 76 U(const U&) = default; 77 }; 78 79 struct V { 80 V(); // expected-note {{here}} 81 V(V&&) = default; 82 V(const V&) = default; 83 }; 84 85 struct W { 86 W(); // expected-note {{here}} 87 }; 88 89 static_assert(__is_literal_type(U), ""); 90 static_assert(!__is_literal_type(V), ""); 91 static_assert(!__is_literal_type(W), ""); 92 static_assert(__is_literal_type(S<U>), ""); 93 static_assert(!__is_literal_type(S<V>), ""); 94 static_assert(!__is_literal_type(S<W>), ""); 95 96 struct X { 97 friend constexpr U::U() noexcept; 98 friend constexpr U::U(U&&) noexcept; 99 friend constexpr U::U(const U&) noexcept; 100 friend constexpr V::V(); // expected-error {{follows non-constexpr declaration}} 101 friend constexpr V::V(V&&) noexcept; 102 friend constexpr V::V(const V&) noexcept; 103 friend constexpr W::W(); // expected-error {{follows non-constexpr declaration}} 104 friend constexpr W::W(W&&) noexcept; 105 friend constexpr W::W(const W&) noexcept; 106 friend constexpr S<U>::S() noexcept; 107 friend constexpr S<U>::S(S<U>&&) noexcept; 108 friend constexpr S<U>::S(const S<U>&) noexcept; 109 friend constexpr S<V>::S(); // expected-error {{follows non-constexpr declaration}} 110 friend constexpr S<V>::S(S<V>&&) noexcept; 111 friend constexpr S<V>::S(const S<V>&) noexcept; 112 friend constexpr S<W>::S(); // expected-error {{follows non-constexpr declaration}} 113 friend constexpr S<W>::S(S<W>&&) noexcept; 114 friend constexpr S<W>::S(const S<W>&) noexcept; 115 }; 116 } 117 118 namespace Mutable { 119 struct A { 120 constexpr A(A &); 121 A(const A &); 122 }; 123 struct B { 124 constexpr B(const B &) = default; // ok 125 mutable A a; 126 }; 127 struct C { 128 constexpr C(const C &) = default; // expected-error {{not constexpr}} 129 A a; 130 }; 131 } 132