diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2020-02-07 11:31:12 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2020-02-07 11:39:12 +0000 |
commit | 5713834e4b99e4c4c99eef15698a497f091b7dc4 (patch) | |
tree | d4a1c39fd7d1c54e158db18a6cfee065ce9721ea | |
parent | ea5ca698dca15dc86b823661ac357a30b49dd0f6 (diff) | |
download | gcc-5713834e4b99e4c4c99eef15698a497f091b7dc4.zip gcc-5713834e4b99e4c4c99eef15698a497f091b7dc4.tar.gz gcc-5713834e4b99e4c4c99eef15698a497f091b7dc4.tar.bz2 |
libstdc++: Enable three-way comparison for iota_view iterators
The declaration of operator<=> was disabled due to a typo in the macro.
The declaration was also ill-formed when three_way_comparable<_Winc> is
not satisfied, which is a defect in the C++20 draft.
* include/std/ranges (iota_view::_Iterator): Fix typo in name of
__cpp_lib_three_way_comparison macro and use deduced return type for
operator<=>.
* testsuite/std/ranges/iota/iterator.cc: New test.
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/std/ranges | 4 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/std/ranges/iota/iterator.cc | 35 |
3 files changed, 44 insertions, 2 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b9c7f43..18d02cb 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2020-02-07 Jonathan Wakely <jwakely@redhat.com> + + * include/std/ranges (iota_view::_Iterator): Fix typo in name of + __cpp_lib_three_way_comparison macro and use deduced return type for + operator<=>. + * testsuite/std/ranges/iota/iterator.cc: New test. + 2020-02-07 Patrick Palka <ppalka@redhat.com> Jonathan Wakely <jwakely@redhat.com> diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index 860f728..dc277a7 100644 --- a/libstdc++-v3/include/std/ranges +++ b/libstdc++-v3/include/std/ranges @@ -776,8 +776,8 @@ namespace ranges requires totally_ordered<_Winc> { return !(__x < __y); } -#ifdef __cpp_lib_threeway_comparison - friend constexpr compare_three_way_result_t<_Winc> +#ifdef __cpp_lib_three_way_comparison + friend constexpr auto operator<=>(const _Iterator& __x, const _Iterator& __y) requires totally_ordered<_Winc> && three_way_comparable<_Winc> { return __x._M_value <=> __y._M_value; } diff --git a/libstdc++-v3/testsuite/std/ranges/iota/iterator.cc b/libstdc++-v3/testsuite/std/ranges/iota/iterator.cc new file mode 100644 index 0000000..4d47143 --- /dev/null +++ b/libstdc++-v3/testsuite/std/ranges/iota/iterator.cc @@ -0,0 +1,35 @@ +// 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> + +auto i = std::ranges::iota_view<int>{}.begin(); +static_assert( std::three_way_comparable<decltype(i)> ); + +struct Inc { + Inc& operator++(); + Inc operator++(int); + friend long operator-(Inc, Inc); +}; +static_assert( ! std::three_way_comparable<Inc> ); + +// Instantiating iterator type must be valid despite !three_way_comparable<Inc> +auto j = std::ranges::iota_view<Inc>{}.begin(); +static_assert( ! std::three_way_comparable<decltype(j)> ); |