https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106201

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|unassigned at gcc dot gnu.org      |redi at gcc dot gnu.org
   Last reconfirmed|                            |2022-07-05
           Keywords|                            |rejects-valid
             Status|UNCONFIRMED                 |ASSIGNED
     Ever confirmed|0                           |1

--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Patrick Welche from comment #0)
> Oh: https://cplusplus.github.io/LWG/issue3480
> But: it says "could be fixed ... (as libstdc++ currently does anyway)"
> Issue looks resolved?

That ensures that directory iterators are ranges, which is what your second
for_each call depends on.

The third one fails but not because of anything to do with borrowable ranges.
The problem is that the filesystem::swap(path&, path&) overload is found by ADL
and considered by overload resolution when checking whether
counted_iterator<filesystem::directory_iterator> is swappable. Overload
resolution checks whether the iterator can be converted to a path, which causes
constraint recursion.

The following change fixes this by removing filesystem::swap(path&, path&) from
the ADL result set:

--- a/libstdc++-v3/include/bits/fs_path.h
+++ b/libstdc++-v3/include/bits/fs_path.h
@@ -591,6 +591,8 @@ namespace __detail
       return __result;
     }

+    friend void swap(path& __lhs, path& __rhs) noexcept { __lhs.swap(__rhs); }
+
   private:
     enum class _Type : unsigned char {
       _Multi = 0, _Root_name, _Root_dir, _Filename
@@ -732,8 +734,6 @@ namespace __detail
   /// @{
   /// @relates std::filesystem::path

-  inline void swap(path& __lhs, path& __rhs) noexcept { __lhs.swap(__rhs); }
-
   size_t hash_value(const path& __p) noexcept;

   /// @}

Reply via email to