Friendly ping~ Yrong <yronglin...@gmail.com>于2025年8月26日 周二21:46写道:
> Got it, thanks! > > Patrick Palka <ppa...@redhat.com>于2025年8月23日 周六02:59写道: > >> On Fri, 22 Aug 2025, Yrong wrote: >> >> > friendly ping~ >> > >> > Yrong <yronglin...@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! >> >> The patch will be pushed by one of us one it's approved by Jonathan >> or another maintainer. >> >> > >> > > Perhaps we want to backport this, not sure how far back >> > >> > Is there anything I need to do about this? >> >> Nope, you're all set, we'll decide that at some point based on >> the risk/benefit of the patch, and let you know. Thanks again for the >> patch! >> >> > >> > Best regards,Yihan >> > >> > Patrick Palka <ppa...@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 <yronglin...@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 >> > > >> > > >> > >> > >> > > >