PR28978: If we need overload resolution for the move constructor of an

anonymous union member of a class, we need overload resolution for the move
constructor of the class itself too; we can't rely on Sema to do the right
thing for us for anonymous union types.

llvm-svn: 278763
This commit is contained in:
Richard Smith 2016-08-16 00:13:47 +00:00
parent 229d32abfc
commit dd5619feac
2 changed files with 23 additions and 0 deletions

View File

@ -807,6 +807,17 @@ void CXXRecordDecl::addedMember(Decl *D) {
data().DefaultedDestructorIsDeleted = true;
}
// For an anonymous union member, our overload resolution will perform
// overload resolution for its members.
if (Field->isAnonymousStructOrUnion()) {
data().NeedOverloadResolutionForMoveConstructor |=
FieldRec->data().NeedOverloadResolutionForMoveConstructor;
data().NeedOverloadResolutionForMoveAssignment |=
FieldRec->data().NeedOverloadResolutionForMoveAssignment;
data().NeedOverloadResolutionForDestructor |=
FieldRec->data().NeedOverloadResolutionForDestructor;
}
// C++0x [class.ctor]p5:
// A default constructor is trivial [...] if:
// -- for all the non-static data members of its class that are of

View File

@ -4,6 +4,9 @@ struct Trivial {};
struct NonTrivial {
NonTrivial(NonTrivial&&); // expected-note{{copy constructor is implicitly deleted}}
};
struct DeletedCopy {
DeletedCopy(const DeletedCopy&) = delete;
};
// A defaulted move constructor for a class X is defined as deleted if X has:
@ -22,6 +25,15 @@ struct DeletedNTVariant2 {
};
DeletedNTVariant2::DeletedNTVariant2(DeletedNTVariant2&&) = default; // expected-error{{would delete}}
// Note, move constructor is not a candidate because it is deleted.
template<typename T> struct DeletedNTVariant3 { // expected-note 2{{default}} expected-note 2{{copy}}
union {
T NT;
};
};
extern DeletedNTVariant3<NonTrivial> dntv3a(0); // expected-error {{no matching}}
extern DeletedNTVariant3<DeletedCopy> dntv3a(0); // expected-error {{no matching}}
// -- a non-static data member of class type M (or array thereof) that cannot be
// copied because overload resolution results in an ambiguity or a function
// that is deleted or inaccessible