p11.0x.move.cpp revision 6c4c36c4ed1007143f5b8655eb68b313a7e12e76
1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 3769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct NonTrivial { 4769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt NonTrivial(NonTrivial&&); 5769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 6769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 7ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// A defaulted move constructor for a class X is defined as deleted if X has: 8ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith 9ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// -- a variant member with a non-trivial corresponding constructor 10769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntunion DeletedNTVariant { 11769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt NonTrivial NT; 12769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt DeletedNTVariant(DeletedNTVariant&&); 13769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 14769bb2d0dbd173589747cc8e7428a66db3b2692eSean HuntDeletedNTVariant::DeletedNTVariant(DeletedNTVariant&&) = default; // expected-error{{would delete}} 15769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 16769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct DeletedNTVariant2 { 17769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt union { 18769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt NonTrivial NT; 19769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt }; 20769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt DeletedNTVariant2(DeletedNTVariant2&&); 21769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 22769bb2d0dbd173589747cc8e7428a66db3b2692eSean HuntDeletedNTVariant2::DeletedNTVariant2(DeletedNTVariant2&&) = default; // expected-error{{would delete}} 23769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 24ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// -- a non-static data member of class type M (or array thereof) that cannot be 25ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// copied because overload resolution results in an ambiguity or a function 26ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// that is deleted or inaccessible 27769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct NoAccess { 28769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt NoAccess() = default; 29769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntprivate: 30769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt NoAccess(NoAccess&&); 31769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 32769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt friend struct HasAccess; 33769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 34769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 35769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct HasNoAccess { 36769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt NoAccess NA; 37769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt HasNoAccess(HasNoAccess&&); 38769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 39769bb2d0dbd173589747cc8e7428a66db3b2692eSean HuntHasNoAccess::HasNoAccess(HasNoAccess&&) = default; // expected-error{{would delete}} 40769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 41769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct HasAccess { 42769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt NoAccess NA; 43769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt HasAccess(HasAccess&&); 44769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 45769bb2d0dbd173589747cc8e7428a66db3b2692eSean HuntHasAccess::HasAccess(HasAccess&&) = default; 46769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 47ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smithstruct Ambiguity { 48ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith Ambiguity(const Ambiguity&&); 49ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith Ambiguity(volatile Ambiguity&&); 50ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith}; 51ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith 52ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smithstruct IsAmbiguous { 53ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith Ambiguity A; 54ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith IsAmbiguous(IsAmbiguous&&); 55ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith}; 56ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard SmithIsAmbiguous::IsAmbiguous(IsAmbiguous&&) = default; // expected-error{{would delete}} 57ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith 58ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smithstruct Deleted { 59ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith IsAmbiguous IA; 60ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith Deleted(Deleted&&); 61ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith}; 62ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard SmithDeleted::Deleted(Deleted&&) = default; // expected-error{{would delete}} 63ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith 64ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// -- a direct or virtual base class B that cannot be moved because overload 65ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// resolution results in an ambiguity or a function that is deleted or 66ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// inaccessible 67ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smithstruct AmbiguousMoveBase : Ambiguity { 68ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith AmbiguousMoveBase(AmbiguousMoveBase&&); 69ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith}; 70ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard SmithAmbiguousMoveBase::AmbiguousMoveBase(AmbiguousMoveBase&&) = default; // expected-error{{would delete}} 71ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith 72ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smithstruct DeletedMoveBase : AmbiguousMoveBase { 73ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith DeletedMoveBase(DeletedMoveBase&&); 74ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith}; 75ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard SmithDeletedMoveBase::DeletedMoveBase(DeletedMoveBase&&) = default; // expected-error{{would delete}} 76ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith 77ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smithstruct InaccessibleMoveBase : NoAccess { 78ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith InaccessibleMoveBase(InaccessibleMoveBase&&); 79ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith}; 80ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard SmithInaccessibleMoveBase::InaccessibleMoveBase(InaccessibleMoveBase&&) = default; // expected-error{{would delete}} 81ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith 82ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// -- any direct or virtual base class or non-static data member of a type with 83ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// a destructor that is deleted or inaccessible 84769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct NoAccessDtor { 856c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smith NoAccessDtor(NoAccessDtor&&); // expected-note{{copy constructor is implicitly deleted because 'NoAccessDtor' has a user-declared move constructor}} 86769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntprivate: 87769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt ~NoAccessDtor(); 88769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt friend struct HasAccessDtor; 89769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 90769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 91769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct HasNoAccessDtor { 92769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt NoAccessDtor NAD; 93769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt HasNoAccessDtor(HasNoAccessDtor&&); 94769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 95769bb2d0dbd173589747cc8e7428a66db3b2692eSean HuntHasNoAccessDtor::HasNoAccessDtor(HasNoAccessDtor&&) = default; // expected-error{{would delete}} 96769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 97769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct HasAccessDtor { 98769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt NoAccessDtor NAD; 99769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt HasAccessDtor(HasAccessDtor&&); 100769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 101769bb2d0dbd173589747cc8e7428a66db3b2692eSean HuntHasAccessDtor::HasAccessDtor(HasAccessDtor&&) = default; 102769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 1036c4c36c4ed1007143f5b8655eb68b313a7e12e76Richard Smithstruct HasNoAccessDtorBase : NoAccessDtor { // expected-note{{copy constructor of 'HasNoAccessDtorBase' is implicitly deleted because base class 'NoAccessDtor' has a deleted copy constructor}} 104ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith}; 105ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smithextern HasNoAccessDtorBase HNADBa; 106ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard SmithHasNoAccessDtorBase HNADBb(HNADBa); // expected-error{{implicitly-deleted copy constructor}} 107ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith 108ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// The restriction on rvalue reference members applies to only the copy 109ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// constructor. 110769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct RValue { 111769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt int &&ri = 1; 112769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt RValue(RValue&&); 113769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 114769bb2d0dbd173589747cc8e7428a66db3b2692eSean HuntRValue::RValue(RValue&&) = default; 115769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 116ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// -- a non-static data member or direct or virtual base class with a type that 117ec92bc78979aae6ec436fe51d082f7467e6f96c0Richard Smith// does not have a move constructor and is not trivially copyable 118769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct CopyOnly { 119769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt CopyOnly(const CopyOnly&); 120769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 121769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 122769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct NonMove { 123769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt CopyOnly CO; 124769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt NonMove(NonMove&&); 125769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 126769bb2d0dbd173589747cc8e7428a66db3b2692eSean HuntNonMove::NonMove(NonMove&&) = default; // expected-error{{would delete}} 127769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 128769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct Moveable { 129769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt Moveable(); 130769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt Moveable(Moveable&&); 131769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 132769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt 133769bb2d0dbd173589747cc8e7428a66db3b2692eSean Huntstruct HasMove { 134769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt Moveable M; 135769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt HasMove(HasMove&&); 136769bb2d0dbd173589747cc8e7428a66db3b2692eSean Hunt}; 137769bb2d0dbd173589747cc8e7428a66db3b2692eSean HuntHasMove::HasMove(HasMove&&) = default; 138