Got it, thanks! Patrick Palka <[email protected]>于2025年8月23日 周六02:59写道:
> On Fri, 22 Aug 2025, Yrong wrote: > > > friendly ping~ > > > > Yrong <[email protected]> 于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 <[email protected]> 于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 <[email protected]> > > > --- > > > 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 > > > > > > > > > > > >
