On Tue, 9 Sept 2025 at 13:18, Luc Grosheintz <[email protected]> wrote: > > > > 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
Aha, thanks! Good to know I'm not confused, it's GCC that is confused ;-)
