libstdc++: Do not set eofbit eagerly in operator>>(istream&, char(&)[N])
authorJonathan Wakely <jwakely@redhat.com>
Thu, 6 Aug 2020 18:23:14 +0000 (19:23 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Thu, 6 Aug 2020 18:23:14 +0000 (19:23 +0100)
commit4e39f563c0cd25401f689c2093cb8c13692156ef
tree2f916c09130bbc9794dd9c264ab78c3a2ece7de3
parent6a3f3e08723063ea2dadb7ddf503f02972a724e2
libstdc++: Do not set eofbit eagerly in operator>>(istream&, char(&)[N])

Similar to the bugs I fixed recently in istream::ignore, we incorrectly
set eofbit too often in operator>>(istream&, string&) and
operator>>(istream&.  char(&)[N]).

We should only set eofbit if we reach EOF but would have kept going
otherwise. If we've already extracted the maximum number of characters
(whether that's because of the buffer size or the istream's width())
then we should not set eofbit.

libstdc++-v3/ChangeLog:

* include/bits/basic_string.tcc
(operator>>(basic_istream&, basic_string&)): Do not set eofbit
if extraction stopped after in.width() characters.
* src/c++98/istream-string.cc (operator>>(istream&, string&)):
Likewise.
* include/bits/istream.tcc (__istream_extract): Do not set
eofbit if extraction stopped after n-1 characters.
* src/c++98/istream.cc (__istream_extract): Likewise.
* testsuite/21_strings/basic_string/inserters_extractors/char/13.cc: New test.
* testsuite/21_strings/basic_string/inserters_extractors/wchar_t/13.cc: New test.
* testsuite/27_io/basic_istream/extractors_character/char/5.cc: New test.
* testsuite/27_io/basic_istream/extractors_character/wchar_t/5.cc: New test.
libstdc++-v3/include/bits/basic_string.tcc
libstdc++-v3/include/bits/istream.tcc
libstdc++-v3/src/c++98/istream-string.cc
libstdc++-v3/src/c++98/istream.cc
libstdc++-v3/testsuite/21_strings/basic_string/inserters_extractors/char/13.cc [new file with mode: 0644]
libstdc++-v3/testsuite/21_strings/basic_string/inserters_extractors/wchar_t/13.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/char/5.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/wchar_t/5.cc [new file with mode: 0644]