From eecacc0fadb4f1fcb2297b5dbcca5c610e8f8c21 Mon Sep 17 00:00:00 2001 From: Howard Hinnant Date: Mon, 1 Jul 2013 00:37:50 +0000 Subject: [PATCH] In istream::ignore, check the delimeter as an int_type, not as a char_type, so as to correctly handle EOF. This fixes http://llvm.org/bugs/show_bug.cgi?id=16427 llvm-svn: 185298 --- libcxx/include/istream | 6 ++-- .../istream.unformatted/ignore_0xff.pass.cpp | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 libcxx/test/input.output/iostream.format/input.streams/istream.unformatted/ignore_0xff.pass.cpp diff --git a/libcxx/include/istream b/libcxx/include/istream index 3f629f68008c..f3e74c382e6b 100644 --- a/libcxx/include/istream +++ b/libcxx/include/istream @@ -1144,8 +1144,7 @@ basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm) break; } ++__gc_; - char_type __ch = traits_type::to_char_type(__i); - if (traits_type::eq(__ch, static_cast(__dlm))) + if (traits_type::eq_int_type(__i, __dlm)) break; } } @@ -1160,8 +1159,7 @@ basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm) break; } ++__gc_; - char_type __ch = traits_type::to_char_type(__i); - if (traits_type::eq(__ch, static_cast(__dlm))) + if (traits_type::eq_int_type(__i, __dlm)) break; } } diff --git a/libcxx/test/input.output/iostream.format/input.streams/istream.unformatted/ignore_0xff.pass.cpp b/libcxx/test/input.output/iostream.format/input.streams/istream.unformatted/ignore_0xff.pass.cpp new file mode 100644 index 000000000000..ab0326cf0c90 --- /dev/null +++ b/libcxx/test/input.output/iostream.format/input.streams/istream.unformatted/ignore_0xff.pass.cpp @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// basic_istream& +// ignore(streamsize n = 1, int_type delim = traits::eof()); + +// http://llvm.org/bugs/show_bug.cgi?id=16427 + +#include +#include + +int main() +{ + int bad=-1; + std::ostringstream os; + os << "aaaabbbb" << static_cast(bad) + << "ccccdddd" << std::endl; + std::string s=os.str(); + + std::istringstream is(s); + const unsigned int ignoreLen=10; + size_t a=is.tellg(); + is.ignore(ignoreLen); + size_t b=is.tellg(); + assert((b-a)==ignoreLen); +} -- 2.34.1