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