| // RUN: %clang_cc1 -std=c++11 %s -verify |
| // expected-no-diagnostics |
| |
| // C++98 [class.copy]p10 / C++11 [class.copy]p18. |
| |
| // The implicitly-declared copy assignment operator for a class X will have the form |
| // X& X::operator=(const X&) |
| // if [every direct subobject] has a copy assignment operator whose first parameter is |
| // of type 'const volatile[opt] T &' or 'T'. Otherwise, it will have the form |
| // X &X::operator=(X&) |
| |
| struct ConstCopy { |
| ConstCopy &operator=(const ConstCopy &); |
| }; |
| |
| struct NonConstCopy { |
| NonConstCopy &operator=(NonConstCopy &); |
| }; |
| |
| struct DeletedConstCopy { |
| DeletedConstCopy &operator=(const DeletedConstCopy &) = delete; |
| }; |
| |
| struct DeletedNonConstCopy { |
| DeletedNonConstCopy &operator=(DeletedNonConstCopy &) = delete; |
| }; |
| |
| struct ImplicitlyDeletedConstCopy { |
| ImplicitlyDeletedConstCopy &operator=(ImplicitlyDeletedConstCopy &&); |
| }; |
| |
| struct ByValueCopy { |
| ByValueCopy &operator=(ByValueCopy); |
| }; |
| |
| struct AmbiguousConstCopy { |
| AmbiguousConstCopy &operator=(const AmbiguousConstCopy&); |
| AmbiguousConstCopy &operator=(AmbiguousConstCopy); |
| }; |
| |
| |
| 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 H : ByValueCopy {}; |
| struct I : AmbiguousConstCopy {}; |
| |
| struct Test { |
| friend A &A::operator=(const A &); |
| friend B &B::operator=(B &); |
| friend C &C::operator=(C &); |
| friend D &D::operator=(const D &); |
| friend E &E::operator=(E &); |
| friend F &F::operator=(const F &); |
| friend G &G::operator=(G &); |
| friend H &H::operator=(const H &); |
| friend I &I::operator=(const I &); |
| }; |