mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-08 00:52:54 +00:00
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:
parent
229d32abfc
commit
dd5619feac
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user