1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
2c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt
37bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendlingstruct Trivial {};
4c32d684d6c787b332a64c9013598d5ef668c4b45Sean Huntstruct NonTrivial {
5c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  NonTrivial(const NonTrivial&);
6c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt};
7c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt
8ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// A defaulted copy constructor for a class X is defined as deleted if X has:
9ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith
10ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// -- a variant member with a non-trivial corresponding constructor
116c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithunion DeletedNTVariant {
12a2e76f56c60dbd4de3dc0fed02bb01bea4dcff81Richard Smith  NonTrivial NT; // expected-note{{copy constructor of 'DeletedNTVariant' is implicitly deleted because variant field 'NT' has a non-trivial copy constructor}}
13c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  DeletedNTVariant();
14c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt};
15c32d684d6c787b332a64c9013598d5ef668c4b45Sean HuntDeletedNTVariant DVa;
16e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas GregorDeletedNTVariant DVb(DVa); // expected-error{{call to implicitly-deleted copy constructor}}
17c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt
186c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct DeletedNTVariant2 {
19c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  union {
20a2e76f56c60dbd4de3dc0fed02bb01bea4dcff81Richard Smith    NonTrivial NT; // expected-note{{copy constructor of 'DeletedNTVariant2' is implicitly deleted because variant field 'NT' has a non-trivial copy constructor}}
21c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  };
22c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  DeletedNTVariant2();
23c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt};
24c32d684d6c787b332a64c9013598d5ef668c4b45Sean HuntDeletedNTVariant2 DV2a;
25e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas GregorDeletedNTVariant2 DV2b(DV2a); // expected-error{{call to implicitly-deleted copy constructor}}
26c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt
27ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// -- a non-static data member of class type M (or array thereof) that cannot be
28ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith//    copied because overload resolution results in an ambiguity or a function
29ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith//    that is deleted or inaccessible
30c32d684d6c787b332a64c9013598d5ef668c4b45Sean Huntstruct NoAccess {
31c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  NoAccess() = default;
32c32d684d6c787b332a64c9013598d5ef668c4b45Sean Huntprivate:
33c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  NoAccess(const NoAccess&);
34c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt
35c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  friend struct HasAccess;
36c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt};
37c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt
386c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct HasNoAccess {
396c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  NoAccess NA; // expected-note{{copy constructor of 'HasNoAccess' is implicitly deleted because field 'NA' has an inaccessible copy constructor}}
40c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt};
41c32d684d6c787b332a64c9013598d5ef668c4b45Sean HuntHasNoAccess HNAa;
42e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas GregorHasNoAccess HNAb(HNAa); // expected-error{{call to implicitly-deleted copy constructor}}
43c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt
44c32d684d6c787b332a64c9013598d5ef668c4b45Sean Huntstruct HasAccess {
45c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  NoAccess NA;
46c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt};
47c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt
48c32d684d6c787b332a64c9013598d5ef668c4b45Sean HuntHasAccess HAa;
49c32d684d6c787b332a64c9013598d5ef668c4b45Sean HuntHasAccess HAb(HAa);
50c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt
51c32d684d6c787b332a64c9013598d5ef668c4b45Sean Huntstruct NonConst {
52c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  NonConst(NonConst&);
53c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt};
54c32d684d6c787b332a64c9013598d5ef668c4b45Sean Huntstruct Ambiguity {
55c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  Ambiguity(const Ambiguity&);
56c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  Ambiguity(volatile Ambiguity&);
57c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt};
58c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt
596c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct IsAmbiguous {
60c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  NonConst NC;
616c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  Ambiguity A; // expected-note 2{{copy constructor of 'IsAmbiguous' is implicitly deleted because field 'A' has multiple copy constructors}}
62c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  IsAmbiguous();
63c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt};
64c32d684d6c787b332a64c9013598d5ef668c4b45Sean HuntIsAmbiguous IAa;
65e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas GregorIsAmbiguous IAb(IAa); // expected-error{{call to implicitly-deleted copy constructor}}
66c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt
676c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct Deleted {
686c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  IsAmbiguous IA; // expected-note{{copy constructor of 'Deleted' is implicitly deleted because field 'IA' has a deleted copy constructor}}
69c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt};
70c32d684d6c787b332a64c9013598d5ef668c4b45Sean HuntDeleted Da;
71e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas GregorDeleted Db(Da); // expected-error{{call to implicitly-deleted copy constructor}}
72c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt
737bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling// It's implied (but not stated) that this also applies in the case where
747bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling// overload resolution would fail.
757bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendlingstruct VolatileMember {
767bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling  volatile Trivial vm; // expected-note {{has no copy}}
777bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling} vm1, vm2(vm1); // expected-error {{deleted}}
787bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling
79ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// -- a direct or virtual base class B that cannot be copied because overload
80ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith//    resolution results in an ambiguity or a function that is deleted or
81ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith//    inaccessible
826c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct AmbiguousCopyBase : Ambiguity { // expected-note 2{{copy constructor of 'AmbiguousCopyBase' is implicitly deleted because base class 'Ambiguity' has multiple copy constructors}}
83ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith  NonConst NC;
84ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith};
85ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smithextern AmbiguousCopyBase ACBa;
86ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard SmithAmbiguousCopyBase ACBb(ACBa); // expected-error {{deleted copy constructor}}
87ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith
886c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct DeletedCopyBase : AmbiguousCopyBase {}; // expected-note {{copy constructor of 'DeletedCopyBase' is implicitly deleted because base class 'AmbiguousCopyBase' has a deleted copy constructor}}
89ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smithextern DeletedCopyBase DCBa;
90ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard SmithDeletedCopyBase DCBb(DCBa); // expected-error {{deleted copy constructor}}
91ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith
926c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct InaccessibleCopyBase : NoAccess {}; // expected-note {{copy constructor of 'InaccessibleCopyBase' is implicitly deleted because base class 'NoAccess' has an inaccessible copy constructor}}
93ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smithextern InaccessibleCopyBase ICBa;
94ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard SmithInaccessibleCopyBase ICBb(ICBa); // expected-error {{deleted copy constructor}}
95ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith
96ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// -- any direct or virtual base class or non-static data member of a type with
97ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith//    a destructor that is deleted or inaccessible
98c32d684d6c787b332a64c9013598d5ef668c4b45Sean Huntstruct NoAccessDtor {
99c32d684d6c787b332a64c9013598d5ef668c4b45Sean Huntprivate:
100c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  ~NoAccessDtor();
101c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  friend struct HasAccessDtor;
102c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt};
103c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt
1046c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct HasNoAccessDtor {
1056c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  NoAccessDtor NAD; // expected-note{{copy constructor of 'HasNoAccessDtor' is implicitly deleted because field 'NAD' has an inaccessible destructor}}
106c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  HasNoAccessDtor();
107c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  ~HasNoAccessDtor();
108c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt};
109c32d684d6c787b332a64c9013598d5ef668c4b45Sean HuntHasNoAccessDtor HNADa;
110e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas GregorHasNoAccessDtor HNADb(HNADa); // expected-error{{call to implicitly-deleted copy constructor}}
111c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt
112c32d684d6c787b332a64c9013598d5ef668c4b45Sean Huntstruct HasAccessDtor {
113c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt  NoAccessDtor NAD;
114c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt};
115c32d684d6c787b332a64c9013598d5ef668c4b45Sean HuntHasAccessDtor HADa;
116c32d684d6c787b332a64c9013598d5ef668c4b45Sean HuntHasAccessDtor HADb(HADa);
117c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt
1186c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct HasNoAccessDtorBase : NoAccessDtor { // expected-note{{copy constructor of 'HasNoAccessDtorBase' is implicitly deleted because base class 'NoAccessDtor' has an inaccessible destructor}}
119ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith};
120ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smithextern HasNoAccessDtorBase HNADBa;
121ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard SmithHasNoAccessDtorBase HNADBb(HNADBa); // expected-error{{implicitly-deleted copy constructor}}
122ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith
123ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// -- a non-static data member of rvalue reference type
1246c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct RValue {
1256c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith  int && ri = 1; // expected-note{{copy constructor of 'RValue' is implicitly deleted because field 'ri' is of rvalue reference type 'int &&'}}
126a4bb99cd0055ba0e1f3107890e5b6cbe31e6d1ccRichard Smith  // expected-warning@-1{{binding reference member 'ri' to a temporary}} expected-note@-1 {{here}}
127c32d684d6c787b332a64c9013598d5ef668c4b45Sean Hunt};
128c32d684d6c787b332a64c9013598d5ef668c4b45Sean HuntRValue RVa;
129e4e68d45f89ff4899d30cbd196603d09b7fbc150Douglas GregorRValue RVb(RVa); // expected-error{{call to implicitly-deleted copy constructor}}
130517bb844016064f303416f09f1aeb123e32c0f66Richard Smith
131517bb844016064f303416f09f1aeb123e32c0f66Richard Smithnamespace PR13381 {
132517bb844016064f303416f09f1aeb123e32c0f66Richard Smith  struct S {
133517bb844016064f303416f09f1aeb123e32c0f66Richard Smith    S(const S&);
134517bb844016064f303416f09f1aeb123e32c0f66Richard Smith    S(const volatile S&) = delete; // expected-note{{deleted here}}
135517bb844016064f303416f09f1aeb123e32c0f66Richard Smith  };
136517bb844016064f303416f09f1aeb123e32c0f66Richard Smith  struct T {
137517bb844016064f303416f09f1aeb123e32c0f66Richard Smith    volatile S s; // expected-note{{field 's' has a deleted copy constructor}}
138517bb844016064f303416f09f1aeb123e32c0f66Richard Smith  };
139517bb844016064f303416f09f1aeb123e32c0f66Richard Smith  T &f();
140517bb844016064f303416f09f1aeb123e32c0f66Richard Smith  T t = f(); // expected-error{{call to implicitly-deleted copy constructor}}
141517bb844016064f303416f09f1aeb123e32c0f66Richard Smith}
142651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
143651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace Mutable {
144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A {
145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    A(const A &);
146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    A(A &) = delete; // expected-note {{deleted here}}
147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
149651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B {
150651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    A a;
151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    B(const B &);
152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  B::B(const B &) = default;
154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct C {
156651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    mutable A a; // expected-note {{deleted because field 'a' has a deleted copy constructor}}
157651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    C(const C &);
158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  C::C(const C &) = default; // expected-error{{would delete}}
160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
161