diff mbox series

libstdc++: Implement LWG 3563 changes to keys_view and values_view

Message ID 20241114161753.1809627-1-ppalka@redhat.com
State New
Headers show
Series libstdc++: Implement LWG 3563 changes to keys_view and values_view | expand

Commit Message

Patrick Palka Nov. 14, 2024, 4:17 p.m. UTC
Tested on x86_64-pc-linux-gnu, does this look OK for trunk and perhaps
14/13?  IIRC alias CTAD didn't work correctly in 12 so it's not worth
backportig there.

-- >8 --

This LWG issue corrects the definition of these alias templates to make
them eligible 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.
---
 libstdc++-v3/include/std/ranges                    |  6 ++++--
 .../testsuite/std/ranges/adaptors/elements.cc      | 14 ++++++++++++++
 2 files changed, 18 insertions(+), 2 deletions(-)

Comments

Jonathan Wakely Nov. 14, 2024, 5:17 p.m. UTC | #1
On Thu, 14 Nov 2024 at 16:18, Patrick Palka <ppalka@redhat.com> wrote:
>
> Tested on x86_64-pc-linux-gnu, does this look OK for trunk and perhaps
> 14/13?  IIRC alias CTAD didn't work correctly in 12 so it's not worth
> backportig there.

OK for trunk and 13/14, thanks.


>
> -- >8 --
>
> This LWG issue corrects the definition of these alias templates to make
> them eligible 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.
> ---
>  libstdc++-v3/include/std/ranges                    |  6 ++++--
>  .../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 cebe10683f9..0039cc0c876 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
> +  // LWG 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 a15192bf0ec..0a05ce7378f 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();
>  }
> --
> 2.47.0.287.g25b0f41288
>
diff mbox series

Patch

diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
index cebe10683f9..0039cc0c876 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
+  // LWG 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 a15192bf0ec..0a05ce7378f 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();
 }