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