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. --- libstdc++-v3/include/std/ranges | 2 ++ .../testsuite/std/ranges/adaptors/take_while.cc | 10 ++++++++++ 2 files changed, 12 insertions(+)
diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index 19bc01a3b3a..55e7c4de234 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 d587127b97e..48771397f1d 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(); } -- 2.29.0.rc0