Commit 1ceb90cf by Petur Runolfsson Committed by Benjamin Kosnik

re PR libstdc++/9322 (return value of basic_streambuf<>::getloc affected by locale::global)


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
parent 806e0935
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> 2003-01-23 Benjamin Kosnik <bkoz@redhat.com>
Revert include ordering. Revert include ordering.
......
...@@ -477,10 +477,7 @@ namespace std ...@@ -477,10 +477,7 @@ namespace std
bool __testbeg = gptr() == eback() && pptr() == pbase(); bool __testbeg = gptr() == eback() && pptr() == pbase();
if (__testbeg && this->_M_buf_locale != __loc) if (__testbeg && this->_M_buf_locale != __loc)
{
this->_M_buf_locale = __loc; this->_M_buf_locale = __loc;
this->_M_buf_locale_init = true;
}
// NB this may require the reconversion of previously // NB this may require the reconversion of previously
// converted chars. This in turn may cause the reconstruction // converted chars. This in turn may cause the reconstruction
......
// Stream buffer classes -*- C++ -*- // 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. // Free Software Foundation, Inc.
// //
// This file is part of the GNU ISO C++ Library. This library is free // This file is part of the GNU ISO C++ Library. This library is free
...@@ -224,13 +224,6 @@ namespace std ...@@ -224,13 +224,6 @@ namespace std
*/ */
locale _M_buf_locale; locale _M_buf_locale;
/**
* @if maint
* True iff locale is initialized.
* @endif
*/
bool _M_buf_locale_init;
//@{ //@{
/** /**
* @if maint * @if maint
...@@ -364,7 +357,6 @@ namespace std ...@@ -364,7 +357,6 @@ namespace std
_M_buf_size = 0; _M_buf_size = 0;
_M_buf_size_opt = 0; _M_buf_size_opt = 0;
_M_mode = ios_base::openmode(0); _M_mode = ios_base::openmode(0);
_M_buf_locale_init = false;
} }
// [27.5.2.2.1] locales // [27.5.2.2.1] locales
...@@ -393,12 +385,7 @@ namespace std ...@@ -393,12 +385,7 @@ namespace std
*/ */
locale locale
getloc() const getloc() const
{ { return _M_buf_locale; }
if (_M_buf_locale_init)
return _M_buf_locale;
else
return locale();
}
// [27.5.2.2.2] buffer management and positioning // [27.5.2.2.2] buffer management and positioning
//@{ //@{
...@@ -584,7 +571,7 @@ namespace std ...@@ -584,7 +571,7 @@ namespace std
_M_buf_unified(false), _M_in_beg(0), _M_in_cur(0), _M_in_end(0), _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_out_beg(0), _M_out_cur(0), _M_out_end(0),
_M_mode(ios_base::openmode(0)), _M_buf_locale(locale()), _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) _M_pback_init(false)
{ } { }
...@@ -700,7 +687,6 @@ namespace std ...@@ -700,7 +687,6 @@ namespace std
virtual void virtual void
imbue(const locale& __loc) imbue(const locale& __loc)
{ {
_M_buf_locale_init = true;
if (_M_buf_locale != __loc) if (_M_buf_locale != __loc)
_M_buf_locale = __loc; _M_buf_locale = __loc;
} }
......
// 2001-05-21 Benjamin Kosnik <bkoz@redhat.com> // 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 // 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 // software; you can redistribute it and/or modify it under the
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
// 27.8.1.4 Overridden virtual functions // 27.8.1.4 Overridden virtual functions
#include <fstream> #include <fstream>
#include <locale>
#include <testsuite_hooks.h> #include <testsuite_hooks.h>
// @require@ %-*.tst %-*.txt // @require@ %-*.tst %-*.txt
...@@ -514,6 +515,28 @@ void test06() ...@@ -514,6 +515,28 @@ void test06()
VERIFY( buffer[0] == 'a' ); 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() main()
{ {
test01(); test01();
...@@ -524,5 +547,6 @@ main() ...@@ -524,5 +547,6 @@ main()
test05(); test05();
test06(); test06();
test07();
return 0; return 0;
} }
// 1999-10-11 bkoz // 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 // 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 // software; you can redistribute it and/or modify it under the
...@@ -364,6 +364,28 @@ test07() ...@@ -364,6 +364,28 @@ test07()
VERIFY(out.good()); 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() int main()
{ {
test01(); test01();
...@@ -374,5 +396,6 @@ int main() ...@@ -374,5 +396,6 @@ int main()
test05(); test05();
test07(); test07();
test08();
return 0; return 0;
} }
// 2001-05-21 Benjamin Kosnik <bkoz@redhat.com> // 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 // 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 // software; you can redistribute it and/or modify it under the
...@@ -70,6 +70,28 @@ void test02(std::stringbuf& in, bool pass) ...@@ -70,6 +70,28 @@ void test02(std::stringbuf& in, bool pass)
VERIFY( p == bad ); 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() int main()
{ {
using namespace std; using namespace std;
...@@ -83,5 +105,6 @@ int main() ...@@ -83,5 +105,6 @@ int main()
test02(in2, false); test02(in2, false);
test02(in3, false); test02(in3, false);
test08();
return 0; return 0;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment