You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by se...@apache.org on 2008/02/07 01:16:25 UTC
svn commit: r619228 - in /stdcxx/trunk: include/rw/_streamiter.h
tests/iterators/24.istream.iterator.cpp
Author: sebor
Date: Wed Feb 6 16:16:21 2008
New Revision: 619228
URL: http://svn.apache.org/viewvc?rev=619228&view=rev
Log:
2008-02-06 Martin Sebor <se...@roguewave.com>
STDCXX-645
* include/rw/_streamiter.h (operator*): Checked fail() instead
of eof() on the associated stream before turning the object into
the end-of-stream iterator, as per LWG issue 788.
* tests/iterators/24.istream.iterator.cpp (test_ctors): Inserted
a valid number instead of NUL into test stream.
(test_ops): Changed the expected result of equality comparison
with the end-of-stream iterator according to LWG issue 788.
(opt_char, opt_wchar_t, opt_UserTraits, opt_short, opt_int,
opt_long, opt_double): Added "tri-state" options.
(do_test, run_test, main): Handled said options.
Modified:
stdcxx/trunk/include/rw/_streamiter.h
stdcxx/trunk/tests/iterators/24.istream.iterator.cpp
Modified: stdcxx/trunk/include/rw/_streamiter.h
URL: http://svn.apache.org/viewvc/stdcxx/trunk/include/rw/_streamiter.h?rev=619228&r1=619227&r2=619228&view=diff
==============================================================================
--- stdcxx/trunk/include/rw/_streamiter.h (original)
+++ stdcxx/trunk/include/rw/_streamiter.h Wed Feb 6 16:16:21 2008
@@ -120,7 +120,9 @@
operator++ ()
{
// incrementing an end-of-stream iterator has undefined behavior
- if (_C_strm && (*_C_strm >> _C_val).eof ())
+
+ // see also LWG issue 788
+ if (_C_strm && (*_C_strm >> _C_val).fail ())
_C_strm = 0;
return *this;
Modified: stdcxx/trunk/tests/iterators/24.istream.iterator.cpp
URL: http://svn.apache.org/viewvc/stdcxx/trunk/tests/iterators/24.istream.iterator.cpp?rev=619228&r1=619227&r2=619228&view=diff
==============================================================================
--- stdcxx/trunk/tests/iterators/24.istream.iterator.cpp (original)
+++ stdcxx/trunk/tests/iterators/24.istream.iterator.cpp Wed Feb 6 16:16:21 2008
@@ -100,8 +100,7 @@
// below, to prevent the iterator ctor from creating an end-of-stream
// iterator (in case it doesn't delay extracting a value until it's
// needed)
- strm1.rdbuf ()->sputc (CharT ());
- strm1.rdbuf ()->sputc (CharT ());
+ strm1 << "1 2 ";
// verify [reverse.iter], p3, i.e., that two istream_iterators
// constructed from the same stream always compare equal
@@ -119,7 +118,7 @@
StringStream strm2;
strm2.imbue (strm1.getloc ());
- strm2.rdbuf ()->sputc (CharT ());
+ strm2 << "2 ";
const Iterator iter3 (strm2);
@@ -209,46 +208,58 @@
const bool is_signed = zero - one < zero;
const bool is_exact = one / two == zero;
+ // see LWG issue 788
+ // an istream_iterator object becomes an end-of-stream iterator
+ // after a failed extraction (i.e., when the call to fail() on
+ // the associated stream returns true)
+
if (is_char) {
+
+ // +-- controlled sequence
+ // | +-- extracted value
+ // | | +-- iterator equal to EOS after extraction
+ // | | | +-- stream state after extraction
+ // | | | |
+ // V V V V
TEST ("", '\0', true, Eof | Fail);
TEST ("1", '1', false, Good);
TEST ("2", '2', false, Good);
}
else {
TEST ("", 0, true, Eof | Fail);
- TEST ("1", 1, true, Eof);
+ TEST ("1", 1, false, Eof);
TEST ("1 ", 1, false, Good);
- TEST ("+1", 1, true, Eof);
- TEST (" 1", 1, true, Eof);
+ TEST ("+1", 1, false, Eof);
+ TEST (" 1", 1, false, Eof);
TEST (" 1 ", 1, false, Good);
- TEST (" +1", 1, true, Eof);
- TEST ("2", 2, true, Eof);
- TEST ("+2", 2, true, Eof);
- TEST (" 2", 2, true, Eof);
- TEST (" +2", 2, true, Eof);
- TEST ("99", 99, true, Eof);
- TEST ("+99", 99, true, Eof);
- TEST (" 99", 99, true, Eof);
- TEST (" +99", 99, true, Eof);
+ TEST (" +1", 1, false, Eof);
+ TEST ("2", 2, false, Eof);
+ TEST ("+2", 2, false, Eof);
+ TEST (" 2", 2, false, Eof);
+ TEST (" +2", 2, false, Eof);
+ TEST ("99", 99, false, Eof);
+ TEST ("+99", 99, false, Eof);
+ TEST (" 99", 99, false, Eof);
+ TEST (" +99", 99, false, Eof);
TEST ("+", 0, true, Eof | Fail);
TEST ("-", 0, true, Eof | Fail);
TEST (" +", 0, true, Eof | Fail);
TEST (" -", 0, true, Eof | Fail);
- TEST ("++", 0, false, Fail);
- TEST ("--", 0, false, Fail);
- TEST (" ++", 0, false, Fail);
- TEST (" --", 0, false, Fail);
- TEST ("*", 0, false, Fail);
- TEST (" *", 0, false, Fail);
+ TEST ("++", 0, true, Fail);
+ TEST ("--", 0, true, Fail);
+ TEST (" ++", 0, true, Fail);
+ TEST (" --", 0, true, Fail);
+ TEST ("*", 0, true, Fail);
+ TEST (" *", 0, true, Fail);
if (is_signed) {
- TEST ("-1", -1, true, Eof);
- TEST (" -1", -1, true, Eof);
- TEST ("-2", -2, true, Eof);
- TEST (" -2", -2, true, Eof);
- TEST ("-99", -99, true, Eof);
- TEST (" -99", -99, true, Eof);
+ TEST ("-1", -1, false, Eof);
+ TEST (" -1", -1, false, Eof);
+ TEST ("-2", -2, false, Eof);
+ TEST (" -2", -2, false, Eof);
+ TEST ("-99", -99, false, Eof);
+ TEST (" -99", -99, false, Eof);
}
if (is_exact) {
@@ -258,27 +269,27 @@
TEST (" +4.", 4, false, Good);
}
else {
- TEST (".1", 0.1, true, Eof);
- TEST ("+.2", 0.2, true, Eof);
- TEST ("-.3", -0.3, true, Eof);
- TEST (" +.4", 0.4, true, Eof);
- TEST (" -.5", -0.5, true, Eof);
+ TEST (".1", 0.1, false, Eof);
+ TEST ("+.2", 0.2, false, Eof);
+ TEST ("-.3", -0.3, false, Eof);
+ TEST (" +.4", 0.4, false, Eof);
+ TEST (" -.5", -0.5, false, Eof);
TEST ("1..", 1.0, false, Good);
- TEST ("1.234", 1.234, true, Eof);
- TEST ("+1.235", +1.235, true, Eof);
- TEST ("-1.236", -1.236, true, Eof);
- TEST (" +1.237", +1.237, true, Eof);
- TEST (" -1.238", -1.238, true, Eof);
- TEST ("1.239e1", 1.239e1, true, Eof);
- TEST ("1.240e+1", 1.240e+1, true, Eof);
- TEST ("-1.241e+2", -1.241e+2, true, Eof);
+ TEST ("1.234", 1.234, false, Eof);
+ TEST ("+1.235", +1.235, false, Eof);
+ TEST ("-1.236", -1.236, false, Eof);
+ TEST (" +1.237", +1.237, false, Eof);
+ TEST (" -1.238", -1.238, false, Eof);
+ TEST ("1.239e1", 1.239e1, false, Eof);
+ TEST ("1.240e+1", 1.240e+1, false, Eof);
+ TEST ("-1.241e+2", -1.241e+2, false, Eof);
TEST ("-1.242e-3 ", -1.242e-3, false, Good);
TEST ("1.3e", 0, true, Eof | Fail);
TEST ("1.4e+", 0, true, Eof | Fail);
TEST ("1.5e-", 0, true, Eof | Fail);
- TEST ("1.6e+ ", 0, false, Fail);
+ TEST ("1.6e+ ", 0, true, Fail);
}
}
}
@@ -309,6 +320,15 @@
/***********************************************************************/
+int opt_char;
+int opt_wchar_t;
+int opt_UserTraits;
+int opt_short;
+int opt_int;
+int opt_long;
+int opt_double;
+
+
// exercise different specializations of T
template <class CharT, class Traits, class Dist>
void do_test (TestId id,
@@ -318,7 +338,8 @@
{
#undef TEST
#define TEST(T, fmt) \
- do_test<T, CharT, Traits, Dist>(id, #T, fmt, cname, trname, dname)
+ if (opt_ ## T) \
+ do_test<T, CharT, Traits, Dist>(id, #T, fmt, cname, trname, dname)
// cannot instantiate basic_istream<CharT>::operator>>(char&)
// for any CharT other than char
@@ -348,6 +369,15 @@
{
static const TestId test_ids [] = { TestCtors, TestOps };
+ if (opt_char < 0)
+ rw_note (0, 0, __LINE__, "tests of char specialization disabled");
+
+ if (opt_wchar_t < 0)
+ rw_note (0, 0, __LINE__, "tests of wchar_t specialization disabled");
+
+ if (opt_UserTraits < 0)
+ rw_note (0, 0, __LINE__, "tests of UserTraits specialization disabled");
+
typedef std::char_traits<char> Traits;
typedef UserTraits<char> UsrTraits;
@@ -355,25 +385,38 @@
const TestId id = test_ids [i];
- // call these helper functions directly to avoid instantiating
- // basic_istream<CharT>::operator>>(char&) on any CharT other
- // than char
- do_test<char, char, Traits, std::ptrdiff_t>(id, "char", "%{hhi}",
- 0, 0, 0);
- do_test<char, char, UsrTraits, std::ptrdiff_t>(id, "char", "%{hhi}",
- 0, "UserTraits<char>",
- "std::ptrdiff_t");
+ if (0 <= opt_char) {
- do_test<char, Traits>(id, 0, 0);
- do_test<char, UsrTraits>(id, "char", "UserTraits<char>");
+ // call these helper functions directly to avoid instantiating
+ // basic_istream<CharT>::operator>>(char&) on any CharT other
+ // than char
+ do_test<char, char, Traits, std::ptrdiff_t>(id, "char", "%{hhi}",
+ 0, 0, 0);
+
+ if (0 <= opt_UserTraits)
+ do_test<char, char, UsrTraits, std::ptrdiff_t>(id, "char",
+ "%{hhi}", 0, "UserTraits<char>", "std::ptrdiff_t");
+
+ do_test<char, Traits>(id, 0, 0);
+
+ if (0 <= opt_UserTraits)
+ do_test<char, UsrTraits>(id, "char", "UserTraits<char>");
+ }
#ifndef _RWSTD_NO_WCHAR_T
- typedef std::char_traits<wchar_t> WTraits;
- typedef UserTraits<wchar_t> WUsrTraits;
+ if (0 <= opt_wchar_t) {
+
+ typedef std::char_traits<wchar_t> WTraits;
+ typedef UserTraits<wchar_t> WUsrTraits;
- do_test<wchar_t, WTraits>(id, 0, 0);
- do_test<wchar_t, WUsrTraits>(id, "wchar_t", "UserTraits<wchar_t>");
+ do_test<wchar_t, WTraits>(id, 0, 0);
+
+ if (0 <= opt_UserTraits)
+ do_test<wchar_t, WUsrTraits>(id, "wchar_t",
+ "UserTraits<wchar_t>");
+
+ }
#endif // _RWSTD_NO_WCHAR_T
@@ -391,5 +434,19 @@
"lib.istream.iterator",
0 /* no comment */,
run_test,
- "", 0);
+ "|-char~ "
+ "|-wchar_t~ "
+ "|-UserTraits~ "
+ "|-short~ "
+ "|-int~ "
+ "|-long~ "
+ "|-double~ ",
+ &opt_char,
+ &opt_wchar_t,
+ &opt_UserTraits,
+ &opt_short,
+ &opt_int,
+ &opt_long,
+ &opt_double,
+ (void*)0 /* sentinel */);
}