diff --git a/libcxx/docs/Status/SpaceshipProjects.csv b/libcxx/docs/Status/SpaceshipProjects.csv --- a/libcxx/docs/Status/SpaceshipProjects.csv +++ b/libcxx/docs/Status/SpaceshipProjects.csv @@ -75,6 +75,6 @@ | chrono::time_zone_link",A ```` implementation,Unassigned,|Not Started| | `[fs.filesystem.syn] `_,| `filesystem::space_info `_,None,Adrian Vogelsgesang,|In Progress| | `[fs.path.nonmember] `_,| `filesystem::path `_,None,Adrian Vogelsgesang,|Complete| -| `[fs.dir.entry.obs] `_,| `filesystem::directory_entry `_,None,Adrian Vogelsgesang,|In Progress| +| `[fs.dir.entry.obs] `_,| `filesystem::directory_entry `_,None,Adrian Vogelsgesang,|Complete| | `[re.submatch.op] `_,| sub_match,None,Mark de Wever,|In Progress| | `[thread.thread.id] `_,| thread::id,None,Unassigned,|Not Started| diff --git a/libcxx/include/__filesystem/directory_entry.h b/libcxx/include/__filesystem/directory_entry.h --- a/libcxx/include/__filesystem/directory_entry.h +++ b/libcxx/include/__filesystem/directory_entry.h @@ -215,21 +215,24 @@ return __get_symlink_status(&__ec); } - _LIBCPP_INLINE_VISIBILITY - bool operator<(directory_entry const& __rhs) const noexcept { - return __p_ < __rhs.__p_; - } _LIBCPP_INLINE_VISIBILITY bool operator==(directory_entry const& __rhs) const noexcept { return __p_ == __rhs.__p_; } +#if _LIBCPP_STD_VER <= 17 _LIBCPP_INLINE_VISIBILITY bool operator!=(directory_entry const& __rhs) const noexcept { return __p_ != __rhs.__p_; } + _LIBCPP_INLINE_VISIBILITY + bool operator<(directory_entry const& __rhs) const noexcept { + return __p_ < __rhs.__p_; + } + + _LIBCPP_INLINE_VISIBILITY bool operator<=(directory_entry const& __rhs) const noexcept { return __p_ <= __rhs.__p_; @@ -245,6 +248,16 @@ return __p_ >= __rhs.__p_; } +#else // _LIBCPP_STD_VER <= 17 + + + _LIBCPP_INLINE_VISIBILITY + strong_ordering operator<=>(const directory_entry& __rhs) const noexcept { + return __p_ <=> __rhs.__p_; + } + +#endif // _LIBCPP_STD_VER <= 17 + template _LIBCPP_INLINE_VISIBILITY friend basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, const directory_entry& __d) { diff --git a/libcxx/test/std/input.output/filesystems/class.directory_entry/directory_entry.obs/comparisons.pass.cpp b/libcxx/test/std/input.output/filesystems/class.directory_entry/directory_entry.obs/comparisons.pass.cpp --- a/libcxx/test/std/input.output/filesystems/class.directory_entry/directory_entry.obs/comparisons.pass.cpp +++ b/libcxx/test/std/input.output/filesystems/class.directory_entry/directory_entry.obs/comparisons.pass.cpp @@ -12,12 +12,13 @@ // class directory_entry -// bool operator==(directory_entry const&) const noexcept; -// bool operator!=(directory_entry const&) const noexcept; -// bool operator< (directory_entry const&) const noexcept; -// bool operator<=(directory_entry const&) const noexcept; -// bool operator> (directory_entry const&) const noexcept; -// bool operator>=(directory_entry const&) const noexcept; +// bool operator== (directory_entry const&) const noexcept; +// bool operator!= (directory_entry const&) const noexcept; +// bool operator< (directory_entry const&) const noexcept; +// bool operator<= (directory_entry const&) const noexcept; +// bool operator> (directory_entry const&) const noexcept; +// bool operator>= (directory_entry const&) const noexcept; +// bool operator<=>(directory_entry const&) const noexcept; #include "filesystem_include.h" #include @@ -26,10 +27,9 @@ #include "test_macros.h" - -#define CHECK_OP(Op) \ - static_assert(std::is_same::value, ""); \ - static_assert(noexcept(ce Op ce), "Operation must be noexcept" ) +#define CHECK_OP(Op, Ret) \ + static_assert(std::is_same::value, ""); \ + static_assert(noexcept(ce Op ce), "Operation must be noexcept") void test_comparison_signatures() { using namespace fs; @@ -38,12 +38,15 @@ // potentially-throwing. { directory_entry const ce(p); - CHECK_OP(==); - CHECK_OP(!=); - CHECK_OP(< ); - CHECK_OP(<=); - CHECK_OP(> ); - CHECK_OP(>=); + CHECK_OP(==, bool); + CHECK_OP(!=, bool); + CHECK_OP(<, bool); + CHECK_OP(<=, bool); + CHECK_OP(>, bool); + CHECK_OP(>=, bool); +#if TEST_STD_VER > 17 + CHECK_OP(<=>, std::strong_ordering); +#endif } } #undef CHECK_OP @@ -68,6 +71,9 @@ assert((LHS <= RHS) == (LHSE <= RHSE)); assert((LHS > RHS) == (LHSE > RHSE)); assert((LHS >= RHS) == (LHSE >= RHSE)); +#if TEST_STD_VER > 17 + assert((LHS <=> RHS) == (LHSE <=> RHSE)); +#endif }; for (auto const& TC : TestCases) { const directory_entry L(TC.first);