1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 37bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendlingstruct Trivial {}; 4769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct NonTrivial { 5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines NonTrivial(NonTrivial&&); // expected-note{{copy constructor is implicitly deleted}} 6769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 7769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 8ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// A defaulted move 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 11769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntunion DeletedNTVariant { 12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines NonTrivial NT; // expected-note{{deleted because variant field 'NT' has a non-trivial move constructor}} 13769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt DeletedNTVariant(DeletedNTVariant&&); 14769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 15769bb2d0dbd173589747cc8e7428a66db3b2692eSean HuntDeletedNTVariant::DeletedNTVariant(DeletedNTVariant&&) = default; // expected-error{{would delete}} 16769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 17769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct DeletedNTVariant2 { 18769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt union { 19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines NonTrivial NT; // expected-note{{deleted because variant field 'NT' has a non-trivial move constructor}} 20769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt }; 21769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt DeletedNTVariant2(DeletedNTVariant2&&); 22769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 23769bb2d0dbd173589747cc8e7428a66db3b2692eSean HuntDeletedNTVariant2::DeletedNTVariant2(DeletedNTVariant2&&) = default; // expected-error{{would delete}} 24769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 25ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// -- a non-static data member of class type M (or array thereof) that cannot be 26ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// copied because overload resolution results in an ambiguity or a function 27ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// that is deleted or inaccessible 28769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct NoAccess { 29769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt NoAccess() = default; 30769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntprivate: 31769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt NoAccess(NoAccess&&); 32769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 33769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt friend struct HasAccess; 34769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 35769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 36769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct HasNoAccess { 37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines NoAccess NA; // expected-note{{deleted because field 'NA' has an inaccessible move constructor}} 38769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt HasNoAccess(HasNoAccess&&); 39769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 40769bb2d0dbd173589747cc8e7428a66db3b2692eSean HuntHasNoAccess::HasNoAccess(HasNoAccess&&) = default; // expected-error{{would delete}} 41769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 42769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct HasAccess { 43769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt NoAccess NA; 44769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt HasAccess(HasAccess&&); 45769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 46769bb2d0dbd173589747cc8e7428a66db3b2692eSean HuntHasAccess::HasAccess(HasAccess&&) = default; 47769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 48ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smithstruct Ambiguity { 49ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith Ambiguity(const Ambiguity&&); 50ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith Ambiguity(volatile Ambiguity&&); 51ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith}; 52ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith 53ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smithstruct IsAmbiguous { 54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ambiguity A; // expected-note{{deleted because field 'A' has multiple move constructors}} 55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IsAmbiguous(IsAmbiguous&&); // expected-note{{copy constructor is implicitly deleted because 'IsAmbiguous' has a user-declared move constructor}} 56ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith}; 57ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard SmithIsAmbiguous::IsAmbiguous(IsAmbiguous&&) = default; // expected-error{{would delete}} 58ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith 59ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smithstruct Deleted { 60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: This diagnostic is slightly wrong: the constructor we select to move 61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // 'IA' is deleted, but we select the copy constructor (we ignore the move 62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // constructor, because it was defaulted and deleted). 63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IsAmbiguous IA; // expected-note{{deleted because field 'IA' has a deleted move constructor}} 64ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith Deleted(Deleted&&); 65ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith}; 66ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard SmithDeleted::Deleted(Deleted&&) = default; // expected-error{{would delete}} 67ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith 687bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling// It's implied (but not stated) that this should also happen if overload 697bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling// resolution fails. 707bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendlingstruct ConstMember { 717bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling const Trivial ct; 727bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling ConstMember(ConstMember&&); 737bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling}; 747bd67854cfa59699e0efe72244af1578f2a1c09eBill WendlingConstMember::ConstMember(ConstMember&&) = default; // ok, calls copy ctor 757bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendlingstruct ConstMoveOnlyMember { 76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: This diagnostic is slightly wrong: the constructor we select to move 77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // 'cnt' is deleted, but we select the copy constructor, because the object is 78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // const. 79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const NonTrivial cnt; // expected-note{{deleted because field 'cnt' has a deleted move constructor}} 807bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling ConstMoveOnlyMember(ConstMoveOnlyMember&&); 817bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling}; 827bd67854cfa59699e0efe72244af1578f2a1c09eBill WendlingConstMoveOnlyMember::ConstMoveOnlyMember(ConstMoveOnlyMember&&) = default; // expected-error{{would delete}} 837bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendlingstruct VolatileMember { 84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines volatile Trivial vt; // expected-note{{deleted because field 'vt' has no move constructor}} 857bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling VolatileMember(VolatileMember&&); 867bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling}; 877bd67854cfa59699e0efe72244af1578f2a1c09eBill WendlingVolatileMember::VolatileMember(VolatileMember&&) = default; // expected-error{{would delete}} 887bd67854cfa59699e0efe72244af1578f2a1c09eBill Wendling 89ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// -- a direct or virtual base class B that cannot be moved because overload 90ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// resolution results in an ambiguity or a function that is deleted or 91ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// inaccessible 92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct AmbiguousMoveBase : Ambiguity { // expected-note{{deleted because base class 'Ambiguity' has multiple move constructors}} 93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AmbiguousMoveBase(AmbiguousMoveBase&&); // expected-note{{copy constructor is implicitly deleted}} 94ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith}; 95ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard SmithAmbiguousMoveBase::AmbiguousMoveBase(AmbiguousMoveBase&&) = default; // expected-error{{would delete}} 96ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith 97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct DeletedMoveBase : AmbiguousMoveBase { // expected-note{{deleted because base class 'AmbiguousMoveBase' has a deleted move constructor}} 98ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith DeletedMoveBase(DeletedMoveBase&&); 99ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith}; 100ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard SmithDeletedMoveBase::DeletedMoveBase(DeletedMoveBase&&) = default; // expected-error{{would delete}} 101ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith 102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct InaccessibleMoveBase : NoAccess { // expected-note{{deleted because base class 'NoAccess' has an inaccessible move constructor}} 103ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith InaccessibleMoveBase(InaccessibleMoveBase&&); 104ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith}; 105ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard SmithInaccessibleMoveBase::InaccessibleMoveBase(InaccessibleMoveBase&&) = default; // expected-error{{would delete}} 106ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith 107ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// -- any direct or virtual base class or non-static data member of a type with 108ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// a destructor that is deleted or inaccessible 109769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct NoAccessDtor { 1106c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith NoAccessDtor(NoAccessDtor&&); // expected-note{{copy constructor is implicitly deleted because 'NoAccessDtor' has a user-declared move constructor}} 111769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntprivate: 112769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt ~NoAccessDtor(); 113769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt friend struct HasAccessDtor; 114769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 115769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 116769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct HasNoAccessDtor { 117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines NoAccessDtor NAD; // expected-note {{deleted because field 'NAD' has an inaccessible destructor}} 118769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt HasNoAccessDtor(HasNoAccessDtor&&); 119769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 120769bb2d0dbd173589747cc8e7428a66db3b2692eSean HuntHasNoAccessDtor::HasNoAccessDtor(HasNoAccessDtor&&) = default; // expected-error{{would delete}} 121769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 122769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct HasAccessDtor { 123769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt NoAccessDtor NAD; 124769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt HasAccessDtor(HasAccessDtor&&); 125769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 126769bb2d0dbd173589747cc8e7428a66db3b2692eSean HuntHasAccessDtor::HasAccessDtor(HasAccessDtor&&) = default; 127769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 1286c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct HasNoAccessDtorBase : NoAccessDtor { // expected-note{{copy constructor of 'HasNoAccessDtorBase' is implicitly deleted because base class 'NoAccessDtor' has a deleted copy constructor}} 129ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith}; 130ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smithextern HasNoAccessDtorBase HNADBa; 131ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard SmithHasNoAccessDtorBase HNADBb(HNADBa); // expected-error{{implicitly-deleted copy constructor}} 132ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith 133ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// The restriction on rvalue reference members applies to only the copy 134ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// constructor. 135769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct RValue { 136a4bb99cd0055ba0e1f3107890e5b6cbe31e6d1ccRichard Smith int &&ri = 1; // expected-warning {{binding reference member 'ri' to a temporary}} expected-note {{here}} 137769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt RValue(RValue&&); 138769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 139769bb2d0dbd173589747cc8e7428a66db3b2692eSean HuntRValue::RValue(RValue&&) = default; 140769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 141ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// -- a non-static data member or direct or virtual base class with a type that 142ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// does not have a move constructor and is not trivially copyable 143769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct CopyOnly { 144769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt CopyOnly(const CopyOnly&); 145769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 146769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 147769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct NonMove { 148769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt CopyOnly CO; 149769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt NonMove(NonMove&&); 150769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 1511c931be1873f8c20cdcb5060c84570cd3359aa02Richard SmithNonMove::NonMove(NonMove&&) = default; // ok under DR1402 152769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 153769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct Moveable { 154769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt Moveable(); 155769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt Moveable(Moveable&&); 156769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 157769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 158769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct HasMove { 159769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt Moveable M; 160769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt HasMove(HasMove&&); 161769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 162769bb2d0dbd173589747cc8e7428a66db3b2692eSean HuntHasMove::HasMove(HasMove&&) = default; 1631c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith 1641c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smithnamespace DR1402 { 1651c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith struct member { 1661c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith member(); 1671c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith member(const member&); 1681c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith member& operator=(const member&); 1691c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith ~member(); 1701c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith }; 1711c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith 1721c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith struct A { 1731c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith member m_; 1741c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith 1751c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith A() = default; 1761c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith A(const A&) = default; 1771c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith A& operator=(const A&) = default; 1781c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith A(A&&) = default; 1791c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith A& operator=(A&&) = default; 1801c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith ~A() = default; 1811c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith }; 1821c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith 1831c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith // ok, A's explicitly-defaulted move operations copy m_. 1841c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith void f() { 1851c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith A a, b(a), c(static_cast<A&&>(a)); 1861c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith a = b; 1871c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith b = static_cast<A&&>(c); 1881c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith } 1891c931be1873f8c20cdcb5060c84570cd3359aa02Richard Smith} 190