From 11b87182b0a59685b82d6b825b81f416728f051f 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 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@185298 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/istream | 6 ++-- .../istream.unformatted/ignore_0xff.pass.cpp | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 test/input.output/iostream.format/input.streams/istream.unformatted/ignore_0xff.pass.cpp diff --git a/include/istream b/include/istream index 3f629f68..f3e74c38 100644 --- a/include/istream +++ b/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/test/input.output/iostream.format/input.streams/istream.unformatted/ignore_0xff.pass.cpp b/test/input.output/iostream.format/input.streams/istream.unformatted/ignore_0xff.pass.cpp new file mode 100644 index 00000000..ab0326cf --- /dev/null +++ b/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); +}