Home | History | Annotate | Download | only in class.copy
      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 {
      6   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;
     15   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;
     45   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 {};
     58 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