r278763 - PR28978: If we need overload resolution for the move constructor of an
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 15 17:36:41 PDT 2016
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 at 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 at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160815/0323f24d/attachment-0001.html>
More information about the cfe-commits
mailing list