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.
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>,
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)
--- /dev/null
+// 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" }