On Thu, 10 Feb 2022 at 16:58, Patrick Palka via Libstdc++ <libstd...@gcc.gnu.org> wrote: > > The primary template for _CachedPosition is a dummy implementation for > non-forward ranges, the iterators for which generally can't be cached. > Because this implementation doesn't actually cache anything, _M_has_value > is defined to be false and so calls to _M_get (which are always guarded > by _M_has_value) are unreachable. > > Still, to suppress a "control reaches end of non-void function" warning > I made _M_get return {}, but after P2325 input iterators are no longer > necessarily default constructible so this workaround now breaks valid > programs. > > This patch fixes this by instead using __builtin_unreachable to squelch > the warning.
OK > > PR libstdc++/103904 > PR libstdc++/101231 > > libstdc++-v3/ChangeLog: > > * include/std/ranges (_CachedPosition::_M_get): For non-forward > ranges, just call __builtin_unreachable. > * testsuite/std/ranges/istream_view.cc (test05): New test. > > (cherry picked from commit 1af937eb6246ad7f63ebff03590e9eede33aca81) > --- > libstdc++-v3/include/std/ranges | 2 +- > libstdc++-v3/testsuite/std/ranges/istream_view.cc | 12 ++++++++++++ > 2 files changed, 13 insertions(+), 1 deletion(-) > > diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges > index bf6cfae2a6e..a4228ba9aa0 100644 > --- a/libstdc++-v3/include/std/ranges > +++ b/libstdc++-v3/include/std/ranges > @@ -1221,7 +1221,7 @@ namespace views::__adaptor > _M_get(const _Range&) const > { > __glibcxx_assert(false); > - return {}; > + __builtin_unreachable(); > } > > constexpr void > diff --git a/libstdc++-v3/testsuite/std/ranges/istream_view.cc > b/libstdc++-v3/testsuite/std/ranges/istream_view.cc > index af76a1ab39e..f5c0c2a6bb0 100644 > --- a/libstdc++-v3/testsuite/std/ranges/istream_view.cc > +++ b/libstdc++-v3/testsuite/std/ranges/istream_view.cc > @@ -83,6 +83,17 @@ test04() > static_assert(!std::forward_iterator<It>); > } > > +void > +test05() > +{ > + // PR libstdc++/101231 > + auto words = std::istringstream{"42"}; > + auto is = ranges::istream_view<int>(words); > + auto r = is | views::filter([](auto) { return true; }); > + for (auto x : r) > + ; > +} > + > void > test06() > { > @@ -99,5 +110,6 @@ main() > test02(); > test03(); > test04(); > + test05(); > test06(); > } > -- > 2.35.1.102.g2b9c120970 >