xref: /aosp_15_r20/external/clang/test/CXX/special/class.copy/p11.0x.copy.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li struct Trivial {};
4*67e74705SXin Li struct NonTrivial {
5*67e74705SXin Li   NonTrivial(const NonTrivial&);
6*67e74705SXin Li };
7*67e74705SXin Li 
8*67e74705SXin Li // A defaulted copy constructor for a class X is defined as deleted if X has:
9*67e74705SXin Li 
10*67e74705SXin Li // -- a variant member with a non-trivial corresponding constructor
11*67e74705SXin Li union DeletedNTVariant {
12*67e74705SXin Li   NonTrivial NT; // expected-note{{copy constructor of 'DeletedNTVariant' is implicitly deleted because variant field 'NT' has a non-trivial copy constructor}}
13*67e74705SXin Li   DeletedNTVariant();
14*67e74705SXin Li };
15*67e74705SXin Li DeletedNTVariant DVa;
16*67e74705SXin Li DeletedNTVariant DVb(DVa); // expected-error{{call to implicitly-deleted copy constructor}}
17*67e74705SXin Li 
18*67e74705SXin Li struct DeletedNTVariant2 {
19*67e74705SXin Li   union {
20*67e74705SXin Li     NonTrivial NT; // expected-note{{copy constructor of 'DeletedNTVariant2' is implicitly deleted because variant field 'NT' has a non-trivial copy constructor}}
21*67e74705SXin Li   };
22*67e74705SXin Li   DeletedNTVariant2();
23*67e74705SXin Li };
24*67e74705SXin Li DeletedNTVariant2 DV2a;
25*67e74705SXin Li DeletedNTVariant2 DV2b(DV2a); // expected-error{{call to implicitly-deleted copy constructor}}
26*67e74705SXin Li 
27*67e74705SXin Li // -- a non-static data member of class type M (or array thereof) that cannot be
28*67e74705SXin Li //    copied because overload resolution results in an ambiguity or a function
29*67e74705SXin Li //    that is deleted or inaccessible
30*67e74705SXin Li struct NoAccess {
31*67e74705SXin Li   NoAccess() = default;
32*67e74705SXin Li private:
33*67e74705SXin Li   NoAccess(const NoAccess&);
34*67e74705SXin Li 
35*67e74705SXin Li   friend struct HasAccess;
36*67e74705SXin Li };
37*67e74705SXin Li 
38*67e74705SXin Li struct HasNoAccess {
39*67e74705SXin Li   NoAccess NA; // expected-note{{copy constructor of 'HasNoAccess' is implicitly deleted because field 'NA' has an inaccessible copy constructor}}
40*67e74705SXin Li };
41*67e74705SXin Li HasNoAccess HNAa;
42*67e74705SXin Li HasNoAccess HNAb(HNAa); // expected-error{{call to implicitly-deleted copy constructor}}
43*67e74705SXin Li 
44*67e74705SXin Li struct HasAccess {
45*67e74705SXin Li   NoAccess NA;
46*67e74705SXin Li };
47*67e74705SXin Li 
48*67e74705SXin Li HasAccess HAa;
49*67e74705SXin Li HasAccess HAb(HAa);
50*67e74705SXin Li 
51*67e74705SXin Li struct NonConst {
52*67e74705SXin Li   NonConst(NonConst&);
53*67e74705SXin Li };
54*67e74705SXin Li struct Ambiguity {
55*67e74705SXin Li   Ambiguity(const Ambiguity&);
56*67e74705SXin Li   Ambiguity(volatile Ambiguity&);
57*67e74705SXin Li };
58*67e74705SXin Li 
59*67e74705SXin Li struct IsAmbiguous {
60*67e74705SXin Li   NonConst NC;
61*67e74705SXin Li   Ambiguity A; // expected-note 2{{copy constructor of 'IsAmbiguous' is implicitly deleted because field 'A' has multiple copy constructors}}
62*67e74705SXin Li   IsAmbiguous();
63*67e74705SXin Li };
64*67e74705SXin Li IsAmbiguous IAa;
65*67e74705SXin Li IsAmbiguous IAb(IAa); // expected-error{{call to implicitly-deleted copy constructor}}
66*67e74705SXin Li 
67*67e74705SXin Li struct Deleted {
68*67e74705SXin Li   IsAmbiguous IA; // expected-note{{copy constructor of 'Deleted' is implicitly deleted because field 'IA' has a deleted copy constructor}}
69*67e74705SXin Li };
70*67e74705SXin Li Deleted Da;
71*67e74705SXin Li Deleted Db(Da); // expected-error{{call to implicitly-deleted copy constructor}}
72*67e74705SXin Li 
73*67e74705SXin Li // It's implied (but not stated) that this also applies in the case where
74*67e74705SXin Li // overload resolution would fail.
75*67e74705SXin Li struct VolatileMember {
76*67e74705SXin Li   volatile Trivial vm; // expected-note {{has no copy}}
77*67e74705SXin Li } vm1, vm2(vm1); // expected-error {{deleted}}
78*67e74705SXin Li 
79*67e74705SXin Li // -- a direct or virtual base class B that cannot be copied because overload
80*67e74705SXin Li //    resolution results in an ambiguity or a function that is deleted or
81*67e74705SXin Li //    inaccessible
82*67e74705SXin Li struct AmbiguousCopyBase : Ambiguity { // expected-note 2{{copy constructor of 'AmbiguousCopyBase' is implicitly deleted because base class 'Ambiguity' has multiple copy constructors}}
83*67e74705SXin Li   NonConst NC;
84*67e74705SXin Li };
85*67e74705SXin Li extern AmbiguousCopyBase ACBa;
86*67e74705SXin Li AmbiguousCopyBase ACBb(ACBa); // expected-error {{deleted copy constructor}}
87*67e74705SXin Li 
88*67e74705SXin Li struct DeletedCopyBase : AmbiguousCopyBase {}; // expected-note {{copy constructor of 'DeletedCopyBase' is implicitly deleted because base class 'AmbiguousCopyBase' has a deleted copy constructor}}
89*67e74705SXin Li extern DeletedCopyBase DCBa;
90*67e74705SXin Li DeletedCopyBase DCBb(DCBa); // expected-error {{deleted copy constructor}}
91*67e74705SXin Li 
92*67e74705SXin Li struct InaccessibleCopyBase : NoAccess {}; // expected-note {{copy constructor of 'InaccessibleCopyBase' is implicitly deleted because base class 'NoAccess' has an inaccessible copy constructor}}
93*67e74705SXin Li extern InaccessibleCopyBase ICBa;
94*67e74705SXin Li InaccessibleCopyBase ICBb(ICBa); // expected-error {{deleted copy constructor}}
95*67e74705SXin Li 
96*67e74705SXin Li // -- any direct or virtual base class or non-static data member of a type with
97*67e74705SXin Li //    a destructor that is deleted or inaccessible
98*67e74705SXin Li struct NoAccessDtor {
99*67e74705SXin Li private:
100*67e74705SXin Li   ~NoAccessDtor();
101*67e74705SXin Li   friend struct HasAccessDtor;
102*67e74705SXin Li };
103*67e74705SXin Li 
104*67e74705SXin Li struct HasNoAccessDtor {
105*67e74705SXin Li   NoAccessDtor NAD; // expected-note{{copy constructor of 'HasNoAccessDtor' is implicitly deleted because field 'NAD' has an inaccessible destructor}}
106*67e74705SXin Li   HasNoAccessDtor();
107*67e74705SXin Li   ~HasNoAccessDtor();
108*67e74705SXin Li };
109*67e74705SXin Li HasNoAccessDtor HNADa;
110*67e74705SXin Li HasNoAccessDtor HNADb(HNADa); // expected-error{{call to implicitly-deleted copy constructor}}
111*67e74705SXin Li 
112*67e74705SXin Li struct HasAccessDtor {
113*67e74705SXin Li   NoAccessDtor NAD;
114*67e74705SXin Li };
115*67e74705SXin Li HasAccessDtor HADa;
116*67e74705SXin Li HasAccessDtor HADb(HADa);
117*67e74705SXin Li 
118*67e74705SXin Li struct HasNoAccessDtorBase : NoAccessDtor { // expected-note{{copy constructor of 'HasNoAccessDtorBase' is implicitly deleted because base class 'NoAccessDtor' has an inaccessible destructor}}
119*67e74705SXin Li };
120*67e74705SXin Li extern HasNoAccessDtorBase HNADBa;
121*67e74705SXin Li HasNoAccessDtorBase HNADBb(HNADBa); // expected-error{{implicitly-deleted copy constructor}}
122*67e74705SXin Li 
123*67e74705SXin Li // -- a non-static data member of rvalue reference type
124*67e74705SXin Li struct RValue {
125*67e74705SXin Li   int && ri = 1; // expected-note{{copy constructor of 'RValue' is implicitly deleted because field 'ri' is of rvalue reference type 'int &&'}}
126*67e74705SXin Li   // expected-warning@-1{{binding reference member 'ri' to a temporary}} expected-note@-1 {{here}}
127*67e74705SXin Li };
128*67e74705SXin Li RValue RVa;
129*67e74705SXin Li RValue RVb(RVa); // expected-error{{call to implicitly-deleted copy constructor}}
130*67e74705SXin Li 
131*67e74705SXin Li namespace PR13381 {
132*67e74705SXin Li   struct S {
133*67e74705SXin Li     S(const S&);
134*67e74705SXin Li     S(const volatile S&) = delete; // expected-note{{deleted here}}
135*67e74705SXin Li   };
136*67e74705SXin Li   struct T {
137*67e74705SXin Li     volatile S s; // expected-note{{field 's' has a deleted copy constructor}}
138*67e74705SXin Li   };
139*67e74705SXin Li   T &f();
140*67e74705SXin Li   T t = f(); // expected-error{{call to implicitly-deleted copy constructor}}
141*67e74705SXin Li }
142*67e74705SXin Li 
143*67e74705SXin Li namespace Mutable {
144*67e74705SXin Li   struct A {
145*67e74705SXin Li     A(const A &);
146*67e74705SXin Li     A(A &) = delete; // expected-note {{deleted here}}
147*67e74705SXin Li   };
148*67e74705SXin Li 
149*67e74705SXin Li   struct B {
150*67e74705SXin Li     A a;
151*67e74705SXin Li     B(const B &);
152*67e74705SXin Li   };
153*67e74705SXin Li   B::B(const B &) = default;
154*67e74705SXin Li 
155*67e74705SXin Li   struct C {
156*67e74705SXin Li     mutable A a; // expected-note {{deleted because field 'a' has a deleted copy constructor}}
157*67e74705SXin Li     C(const C &);
158*67e74705SXin Li   };
159*67e74705SXin Li   C::C(const C &) = default; // expected-error{{would delete}}
160*67e74705SXin Li }
161