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