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 ;-)

Reply via email to