• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 {};
Constexpr5Constexpr558 struct 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