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