diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-09-15 17:27:23 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-09-15 17:27:23 +0000 |
commit | 22cbb21e653545a1891f33e34414ac46f3e5e813 (patch) | |
tree | 98f62ab59a889a5d7e2c70f0f1025004dd906ddf /libstdc++-v3 | |
parent | 2e667208ae346457eb476e12776ae238e120c8cd (diff) | |
download | gcc-22cbb21e653545a1891f33e34414ac46f3e5e813.tar.gz |
2005-09-15 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/23875
* include/std/std_ostream.h (operator<<(short), operator<<(unsigned
short), operator<<(int), operator<<(unsigned int), operator<<(float)):
Don't call operator<<(long), operator<<(unsigned long), or
operator<<(double), do the work mandated by the resolution of DR117...
* include/bits/ostream.tcc (operator<<(short), operator<<(unsigned
short), operator<<(int), operator<<(unsigned int), operator<<(float)):
... here.
* testsuite/27_io/basic_ostream/inserters_arithmetic/pod/23875.cc: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@104313 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 12 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/ostream.tcc | 142 | ||||
-rw-r--r-- | libstdc++-v3/include/std/std_ostream.h | 29 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/pod/23875.cc | 85 |
4 files changed, 244 insertions, 24 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 9585c6cf129..1d8713e473e 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,15 @@ +2005-09-15 Paolo Carlini <pcarlini@suse.de> + + PR libstdc++/23875 + * include/std/std_ostream.h (operator<<(short), operator<<(unsigned + short), operator<<(int), operator<<(unsigned int), operator<<(float)): + Don't call operator<<(long), operator<<(unsigned long), or + operator<<(double), do the work mandated by the resolution of DR117... + * include/bits/ostream.tcc (operator<<(short), operator<<(unsigned + short), operator<<(int), operator<<(unsigned int), operator<<(float)): + ... here. + * testsuite/27_io/basic_ostream/inserters_arithmetic/pod/23875.cc: New. + 2005-09-15 Mark Mitchell <mark@codesourcery.com> * testsuite/testsuite_character.h: Specialize character<> diff --git a/libstdc++-v3/include/bits/ostream.tcc b/libstdc++-v3/include/bits/ostream.tcc index cd9585073ae..e26ad50d6b8 100644 --- a/libstdc++-v3/include/bits/ostream.tcc +++ b/libstdc++-v3/include/bits/ostream.tcc @@ -122,6 +122,122 @@ namespace std template<typename _CharT, typename _Traits> basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>:: + operator<<(short __n) + { + sentry __cerb(*this); + if (__cerb) + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + try + { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 117. basic_ostream uses nonexistent num_put member functions. + long __l; + const ios_base::fmtflags __fmt = (this->flags() + & ios_base::basefield); + if (__fmt == ios_base::oct || __fmt == ios_base::hex) + __l = static_cast<long>(static_cast<unsigned short>(__n)); + else + __l = static_cast<long>(__n); + const __num_put_type& __np = __check_facet(this->_M_num_put); + if (__np.put(*this, *this, this->fill(), __l).failed()) + __err |= ios_base::badbit; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + template<typename _CharT, typename _Traits> + basic_ostream<_CharT, _Traits>& + basic_ostream<_CharT, _Traits>:: + operator<<(unsigned short __n) + { + sentry __cerb(*this); + if (__cerb) + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + try + { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 117. basic_ostream uses nonexistent num_put member functions. + const __num_put_type& __np = __check_facet(this->_M_num_put); + if (__np.put(*this, *this, this->fill(), + static_cast<unsigned long>(__n)).failed()) + __err |= ios_base::badbit; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + template<typename _CharT, typename _Traits> + basic_ostream<_CharT, _Traits>& + basic_ostream<_CharT, _Traits>:: + operator<<(int __n) + { + sentry __cerb(*this); + if (__cerb) + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + try + { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 117. basic_ostream uses nonexistent num_put member functions. + long __l; + const ios_base::fmtflags __fmt = (this->flags() + & ios_base::basefield); + if (__fmt == ios_base::oct || __fmt == ios_base::hex) + __l = static_cast<long>(static_cast<unsigned int>(__n)); + else + __l = static_cast<long>(__n); + const __num_put_type& __np = __check_facet(this->_M_num_put); + if (__np.put(*this, *this, this->fill(), __l).failed()) + __err |= ios_base::badbit; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + template<typename _CharT, typename _Traits> + basic_ostream<_CharT, _Traits>& + basic_ostream<_CharT, _Traits>:: + operator<<(unsigned int __n) + { + sentry __cerb(*this); + if (__cerb) + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + try + { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 117. basic_ostream uses nonexistent num_put member functions. + const __num_put_type& __np = __check_facet(this->_M_num_put); + if (__np.put(*this, *this, this->fill(), + static_cast<unsigned long>(__n)).failed()) + __err |= ios_base::badbit; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + template<typename _CharT, typename _Traits> + basic_ostream<_CharT, _Traits>& + basic_ostream<_CharT, _Traits>:: operator<<(long __n) { sentry __cerb(*this); @@ -216,6 +332,32 @@ namespace std template<typename _CharT, typename _Traits> basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>:: + operator<<(float __n) + { + sentry __cerb(*this); + if (__cerb) + { + ios_base::iostate __err = ios_base::iostate(ios_base::goodbit); + try + { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 117. basic_ostream uses nonexistent num_put member functions. + const __num_put_type& __np = __check_facet(this->_M_num_put); + if (__np.put(*this, *this, this->fill(), + static_cast<double>(__n)).failed()) + __err |= ios_base::badbit; + } + catch(...) + { this->_M_setstate(ios_base::badbit); } + if (__err) + this->setstate(__err); + } + return *this; + } + + template<typename _CharT, typename _Traits> + basic_ostream<_CharT, _Traits>& + basic_ostream<_CharT, _Traits>:: operator<<(double __n) { sentry __cerb(*this); diff --git a/libstdc++-v3/include/std/std_ostream.h b/libstdc++-v3/include/std/std_ostream.h index fce5a4194bb..ffc1a281730 100644 --- a/libstdc++-v3/include/std/std_ostream.h +++ b/libstdc++-v3/include/std/std_ostream.h @@ -173,34 +173,16 @@ namespace std operator<<(bool __n); __ostream_type& - operator<<(short __n) - { - const ios_base::fmtflags __fmt = this->flags() & ios_base::basefield; - if (__fmt == ios_base::oct || __fmt == ios_base::hex) - return this->operator<<(static_cast<long> - (static_cast<unsigned short>(__n))); - else - return this->operator<<(static_cast<long>(__n)); - } + operator<<(short __n); __ostream_type& - operator<<(unsigned short __n) - { return this->operator<<(static_cast<unsigned long>(__n)); } + operator<<(unsigned short __n); __ostream_type& - operator<<(int __n) - { - const ios_base::fmtflags __fmt = this->flags() & ios_base::basefield; - if (__fmt == ios_base::oct || __fmt == ios_base::hex) - return this->operator<<(static_cast<long> - (static_cast<unsigned int>(__n))); - else - return this->operator<<(static_cast<long>(__n)); - } + operator<<(int __n); __ostream_type& - operator<<(unsigned int __n) - { return this->operator<<(static_cast<unsigned long>(__n)); } + operator<<(unsigned int __n); #ifdef _GLIBCXX_USE_LONG_LONG __ostream_type& @@ -214,8 +196,7 @@ namespace std operator<<(double __f); __ostream_type& - operator<<(float __f) - { return this->operator<<(static_cast<double>(__f)); } + operator<<(float __f); __ostream_type& operator<<(long double __f); diff --git a/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/pod/23875.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/pod/23875.cc new file mode 100644 index 00000000000..760103c197f --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/pod/23875.cc @@ -0,0 +1,85 @@ +// 2005-09-15 Paolo Carlini <pcarlini@suse.de> + +// Copyright (C) 2005 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +// USA. + +// 27.6.2.5.2 Arithmetic inserters + +#include <sstream> +#include <testsuite_hooks.h> +#include <testsuite_character.h> + +bool test __attribute__((unused)) = true; +using __gnu_test::pod_ushort; + +namespace std +{ + template<> + basic_ostream<pod_ushort>& + basic_ostream<pod_ushort>:: + operator<<(long) + { + VERIFY( false ); + return *this; + } + + template<> + basic_ostream<pod_ushort>& + basic_ostream<pod_ushort>:: + operator<<(unsigned long) + { + VERIFY( false ); + return *this; + } + + template<> + basic_ostream<pod_ushort>& + basic_ostream<pod_ushort>:: + operator<<(double) + { + VERIFY( false ); + return *this; + } +} + +// libstdc++/23875 +void test01() +{ + std::basic_ostringstream<pod_ushort> ostr; + + short s = 1; + ostr << s; + + unsigned short us = 1; + ostr << us; + + int i = 1; + ostr << i; + + unsigned int ui = 1; + ostr << ui; + + float f = 1.0f; + ostr << f; +} + +int main() +{ + test01(); + return 0; +} |