+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.
// 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;
};
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;
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"
}
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;
}
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
{
_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
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;
}
}
// 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;
// 01: Doesn't call basic_ios::init, which uses ctype<char_type>..
try
{
- std::basic_ostringstream<unsigned short> oss;
+ gnu_ios gios;
}
catch(...)
{
}
catch(const std::bad_cast& obj)
{
- test = true;
+ // This is correct.
}
catch(...)
{