diff options
author | Howard Hinnant <hhinnant@apple.com> | 2011-10-09 15:20:46 +0000 |
---|---|---|
committer | Howard Hinnant <hhinnant@apple.com> | 2011-10-09 15:20:46 +0000 |
commit | 1ed7df111b976508a40e1030dad3be633d65bbf5 (patch) | |
tree | 7630aa7068734014f02aeb8c8824a1d1b65fd48b | |
parent | fe9179fa4f58eca34a16005caf2d14a86e93a3cb (diff) | |
download | bcm5719-llvm-1ed7df111b976508a40e1030dad3be633d65bbf5.tar.gz bcm5719-llvm-1ed7df111b976508a40e1030dad3be633d65bbf5.zip |
Fix <rdar://problem/10256836> getline of an empty string mistakenly causes failure
llvm-svn: 141506
-rw-r--r-- | libcxx/include/istream | 4 | ||||
-rw-r--r-- | libcxx/test/strings/basic.string/string.nonmembers/string.io/get_line_delim.pass.cpp | 10 |
2 files changed, 11 insertions, 3 deletions
diff --git a/libcxx/include/istream b/libcxx/include/istream index de8aa106723..d2d37768e52 100644 --- a/libcxx/include/istream +++ b/libcxx/include/istream @@ -1586,6 +1586,7 @@ getline(basic_istream<_CharT, _Traits>& __is, { __str.clear(); ios_base::iostate __err = ios_base::goodbit; + streamsize __extr = 0; while (true) { typename _Traits::int_type __i = __is.rdbuf()->sbumpc(); @@ -1594,6 +1595,7 @@ getline(basic_istream<_CharT, _Traits>& __is, __err |= ios_base::eofbit; break; } + ++__extr; _CharT __ch = _Traits::to_char_type(__i); if (_Traits::eq(__ch, __dlm)) break; @@ -1604,7 +1606,7 @@ getline(basic_istream<_CharT, _Traits>& __is, break; } } - if (__str.empty()) + if (__extr == 0) __err |= ios_base::failbit; __is.setstate(__err); } diff --git a/libcxx/test/strings/basic.string/string.nonmembers/string.io/get_line_delim.pass.cpp b/libcxx/test/strings/basic.string/string.nonmembers/string.io/get_line_delim.pass.cpp index 656d531860b..d8e2fec5032 100644 --- a/libcxx/test/strings/basic.string/string.nonmembers/string.io/get_line_delim.pass.cpp +++ b/libcxx/test/strings/basic.string/string.nonmembers/string.io/get_line_delim.pass.cpp @@ -21,7 +21,7 @@ int main() { { - std::istringstream in(" abc* def* ghij"); + std::istringstream in(" abc* def** ghij"); std::string s("initial text"); getline(in, s, '*'); assert(in.good()); @@ -30,11 +30,14 @@ int main() assert(in.good()); assert(s == " def"); getline(in, s, '*'); + assert(in.good()); + assert(s == ""); + getline(in, s, '*'); assert(in.eof()); assert(s == " ghij"); } { - std::wistringstream in(L" abc* def* ghij"); + std::wistringstream in(L" abc* def** ghij"); std::wstring s(L"initial text"); getline(in, s, L'*'); assert(in.good()); @@ -43,6 +46,9 @@ int main() assert(in.good()); assert(s == L" def"); getline(in, s, L'*'); + assert(in.good()); + assert(s == L""); + getline(in, s, L'*'); assert(in.eof()); assert(s == L" ghij"); } |