https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91653
Bug ID: 91653
Summary: ostream::operator<<(streambuf*) should fail the
ostream when write output stream error but not
Product: gcc
Version: 4.9.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: yhliang86 at hotmail dot com
Target Milestone: ---
bits/ostream.tcc
operator<<(__streambuf_type* __sbin):
if (!__copy_streambufs(__sbin, this->rdbuf()))
__err |= ios_base::failbit;
expect __copy_streambufs return zero on failure, but __copy_streambufs actually
return copied number, and will never be zero if sputc error after have written
some:
bits/streambuf.tcc
__copy_streambufs_eof(basic_streambuf<_CharT, _Traits>* __sbin,
basic_streambuf<_CharT, _Traits>* __sbout,
bool& __ineof)
{
streamsize __ret = 0;
__ineof = true;
typename _Traits::int_type __c = __sbin->sgetc();
while (!_Traits::eq_int_type(__c, _Traits::eof()))
{
__c = __sbout->sputc(_Traits::to_char_type(__c));
if (_Traits::eq_int_type(__c, _Traits::eof()))
{
__ineof = false;
break;
}
++__ret;
__c = __sbin->snextc();
}
return __ret;
}
__copy_streambufs(basic_streambuf<_CharT, _Traits>* __sbin,
basic_streambuf<_CharT, _Traits>* __sbout)
{
bool __ineof;
return __copy_streambufs_eof(__sbin, __sbout, __ineof);
}
only __ineof is false can indicate the failure, but it is ignored by
__copy_streambufs.