On 9/9/25 2:15 PM, Tomasz Kaminski wrote:
On Tue, Sep 9, 2025 at 12:45 PM Jonathan Wakely <[email protected]> wrote:

On Fri, 5 Sept 2025 at 08:14, Tomasz Kamiński <[email protected]> wrote:

From: Luc Grosheintz <[email protected]>

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 <[email protected]>
Signed-off-by: Luc Grosheintz <[email protected]>
Signed-off-by: Tomasz Kamiński <[email protected]>
---
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.

This ran a bell:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117392




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