[libcxx-commits] [libcxx] [libc++] Make std::pair trivially copyable if its members are (PR #89652)
Christopher Di Bella via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Jul 23 11:50:03 PDT 2024
cjdb wrote:
> https://isocpp.org/files/papers/N4860.pdf 20.4.2 Class template pair [pairs.pair]p23 (about the assignment op): "Remarks: This operator is defined as deleted unless is_copy_assignable_v<first_type> is true and is_copy_assignable_v<second_type> is true."
>
> p28 (on the move assignment op): "Constraints: (28.1) — is_move_assignable_v<first_type> is true and (28.2) — is_move_assignable_v<second_type> is true."
>
> The new __has_defaulted_members doesn't honor those. If I make them honor it as below (only did the C++20 branch), my code stays working as-is:
>
> ```diff
> % git diff
> diff --git a/libcxx/include/__utility/pair.h b/libcxx/include/__utility/pair.h
> index c0002b7abb3c..bc30eb6ca718 100644
> --- a/libcxx/include/__utility/pair.h
> +++ b/libcxx/include/__utility/pair.h
> @@ -92,11 +92,21 @@ struct _LIBCPP_TEMPLATE_VIS pair
> };
> # if _LIBCPP_STD_VER >= 20
> _LIBCPP_HIDE_FROM_ABI constexpr pair& operator=(const pair&)
> - requires __has_defaulted_members::value
> + requires (__has_defaulted_members::value &&
> + is_copy_assignable<first_type>::value &&
> + is_copy_assignable<second_type>::value)
> = default;
>
> + _LIBCPP_HIDE_FROM_ABI constexpr pair& operator=(const pair&)
> + requires (__has_defaulted_members::value &&
> + !(is_copy_assignable<first_type>::value &&
> + is_copy_assignable<second_type>::value))
> + = delete;
> +
> _LIBCPP_HIDE_FROM_ABI constexpr pair& operator=(pair&&)
> - requires __has_defaulted_members::value
> + requires (__has_defaulted_members::value &&
> + is_move_assignable<first_type>::value &&
> + is_move_assignable<second_type>::value)
> = default;
> # elif __has_attribute(__enable_if__)
> _LIBCPP_HIDE_FROM_ABI pair& operator=(const pair&)
> ```
>
> Looks like the PR as-submitted might not be complete, maybe. (I'm not a standards expert though.)
Those additions need to be `is_trivially_copy_assignable` and `is_trivially_move_assignable`, but otherwise, a forward fix might be on the horizon?
https://github.com/llvm/llvm-project/pull/89652
More information about the libcxx-commits
mailing list