#if __cplusplus >= 202002L
# include <compare> // std::strong_ordering
# include <bits/iterator_concepts.h> // std::default_sentinel_t
+# include <bits/ranges_base.h> // enable_view, enable_borrowed_range
#endif
namespace std _GLIBCXX_VISIBILITY(default)
extern template class
__shared_ptr<filesystem::recursive_directory_iterator::_Dir_stack>;
+#if __glibcxx_ranges // >= C++20
+// _GLIBCXX_RESOLVE_LIB_DEFECTS
+// 3480. directory_iterator and recursive_directory_iterator are not ranges
+namespace ranges
+{
+ template<>
+ inline constexpr bool
+ enable_borrowed_range<filesystem::directory_iterator> = true;
+ template<>
+ inline constexpr bool
+ enable_borrowed_range<filesystem::recursive_directory_iterator> = true;
+
+ template<>
+ inline constexpr bool
+ enable_view<filesystem::directory_iterator> = true;
+ template<>
+ inline constexpr bool
+ enable_view<filesystem::recursive_directory_iterator> = true;
+} // namespace ranges
+#endif // ranges
+
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std
--- /dev/null
+// { dg-do compile { target c++20 } }
+// { dg-require-filesystem-ts "" }
+
+// LWG 3480
+// directory_iterator and recursive_directory_iterator are not C++20 ranges
+
+#include <filesystem>
+
+namespace fs = std::filesystem;
+namespace rg = std::ranges;
+
+static_assert( rg::borrowed_range<fs::directory_iterator> );
+static_assert( rg::borrowed_range<fs::recursive_directory_iterator> );
+
+static_assert( rg::view<fs::directory_iterator> );
+static_assert( rg::view<fs::recursive_directory_iterator> );