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