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?

> +
> +  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