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; /// @}