// RUN: %clang_cc1 -std=c++11 %s -verify // expected-no-diagnostics // C++98 [class.copy]p5 / C++11 [class.copy]p8. // The implicitly-declared copy constructor for a class X will have the form // X::X(const X&) // if [every direct subobject] has a copy constructor whose first parameter is // of type 'const volatile[opt] T &'. Otherwise, it will have the form // X::X(X&) struct ConstCopy { ConstCopy(const ConstCopy &); }; struct NonConstCopy { NonConstCopy(NonConstCopy &); }; struct DeletedConstCopy { DeletedConstCopy(const DeletedConstCopy &) = delete; }; struct DeletedNonConstCopy { DeletedNonConstCopy(DeletedNonConstCopy &) = delete; }; struct ImplicitlyDeletedConstCopy { ImplicitlyDeletedConstCopy(ImplicitlyDeletedConstCopy &&); }; struct A : ConstCopy {}; struct B : NonConstCopy { ConstCopy a; }; struct C : ConstCopy { NonConstCopy a; }; struct D : DeletedConstCopy {}; struct E : DeletedNonConstCopy {}; struct F { ImplicitlyDeletedConstCopy a; }; struct G : virtual B {}; struct Test { friend A::A(const A &); friend B::B(B &); friend C::C(C &); friend D::D(const D &); friend E::E(E &); constexpr friend F::F(const F &); friend G::G(G &); };