Home | History | Annotate | Download | only in class.copy
      1 // RUN: %clang_cc1 -std=c++11 %s -verify
      2 // expected-no-diagnostics
      3 
      4 // C++98 [class.copy]p5 / C++11 [class.copy]p8.
      5 
      6 // The implicitly-declared copy constructor for a class X will have the form
      7 //   X::X(const X&)
      8 // if [every direct subobject] has a copy constructor whose first parameter is
      9 // of type 'const volatile[opt] T &'. Otherwise, it will have the form
     10 //   X::X(X&)
     11 
     12 struct ConstCopy {
     13   ConstCopy(const ConstCopy &);
     14 };
     15 
     16 struct NonConstCopy {
     17   NonConstCopy(NonConstCopy &);
     18 };
     19 
     20 struct DeletedConstCopy {
     21   DeletedConstCopy(const DeletedConstCopy &) = delete;
     22 };
     23 
     24 struct DeletedNonConstCopy {
     25   DeletedNonConstCopy(DeletedNonConstCopy &) = delete;
     26 };
     27 
     28 struct ImplicitlyDeletedConstCopy {
     29   ImplicitlyDeletedConstCopy(ImplicitlyDeletedConstCopy &&);
     30 };
     31 
     32 
     33 struct A : ConstCopy {};
     34 struct B : NonConstCopy { ConstCopy a; };
     35 struct C : ConstCopy { NonConstCopy a; };
     36 struct D : DeletedConstCopy {};
     37 struct E : DeletedNonConstCopy {};
     38 struct F { ImplicitlyDeletedConstCopy a; };
     39 struct G : virtual B {};
     40 
     41 struct Test {
     42   friend A::A(const A &);
     43   friend B::B(B &);
     44   friend C::C(C &);
     45   friend D::D(const D &);
     46   friend E::E(E &);
     47   constexpr friend F::F(const F &);
     48   friend G::G(G &);
     49 };
     50