Message ID | 20220210165624.2953676-3-ppalka@redhat.com |
---|---|
State | New |
Headers | show |
Series | [1/3,11,backport] libstdc++: Implement P2325 changes to default-constructibility of views | expand |
On Thu, 10 Feb 2022 at 16:58, Patrick Palka via Libstdc++ <libstdc++@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 >
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(); }