aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2020-10-12 13:46:24 -0400
committerPatrick Palka <ppalka@redhat.com>2020-10-12 13:46:24 -0400
commitc5aad5a41838dbfd29ff114692ff9533b52746b4 (patch)
treeb8c2de4f7b24bd6225243ee44817633b950caac2
parente066821b6f6b7332c7a67981f7b33c9ba0ccaee7 (diff)
downloadgcc-c5aad5a41838dbfd29ff114692ff9533b52746b4.zip
gcc-c5aad5a41838dbfd29ff114692ff9533b52746b4.tar.gz
gcc-c5aad5a41838dbfd29ff114692ff9533b52746b4.tar.bz2
libstdc++: Apply proposed resolution for LWG 3450
libstdc++-v3/ChangeLog: * include/std/ranges (take_while_view::begin): Constrain the const overload further as per LWG 3450. (take_while_view::end): Likewise. * testsuite/std/ranges/adaptors/take_while.cc: Add test for LWG 3450.
-rw-r--r--libstdc++-v3/include/std/ranges2
-rw-r--r--libstdc++-v3/testsuite/std/ranges/adaptors/take_while.cc10
2 files changed, 12 insertions, 0 deletions
diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
index 19bc01a..55e7c4d 100644
--- a/libstdc++-v3/include/std/ranges
+++ b/libstdc++-v3/include/std/ranges
@@ -1888,6 +1888,7 @@ namespace views
constexpr auto
begin() const requires range<const _Vp>
+ && indirect_unary_predicate<const _Pred, iterator_t<const _Vp>>
{ return ranges::begin(_M_base); }
constexpr auto
@@ -1897,6 +1898,7 @@ namespace views
constexpr auto
end() const requires range<const _Vp>
+ && indirect_unary_predicate<const _Pred, iterator_t<const _Vp>>
{ return _Sentinel<true>(ranges::end(_M_base),
std::__addressof(*_M_pred)); }
};
diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/take_while.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/take_while.cc
index d587127..4877139 100644
--- a/libstdc++-v3/testsuite/std/ranges/adaptors/take_while.cc
+++ b/libstdc++-v3/testsuite/std/ranges/adaptors/take_while.cc
@@ -70,10 +70,20 @@ test03()
b = ranges::end(v);
}
+void
+test04()
+{
+ // LWG 3450
+ auto v = views::single(1) | views::take_while([](int& x) { return true;});
+ static_assert(ranges::range<decltype(v)>);
+ static_assert(!ranges::range<decltype(v) const>);
+}
+
int
main()
{
test01();
test02();
test03();
+ test04();
}