https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94749

--- Comment #4 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jonathan Wakely <r...@gcc.gnu.org>:

https://gcc.gnu.org/g:b32eea9c0c25a03e77170675abc4e4bcab6d2b3b

commit r11-1238-gb32eea9c0c25a03e77170675abc4e4bcab6d2b3b
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Thu Jun 11 18:41:37 2020 +0100

    libstdc++: Fix istream::ignore discarding too many chars (PR 94749)

    The current code assumes that if the next character in the stream is
    equal to the delimiter then we stopped because we saw that delimiter,
    and so discards it.  But in the testcase for the PR we stop because we
    reached the maximum number of characters, and it's coincidence that the
    next character equals the delimiter. We should not discard the next
    character in that case.

    The fix is to check that we haven't discarded __n characters already,
    instead of checking whether the next character equals __delim. Because
    we've already checked for EOF, if we haven't discarded __n yet then we
    know we stopped because we saw the delimiter. On the other hand, if the
    next character is the delimiter we don't know if that's why we stopped.

            PR libstdc++/94749
            * include/bits/istream.tcc (basic_istream::ignore(streamsize,
CharT)):
            Only discard an extra character if we didn't already reach the
            maximum number.
            * src/c++98/istream.cc (istream::ignore(streamsiz, char))
            (wistream::ignore(streamsize, wchar_t)): Likewise.
            * testsuite/27_io/basic_istream/ignore/char/94749.cc: New test.
            * testsuite/27_io/basic_istream/ignore/wchar_t/94749.cc: New test.

Reply via email to