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