On Wed, Sep 10, 2025 at 10:20 AM Jonathan Wakely <jwak...@redhat.com> wrote:

> On Sun, 7 Sept 2025 at 16:34, Jonathan Wakely <jwak...@redhat.com> wrote:
> >
> > On Sat, 6 Sept 2025 at 14:12, Luc Grosheintz wrote:
> > >
> > > The concept __integral_constant_like doesn't consider traits with a
> > > boolean member `value` as an integer constant. This is done to reject
> > > various completely unrelated traits like is_const, is_abstract, etc.
> > >
> > > LWG4351 adjusts the check to strip references and cv qualifiers before
> > > checking if `value` is bool. The immediate context is constant_wrapper
> > > which defines:
> > >
> > >     template<...>
> > >     struct constant_wrapper
> > >     {
> > >       static constexpr const auto& value = ...;
> > >     };
> > >
> > > Without LWG4351, std::cw<true> and std::cw<false> would both be
> > > considered integer constants (by __integral_constant_like); but both
> > > std::{true,false}_type are not considered integer constants. Hence,
> > > LWG4351 removes inconsistent behaviour between std::integral_constant
> > > and std::constant_wrapper.
> >
> > Thanks, the patch looks good but I'd like to wait before pushing it
> > until LWG have seen the issue. I'll start a prioritization poll for
> > the issue tomorrow, and see if anybody points out a reason why the
> > issue is wrong and shouldn't be fixed (I don't expect that to happen
> > though).
>
> Unsurprisingly, LWG agreed with the proposed resolution. So this is OK
> fo trunk now.
>
Pushed to the trunk.

>
>
> >
> > >
> > > libstdc++-v3/ChangeLog:
> > >
> > >         * include/std/span (__integral_constant_like): Use
> > >         remove_cvref_t before checking if _Tp::value is boolean.
> > >         * testsuite/23_containers/mdspan/extents/misc.cc: Update test.
> > >         * testsuite/23_containers/mdspan/mdspan.cc: Ditto.
> > >         * testsuite/23_containers/span/deduction.cc: Ditto.
> > >
> > > Signed-off-by: Luc Grosheintz <luc.groshei...@gmail.com>
> > > ---
> > >  libstdc++-v3/include/std/span                               | 4 +++-
> > >  libstdc++-v3/testsuite/23_containers/mdspan/extents/misc.cc | 2 +-
> > >  libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc       | 3 +--
> > >  libstdc++-v3/testsuite/23_containers/span/deduction.cc      | 2 +-
> > >  4 files changed, 6 insertions(+), 5 deletions(-)
> > >
> > > diff --git a/libstdc++-v3/include/std/span
> b/libstdc++-v3/include/std/span
> > > index f9aa3c77e8e..58089113565 100644
> > > --- a/libstdc++-v3/include/std/span
> > > +++ b/libstdc++-v3/include/std/span
> > > @@ -479,10 +479,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> > >    // deduction guides
> > >    namespace __detail
> > >    {
> > > +    // _GLIBCXX_RESOLVE_LIB_DEFECTS
> > > +    // 4351. integral-constant-like needs more remove_cvref_t
> > >      template<typename _Tp>
> > >        concept __integral_constant_like =
> > >         is_integral_v<remove_cvref_t<decltype(_Tp::value)>>
> > > -       && !is_same_v<bool, remove_const_t<decltype(_Tp::value)>>
> > > +       && !is_same_v<bool, remove_cvref_t<decltype(_Tp::value)>>
> > >         && convertible_to<_Tp, decltype(_Tp::value)>
> > >         && equality_comparable_with<_Tp, decltype(_Tp::value)>
> > >         && bool_constant<_Tp() == _Tp::value>::value
> > > diff --git
> a/libstdc++-v3/testsuite/23_containers/mdspan/extents/misc.cc
> b/libstdc++-v3/testsuite/23_containers/mdspan/extents/misc.cc
> > > index 94086653a74..33d6f947f0b 100644
> > > --- a/libstdc++-v3/testsuite/23_containers/mdspan/extents/misc.cc
> > > +++ b/libstdc++-v3/testsuite/23_containers/mdspan/extents/misc.cc
> > > @@ -121,7 +121,7 @@ test_deduction_from_constant()
> > >    verify(std::extents(1, c2), std::extents<size_t, dyn, 2>{1});
> > >    verify(std::extents(c2), std::extents<size_t, 2>{});
> > >    verify(std::extents(1, c2), std::extents<size_t, dyn, 2>{1});
> > > -  verify(std::extents(std::cw<true>, c2), std::extents<size_t, 1,
> 2>{});
> > > +  verify(std::extents(std::cw<true>, c2), std::extents<size_t, dyn,
> 2>{1});
> > >  #endif
> > >    return true;
> > >  }
> > > diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc
> b/libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc
> > > index ca100b4f314..a92a0554417 100644
> > > --- a/libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc
> > > +++ b/libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc
> > > @@ -304,8 +304,7 @@ test_from_pointer_and_constant()
> > >    auto c3 = std::constant_wrapper<3>{};
> > >    verify(std::mdspan(ptr, 2, c3), std::extents(2, i3));
> > >    verify(std::mdspan(ptr, 2, std::cw<3>), std::extents(2, i3));
> > > -  verify(std::mdspan(ptr, std::cw<true>, std::cw<3>),
> > > -        std::extents(std::cw<1>, i3));
> > > +  verify(std::mdspan(ptr, std::cw<true>, std::cw<3>), std::extents(1,
> i3));
> > >  #endif
> > >    return true;
> > >  }
> > > diff --git a/libstdc++-v3/testsuite/23_containers/span/deduction.cc
> b/libstdc++-v3/testsuite/23_containers/span/deduction.cc
> > > index e958ad5d6db..55a586254e8 100644
> > > --- a/libstdc++-v3/testsuite/23_containers/span/deduction.cc
> > > +++ b/libstdc++-v3/testsuite/23_containers/span/deduction.cc
> > > @@ -99,6 +99,6 @@ test01()
> > >    static_assert( is_static_span<long, 4>(s17) );
> > >
> > >    std::span s18(a.data(), std::cw<true>);
> > > -  static_assert( is_static_span<long, 1>(s18) );
> > > +  static_assert( is_dynamic_span<long>(s18) );
> > >  #endif
> > >  }
> > > --
> > > 2.51.0
> > >
>
>

Reply via email to