Merge pull request #1343 from mefyl/develop
Set eofbit on exhausted input stream.
This commit is contained in:
commit
35829928da
3 changed files with 27 additions and 6 deletions
|
@ -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:
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue