ios.cc (ios_base::~ios_base): Tweak.

2002-02-25  Benjamin Kosnik  <bkoz@redhat.com>

	* src/ios.cc (ios_base::~ios_base): Tweak.
	(ios_base::_M_call_callbacks): Deal with null __p.
	(ios_base::ios_base): Set _M_callbacks.
	* include/bits/basic_ios.tcc (basic_ios::init): Adjust comment.
	* testsuite/27_io/ios_init.cc (test02): Fix.

	* mkcheck.in (static_fail): Failed links go to output file.

From-SVN: r50032
This commit is contained in:
Benjamin Kosnik 2002-02-26 04:55:48 +00:00 committed by Benjamin Kosnik
parent 801791cc03
commit 1bc59af523
6 changed files with 38 additions and 21 deletions

View file

@ -1,3 +1,13 @@
2002-02-25 Benjamin Kosnik <bkoz@redhat.com>
* src/ios.cc (ios_base::~ios_base): Tweak.
(ios_base::_M_call_callbacks): Deal with null __p.
(ios_base::ios_base): Set _M_callbacks.
* include/bits/basic_ios.tcc (basic_ios::init): Adjust comment.
* testsuite/27_io/ios_init.cc (test02): Fix.
* mkcheck.in (static_fail): Failed links go to output file.
2002-02-25 Phil Edwards <pme@gcc.gnu.org>
* docs/html/faq/index.html: Update.

View file

@ -148,12 +148,12 @@ namespace std
// requirements after basic_ios::init() has been called. As part
// of this, fill() must return widen(' '), which needs an imbued
// ctype facet of char_type to return without throwing an
// exception. This is not a required facet, so streams with
// char_type != [char, wchar_t] will not have it by
// default. However, because fill()'s signature is const, this
// data member cannot be lazily initialized. Thus, thoughts of
// using a non-const helper function in ostream inserters is
// really besides the point.
// exception. Unfortunately, ctype<char_type> is not necessarily a
// required facet, so streams with char_type != [char, wchar_t]
// will not have it by default. However, because fill()'s
// signature is const, this data member cannot be lazily
// initialized. Thus, thoughts of using a non-const helper
// function in ostream inserters is really besides the point.
_M_fill = this->widen(' ');
_M_exception = goodbit;

View file

@ -277,7 +277,7 @@ namespace std
};
static const int _S_local_words = 8;
_Words _M_word_array[_S_local_words]; // Guaranteed storage
_Words _M_word_array[_S_local_words]; // Guaranteed storage.
_Words _M_dummy; // Only for failed iword/pword calls.
_Words* _M_words;
int _M_word_limit;

View file

@ -362,8 +362,8 @@ test_file()
else
# the file did not compile/link.
printf "\n" >> $LOG_FILE
# `cat compile.out >> $LOG_FILE`
# rm compile.out
`cat compile.out >> $LOG_FILE`
rm compile.out
RESULT="-b"
TEXT="0"
DATA="0"

View file

@ -257,7 +257,7 @@ namespace std
}
for (; i < _M_word_limit; i++)
words[i] = _M_words[i];
if (_M_words != _M_word_array)
if (_M_words && _M_words != _M_word_array)
delete [] _M_words;
}
@ -294,7 +294,11 @@ namespace std
ios_base::ios_base()
{
// Do nothing; init() does it. Static init to 0 makes everything sane.
// Do nothing: basic_ios::init() does it.
// NB: _M_callbacks and _M_words must be zero for non-initialized
// ios_base to go through ~ios_base gracefully.
_M_callbacks = 0;
_M_words = 0;
}
// 27.4.2.7 ios_base constructors/destructors
@ -302,9 +306,8 @@ namespace std
{
_M_call_callbacks(erase_event);
_M_dispose_callbacks();
if (_M_words != _M_word_array)
if (_M_words && _M_words != _M_word_array)
delete [] _M_words;
// XXX done?
}
void
@ -314,13 +317,14 @@ namespace std
void
ios_base::_M_call_callbacks(event __e) throw()
{
for (_Callback_list* __p = _M_callbacks; __p; __p = __p->_M_next)
_Callback_list* __p = _M_callbacks;
while (__p)
{
try {
(*__p->_M_fn) (__e, *this, __p->_M_index);
}
catch (...) {
}
try
{ (*__p->_M_fn) (__e, *this, __p->_M_index); }
catch (...)
{ }
__p = __p->_M_next;
}
}

View file

@ -86,6 +86,9 @@ void test01()
// by default, into the locale object. As such, basic_ios::init is
// required to return a bad_cast for the first use of fill() call.
// See 27.4.4.1
class gnu_ios: public std::basic_ios<char> { };
void test02()
{
bool test = true;
@ -93,7 +96,7 @@ void test02()
// 01: Doesn't call basic_ios::init, which uses ctype<char_type>..
try
{
std::basic_ostringstream<unsigned short> oss;
gnu_ios gios;
}
catch(...)
{
@ -122,7 +125,7 @@ void test02()
}
catch(const std::bad_cast& obj)
{
test = true;
// This is correct.
}
catch(...)
{