p13-0x.cpp revision de8facc81f505ca7e86022911145271f614b96ea
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. 5struct Constexpr1 { 6 constexpr Constexpr1() : n(0) {} 7 int n; 8}; 9constexpr Constexpr1 c1a = Constexpr1(Constexpr1()); // ok 10constexpr Constexpr1 c1b = Constexpr1(Constexpr1(c1a)); // ok 11 12struct Constexpr2 { 13 Constexpr1 ce1; 14 constexpr Constexpr2() = default; 15 constexpr Constexpr2(const Constexpr2 &o) : ce1(o.ce1) {} 16 // no move constructor 17}; 18 19constexpr Constexpr2 c2a = Constexpr2(Constexpr2()); // ok 20constexpr Constexpr2 c2b = Constexpr2(Constexpr2(c2a)); // ok 21 22struct Constexpr3 { 23 Constexpr2 ce2; 24 // all special constructors are constexpr, move ctor calls ce2's copy ctor 25}; 26 27constexpr Constexpr3 c3a = Constexpr3(Constexpr3()); // ok 28constexpr Constexpr3 c3b = Constexpr3(Constexpr3(c3a)); // ok 29 30struct NonConstexprCopy { 31 constexpr NonConstexprCopy() = default; 32 NonConstexprCopy(const NonConstexprCopy &); 33 constexpr NonConstexprCopy(NonConstexprCopy &&) = default; 34 35 int n = 42; 36}; 37 38NonConstexprCopy::NonConstexprCopy(const NonConstexprCopy &) = default; // expected-note {{here}} 39 40constexpr NonConstexprCopy ncc1 = NonConstexprCopy(NonConstexprCopy()); // ok 41constexpr NonConstexprCopy ncc2 = ncc1; // expected-error {{constant expression}} expected-note {{non-constexpr constructor}} 42 43struct NonConstexprDefault { 44 NonConstexprDefault() = default; 45 constexpr NonConstexprDefault(int n) : n(n) {} 46 int n; 47}; 48struct Constexpr4 { 49 NonConstexprDefault ncd; 50}; 51 52constexpr NonConstexprDefault ncd = NonConstexprDefault(NonConstexprDefault(1)); 53constexpr Constexpr4 c4a = { ncd }; 54constexpr Constexpr4 c4b = Constexpr4(c4a); 55constexpr Constexpr4 c4c = Constexpr4(static_cast<Constexpr4&&>(const_cast<Constexpr4&>(c4b))); 56 57struct Constexpr5Base {}; 58struct Constexpr5 : Constexpr5Base { constexpr Constexpr5() {} }; 59constexpr Constexpr5 ce5move = Constexpr5(); 60constexpr Constexpr5 ce5copy = ce5move; 61