re PR libstdc++/9322 (return value of basic_streambuf<>::getloc affected by locale...
authorPetur Runolfsson <peturr02@ru.is>
Thu, 23 Jan 2003 22:53:35 +0000 (22:53 +0000)
committerBenjamin Kosnik <bkoz@gcc.gnu.org>
Thu, 23 Jan 2003 22:53:35 +0000 (22:53 +0000)
2003-01-23  Petur Runolfsson  <peturr02@ru.is>

PR libstdc++/9322
* include/std/std_streambuf.h
(basic_streambuf::basic_streambuf,
basic_streambuf::~basic_streambuf,
basic_streambuf::getloc, basic_streambuf::imbue):
Remove _M_buf_locale_init use.
* include/bits/fstream.tcc (basic_filebuf::imbue):  Likewise
* testsuite/27_io/filebuf_virtuals.cc (test08):  Add.
* testsuite/27_io/streambuf_members.cc (test08):  Add.
* testsuite/27_io/stringbuf_virtuals.cc (test08):  Add.

From-SVN: r61678

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/fstream.tcc
libstdc++-v3/include/std/std_streambuf.h
libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc
libstdc++-v3/testsuite/27_io/streambuf_members.cc
libstdc++-v3/testsuite/27_io/stringbuf_virtuals.cc

index ff2b1664c066323f9863445ea8cf8089af614b4b..bda8f070798803591fa96e4681d980a3c294c8b3 100644 (file)
@@ -1,3 +1,16 @@
+2003-01-23  Petur Runolfsson  <peturr02@ru.is>
+
+       PR libstdc++/9322
+       * include/std/std_streambuf.h
+       (basic_streambuf::basic_streambuf,
+       basic_streambuf::~basic_streambuf,
+       basic_streambuf::getloc, basic_streambuf::imbue):
+       Remove _M_buf_locale_init
+       * include/bits/fstream.tcc (basic_filebuf::imbue):  Likewise
+       * testsuite/27_io/filebuf_virtuals.cc (test08):  Add.
+       * testsuite/27_io/streambuf_members.cc (test08):  Add.
+       * testsuite/27_io/stringbuf_virtuals.cc (test08):  Add.
+
 2003-01-23  Benjamin Kosnik  <bkoz@redhat.com>
 
        Revert include ordering.
index 1865a92f2f4f18217954ddde956362a11752beb4..bf1c42e8ce2247a4b3d8195764d7caaa908655cc 100644 (file)
@@ -477,10 +477,7 @@ namespace std
       bool __testbeg = gptr() == eback() && pptr() == pbase();
 
       if (__testbeg && this->_M_buf_locale != __loc)
-       {
-         this->_M_buf_locale = __loc;
-         this->_M_buf_locale_init = true;
-       }
+       this->_M_buf_locale = __loc;
 
       // NB this may require the reconversion of previously
       // converted chars. This in turn may cause the reconstruction
index ffa14dff52aec839796ebe739a675661c125d092..e7dca92d00bc72d5b3b31ebaaf9a1988f8870c41 100644 (file)
@@ -1,6 +1,6 @@
 // Stream buffer classes -*- C++ -*-
 
-// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
 // Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
@@ -224,13 +224,6 @@ namespace std
       */
       locale                   _M_buf_locale;  
 
-      /**
-       *  @if maint
-       *  True iff locale is initialized.
-       *  @endif
-      */
-      bool                     _M_buf_locale_init;
-
       //@{
       /**
        *  @if maint
@@ -364,7 +357,6 @@ namespace std
        _M_buf_size = 0;
        _M_buf_size_opt = 0;
        _M_mode = ios_base::openmode(0);
-       _M_buf_locale_init = false;
       }
 
       // [27.5.2.2.1] locales
@@ -393,12 +385,7 @@ namespace std
       */
       locale   
       getloc() const
-      {
-       if (_M_buf_locale_init)
-         return _M_buf_locale; 
-       else 
-         return locale();
-      } 
+      { return _M_buf_locale; } 
 
       // [27.5.2.2.2] buffer management and positioning
       //@{
@@ -584,7 +571,7 @@ namespace std
       _M_buf_unified(false), _M_in_beg(0), _M_in_cur(0), _M_in_end(0), 
       _M_out_beg(0), _M_out_cur(0), _M_out_end(0), 
       _M_mode(ios_base::openmode(0)), _M_buf_locale(locale()), 
-      _M_buf_locale_init(false), _M_pback_cur_save(0), _M_pback_end_save(0), 
+      _M_pback_cur_save(0), _M_pback_end_save(0), 
       _M_pback_init(false)
       { }
 
@@ -700,7 +687,6 @@ namespace std
       virtual void 
       imbue(const locale& __loc) 
       { 
-       _M_buf_locale_init = true;
        if (_M_buf_locale != __loc)
          _M_buf_locale = __loc;
       }
index 0a92788296a5b0e50e0fe7dcef0015a3f683959b..c02e1a77be90b16a6f6678e2a661d834ecfb1b43 100644 (file)
@@ -1,6 +1,6 @@
 // 2001-05-21 Benjamin Kosnik  <bkoz@redhat.com>
 
-// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -21,6 +21,7 @@
 // 27.8.1.4 Overridden virtual functions
 
 #include <fstream>
+#include <locale>
 #include <testsuite_hooks.h>
 
 // @require@ %-*.tst %-*.txt
@@ -514,6 +515,28 @@ void test06()
   VERIFY( buffer[0] == 'a' );
 }
 
+// libstdc++/9322
+void test07()
+{
+  using std::locale;
+  bool test = true;
+
+  locale loc;
+  std::filebuf ob;
+  VERIFY( ob.getloc() == loc );
+
+  locale::global(locale("en_US"));
+  VERIFY( ob.getloc() == loc );
+
+  locale loc_de ("de_DE");
+  locale ret = ob.pubimbue(loc_de);
+  VERIFY( ob.getloc() == loc_de );
+  VERIFY( ret == loc );
+
+  locale::global(loc);
+  VERIFY( ob.getloc() == loc_de );
+}
+
 main() 
 {
   test01();
@@ -524,5 +547,6 @@ main()
   test05();
   test06();
 
+  test07();
   return 0;
 }
index 3f9a3192b7e0174c1ccb6aa843a185d585210f6f..aaad07dc47ff7a07e633c06041f3e4c360633780 100644 (file)
@@ -1,6 +1,6 @@
 // 1999-10-11 bkoz
 
-// Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+// Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -364,6 +364,28 @@ test07()
   VERIFY(out.good());
 }
 
+// libstdc++/9322
+void test08()
+{
+  using std::locale;
+  bool test = true;
+
+  locale loc;
+  testbuf2 ob;
+  VERIFY( ob.getloc() == loc );
+
+  locale::global(locale("en_US"));
+  VERIFY( ob.getloc() == loc );
+
+  locale loc_de ("de_DE");
+  locale ret = ob.pubimbue(loc_de);
+  VERIFY( ob.getloc() == loc_de );
+  VERIFY( ret == loc );
+
+  locale::global(loc);
+  VERIFY( ob.getloc() == loc_de );
+}
+
 int main() 
 {
   test01();
@@ -374,5 +396,6 @@ int main()
   test05();
 
   test07();
+  test08();
   return 0;
 }
index 318bb72fa8a131bd82c256726752c9a9092915c3..8a6add9dfc596e0aaee70fa7c73a329d4212235b 100644 (file)
@@ -1,6 +1,6 @@
 // 2001-05-21 Benjamin Kosnik  <bkoz@redhat.com>
 
-// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -70,6 +70,28 @@ void test02(std::stringbuf& in, bool pass)
   VERIFY( p == bad );
 }
 
+// libstdc++/9322
+void test08()
+{
+  using std::locale;
+  bool test = true;
+
+  locale loc;
+  std::stringbuf ob;
+  VERIFY( ob.getloc() == loc );
+
+  locale::global(locale("en_US"));
+  VERIFY( ob.getloc() == loc );
+
+  locale loc_de ("de_DE");
+  locale ret = ob.pubimbue(loc_de);
+  VERIFY( ob.getloc() == loc_de );
+  VERIFY( ret == loc );
+
+  locale::global(loc);
+  VERIFY( ob.getloc() == loc_de );
+}
+
 int main() 
 {
   using namespace std;
@@ -83,5 +105,6 @@ int main()
   test02(in2, false);
   test02(in3, false);
 
+  test08();
   return 0;
 }