From fa89adaa979093936d8f148ef5496db05ad308e5 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 19 Feb 2020 11:37:54 +0000 Subject: [PATCH] libstdc++: tuple_element_t is also wrong for const subrange (LWG 3398) * include/std/ranges (tuple_element<0, const subrange>) (tuple_element<1, const subrange>): Add partial specializations (LWG 3398). * testsuite/std/ranges/subrange/tuple_like.cc: New test. --- libstdc++-v3/ChangeLog | 5 ++ libstdc++-v3/include/std/ranges | 9 +++- .../std/ranges/subrange/tuple_like.cc | 52 +++++++++++++++++++ 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 libstdc++-v3/testsuite/std/ranges/subrange/tuple_like.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index a8fcd7cb475..f69507d667f 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,10 @@ 2020-02-19 Jonathan Wakely + * include/std/ranges (tuple_element<0, const subrange>) + (tuple_element<1, const subrange>): Add partial + specializations (LWG 3398). + * testsuite/std/ranges/subrange/tuple_like.cc: New test. + * include/bits/ranges_algo.h (__find_fn, __find_first_of_fn) (__adjacent_find_fn, __remove_if_fn, __remove_copy_if_fn) (__unique_fn, __unique_copy_fn): Remove redundant conversions to bool. diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index e0eb84748a2..4e50206fb61 100644 --- a/libstdc++-v3/include/std/ranges +++ b/libstdc++-v3/include/std/ranges @@ -3193,7 +3193,6 @@ namespace views typename tuple_size<_Tp>::type; requires _Nm < tuple_size_v<_Tp>; typename tuple_element_t<_Nm, _Tp>; - // XXX: we applied P3323 here { std::get<_Nm>(__t) } -> convertible_to&>; }; @@ -3451,6 +3450,14 @@ namespace views struct tuple_element<1, ranges::subrange<_Iter, _Sent, _Kind>> { using type = _Sent; }; + template + struct tuple_element<0, const ranges::subrange<_Iter, _Sent, _Kind>> + { using type = _Iter; }; + + template + struct tuple_element<1, const ranges::subrange<_Iter, _Sent, _Kind>> + { using type = _Sent; }; + _GLIBCXX_END_NAMESPACE_VERSION } // namespace #endif // library concepts diff --git a/libstdc++-v3/testsuite/std/ranges/subrange/tuple_like.cc b/libstdc++-v3/testsuite/std/ranges/subrange/tuple_like.cc new file mode 100644 index 00000000000..a3020d21d29 --- /dev/null +++ b/libstdc++-v3/testsuite/std/ranges/subrange/tuple_like.cc @@ -0,0 +1,52 @@ +// Copyright (C) 2020 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include + +using S1 = std::ranges::subrange; +using S2 = std::ranges::subrange; + +static_assert( std::tuple_size_v == 2 ); +static_assert( std::tuple_size_v == 2 ); + +static_assert( std::same_as, int*> ); +static_assert( std::same_as, int*> ); +// LWG 3398 +static_assert( std::same_as, int*> ); +static_assert( std::same_as, int*> ); + +static_assert( std::same_as, long*> ); +static_assert( std::same_as, void*> ); +// LWG 3398 +static_assert( std::same_as, long*> ); +static_assert( std::same_as, void*> ); + +S1 s1; +static_assert( std::same_as(s1)), int*> ); +static_assert( std::same_as(s1)), int*> ); +const S1 c1; +static_assert( std::same_as(c1)), int*> ); +static_assert( std::same_as(c1)), int*> ); +S2 s2; +static_assert( std::same_as(s2)), long*> ); +static_assert( std::same_as(s2)), void*> ); +const S2 c2; +static_assert( std::same_as(c2)), long*> ); +static_assert( std::same_as(c2)), void*> ); -- 2.30.2