The warning was produced by following sequence, given an istream_iterator<char>
it, such that *it will result in hitting EoF in it->_M_get(), and thus clearing
_M_sbuf, the subsequent call to ++it, will result in _M_sbuf->sbumpc() call on
null pointer. This is however an false-positive, as in such situation
it == istream_iteator() returns true, and the iterator should not be
incremented in first place.
This patch sliences the issue, by disabling the "-Wnull-dereference" using
GCC diagnostic pragmas. To work correctly the pragmas needs to be placed around
streambuf functions on which the issue originating from istreambuf_iterator are
reported.
PR libstdc++/105580
libstdc++-v3/ChangeLog:
* include/std/streambuf (streambuf::gptr, streambuf::egptr)
(streambuf::gbump): Surround with pragma disabling -Wnull-dereference.
* testsuite/24_iterators/istreambuf_iterator/105580.cc: Remove check for
warning being emitted.
---
This will silence more-warnings that the istream_iterator false-positive.
But I believe this is better outcoume, as I believe such false-positive
warning reduce the trust in the output, and leads to any warning in the
area to be ignored (as same-issue).
Tested on x86_64-linux. OK to backport to 13/14/15?
Do we want to use that for 16, instad of iterator fix.
libstdc++-v3/include/std/streambuf | 5 +++++
.../testsuite/24_iterators/istreambuf_iterator/105580.cc | 2 --
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/libstdc++-v3/include/std/streambuf
b/libstdc++-v3/include/std/streambuf
index d6036bd5ddc..f013aa06c28 100644
--- a/libstdc++-v3/include/std/streambuf
+++ b/libstdc++-v3/include/std/streambuf
@@ -490,6 +490,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
char_type*
eback() const { return _M_in_beg; }
+// Required to silence false-positive warnings originating from
istream_iterator::operator++,
+// see PR105580.
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wnull-dereference"
char_type*
gptr() const { return _M_in_cur; }
@@ -505,6 +509,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
*/
void
gbump(int __n) { _M_in_cur += __n; }
+#pragma GCC diagnostic pop
/**
* @brief Setting the three read area pointers.
diff --git a/libstdc++-v3/testsuite/24_iterators/istreambuf_iterator/105580.cc
b/libstdc++-v3/testsuite/24_iterators/istreambuf_iterator/105580.cc
index 85f888b86e7..87edf999ffc 100644
--- a/libstdc++-v3/testsuite/24_iterators/istreambuf_iterator/105580.cc
+++ b/libstdc++-v3/testsuite/24_iterators/istreambuf_iterator/105580.cc
@@ -1,5 +1,4 @@
// { dg-compile }
-// { dg-require-normal-mode "" }
// { dg-additional-options "-Wnull-dereference" }
#include <string>
@@ -12,5 +11,4 @@ int main()
std::string ss(it, end);
return 0;
}
-// { dg-warning ".*null pointer dereference" "" { target *-*-* } 0 }
--
2.53.0