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