[PATCH v3] libstdc++: Implement LWG4222 'expected' constructor from a single value missing a constraint
Yrong
yronglin777@gmail.com
Fri Aug 22 14:56:46 GMT 2025
friendly ping~
Yrong <yronglin777@gmail.com> 于2025年8月19日周二 23:58写道:
> Thanks for the review! But I don't have a commit access, could you help me
> to commit this patch? Many thanks!
>
> > Perhaps we want to backport this, not sure how far back
>
> Is there anything I need to do about this?
>
> Best regards,
> Yihan
>
> Patrick Palka <ppalka@redhat.com> 于2025年8月19日周二 23:16写道:
>
>> LGTM! Perhaps we want to backport this, not sure how far back
>> (std::expected was implemented in GCC 12).
>>
>> On Sat, 16 Aug 2025, Yihan Wang wrote:
>>
>> > libstdc++-v3/ChangeLog:
>> >
>> > * include/std/expected: Add missing constraint as per LWG 4222.
>> > * testsuite/20_util/expected/lwg4222.cc: New test.
>> >
>> > Signed-off-by: Yihan Wang <yronglin777@gmail.com>
>> > ---
>> > libstdc++-v3/include/std/expected | 1 +
>> > .../testsuite/20_util/expected/lwg4222.cc | 39 +++++++++++++++++++
>> > 2 files changed, 40 insertions(+)
>> > create mode 100644 libstdc++-v3/testsuite/20_util/expected/lwg4222.cc
>> >
>> > diff --git a/libstdc++-v3/include/std/expected
>> b/libstdc++-v3/include/std/expected
>> > index 60f1565f15b..4eaaab693e1 100644
>> > --- a/libstdc++-v3/include/std/expected
>> > +++ b/libstdc++-v3/include/std/expected
>> > @@ -474,6 +474,7 @@ namespace __expected
>> > template<typename _Up = remove_cv_t<_Tp>>
>> > requires (!is_same_v<remove_cvref_t<_Up>, expected>)
>> > && (!is_same_v<remove_cvref_t<_Up>, in_place_t>)
>> > + && (!is_same_v<remove_cvref_t<_Up>, unexpect_t>)
>> > && is_constructible_v<_Tp, _Up>
>> > && (!__expected::__is_unexpected<remove_cvref_t<_Up>>)
>> > && __expected::__not_constructing_bool_from_expected<_Tp, _Up>
>> > diff --git a/libstdc++-v3/testsuite/20_util/expected/lwg4222.cc
>> b/libstdc++-v3/testsuite/20_util/expected/lwg4222.cc
>> > new file mode 100644
>> > index 00000000000..5c107792456
>> > --- /dev/null
>> > +++ b/libstdc++-v3/testsuite/20_util/expected/lwg4222.cc
>> > @@ -0,0 +1,39 @@
>> > +// { dg-do run { target c++23 } }
>> > +
>> > +// LWG 4222. 'expected' constructor from a single value missing a
>> constraint
>> > +
>> > +#include <expected>
>> > +#include <type_traits>
>> > +#include <testsuite_hooks.h>
>> > +
>> > +struct T {
>> > + explicit T(auto) {}
>> > +};
>> > +struct E {
>> > + E(int) {}
>> > +};
>> > +
>> > +struct V {
>> > + explicit constexpr V(std::unexpect_t) {}
>> > +};
>> > +
>> > +static_assert(!std::is_constructible_v<std::expected<T, E>,
>> std::unexpect_t>);
>> > +static_assert(!std::is_constructible_v<std::expected<T, E>,
>> std::unexpect_t &>);
>> > +static_assert(!std::is_constructible_v<std::expected<T, E>,
>> std::unexpect_t &&>);
>> > +static_assert(!std::is_constructible_v<std::expected<T, E>, const
>> std::unexpect_t>);
>> > +static_assert(!std::is_constructible_v<std::expected<T, E>, const
>> std::unexpect_t &>);
>> > +static_assert(!std::is_constructible_v<std::expected<T, E>, const
>> std::unexpect_t &&>);
>> > +
>> > +constexpr bool test() {
>> > + std::expected<V, int> e1(std::in_place, std::unexpect);
>> > + VERIFY( e1.has_value() );
>> > + std::expected<int, V> e2(std::unexpect, std::unexpect);
>> > + VERIFY( !e2.has_value() );
>> > + return true;
>> > +}
>> > +
>> > +int main() {
>> > + test();
>> > + static_assert(test());
>> > + return 0;
>> > +}
>> > --
>> > 2.39.5
>> >
>> >
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20250822/7be3d5c5/attachment.htm>
More information about the Libstdc++
mailing list