diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index bdf20606bc9..0b81f047a17 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,10 @@ 2018-06-18 Jonathan Wakely + LWG 2989 hide path iostream operators from normal lookup + * include/bits/fs_path.h (operator<<, operator>>): Define inline as + friends. + * testsuite/27_io/filesystem/path/io/dr2989.cc: New. + LWG 3050 Fix cv-qualification of convertibility constraints * include/std/chrono (duration, operator*, operator/, operator%): Use const-qualified type as source type in is_convertible constraints. diff --git a/libstdc++-v3/include/bits/fs_path.h b/libstdc++-v3/include/bits/fs_path.h index 6eab800ac56..e3938d06d59 100644 --- a/libstdc++-v3/include/bits/fs_path.h +++ b/libstdc++-v3/include/bits/fs_path.h @@ -363,6 +363,26 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 iterator begin() const; iterator end() const; + /// Write a path to a stream + template + friend std::basic_ostream<_CharT, _Traits>& + operator<<(std::basic_ostream<_CharT, _Traits>& __os, const path& __p) + { + __os << std::quoted(__p.string<_CharT, _Traits>()); + return __os; + } + + /// Read a path from a stream + template + friend std::basic_istream<_CharT, _Traits>& + operator>>(std::basic_istream<_CharT, _Traits>& __is, path& __p) + { + std::basic_string<_CharT, _Traits> __tmp; + if (__is >> std::quoted(__tmp)) + __p = std::move(__tmp); + return __is; + } + // Create a basic_string by reading until a null character. template, @@ -505,26 +525,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 return __result; } - /// Write a path to a stream - template - basic_ostream<_CharT, _Traits>& - operator<<(basic_ostream<_CharT, _Traits>& __os, const path& __p) - { - __os << std::quoted(__p.string<_CharT, _Traits>()); - return __os; - } - - /// Read a path from a stream - template - basic_istream<_CharT, _Traits>& - operator>>(basic_istream<_CharT, _Traits>& __is, path& __p) - { - basic_string<_CharT, _Traits> __tmp; - if (__is >> std::quoted(__tmp)) - __p = std::move(__tmp); - return __is; - } - template inline auto u8path(_InputIterator __first, _InputIterator __last) diff --git a/libstdc++-v3/testsuite/27_io/filesystem/path/io/dr2989.cc b/libstdc++-v3/testsuite/27_io/filesystem/path/io/dr2989.cc new file mode 100644 index 00000000000..b9a1235e1fe --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/filesystem/path/io/dr2989.cc @@ -0,0 +1,35 @@ +// Copyright (C) 2018 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 +// . + +// { dg-options "-std=gnu++17" } +// { dg-do compile { target c++17 } } + +#include +#include + +using namespace std::filesystem; + +struct P { + operator path&(); +}; + +void foo(std::iostream& s) { + P p; + s << p; // { dg-error "no match" } + s >> p; // { dg-error "no match" } +} +// { dg-prune-output "no type .* std::enable_if" }