From: Richard Smith Date: Tue, 16 Aug 2016 00:13:47 +0000 (+0000) Subject: PR28978: If we need overload resolution for the move constructor of an X-Git-Tag: llvmorg-4.0.0-rc1~12369 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dd5619feacbc83e0ee14aa3a485e3717bc661b1a;p=platform%2Fupstream%2Fllvm.git 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 --- diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index 7e85619..7395db5 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -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 diff --git a/clang/test/CXX/special/class.copy/p11.0x.move.cpp b/clang/test/CXX/special/class.copy/p11.0x.move.cpp index 514817d..ab42595 100644 --- a/clang/test/CXX/special/class.copy/p11.0x.move.cpp +++ b/clang/test/CXX/special/class.copy/p11.0x.move.cpp @@ -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 struct DeletedNTVariant3 { // expected-note 2{{default}} expected-note 2{{copy}} + union { + T NT; + }; +}; +extern DeletedNTVariant3 dntv3a(0); // expected-error {{no matching}} +extern DeletedNTVariant3 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