brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · 34dd741 Raw
141 lines · cpp
1// RUN: %clang_cc1 -std=c++11 -verify %s2 3namespace std_example {4  struct B1 {5    B1(int, ...) {}6  };7 8  struct B2 {9    B2(double) {}10  };11 12  int get();13 14  struct D1 : B1 { // expected-note {{no default constructor}}15    using B1::B1; // inherits B1(int, ...)16    int x;17    int y = get();18  };19 20  void test() {21    D1 d(2, 3, 4); // OK: B1 is initialized by calling B1(2, 3, 4),22    // then d.x is default-initialized (no initialization is performed),23    // then d.y is initialized by calling get()24    D1 e; // expected-error {{implicitly-deleted}}25  }26 27  struct D2 : B2 {28    using B2::B2;29    B1 b; // expected-note {{constructor inherited by 'D2' is implicitly deleted because field 'b' has no default constructor}}30  };31 32  D2 f(1.0); // expected-error {{constructor inherited by 'D2' from base class 'B2' is implicitly deleted}}33 34  struct W {35    W(int);36  };37  struct X : virtual W {38    using W::W;39    X() = delete;40  };41  struct Y : X {42    using X::X;43  };44  struct Z : Y, virtual W {45    using Y::Y;46  };47  Z z(0); // OK: initialization of Y does not invoke default constructor of X48 49  template <class T> struct Log : T {50    using T::T; // inherits all constructors from class T51    ~Log() { /* ... */ }52  };53}54 55namespace vbase {56  struct V {57    V(int);58  };59 60  struct A : virtual V {61    A() = delete; // expected-note 2{{deleted here}} expected-note {{deleted}}62    using V::V;63  };64  struct B : virtual V { // expected-note {{no default constructor}}65    B() = delete; // expected-note 2{{deleted here}}66    B(int, int);67    using V::V;68  };69  struct C : B { // expected-note {{deleted default constructor}}70    using B::B;71  };72  struct D : A, C { // expected-note {{deleted default constructor}} expected-note {{deleted corresponding constructor}}73    using A::A;74    using C::C;75  };76 77  A a0; // expected-error {{deleted}}78  A a1(0);79  B b0; // expected-error {{deleted}}80  B b1(0);81  B b2(0, 0);82  C c0; // expected-error {{deleted}}83  C c1(0);84  C c2(0, 0); // expected-error {{deleted}}85  D d0; // expected-error {{deleted}}86  D d1(0);87  D d2(0, 0); // expected-error {{deleted}}88}89 90namespace vbase_of_vbase {91  struct V { V(int); };92  struct W : virtual V { using V::V; };93  struct X : virtual W, virtual V { using W::W; };94  X x(0);95}96 97namespace constexpr_init_order {98  struct Param;99  struct A {100    constexpr A(Param);101    int a;102  };103 104  struct B : A { B(); using A::A; int b = 2; };105 106  // Construct a situation where a value can be observed to change during107  // constant evaluation in C++11: value-initialization of Wrap2 performs108  // zero-initialization and then calls the constructor.109  struct Wrap1 : B { constexpr Wrap1(); };110  struct Wrap2 : Wrap1 {};111 112  extern const Wrap2 b;113 114  struct Param {115    constexpr Param(int c) : n(4 * b.a + b.b + c) {}116    int n;117  };118 119  constexpr A::A(Param p) : a(p.n) {}120 121  constexpr Wrap1::Wrap1() : B(1) {}122 123  constexpr Wrap2 b = {};124  constexpr B c(1);125  static_assert(b.a == 1, "p should be initialized before B() is executed");126  static_assert(c.a == 7, "b not initialized properly");127}128 129namespace default_args {130  // We work around a defect in P0136R1 where it would reject reasonable131  // code like the following:132  struct Base {133    Base(int = 0);134  };135  struct Derived : Base {136    using Base::Base;137  };138  Derived d;139  // FIXME: Once a fix is standardized, implement it.140}141