diff options
author | Marshall Clow <mclow.lists@gmail.com> | 2015-06-22 15:01:21 +0000 |
---|---|---|
committer | Marshall Clow <mclow.lists@gmail.com> | 2015-06-22 15:01:21 +0000 |
commit | 99f5fc937f1042b24188a92bf2fe40f151d023bb (patch) | |
tree | e6d79ef283c5acabcb0240b997af2e020fdf8231 | |
parent | 30952b200b7f5393ababd0907998fa78f2917a7d (diff) | |
download | bcm5719-llvm-99f5fc937f1042b24188a92bf2fe40f151d023bb.tar.gz bcm5719-llvm-99f5fc937f1042b24188a92bf2fe40f151d023bb.zip |
Make seeking on an ostream that has eofbit set work correctly. Fixes PR#21361
llvm-svn: 240286
3 files changed, 24 insertions, 2 deletions
diff --git a/libcxx/include/ostream b/libcxx/include/ostream index a7af2994b6b..f55fd40856e 100644 --- a/libcxx/include/ostream +++ b/libcxx/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/libcxx/test/std/input.output/iostream.format/output.streams/ostream.seeks/seekp.pass.cpp b/libcxx/test/std/input.output/iostream.format/output.streams/ostream.seeks/seekp.pass.cpp index e09627b29b6..ec3fe48866c 100644 --- a/libcxx/test/std/input.output/iostream.format/output.streams/ostream.seeks/seekp.pass.cpp +++ b/libcxx/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<char> 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<char> 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/libcxx/test/std/input.output/iostream.format/output.streams/ostream.seeks/seekp2.pass.cpp b/libcxx/test/std/input.output/iostream.format/output.streams/ostream.seeks/seekp2.pass.cpp index 69b26f3a96e..ebfd24af91d 100644 --- a/libcxx/test/std/input.output/iostream.format/output.streams/ostream.seeks/seekp2.pass.cpp +++ b/libcxx/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<char> 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<char> 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); + } } |