On Thu, 14 Nov 2024 at 16:18, Patrick Palka <[email protected]> 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
>