summaryrefslogtreecommitdiffstats
path: root/libcxx
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2015-06-22 15:01:21 +0000
committerMarshall Clow <mclow.lists@gmail.com>2015-06-22 15:01:21 +0000
commit99f5fc937f1042b24188a92bf2fe40f151d023bb (patch)
treee6d79ef283c5acabcb0240b997af2e020fdf8231 /libcxx
parent30952b200b7f5393ababd0907998fa78f2917a7d (diff)
downloadbcm5719-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
Diffstat (limited to 'libcxx')
-rw-r--r--libcxx/include/ostream4
-rw-r--r--libcxx/test/std/input.output/iostream.format/output.streams/ostream.seeks/seekp.pass.cpp11
-rw-r--r--libcxx/test/std/input.output/iostream.format/output.streams/ostream.seeks/seekp2.pass.cpp11
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);
+ }
}
OpenPOWER on IntegriCloud