5e88d2d08d
* include/std/istream: (__is_convertible_to_basic_istream_test(basic_istream<_Ch, _Up>*)): New. (__do_is_convertible_to_basic_istream_impl): Likewise. (__is_convertible_to_basic_istream_impl): Likewise. (__is_convertible_to_basic_istream): Use the new base. (__rvalue_istream_type): New. (operator>>(_Istream&&, _Tp&&)): Use the new helper alias for the SFINAE check, convert to the helper alias type before doing the actual extraction. * include/std/ostream: (__is_convertible_to_basic_ostream_test(basic_ostream<_Ch, _Up>*)): New. (__do_is_convertible_to_basic_ostream_impl): Likewise. (__is_convertible_to_basic_ostream_impl): Likewise. (__is_convertible_to_basic_ostream): Use the new base. (__rvalue_ostream_type): New. (operator<<(_Ostream&&, const _Tp&)): Use the new helper alias for the SFINAE check, convert to the helper alias type before doing the actual insertion. * testsuite/27_io/rvalue_streams-2.cc: Add new tests. From-SVN: r249468
88 lines
1.9 KiB
C++
88 lines
1.9 KiB
C++
// { dg-do compile { target c++11 } }
|
|
|
|
// Copyright (C) 2015-2017 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/>.
|
|
|
|
#include <sstream>
|
|
|
|
struct A {};
|
|
|
|
void operator<<(std::ostream&, const A&) { }
|
|
void operator>>(std::istream&, A&) { }
|
|
|
|
class MyStream : private std::ostream, private std::istream
|
|
{
|
|
public:
|
|
MyStream& operator <<(const char*)
|
|
{
|
|
return *this;
|
|
}
|
|
MyStream& operator >>(int&)
|
|
{
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
class MyStream2
|
|
{
|
|
public:
|
|
MyStream2& operator <<(const char*)
|
|
{
|
|
return *this;
|
|
}
|
|
MyStream2& operator >>(int&)
|
|
{
|
|
return *this;
|
|
}
|
|
private:
|
|
operator std::ostream&();
|
|
operator std::istream&();
|
|
};
|
|
|
|
struct X { };
|
|
|
|
std::ostream& operator<<(std::ostream& os, const X&) { return os; }
|
|
std::istream& operator>>(std::istream& is, X&&) { return is; }
|
|
|
|
struct O : std::ostream { };
|
|
|
|
void operator<<(O&, X) = delete;
|
|
|
|
struct I : std::istream { };
|
|
|
|
void operator>>(I&, X) = delete;
|
|
|
|
// PR libstdc++/65543
|
|
// PR libstdc++/80675
|
|
// PR libstdc++/80940
|
|
int main()
|
|
{
|
|
A a;
|
|
|
|
std::ostringstream() << a;
|
|
std::istringstream() >> a;
|
|
MyStream stream{};
|
|
stream << "aaa";
|
|
int msi;
|
|
stream >> msi;
|
|
MyStream2 stream2{};
|
|
stream2 << "aaa";
|
|
stream2 >> msi;
|
|
O{} << X{};
|
|
I{} >> X{};
|
|
}
|