Make seeking on an ostream that has eofbit set work correctly. Fixes PR#21361

llvm-svn: 240286
This commit is contained in:
Marshall Clow 2015-06-22 15:01:21 +00:00
parent 30952b200b
commit 99f5fc937f
3 changed files with 24 additions and 2 deletions

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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);
}
}