]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ios.cc (ios_base::~ios_base): Tweak.
authorBenjamin Kosnik <bkoz@redhat.com>
Tue, 26 Feb 2002 04:55:48 +0000 (04:55 +0000)
committerBenjamin Kosnik <bkoz@gcc.gnu.org>
Tue, 26 Feb 2002 04:55:48 +0000 (04:55 +0000)
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

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/basic_ios.tcc
libstdc++-v3/include/bits/ios_base.h
libstdc++-v3/mkcheck.in
libstdc++-v3/src/ios.cc
libstdc++-v3/testsuite/27_io/ios_init.cc

index eceef8983ca53b5fa1276dca1a8239c7a8a10f6b..12baa573132770783e46a7d336907d1a747a4cac 100644 (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.
index 4db4a82d5acac3a063e7f9b1a24277d4a18212d5..b4f523f54835ec6472d23f39d41811f2afbc54c7 100644 (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;
index 7525e7d6f4cd621eb74366b494ec9d7cfa42316e..2cc959b1c273d6a72b35486eb5f4ba08af261253 100644 (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;
index c65a144c2c888781ab2b1fd05547f6c407eb5107..b104244dba61e7047c62d3acaad8ed9969afbf23 100755 (executable)
@@ -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"
index e8122bb2b77b310e71fb350f0196a262efad96ab..9824b10223a686d312cb5715cec886061551f197 100644 (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;
       }
   }
 
index 626439bdb8bb92bb09cee9fb84ab063591d43e1c..9f87ee0d32e5540ee7bcde54655bff1a45725958 100644 (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(...)
     {