On Tue, Sep 9, 2025 at 12:45 PM Jonathan Wakely <jwak...@redhat.com> wrote:

> On Fri, 5 Sept 2025 at 08:14, Tomasz Kamiński <tkami...@redhat.com> wrote:
> >
> > From: Luc Grosheintz <luc.groshei...@gmail.com>
> >
> > This is a partial implementation of P2781R9. It adds std::cw and
> > std::constant_wrapper, but doesn't modify __integral_constant_like for
> > span/mdspan.
> >
> > libstdc++-v3/ChangeLog:
> >
> >         * include/bits/version.def (constant_wrapper): Add.
> >         * include/bits/version.h: Regenerate.
> >         * include/std/type_traits (_CwFixedValue): New class.
> >         (_IndexSequence): New struct.
> >         (_BuildIndexSequence): New struct.
> >         (_ConstExprParam): New concept.
> >         (_CwOperators): New struct.
> >         (constant_wrapper): New struct.
> >         (cw): New global constant.
> >         * src/c++23/std.cc.in (constant_wrapper): Add.
> >         (cw): Add.
> >         * testsuite/20_util/constant_wrapper/adl.cc: New test.
> >         * testsuite/20_util/constant_wrapper/ex.cc: New test.
> >         * testsuite/20_util/constant_wrapper/generic.cc: New test.
> >         * testsuite/20_util/constant_wrapper/instantiate.cc: New test.
> >         * testsuite/20_util/constant_wrapper/op_comma_neg.cc: New test.
> >         * testsuite/20_util/constant_wrapper/version.cc: New test.
> >
> > Co-authored-by: Tomasz Kamiński <tkami...@redhat.com>
> > Signed-off-by: Luc Grosheintz <luc.groshei...@gmail.com>
> > Signed-off-by: Tomasz Kamiński <tkami...@redhat.com>
> > ---
> > v5 adds data member pointer tests
>
> Some late comments that I should have noticed before approving it, sorry!
>
>
> > diff --git a/libstdc++-v3/include/std/type_traits
> b/libstdc++-v3/include/std/type_traits
> > index 4636457eb5a..26cbbb4fd5b 100644
> > --- a/libstdc++-v3/include/std/type_traits
> > +++ b/libstdc++-v3/include/std/type_traits
> > @@ -41,6 +41,7 @@
> >
> >  #define __glibcxx_want_bool_constant
> >  #define __glibcxx_want_bounded_array_traits
> > +#define __glibcxx_want_constant_wrapper
> >  #define __glibcxx_want_has_unique_object_representations
> >  #define __glibcxx_want_integral_constant_callable
> >  #define __glibcxx_want_is_aggregate
> > @@ -4302,6 +4303,376 @@ template<typename _Ret, typename _Fn,
> typename... _Args>
> >      };
> >  #endif // C++11
> >
> > +#ifdef __cpp_lib_constant_wrapper // C++ >= 26
> > +  template<typename _Tp>
> > +    struct _CwFixedValue
> > +    {
> > +      using _S_type = _Tp;
>
> The "_S_" prefix is for static members, this should be just "__type".
> I'll change this.
>
>
> > +
> > +  template<_CwFixedValue _Tp,
> > +          typename = typename decltype(_CwFixedValue(_Tp))::_S_type>
> > +    struct constant_wrapper;
>
> Why do we need decltype(_CwFixedValue(_Tp)) here?
>
> It looks to me like just decltype(_Tp)::_S_type should work ... but it
> doesn't. Is that something to do with CTAD being involved?
>
I think this is a GCC bug, that got a workaround backed in the standard
(the standard specifies the argument this way, this is why it haven't
picked up in review). Just decltype(_Tp) works in clang.


>
> > +
> > +  template<_CwFixedValue _X, typename>
> > +  struct constant_wrapper : _CwOperators
>
> _X is (or was, at some point) used by libc headers on at least one
> UNIX variant. I've already pushed a change to make that _Xv instead.
> This is the same reason that we use _Tp instead of _T.
>
> I think I'll change the _Tp in the constant_wrapper declaration to
> match _Xv, since it's not a type, it's a constant template parameter
> (what used to be called non-type template parameter until
> https://github.com/cplusplus/draft/pull/7587 renamed it).
>
>

Reply via email to