summaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2005-09-15 17:27:23 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2005-09-15 17:27:23 +0000
commit22cbb21e653545a1891f33e34414ac46f3e5e813 (patch)
tree98f62ab59a889a5d7e2c70f0f1025004dd906ddf /libstdc++-v3
parent2e667208ae346457eb476e12776ae238e120c8cd (diff)
downloadgcc-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/ChangeLog12
-rw-r--r--libstdc++-v3/include/bits/ostream.tcc142
-rw-r--r--libstdc++-v3/include/std/std_ostream.h29
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/pod/23875.cc85
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;
+}