Author: sebor
Date: Wed Feb 6 16:16:21 2008
New Revision: 619228
URL: http://svn.apache.org/viewvc?rev=619228view=rev
Log:
2008-02-06 Martin Sebor [EMAIL PROTECTED]
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=619228r1=619227r2=619228view=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=619228r1=619227r2=619228view=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 VV 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,