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
This commit is contained in:
Benjamin Kosnik 2002-05-15 14:38:30 +00:00 committed by Benjamin Kosnik
parent fb5b4dfdcb
commit 7bd9b6d491
3 changed files with 50 additions and 5 deletions

View File

@ -1,3 +1,12 @@
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> 2002-05-15 Benjamin Kosnik <bkoz@redhat.com>
PR libstdc++/6594 PR libstdc++/6594

View File

@ -545,7 +545,8 @@ namespace std
{ {
streamsize __w = __out.width(); streamsize __w = __out.width();
_CharT* __pads = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * __w)); _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) if (__w > __len)
{ {
__pad(__out, __out.fill(), __pads, __s, __w, __len, false); __pad(__out, __out.fill(), __pads, __s, __w, __len, false);
@ -554,6 +555,8 @@ namespace std
} }
__out.write(__s, __len); __out.write(__s, __len);
__out.width(0); __out.width(0);
if (!__len)
__out.setstate(ios_base::badbit);
} }
catch(exception& __fail) catch(exception& __fail)
{ {
@ -575,14 +578,14 @@ namespace std
#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
// 167. Improper use of traits_type::length() // 167. Improper use of traits_type::length()
// Note that this is only in 'Review' status. // Note that this is only in 'Review' status.
typedef char_traits<char> __ctraits_type; typedef char_traits<char> __traits_type;
#endif #endif
typename __ostream_type::sentry __cerb(__out); typename __ostream_type::sentry __cerb(__out);
if (__cerb) 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))); _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]); __ws[__i] = __out.widen(__s[__i]);
_CharT* __str = __ws; _CharT* __str = __ws;
@ -600,6 +603,8 @@ namespace std
} }
__out.write(__str, __len); __out.write(__str, __len);
__out.width(0); __out.width(0);
if (!__len)
__out.setstate(ios_base::badbit);
} }
catch(exception& __fail) catch(exception& __fail)
{ {
@ -626,7 +631,8 @@ namespace std
{ {
streamsize __w = __out.width(); streamsize __w = __out.width();
char* __pads = static_cast<char*>(__builtin_alloca(__w)); 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) if (__w > __len)
{ {
__pad(__out, __out.fill(), __pads, __s, __w, __len, false); __pad(__out, __out.fill(), __pads, __s, __w, __len, false);
@ -635,6 +641,8 @@ namespace std
} }
__out.write(__s, __len); __out.write(__s, __len);
__out.width(0); __out.width(0);
if (!__len)
__out.setstate(ios_base::badbit);
} }
catch(exception& __fail) catch(exception& __fail)
{ {

View File

@ -289,6 +289,33 @@ void test07()
#endif #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() int main()
{ {
test01(); test01();
@ -298,5 +325,6 @@ int main()
test05(); test05();
test06(); test06();
test07(); test07();
test08();
return 0; return 0;
} }