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