1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
5 NonTrivial(NonTrivial&&);
8 // A defaulted move constructor for a class X is defined as deleted if X has:
10 // -- a variant member with a non-trivial corresponding constructor
11 union DeletedNTVariant {
13 DeletedNTVariant(DeletedNTVariant&&);
15 DeletedNTVariant::DeletedNTVariant(DeletedNTVariant&&) = default; // expected-error{{would delete}}
17 struct DeletedNTVariant2 {
21 DeletedNTVariant2(DeletedNTVariant2&&);
23 DeletedNTVariant2::DeletedNTVariant2(DeletedNTVariant2&&) = default; // expected-error{{would delete}}
25 // -- a non-static data member of class type M (or array thereof) that cannot be
26 // copied because overload resolution results in an ambiguity or a function
27 // that is deleted or inaccessible
33 friend struct HasAccess;
38 HasNoAccess(HasNoAccess&&);
40 HasNoAccess::HasNoAccess(HasNoAccess&&) = default; // expected-error{{would delete}}
44 HasAccess(HasAccess&&);
46 HasAccess::HasAccess(HasAccess&&) = default;
49 Ambiguity(const Ambiguity&&);
50 Ambiguity(volatile Ambiguity&&);
55 IsAmbiguous(IsAmbiguous&&);
57 IsAmbiguous::IsAmbiguous(IsAmbiguous&&) = default; // expected-error{{would delete}}
63 Deleted::Deleted(Deleted&&) = default; // expected-error{{would delete}}
65 // It's implied (but not stated) that this should also happen if overload
69 ConstMember(ConstMember&&);
71 ConstMember::ConstMember(ConstMember&&) = default; // ok, calls copy ctor
72 struct ConstMoveOnlyMember {
74 ConstMoveOnlyMember(ConstMoveOnlyMember&&);
76 ConstMoveOnlyMember::ConstMoveOnlyMember(ConstMoveOnlyMember&&) = default; // expected-error{{would delete}}
77 struct VolatileMember {
79 VolatileMember(VolatileMember&&);
81 VolatileMember::VolatileMember(VolatileMember&&) = default; // expected-error{{would delete}}
83 // -- a direct or virtual base class B that cannot be moved because overload
84 // resolution results in an ambiguity or a function that is deleted or
86 struct AmbiguousMoveBase : Ambiguity {
87 AmbiguousMoveBase(AmbiguousMoveBase&&);
89 AmbiguousMoveBase::AmbiguousMoveBase(AmbiguousMoveBase&&) = default; // expected-error{{would delete}}
91 struct DeletedMoveBase : AmbiguousMoveBase {
92 DeletedMoveBase(DeletedMoveBase&&);
94 DeletedMoveBase::DeletedMoveBase(DeletedMoveBase&&) = default; // expected-error{{would delete}}
96 struct InaccessibleMoveBase : NoAccess {
97 InaccessibleMoveBase(InaccessibleMoveBase&&);
99 InaccessibleMoveBase::InaccessibleMoveBase(InaccessibleMoveBase&&) = default; // expected-error{{would delete}}
101 // -- any direct or virtual base class or non-static data member of a type with
102 // a destructor that is deleted or inaccessible
103 struct NoAccessDtor {
104 NoAccessDtor(NoAccessDtor&&); // expected-note{{copy constructor is implicitly deleted because 'NoAccessDtor' has a user-declared move constructor}}
107 friend struct HasAccessDtor;
110 struct HasNoAccessDtor {
112 HasNoAccessDtor(HasNoAccessDtor&&);
114 HasNoAccessDtor::HasNoAccessDtor(HasNoAccessDtor&&) = default; // expected-error{{would delete}}
116 struct HasAccessDtor {
118 HasAccessDtor(HasAccessDtor&&);
120 HasAccessDtor::HasAccessDtor(HasAccessDtor&&) = default;
122 struct HasNoAccessDtorBase : NoAccessDtor { // expected-note{{copy constructor of 'HasNoAccessDtorBase' is implicitly deleted because base class 'NoAccessDtor' has a deleted copy constructor}}
124 extern HasNoAccessDtorBase HNADBa;
125 HasNoAccessDtorBase HNADBb(HNADBa); // expected-error{{implicitly-deleted copy constructor}}
127 // The restriction on rvalue reference members applies to only the copy
130 int &&ri = 1; // expected-warning {{binding reference member 'ri' to a temporary}} expected-note {{here}}
133 RValue::RValue(RValue&&) = default;
135 // -- a non-static data member or direct or virtual base class with a type that
136 // does not have a move constructor and is not trivially copyable
138 CopyOnly(const CopyOnly&);
145 NonMove::NonMove(NonMove&&) = default; // ok under DR1402
149 Moveable(Moveable&&);
156 HasMove::HasMove(HasMove&&) = default;
161 member(const member&);
162 member& operator=(const member&);
170 A(const A&) = default;
171 A& operator=(const A&) = default;
173 A& operator=(A&&) = default;
177 // ok, A's explicitly-defaulted move operations copy m_.
179 A a, b(a), c(static_cast<A&&>(a));
181 b = static_cast<A&&>(c);