This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
std::function::swap does swap(_M_functor, x._M_functor) which exchanges the underlying bytes of the two _Any_data PODs using that type's implicit assignment operator. However, unlike using placement new to construct an object in the storage, simply memcpying the bytes doesn't change the effective type of the storage, so alias analysis decides it can't point to whatever we've tried to store in there. This attribute tells the middle-end to assume anything those bytes could contain any type of object, which is exactly what we want. PR libstdc++/77686 * include/std/functional (_Any_data): Add may_alias attribute. Tested powerpc64le-linux, committing to trunk and gcc-6-branch. std::any doesn't have the same problem, because I defined an _Op_xfer operation that uses placement new to copy the object into the destination, so the dynamic type is changed correctly. I haven't checked whether optional and variant might have similar problems in any implicit copy/move operations working on POD storage.
Attachment:
patch.txt
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |