diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2020-02-19 11:37:54 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2020-02-19 12:46:57 +0000 |
commit | fa89adaa979093936d8f148ef5496db05ad308e5 (patch) | |
tree | c1cd0aa1bedd6c17445080b02fe5c2ab7487d846 | |
parent | a45fb21a10f486f6596b648e2c64bd1c7d808f18 (diff) | |
download | gcc-fa89adaa979093936d8f148ef5496db05ad308e5.zip gcc-fa89adaa979093936d8f148ef5496db05ad308e5.tar.gz gcc-fa89adaa979093936d8f148ef5496db05ad308e5.tar.bz2 |
libstdc++: tuple_element_t is also wrong for const subrange (LWG 3398)
* include/std/ranges (tuple_element<0, const subrange<I, S, K>>)
(tuple_element<1, const subrange<I, S, K>>): Add partial
specializations (LWG 3398).
* testsuite/std/ranges/subrange/tuple_like.cc: New test.
-rw-r--r-- | libstdc++-v3/ChangeLog | 5 | ||||
-rw-r--r-- | libstdc++-v3/include/std/ranges | 9 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/std/ranges/subrange/tuple_like.cc | 52 |
3 files changed, 65 insertions, 1 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index a8fcd7c..f69507d 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,10 @@ 2020-02-19 Jonathan Wakely <jwakely@redhat.com> + * include/std/ranges (tuple_element<0, const subrange<I, S, K>>) + (tuple_element<1, const subrange<I, S, K>>): 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 e0eb847..4e50206 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<const tuple_element_t<_Nm, _Tp>&>; }; @@ -3451,6 +3450,14 @@ namespace views struct tuple_element<1, ranges::subrange<_Iter, _Sent, _Kind>> { using type = _Sent; }; + template<typename _Iter, typename _Sent, ranges::subrange_kind _Kind> + struct tuple_element<0, const ranges::subrange<_Iter, _Sent, _Kind>> + { using type = _Iter; }; + + template<typename _Iter, typename _Sent, ranges::subrange_kind _Kind> + 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 0000000..a3020d2 --- /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 +// <http://www.gnu.org/licenses/>. + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include <ranges> + +using S1 = std::ranges::subrange<int*>; +using S2 = std::ranges::subrange<long*, void*>; + +static_assert( std::tuple_size_v<S1> == 2 ); +static_assert( std::tuple_size_v<S2> == 2 ); + +static_assert( std::same_as<std::tuple_element_t<0, S1>, int*> ); +static_assert( std::same_as<std::tuple_element_t<1, S1>, int*> ); +// LWG 3398 +static_assert( std::same_as<std::tuple_element_t<0, const S1>, int*> ); +static_assert( std::same_as<std::tuple_element_t<1, const S1>, int*> ); + +static_assert( std::same_as<std::tuple_element_t<0, S2>, long*> ); +static_assert( std::same_as<std::tuple_element_t<1, S2>, void*> ); +// LWG 3398 +static_assert( std::same_as<std::tuple_element_t<0, const S2>, long*> ); +static_assert( std::same_as<std::tuple_element_t<1, const S2>, void*> ); + +S1 s1; +static_assert( std::same_as<decltype(std::get<0>(s1)), int*> ); +static_assert( std::same_as<decltype(std::get<1>(s1)), int*> ); +const S1 c1; +static_assert( std::same_as<decltype(std::get<0>(c1)), int*> ); +static_assert( std::same_as<decltype(std::get<1>(c1)), int*> ); +S2 s2; +static_assert( std::same_as<decltype(std::get<0>(s2)), long*> ); +static_assert( std::same_as<decltype(std::get<1>(s2)), void*> ); +const S2 c2; +static_assert( std::same_as<decltype(std::get<0>(c2)), long*> ); +static_assert( std::same_as<decltype(std::get<1>(c2)), void*> ); |