On Tue, 9 Sept 2025 at 13:15, Tomasz Kaminski <tkami...@redhat.com> wrote: > > > > 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.
I've submitted https://github.com/cplusplus/draft/pull/8218 to simplify the C++26 draft.