diff options
author | Benjamin Kosnik <bkoz@redhat.com> | 2002-05-15 14:38:30 +0000 |
---|---|---|
committer | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2002-05-15 14:38:30 +0000 |
commit | 7bd9b6d491a8ecae045944f6eeba77a98e82d0c1 (patch) | |
tree | fe79023e5c71a60a693b8ddca9d75c4bad305887 | |
parent | fb5b4dfdcba3e04c784a87f1b6fa5a7d088748b9 (diff) | |
download | gcc-7bd9b6d491a8ecae045944f6eeba77a98e82d0c1.zip gcc-7bd9b6d491a8ecae045944f6eeba77a98e82d0c1.tar.gz gcc-7bd9b6d491a8ecae045944f6eeba77a98e82d0c1.tar.bz2 |
re PR libstdc++/6518 (???)
2002-05-15 Benjamin Kosnik <bkoz@redhat.com>
PR libstdc++/6518
* include/bits/ostream.tcc (ostream::operator<<(const char*)): Fix
for null case.
(ostream::operator<<(const _CharT*)): Same.
(ostream<char>::operator<<(const char*)): Same.
* testsuite/27_io/ostream_inserter_char.cc (test07): Add test.
From-SVN: r53489
-rw-r--r-- | libstdc++-v3/ChangeLog | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/ostream.tcc | 18 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/27_io/ostream_inserter_char.cc | 28 |
3 files changed, 50 insertions, 5 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 4018151..b1bb701 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,14 @@ 2002-05-15 Benjamin Kosnik <bkoz@redhat.com> + PR libstdc++/6518 + * include/bits/ostream.tcc (ostream::operator<<(const char*)): Fix + for null case. + (ostream::operator<<(const _CharT*)): Same. + (ostream<char>::operator<<(const char*)): Same. + * testsuite/27_io/ostream_inserter_char.cc (test07): Add test. + +2002-05-15 Benjamin Kosnik <bkoz@redhat.com> + PR libstdc++/6594 * src/strstream.cc (strstreambuf): Fix leak. diff --git a/libstdc++-v3/include/bits/ostream.tcc b/libstdc++-v3/include/bits/ostream.tcc index d15b9f2..550e405 100644 --- a/libstdc++-v3/include/bits/ostream.tcc +++ b/libstdc++-v3/include/bits/ostream.tcc @@ -545,7 +545,8 @@ namespace std { streamsize __w = __out.width(); _CharT* __pads = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * __w)); - streamsize __len = static_cast<streamsize>(_Traits::length(__s)); + streamsize __len = __s + ? static_cast<streamsize>(_Traits::length(__s)) : 0; if (__w > __len) { __pad(__out, __out.fill(), __pads, __s, __w, __len, false); @@ -554,6 +555,8 @@ namespace std } __out.write(__s, __len); __out.width(0); + if (!__len) + __out.setstate(ios_base::badbit); } catch(exception& __fail) { @@ -575,14 +578,14 @@ namespace std #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS // 167. Improper use of traits_type::length() // Note that this is only in 'Review' status. - typedef char_traits<char> __ctraits_type; + typedef char_traits<char> __traits_type; #endif typename __ostream_type::sentry __cerb(__out); if (__cerb) { - size_t __clen = __ctraits_type::length(__s); + size_t __clen = __s ? __traits_type::length(__s) : 0; _CharT* __ws = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * (__clen + 1))); - for (size_t __i = 0; __i <= __clen; ++__i) + for (size_t __i = 0; __i < __clen; ++__i) __ws[__i] = __out.widen(__s[__i]); _CharT* __str = __ws; @@ -600,6 +603,8 @@ namespace std } __out.write(__str, __len); __out.width(0); + if (!__len) + __out.setstate(ios_base::badbit); } catch(exception& __fail) { @@ -626,7 +631,8 @@ namespace std { streamsize __w = __out.width(); char* __pads = static_cast<char*>(__builtin_alloca(__w)); - streamsize __len = static_cast<streamsize>(_Traits::length(__s)); + streamsize __len = __s ? + static_cast<streamsize>(_Traits::length(__s)) : 0; if (__w > __len) { __pad(__out, __out.fill(), __pads, __s, __w, __len, false); @@ -635,6 +641,8 @@ namespace std } __out.write(__s, __len); __out.width(0); + if (!__len) + __out.setstate(ios_base::badbit); } catch(exception& __fail) { diff --git a/libstdc++-v3/testsuite/27_io/ostream_inserter_char.cc b/libstdc++-v3/testsuite/27_io/ostream_inserter_char.cc index e8c1558..7acaa02 100644 --- a/libstdc++-v3/testsuite/27_io/ostream_inserter_char.cc +++ b/libstdc++-v3/testsuite/27_io/ostream_inserter_char.cc @@ -289,6 +289,33 @@ void test07() #endif } +void test08() +{ + bool test = true; + char* pt = NULL; + + // 1 + std::ostringstream oss; + oss << pt << std::endl; + VERIFY( oss.bad() ); + VERIFY( oss.str().size() == 0 ); + +#if _GLIBCPP_USE_WCHAR_T + // 2 + std::wostringstream woss; + woss << pt << std::endl; + VERIFY( woss.bad() ); + VERIFY( woss.str().size() == 0 ); + + // 3 + wchar_t* wt = NULL; + woss.clear(); + woss << wt << std::endl; + VERIFY( woss.bad() ); + VERIFY( woss.str().size() == 0 ); +#endif +} + int main() { test01(); @@ -298,5 +325,6 @@ int main() test05(); test06(); test07(); + test08(); return 0; } |