diff --git a/include/ostream b/include/ostream index a7af2994..f55fd408 100644 --- a/include/ostream +++ b/include/ostream @@ -1004,7 +1004,7 @@ basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::seekp(pos_type __pos) { sentry __s(*this); - if (__s) + if (!this->fail()) { if (this->rdbuf()->pubseekpos(__pos, ios_base::out) == pos_type(-1)) this->setstate(ios_base::failbit); @@ -1018,7 +1018,7 @@ basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::seekp(off_type __off, ios_base::seekdir __dir) { sentry __s(*this); - if (__s) + if (!this->fail()) { if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::out) == pos_type(-1)) this->setstate(ios_base::failbit); diff --git a/test/std/input.output/iostream.format/output.streams/ostream.seeks/seekp.pass.cpp b/test/std/input.output/iostream.format/output.streams/ostream.seeks/seekp.pass.cpp index e09627b2..ec3fe488 100644 --- a/test/std/input.output/iostream.format/output.streams/ostream.seeks/seekp.pass.cpp +++ b/test/std/input.output/iostream.format/output.streams/ostream.seeks/seekp.pass.cpp @@ -40,11 +40,13 @@ protected: int main() { { + seekpos_called = 0; std::ostream os((std::streambuf*)0); assert(&os.seekp(5) == &os); assert(seekpos_called == 0); } { + seekpos_called = 0; testbuf sb; std::ostream os(&sb); assert(&os.seekp(10) == &os); @@ -54,4 +56,13 @@ int main() assert(seekpos_called == 2); assert(os.fail()); } + { // See https://llvm.org/bugs/show_bug.cgi?id=21361 + seekpos_called = 0; + testbuf sb; + std::ostream os(&sb); + os.setstate(std::ios_base::eofbit); + assert(&os.seekp(10) == &os); + assert(seekpos_called == 1); + assert(os.rdstate() == std::ios_base::eofbit); + } } diff --git a/test/std/input.output/iostream.format/output.streams/ostream.seeks/seekp2.pass.cpp b/test/std/input.output/iostream.format/output.streams/ostream.seeks/seekp2.pass.cpp index 69b26f3a..ebfd24af 100644 --- a/test/std/input.output/iostream.format/output.streams/ostream.seeks/seekp2.pass.cpp +++ b/test/std/input.output/iostream.format/output.streams/ostream.seeks/seekp2.pass.cpp @@ -42,11 +42,13 @@ protected: int main() { { + seekoff_called = 0; std::ostream os((std::streambuf*)0); assert(&os.seekp(5, std::ios_base::beg) == &os); assert(seekoff_called == 0); } { + seekoff_called = 0; testbuf sb; std::ostream os(&sb); assert(&os.seekp(10, std::ios_base::beg) == &os); @@ -56,4 +58,13 @@ int main() assert(seekoff_called == 2); assert(os.fail()); } + { // See https://llvm.org/bugs/show_bug.cgi?id=21361 + seekoff_called = 0; + testbuf sb; + std::ostream os(&sb); + os.setstate(std::ios_base::eofbit); + assert(&os.seekp(10, std::ios_base::beg) == &os); + assert(seekoff_called == 1); + assert(os.rdstate() == std::ios_base::eofbit); + } }