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