"Silence" in the commit subject line.

On Mon, 2 Mar 2026 at 08:58, Tomasz Kamiński <[email protected]> wrote:
>
> The warning was produced by following sequence, given an 
> istream_iterator<char>

istreambuf not istream

> 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.

Yes, I think this is the best option for trunk at this stage, and we
can refactor the iterator code for GCC 17.

OK for 13/14/15/16, thanks.

>
>  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 }

You can use dg-bogus here, which checks that no such warning is
emitted. That's functionally equivalent to removing the directive,
because if a warning is emitted the test would fail with "excess
errors", but it makes the test self-documenting because with dg-bogus
it documents what problem it is testing for.

Also I don't think you need the .* there because dg-warning always
matches anywhere in the output.

Reply via email to