From f12409e6ecd2a937c7f349ab6ad08d83ad18bba6 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Sat, 3 Mar 2007 19:36:20 +0000 Subject: [PATCH] re PR libstdc++/31031 (ostream ambiguous operator&&) 2007-03-03 Paolo Carlini PR libstdc++/31031 * include/bits/istream.tcc: Inhibit implicit instantiation of the _M_insert helpers. * include/bits/ostream.tcc: Likewise for _M_extract. * testsuite/27_io/basic_ostream/inserters_arithmetic/char/ 31031.cc: New. * testsuite/27_io/basic_ostream/inserters_arithmetic/wchar_t/ 31031.cc: Likewise. From-SVN: r122513 --- libstdc++-v3/ChangeLog | 11 ++++ libstdc++-v3/include/bits/istream.tcc | 28 ++++++++++ libstdc++-v3/include/bits/ostream.tcc | 22 ++++++++ .../inserters_arithmetic/char/31031.cc | 52 +++++++++++++++++++ .../inserters_arithmetic/wchar_t/31031.cc | 52 +++++++++++++++++++ 5 files changed, 165 insertions(+) create mode 100644 libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/char/31031.cc create mode 100644 libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/wchar_t/31031.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 17231c6f14b..f181c4285fd 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2007-03-03 Paolo Carlini + + PR libstdc++/31031 + * include/bits/istream.tcc: Inhibit implicit instantiation of + the _M_insert helpers. + * include/bits/ostream.tcc: Likewise for _M_extract. + * testsuite/27_io/basic_ostream/inserters_arithmetic/char/ + 31031.cc: New. + * testsuite/27_io/basic_ostream/inserters_arithmetic/wchar_t/ + 31031.cc: Likewise. + 2007-03-03 Benjamin Kosnik * include/debug/functions.h: Use cstddef. diff --git a/libstdc++-v3/include/bits/istream.tcc b/libstdc++-v3/include/bits/istream.tcc index 8714c9f2f65..a2e564190da 100644 --- a/libstdc++-v3/include/bits/istream.tcc +++ b/libstdc++-v3/include/bits/istream.tcc @@ -999,6 +999,20 @@ _GLIBCXX_BEGIN_NAMESPACE(std) extern template istream& operator>>(istream&, unsigned char*); extern template istream& operator>>(istream&, signed char*); + extern template istream& istream::_M_extract(unsigned short&); + extern template istream& istream::_M_extract(unsigned int&); + extern template istream& istream::_M_extract(long&); + extern template istream& istream::_M_extract(unsigned long&); + extern template istream& istream::_M_extract(bool&); +#ifdef _GLIBCXX_USE_LONG_LONG + extern template istream& istream::_M_extract(long long&); + extern template istream& istream::_M_extract(unsigned long long&); +#endif + extern template istream& istream::_M_extract(float&); + extern template istream& istream::_M_extract(double&); + extern template istream& istream::_M_extract(long double&); + extern template istream& istream::_M_extract(void*&); + extern template class basic_iostream; #ifdef _GLIBCXX_USE_WCHAR_T @@ -1007,6 +1021,20 @@ _GLIBCXX_BEGIN_NAMESPACE(std) extern template wistream& operator>>(wistream&, wchar_t&); extern template wistream& operator>>(wistream&, wchar_t*); + extern template wistream& wistream::_M_extract(unsigned short&); + extern template wistream& wistream::_M_extract(unsigned int&); + extern template wistream& wistream::_M_extract(long&); + extern template wistream& wistream::_M_extract(unsigned long&); + extern template wistream& wistream::_M_extract(bool&); +#ifdef _GLIBCXX_USE_LONG_LONG + extern template wistream& wistream::_M_extract(long long&); + extern template wistream& wistream::_M_extract(unsigned long long&); +#endif + extern template wistream& wistream::_M_extract(float&); + extern template wistream& wistream::_M_extract(double&); + extern template wistream& wistream::_M_extract(long double&); + extern template wistream& wistream::_M_extract(void*&); + extern template class basic_iostream; #endif #endif diff --git a/libstdc++-v3/include/bits/ostream.tcc b/libstdc++-v3/include/bits/ostream.tcc index 382f0181493..4d549655675 100644 --- a/libstdc++-v3/include/bits/ostream.tcc +++ b/libstdc++-v3/include/bits/ostream.tcc @@ -365,6 +365,17 @@ _GLIBCXX_BEGIN_NAMESPACE(std) extern template ostream& operator<<(ostream&, const unsigned char*); extern template ostream& operator<<(ostream&, const signed char*); + extern template ostream& ostream::_M_insert(long); + extern template ostream& ostream::_M_insert(unsigned long); + extern template ostream& ostream::_M_insert(bool); +#ifdef _GLIBCXX_USE_LONG_LONG + extern template ostream& ostream::_M_insert(long long); + extern template ostream& ostream::_M_insert(unsigned long long); +#endif + extern template ostream& ostream::_M_insert(double); + extern template ostream& ostream::_M_insert(long double); + extern template ostream& ostream::_M_insert(const void*); + #ifdef _GLIBCXX_USE_WCHAR_T extern template class basic_ostream; extern template wostream& endl(wostream&); @@ -374,6 +385,17 @@ _GLIBCXX_BEGIN_NAMESPACE(std) extern template wostream& operator<<(wostream&, char); extern template wostream& operator<<(wostream&, const wchar_t*); extern template wostream& operator<<(wostream&, const char*); + + extern template wostream& wostream::_M_insert(long); + extern template wostream& wostream::_M_insert(unsigned long); + extern template wostream& wostream::_M_insert(bool); +#ifdef _GLIBCXX_USE_LONG_LONG + extern template wostream& wostream::_M_insert(long long); + extern template wostream& wostream::_M_insert(unsigned long long); +#endif + extern template wostream& wostream::_M_insert(double); + extern template wostream& wostream::_M_insert(long double); + extern template wostream& wostream::_M_insert(const void*); #endif #endif diff --git a/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/char/31031.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/char/31031.cc new file mode 100644 index 00000000000..255f76838bc --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/char/31031.cc @@ -0,0 +1,52 @@ +// { dg-do compile } + +// 2007-03-03 Paolo Carlini +// +// Copyright (C) 2007 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 +// 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. + +#include + +class MyClass +{ + double x; + +public: + MyClass(double X) : x(X) {} + friend bool operator&&(int i, const MyClass& Z); +}; + +inline bool +operator&&(int i, const MyClass& Z) +{ return int(Z.x) == i; } + +// libstdc++/31031 +void test01() +{ + int k =3; + MyClass X(3.1); + std::ostringstream oss; + + oss << (k && X); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/wchar_t/31031.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/wchar_t/31031.cc new file mode 100644 index 00000000000..c6e43ec9b64 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/wchar_t/31031.cc @@ -0,0 +1,52 @@ +// { dg-do compile } + +// 2007-03-03 Paolo Carlini +// +// Copyright (C) 2007 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 +// 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. + +#include + +class MyClass +{ + double x; + +public: + MyClass(double X) : x(X) {} + friend bool operator&&(int i, const MyClass& Z); +}; + +inline bool +operator&&(int i, const MyClass& Z) +{ return int(Z.x) == i; } + +// libstdc++/31031 +void test01() +{ + int k =3; + MyClass X(3.1); + std::wostringstream oss; + + oss << (k && X); +} + +int main() +{ + test01(); + return 0; +}