On Wed, Feb 18, 2026 at 11:40 AM Matthias Kretz <[email protected]>
wrote:

> Tomasz Kamiński [Wednesday, 18 February 2026 11:01:14 CET]:
> > This implements LWG4383 with LWG4500, LWG4523 follow-up corrections.
> >
> > This patch changes the constant_wrapper assignments operator (including
> > compounds), increment and decrement to apply directly to value. In
> > consequence the operators are only supported for types, for which above
> > operations can be applied on const value.
> >
> > libstdc++-v3/ChangeLog:
> >
> >       * include/std/type_traits (_CWOperators::operator++)
> >       (_CWOperators::operator--, _CWOperators::operator+=)
> >       (_CWOperators::operator-=, _CWOperators::operator*=)
> >       (_CWOperators::operator/=, _CWOperators::operator%=)
> >       (_CWOperators::operator&=, _CWOperators::operator|=)
> >       (_CWOperators::operator^=, _CWOperators::operator<<=)
> >       (_CWOperators::operator>>=, constant_wrapper::operator=):
> >       Adjust definitions to apply operator on value.
> >       * testsuite/20_util/constant_wrapper/generic.cc:
> >       Remove test_pseudo_mutator.
> >       * testsuite/20_util/constant_wrapper/instantiate.cc:
> >       Test that operators are not provided if wrapped type
> >       do not support them, or provide mutable operators.
> > ---
> > Tested on x86_64-linux. OK for trunk?
> >
> >  libstdc++-v3/include/std/type_traits          | 110 ++---
> >  .../20_util/constant_wrapper/generic.cc       |  14 -
> >  .../20_util/constant_wrapper/instantiate.cc   | 441 ++++++++++++------
> >  3 files changed, 323 insertions(+), 242 deletions(-)
> >
> > diff --git a/libstdc++-v3/include/std/type_traits
> > b/libstdc++-v3/include/std/type_traits index ea700d1ed97..2fe3b48a938
> > 100644
> > --- a/libstdc++-v3/include/std/type_traits
> > +++ b/libstdc++-v3/include/std/type_traits
> > @@ -4593,9 +4593,8 @@ template<typename _Ret, typename _Fn, typename...
> > _Args> template<_ConstExprParam _Tp, _ConstExprParam... _Args>
> >        constexpr auto
> >        operator()(this _Tp, _Args...) noexcept
> > -      requires
> > -     requires(_Args...) {
> constant_wrapper<_Tp::value(_Args::value...)>();
> }
> > -      { return constant_wrapper<_Tp::value(_Args::value...)>{}; }
> > +        -> constant_wrapper<(_Tp::value(_Args::value...))>
> > +      { return {}; }
> >
> >      template<_ConstExprParam _Tp, _ConstExprParam... _Args>
> >        constexpr auto
> > @@ -4606,128 +4605,86 @@ template<typename _Ret, typename _Fn,
> typename...
> > _Args> template<_ConstExprParam _Tp>
>
> Why are you changing operator()? I see no Changelog entry for it. And as
> far
> as I understand, this change makes it IFNDR for arithmetic types.
>
I did this as a pure accident, assuming that I mechanically went through
every declaration
that does not follow a pattern and changed it. Will rever that.

Why is IFNDR for arithmetic types? I do see anything that would make it
that.

>
> - Matthias
>
> --
> ──────────────────────────────────────────────────────────────────────────
>  Dr. Matthias Kretz                           https://mattkretz.github.io
>  GSI Helmholtz Center for Heavy Ion Research               https://gsi.de
>  std::simd
> ──────────────────────────────────────────────────────────────────────────
>

Reply via email to