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