Commit aa103826 by mefyl

Set eofbit on exhausted input stream.

Fix issue #1340. The eofbit is set manually since we don't go through the stream interface. We could maybe use the stream interface instead, but there are some assumptions regarding which exception go through, so this seems to be the most prudent approach for now.
parent d2e6e1bf
...@@ -60,8 +60,8 @@ class input_stream_adapter : public input_adapter_protocol ...@@ -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 ...@@ -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:
......
...@@ -2109,8 +2109,8 @@ class input_stream_adapter : public input_adapter_protocol ...@@ -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 ...@@ -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:
......
...@@ -1708,3 +1708,16 @@ TEST_CASE("regression tests") ...@@ -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());
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment