diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/ignore/wchar_t/94749.cc b/libstdc++-v3/testsuite/27_io/basic_istream/ignore/wchar_t/94749.cc index 65e0a326c10..040e94aa4d6 100644 --- a/libstdc++-v3/testsuite/27_io/basic_istream/ignore/wchar_t/94749.cc +++ b/libstdc++-v3/testsuite/27_io/basic_istream/ignore/wchar_t/94749.cc @@ -89,7 +89,7 @@ struct buff : std::basic_streambuf typedef std::streamsize streamsize; typedef std::numeric_limits limits; - buff() : count(0), buf() { } + buff() : count(0), nonzero_chars(), buf() { } int_type underflow() { @@ -112,12 +112,23 @@ struct buff : std::basic_streambuf buf[headroom+1] = L'3'; this->setg(buf, buf, buf + headroom + 2); count = limits::max(); + nonzero_chars = headroom - 1; } return buf[0]; } + void reset() + { + buf[nonzero_chars] = char_type(); + buf[nonzero_chars+1] = char_type(); + buf[nonzero_chars+2] = char_type(); + nonzero_chars = 0; + count = 0; + } + streamsize count; + streamsize nonzero_chars; static const streamsize bufsz = 2048 << limits::digits10; char_type buf[bufsz + 2]; @@ -132,7 +143,8 @@ test05() typedef std::char_traits T; - std::basic_istream in(new buff); + buff* pbuf = new buff; + std::basic_istream in(pbuf); in.ignore(std::numeric_limits::max(), L'1'); VERIFY(in.good()); @@ -141,7 +153,9 @@ test05() VERIFY(in.get() == L'3'); VERIFY(in.get() == T::eof()); - delete in.rdbuf(new buff); + pbuf->reset(); + in.clear(); + VERIFY(in.gcount() == 0); in.ignore(std::numeric_limits::max(), L'2'); VERIFY(in.good()); @@ -150,7 +164,9 @@ test05() VERIFY(in.get() == L'3'); VERIFY(in.get() == T::eof()); - delete in.rdbuf(new buff); + pbuf->reset(); + in.clear(); + VERIFY(in.gcount() == 0); in.ignore(std::numeric_limits::max(), L'3'); VERIFY(in.good()); @@ -158,7 +174,9 @@ test05() VERIFY(in.gcount() == std::numeric_limits::max()); VERIFY(in.get() == T::eof()); - delete in.rdbuf(new buff); + pbuf->reset(); + in.clear(); + VERIFY(in.gcount() == 0); in.ignore(std::numeric_limits::max(), L'4'); VERIFY(in.eof()); @@ -166,7 +184,8 @@ test05() VERIFY(in.gcount() == std::numeric_limits::max()); VERIFY(in.get() == T::eof()); - delete in.rdbuf(0); + in.rdbuf(0); + delete pbuf; } void @@ -177,7 +196,8 @@ test06() typedef __gnu_cxx::char_traits T; - std::basic_istream in(new buff); + buff* pbuf = new buff; + std::basic_istream in(pbuf); in.ignore(std::numeric_limits::max(), L'1'); VERIFY(in.good()); @@ -186,7 +206,9 @@ test06() VERIFY(in.get() == L'3'); VERIFY(in.get() == T::eof()); - delete in.rdbuf(new buff); + pbuf->reset(); + in.clear(); + VERIFY(in.gcount() == 0); in.ignore(std::numeric_limits::max(), L'2'); VERIFY(in.good()); @@ -195,7 +217,9 @@ test06() VERIFY(in.get() == L'3'); VERIFY(in.get() == T::eof()); - delete in.rdbuf(new buff); + pbuf->reset(); + in.clear(); + VERIFY(in.gcount() == 0); in.ignore(std::numeric_limits::max(), L'3'); VERIFY(in.good()); @@ -203,7 +227,9 @@ test06() VERIFY(in.gcount() == std::numeric_limits::max()); VERIFY(in.get() == T::eof()); - delete in.rdbuf(new buff); + pbuf->reset(); + in.clear(); + VERIFY(in.gcount() == 0); in.ignore(std::numeric_limits::max(), L'4'); VERIFY(in.eof()); @@ -211,7 +237,8 @@ test06() VERIFY(in.gcount() == std::numeric_limits::max()); VERIFY(in.get() == T::eof()); - delete in.rdbuf(0); + in.rdbuf(0); + delete pbuf; } int