https://gcc.gnu.org/g:361050589b144913ec05d9d8e10639afa98319a8
commit r15-5290-g361050589b144913ec05d9d8e10639afa98319a8 Author: Patrick Palka <ppa...@redhat.com> Date: Thu Nov 14 13:27:41 2024 -0500 libstdc++: Implement LWG 3563 changes to keys_view and values_view This LWG issue corrects the definition of these alias templates to make them suitable for alias CTAD. libstdc++-v3/ChangeLog: * include/std/ranges (keys_view): Adjust as per LWG 3563. (values_view): Likewise. * testsuite/std/ranges/adaptors/elements.cc (test08): New test. Reviewed-by: Jonathan Wakely <jwak...@redhat.com> Diff: --- libstdc++-v3/include/std/ranges | 6 ++++-- libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index 743429dbceae..5153dcc26c4f 100644 --- a/libstdc++-v3/include/std/ranges +++ b/libstdc++-v3/include/std/ranges @@ -4551,11 +4551,13 @@ namespace views::__adaptor inline constexpr bool enable_borrowed_range<elements_view<_Tp, _Nm>> = enable_borrowed_range<_Tp>; + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 3563. keys_view example is broken template<typename _Range> - using keys_view = elements_view<views::all_t<_Range>, 0>; + using keys_view = elements_view<_Range, 0>; template<typename _Range> - using values_view = elements_view<views::all_t<_Range>, 1>; + using values_view = elements_view<_Range, 1>; namespace views { diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc index a15192bf0ecf..0a05ce7378f9 100644 --- a/libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc @@ -148,6 +148,19 @@ test07() b == e; } +void +test08() +{ + // LWG 3563 - keys_view example is broken + std::pair<int, int> x[] = {{1,2},{3,4}}; + auto v = ranges::keys_view{views::all(x)}; + auto w = ranges::values_view{views::all(x)}; + using ty1 = decltype(v); + using ty1 = ranges::elements_view<views::all_t<decltype((x))>, 0>; + using ty2 = decltype(w); + using ty2 = ranges::elements_view<views::all_t<decltype((x))>, 1>; +} + int main() { @@ -158,4 +171,5 @@ main() test05(); test06(); test07(); + test08(); }