From: Paolo Carlini Date: Sun, 22 Aug 2004 17:55:51 +0000 (+0000) Subject: locale_facets.tcc (num_put<>::do_put(bool)): Cast to a signed type, long according... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=44e91562edc08fc064375d7e39b6ab704e89da1b;p=gcc.git locale_facets.tcc (num_put<>::do_put(bool)): Cast to a signed type, long according to the resolution of DR 359. 2004-08-22 Paolo Carlini * include/bits/locale_facets.tcc (num_put<>::do_put(bool)): Cast to a signed type, long according to the resolution of DR 359. * testsuite/22_locale/num_put/put/char/9.cc: New. * testsuite/22_locale/num_put/put/wchar_t/9.cc: New. * include/bits/locale_facets.tcc (num_put<>::do_put(const void*)): Simplify a bit: no need to clear showpos. From-SVN: r86382 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index ed43a1e073a..1c45d9a2603 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,13 @@ +2004-08-22 Paolo Carlini + + * include/bits/locale_facets.tcc (num_put<>::do_put(bool)): Cast + to a signed type, long according to the resolution of DR 359. + * testsuite/22_locale/num_put/put/char/9.cc: New. + * testsuite/22_locale/num_put/put/wchar_t/9.cc: New. + + * include/bits/locale_facets.tcc (num_put<>::do_put(const void*)): + Simplify a bit: no need to clear showpos. + 2004-08-21 Paolo Carlini * include/bits/char_traits.h (struct _Char_traits_match): Remove, diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index 6a3c808f6c2..1aea83aea14 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -1160,8 +1160,8 @@ namespace std const ios_base::fmtflags __flags = __io.flags(); if ((__flags & ios_base::boolalpha) == 0) { - unsigned long __uv = __v; - __s = _M_insert_int(__s, __io, __fill, __uv); + const long __l = __v; + __s = _M_insert_int(__s, __io, __fill, __l); } else { @@ -1238,8 +1238,7 @@ namespace std const void* __v) const { const ios_base::fmtflags __flags = __io.flags(); - const ios_base::fmtflags __fmt = ~(ios_base::showpos - | ios_base::basefield + const ios_base::fmtflags __fmt = ~(ios_base::basefield | ios_base::uppercase | ios_base::internal); __io.flags(__flags & __fmt | (ios_base::hex | ios_base::showbase)); diff --git a/libstdc++-v3/testsuite/22_locale/num_put/put/char/9.cc b/libstdc++-v3/testsuite/22_locale/num_put/put/char/9.cc new file mode 100644 index 00000000000..c5016e603cc --- /dev/null +++ b/libstdc++-v3/testsuite/22_locale/num_put/put/char/9.cc @@ -0,0 +1,62 @@ +// 2004-08-22 Paolo Carlini + +// Copyright (C) 2004 Free Software Foundation +// +// 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 +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// 22.2.2.2.1 num_put members + +#include +#include +#include + +// According to 22.2.2.2.2, p23 and the resolution of DR 359 +// val must be casted to a signed type: this can be revealed +// by ios_base::showpos, which is effective only for signed +// types (also see libstdc++/15565 about this). +void test01() +{ + using namespace std; + bool test __attribute__((unused)) = true; + + // basic construction + locale loc_c = locale::classic(); + + // sanity check the data is correct. + const string empty; + + // cache the num_put facet + ostringstream oss; + oss.imbue(loc_c); + const num_put& np = use_facet >(oss.getloc()); + + bool b = true; + np.put(oss.rdbuf(), oss, ' ', b); + VERIFY( oss.str() == "1" ); + + oss.str(empty); + oss.clear(); + oss.setf(ios_base::showpos); + np.put(oss.rdbuf(), oss, ' ', b); + VERIFY( oss.str() == "+1" ); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/22_locale/num_put/put/wchar_t/9.cc b/libstdc++-v3/testsuite/22_locale/num_put/put/wchar_t/9.cc new file mode 100644 index 00000000000..5c326112adc --- /dev/null +++ b/libstdc++-v3/testsuite/22_locale/num_put/put/wchar_t/9.cc @@ -0,0 +1,62 @@ +// 2004-08-22 Paolo Carlini + +// Copyright (C) 2004 Free Software Foundation +// +// 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 +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// 22.2.2.2.1 num_put members + +#include +#include +#include + +// According to 22.2.2.2.2, p23 and the resolution of DR 359 +// val must be casted to a signed type: this can be revealed +// by ios_base::showpos, which is effective only for signed +// types (also see libstdc++/15565 about this). +void test01() +{ + using namespace std; + bool test __attribute__((unused)) = true; + + // basic construction + locale loc_c = locale::classic(); + + // sanity check the data is correct. + const wstring empty; + + // cache the num_put facet + wostringstream oss; + oss.imbue(loc_c); + const num_put& np = use_facet >(oss.getloc()); + + bool b = true; + np.put(oss.rdbuf(), oss, L' ', b); + VERIFY( oss.str() == L"1" ); + + oss.str(empty); + oss.clear(); + oss.setf(ios_base::showpos); + np.put(oss.rdbuf(), oss, L' ', b); + VERIFY( oss.str() == L"+1" ); +} + +int main() +{ + test01(); + return 0; +}