Home | History | Annotate | Download | only in dcl.fct.def.default
      1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
      2 
      3 // An explicitly-defaulted function may be declared constexpr only if it would
      4 // have been implicitly declared as constexpr.
      5 struct S1 {
      6   constexpr S1() = default; // expected-error {{defaulted definition of default constructor is not constexpr}}
      7   constexpr S1(const S1&) = default;
      8   constexpr S1(S1&&) = default;
      9   constexpr S1 &operator=(const S1&) = default; // expected-error {{explicitly-defaulted copy assignment operator may not have}}
     10   constexpr S1 &operator=(S1&&) = default; // expected-error {{explicitly-defaulted move assignment operator may not have}}
     11   constexpr ~S1() = default; // expected-error {{destructor cannot be marked constexpr}}
     12   int n;
     13 };
     14 struct NoCopyMove {
     15   constexpr NoCopyMove() {}
     16   NoCopyMove(const NoCopyMove&);
     17   NoCopyMove(NoCopyMove&&);
     18 };
     19 struct S2 {
     20   constexpr S2() = default;
     21   constexpr S2(const S2&) = default; // expected-error {{defaulted definition of copy constructor is not constexpr}}
     22   constexpr S2(S2&&) = default; // expected-error {{defaulted definition of move constructor is not constexpr}}
     23   NoCopyMove ncm;
     24 };
     25 
     26 // If a function is explicitly defaulted on its first declaration
     27 //   -- it is implicitly considered to be constexpr if the implicit declaration
     28 //      would be
     29 struct S3 {
     30   S3() = default; // expected-note {{here}}
     31   S3(const S3&) = default;
     32   S3(S3&&) = default;
     33   constexpr S3(int n) : n(n) {}
     34   int n;
     35 };
     36 constexpr S3 s3a = S3(0);
     37 constexpr S3 s3b = s3a;
     38 constexpr S3 s3c = S3();
     39 constexpr S3 s3d; // expected-error {{constant expression}} expected-note {{non-constexpr constructor}}
     40 
     41 struct S4 {
     42   S4() = default;
     43   S4(const S4&) = default; // expected-note {{here}}
     44   S4(S4&&) = default; // expected-note {{here}}
     45   NoCopyMove ncm;
     46 };
     47 constexpr S4 s4a; // ok
     48 constexpr S4 s4b = S4(); // expected-error {{constant expression}} expected-note {{non-constexpr constructor}}
     49 constexpr S4 s4c = s4a; // expected-error {{constant expression}} expected-note {{non-constexpr constructor}}
     50 
     51 struct S5 {
     52   constexpr S5();
     53   int n = 1, m = n + 3;
     54 };
     55 constexpr S5::S5() = default;
     56 static_assert(S5().m == 4, "");
     57