]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Implement LWG 3563 changes to keys_view and values_view
authorPatrick Palka <ppalka@redhat.com>
Thu, 14 Nov 2024 18:27:41 +0000 (13:27 -0500)
committerPatrick Palka <ppalka@redhat.com>
Thu, 9 Jan 2025 22:55:10 +0000 (17:55 -0500)
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 <jwakely@redhat.com>
(cherry picked from commit 361050589b144913ec05d9d8e10639afa98319a8)

libstdc++-v3/include/std/ranges
libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc

index 36e36569afcace739ea7a32f778ff892ae0ff6b8..eba539176848c3c5fd4f89e604c9e05253fff914 100644 (file)
@@ -4547,11 +4547,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
   {
index a15192bf0ecf9f110754f768ca87273e3afd43c8..0a05ce7378f93f6ef12d8a97295b726d8ac4351f 100644 (file)
@@ -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();
 }