Hi Hans, Eric Fiselier requested that we fix this bug for 3.9 (it affects libc++'s std::optional implementation), so this would be a good candidate for the branch.
On Mon, Aug 15, 2016 at 5:13 PM, Richard Smith via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Author: rsmith > Date: Mon Aug 15 19:13:47 2016 > New Revision: 278763 > > URL: http://llvm.org/viewvc/llvm-project?rev=278763&view=rev > Log: > 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. > > Modified: > cfe/trunk/lib/AST/DeclCXX.cpp > cfe/trunk/test/CXX/special/class.copy/p11.0x.move.cpp > > Modified: cfe/trunk/lib/AST/DeclCXX.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ > DeclCXX.cpp?rev=278763&r1=278762&r2=278763&view=diff > ============================================================ > ================== > --- cfe/trunk/lib/AST/DeclCXX.cpp (original) > +++ cfe/trunk/lib/AST/DeclCXX.cpp Mon Aug 15 19:13:47 2016 > @@ -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 > > Modified: cfe/trunk/test/CXX/special/class.copy/p11.0x.move.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/ > special/class.copy/p11.0x.move.cpp?rev=278763&r1=278762& > r2=278763&view=diff > ============================================================ > ================== > --- cfe/trunk/test/CXX/special/class.copy/p11.0x.move.cpp (original) > +++ cfe/trunk/test/CXX/special/class.copy/p11.0x.move.cpp Mon Aug 15 > 19:13:47 2016 > @@ -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 > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits