Merge pull request #1343 from mefyl/develop

Set eofbit on exhausted input stream.
This commit is contained in:
Niels Lohmann 2018-11-09 21:07:36 +01:00 committed by GitHub
commit 35829928da
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 6 deletions

View file

@ -60,8 +60,8 @@ class input_stream_adapter : public input_adapter_protocol
~input_stream_adapter() override ~input_stream_adapter() override
{ {
// clear stream flags; we use underlying streambuf I/O, do not // clear stream flags; we use underlying streambuf I/O, do not
// maintain ifstream flags // maintain ifstream flags, except eof
is.clear(); is.clear(is.rdstate() & std::ios::eofbit);
} }
explicit input_stream_adapter(std::istream& i) explicit input_stream_adapter(std::istream& i)
@ -79,7 +79,11 @@ class input_stream_adapter : public input_adapter_protocol
// end up as the same value, eg. 0xFFFFFFFF. // end up as the same value, eg. 0xFFFFFFFF.
std::char_traits<char>::int_type get_character() override std::char_traits<char>::int_type get_character() override
{ {
return sb.sbumpc(); auto res = sb.sbumpc();
// set eof manually, as we don't use the istream interface.
if (res == EOF)
is.clear(is.rdstate() | std::ios::eofbit);
return res;
} }
private: private:

View file

@ -2109,8 +2109,8 @@ class input_stream_adapter : public input_adapter_protocol
~input_stream_adapter() override ~input_stream_adapter() override
{ {
// clear stream flags; we use underlying streambuf I/O, do not // clear stream flags; we use underlying streambuf I/O, do not
// maintain ifstream flags // maintain ifstream flags, except eof
is.clear(); is.clear(is.rdstate() & std::ios::eofbit);
} }
explicit input_stream_adapter(std::istream& i) explicit input_stream_adapter(std::istream& i)
@ -2128,7 +2128,11 @@ class input_stream_adapter : public input_adapter_protocol
// end up as the same value, eg. 0xFFFFFFFF. // end up as the same value, eg. 0xFFFFFFFF.
std::char_traits<char>::int_type get_character() override std::char_traits<char>::int_type get_character() override
{ {
return sb.sbumpc(); auto res = sb.sbumpc();
// set eof manually, as we don't use the istream interface.
if (res == EOF)
is.clear(is.rdstate() | std::ios::eofbit);
return res;
} }
private: private:

View file

@ -1708,3 +1708,16 @@ TEST_CASE("regression tests")
CHECK(expected == data); CHECK(expected == data);
} }
} }
TEST_CASE("regression tests, exceptions dependent", "[!throws]")
{
SECTION("issue #1340 - eof not set on exhausted input stream")
{
std::stringstream s("{}{}");
json j;
s >> j;
s >> j;
CHECK_THROWS_AS(s >> j, json::parse_error const&);
CHECK(s.eof());
}
}