xref: /llvm-project/clang/test/CXX/special/class.copy/p18-cxx11.cpp (revision 1c33fe8feae103191a3cd75e371d80032ad5f607)
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