On 23/09/14 11:48 +0200, Andreas Schwab wrote:
FAIL: g++.old-deja/g++.law/ctors10.C -std=c++11 (test for excess errors) Excess errors: /daten/aranym/gcc/gcc-20140923/gcc/testsuite/g++.old-deja/g++.law/ctors10.C:16:46: error: call of overloaded 'basic_ostream(NULL)' is ambiguous
Fixed by this patch. Tested x86_64-linux (including the g++ tests this time), committed to trunk.
commit ca4e76f7c3a314ab068e4c89f92c6003d9d0a712 Author: Jonathan Wakely <jwak...@redhat.com> Date: Tue Sep 23 11:06:23 2014 +0100 * config/abi/pre/gnu.ver: Adjust basic_ostream exports. * include/std/istream (basic_iostream(basic_iostream&&)): Pass *this to ostream constructor. * include/std/ostream (basic_ostream(basic_iostream*)): Change to take parameter by reference, to avoid ambiguity. * testsuite/27_io/basic_ostream/cons/char/null.cc: New. diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver index 669e36d..58c90d6 100644 --- a/libstdc++-v3/config/abi/pre/gnu.ver +++ b/libstdc++-v3/config/abi/pre/gnu.ver @@ -1413,9 +1413,9 @@ GLIBCXX_3.4.21 { _ZN9__gnu_cxx18stdio_sync_filebufI[cw]St11char_traitsI[cw]EEaSEOS3_; _ZN9__gnu_cxx18stdio_sync_filebufI[cw]St11char_traitsI[cw]EEC[12]EOS3_; - # basic_ostream<C,T>::basic_ostream(basic_iostream<C,T>*) - _ZNSoC[12]EPSd; - _ZNSt13basic_ostreamIwSt11char_traitsIwEEC[12]EPSt14basic_iostreamIwS1_E; + # basic_ostream<C,T>::basic_ostream(basic_iostream<C,T>&) + _ZNSoC[12]ERSd; + _ZNSt13basic_ostreamIwSt11char_traitsIwEEC[12]ERSt14basic_iostreamIwS1_E; } GLIBCXX_3.4.20; diff --git a/libstdc++-v3/include/std/istream b/libstdc++-v3/include/std/istream index 3a47616..d4e5d71 100644 --- a/libstdc++-v3/include/std/istream +++ b/libstdc++-v3/include/std/istream @@ -863,7 +863,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION basic_iostream(const basic_iostream&) = delete; basic_iostream(basic_iostream&& __rhs) - : __istream_type(std::move(__rhs)), __ostream_type(this) + : __istream_type(std::move(__rhs)), __ostream_type(*this) { } // 27.7.3.3 Assign/swap diff --git a/libstdc++-v3/include/std/ostream b/libstdc++-v3/include/std/ostream index 748b805..619dbe4 100644 --- a/libstdc++-v3/include/std/ostream +++ b/libstdc++-v3/include/std/ostream @@ -386,7 +386,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #if __cplusplus >= 201103L // Non-standard constructor that does not call init() - basic_ostream(basic_iostream<_CharT, _Traits>*) { } + basic_ostream(basic_iostream<_CharT, _Traits>&) { } basic_ostream(const basic_ostream&) = delete; diff --git a/libstdc++-v3/testsuite/27_io/basic_ostream/cons/char/null.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/cons/char/null.cc new file mode 100644 index 0000000..6e41c40 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_ostream/cons/char/null.cc @@ -0,0 +1,30 @@ +// Copyright (C) 2014 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// { dg-options "-std=gnu++11" } +// { dg-do compile } + +#include <ostream> + +// https://gcc.gnu.org/ml/libstdc++/2014-09/msg00108.html +struct O : std::ostream +{ + O() : std::ostream(NULL) { } + O(int) : std::ostream(nullptr) { } +}; + +O o;