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