libcxx: Fix for basic_stringbuf::seekoff() after r320604.
As a result of this change, the basic_stringbuf constructor that takes a mode ends up leaving __hm_ set to 0, causing the comparison "__hm_ - __str_.data() < __noff" in seekoff() to succeed, which caused the function to incorrectly return -1. The fix is to account for the possibility of __hm_ being 0 when computing the distance from __hm_ to the start of the string. Differential Revision: https://reviews.llvm.org/D41319 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@321124 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -20,6 +20,30 @@
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
std::stringbuf sb(std::ios_base::in);
|
||||
assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == -1);
|
||||
assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == -1);
|
||||
assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == -1);
|
||||
assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in | std::ios_base::out) == -1);
|
||||
assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in | std::ios_base::out) == -1);
|
||||
assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in | std::ios_base::out) == -1);
|
||||
assert(sb.pubseekoff(0, std::ios_base::beg, std::ios_base::in) == 0);
|
||||
assert(sb.pubseekoff(0, std::ios_base::cur, std::ios_base::in) == 0);
|
||||
assert(sb.pubseekoff(0, std::ios_base::end, std::ios_base::in) == 0);
|
||||
}
|
||||
{
|
||||
std::stringbuf sb(std::ios_base::out);
|
||||
assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == -1);
|
||||
assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == -1);
|
||||
assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == -1);
|
||||
assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in | std::ios_base::out) == -1);
|
||||
assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in | std::ios_base::out) == -1);
|
||||
assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in | std::ios_base::out) == -1);
|
||||
assert(sb.pubseekoff(0, std::ios_base::beg, std::ios_base::out) == 0);
|
||||
assert(sb.pubseekoff(0, std::ios_base::cur, std::ios_base::out) == 0);
|
||||
assert(sb.pubseekoff(0, std::ios_base::end, std::ios_base::out) == 0);
|
||||
}
|
||||
{
|
||||
std::stringbuf sb("0123456789", std::ios_base::in);
|
||||
assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == -1);
|
||||
|
||||
Reference in New Issue
Block a user