diff options
-rw-r--r-- | libstdc++-v3/ChangeLog | 5 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/fs_path.h | 40 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/27_io/filesystem/path/io/dr2989.cc | 35 |
3 files changed, 60 insertions, 20 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index bdf2060..0b81f04 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,10 @@ 2018-06-18 Jonathan Wakely <jwakely@redhat.com> + 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 6eab800..e3938d0 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<typename _CharT, typename _Traits> + 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<typename _CharT, typename _Traits> + 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<typename _InputIterator, typename _Traits = std::iterator_traits<_InputIterator>, @@ -505,26 +525,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 return __result; } - /// Write a path to a stream - template<typename _CharT, typename _Traits> - 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<typename _CharT, typename _Traits> - 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<typename _InputIterator> 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 0000000..b9a1235 --- /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 +// <http://www.gnu.org/licenses/>. + +// { dg-options "-std=gnu++17" } +// { dg-do compile { target c++17 } } + +#include <iostream> +#include <filesystem> + +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" } |