Pushed to original patch (without LWG4351 changes) to trunk. On Sat, Sep 6, 2025 at 3:18 PM Luc Grosheintz <luc.groshei...@gmail.com> wrote:
> > > On 9/5/25 19:58, Jonathan Wakely wrote: > > On Fri, 5 Sept 2025 at 16:26, Jonathan Wakely <jwak...@redhat.com> > wrote: > >> > >> On Thu, 4 Sept 2025 at 13:22, Luc Grosheintz <luc.groshei...@gmail.com> > wrote: > >>> > >>> A usecase for P2781R9 is more ergonomic creation of span and mdspan > with > >>> mixed static and dynamic extents, e.g.: > >>> > >>> span(ptr, cw<3>) > >>> extents(cw<3>, 5, cw<7>) > >>> mdspan(ptr, cw<3>, 5, cw<7>) > >>> > >>> should be deduced as: > >>> span<..., 3> > >>> extents<..., 3, dyn, 7> > >>> mdspan<..., extents<..., 3, dyn, 7>> > >>> > >>> The change required is to strip cv-qualifiers and references from > >>> `_Tp::value`, because of: > >>> > >>> template<_CwFixedValue _X, typename> > >>> struct constant_wrapper : _CwOperators > >>> { > >>> static constexpr const auto& value = _X._M_data; > >>> > >>> libstdc++-v3/ChangeLog: > >>> > >>> * include/std/span (__integral_constant_like): Allow the > member > >>> `value` of a constant wrapping type to be a const reference of > >>> an integer. > >>> * testsuite/23_containers/mdspan/extents/misc.cc: Add test for > >>> cw and constant_wrapper. > >>> * 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 | 3 ++- > >>> .../23_containers/mdspan/extents/misc.cc | 22 +++++++++++++----- > >>> .../testsuite/23_containers/mdspan/mdspan.cc | 23 > +++++++++++++------ > >>> .../testsuite/23_containers/span/deduction.cc | 20 +++++++++++++++- > >>> 4 files changed, 53 insertions(+), 15 deletions(-) > >>> > >>> diff --git a/libstdc++-v3/include/std/span > b/libstdc++-v3/include/std/span > >>> index 44f9b36a7ef..f9aa3c77e8e 100644 > >>> --- a/libstdc++-v3/include/std/span > >>> +++ b/libstdc++-v3/include/std/span > >>> @@ -480,7 +480,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > >>> namespace __detail > >>> { > >>> template<typename _Tp> > >>> - concept __integral_constant_like = > is_integral_v<decltype(_Tp::value)> > >>> + concept __integral_constant_like = > >>> + is_integral_v<remove_cvref_t<decltype(_Tp::value)>> > >>> && !is_same_v<bool, remove_const_t<decltype(_Tp::value)>> > >> > >> We also need remove_cvref_t on this line for the not-bool check, so > >> that constant_wrapper<bool&> doesn't match here, but I haven't opened > >> an LWG issue about that yet, so we can fix that later. > > > > I've created https://cplusplus.github.io/LWG/issue4351 now. > > > > Here's a patch to apply the change: > https://gcc.gnu.org/pipermail/libstdc++/2025-September/063315.html > > if you prefer to squash it into this commit, let me know. > >