diff --git a/libcxx/docs/Status/Cxx2bIssues.csv b/libcxx/docs/Status/Cxx2bIssues.csv --- a/libcxx/docs/Status/Cxx2bIssues.csv +++ b/libcxx/docs/Status/Cxx2bIssues.csv @@ -155,7 +155,7 @@ "`3649 `__","[fund.ts.v2] Reinstate and bump ``__cpp_lib_experimental_memory_resource`` feature test macro","February 2022","","" "`3650 `__","Are ``std::basic_string`` 's ``iterator`` and ``const_iterator`` constexpr iterators?","February 2022","|Nothing to do|","" "`3654 `__","``basic_format_context::arg(size_t)`` should be ``noexcept`` ","February 2022","|Complete|","15.0","|format|" -"`3657 `__","``std::hash`` is not enabled","February 2022","","" +"`3657 `__","``std::hash`` is not enabled","February 2022","|Complete|","15.0","|filesystem|" "`3660 `__","``iterator_traits::pointer`` should conform to ยง[iterator.traits]","February 2022","|Complete|","14.0" "`3661 `__","``constinit atomic> a(nullptr);`` should work","February 2022","","" "","","","","" diff --git a/libcxx/include/__filesystem/path.h b/libcxx/include/__filesystem/path.h --- a/libcxx/include/__filesystem/path.h +++ b/libcxx/include/__filesystem/path.h @@ -1019,6 +1019,17 @@ _LIBCPP_END_NAMESPACE_FILESYSTEM +_LIBCPP_BEGIN_NAMESPACE_STD + +template <> +struct _LIBCPP_TEMPLATE_VIS hash<_VSTD_FS ::path> { + + _LIBCPP_HIDE_FROM_ABI + size_t operator()(const _VSTD_FS ::path& __val) const noexcept { return _VSTD_FS ::hash_value(__val); } +}; + +_LIBCPP_END_NAMESPACE_STD + #endif // _LIBCPP_CXX03_LANG #endif // _LIBCPP___FILESYSTEM_PATH_H diff --git a/libcxx/include/filesystem b/libcxx/include/filesystem --- a/libcxx/include/filesystem +++ b/libcxx/include/filesystem @@ -237,6 +237,9 @@ template <> inline constexpr bool std::ranges::enable_view = true; +template <> +struct std::hash; + */ #include <__assert> // all public C++ headers provide the assertion handler diff --git a/libcxx/test/std/input.output/filesystems/class.path/path.member/path.compare.pass.cpp b/libcxx/test/std/input.output/filesystems/class.path/path.member/path.compare.pass.cpp --- a/libcxx/test/std/input.output/filesystems/class.path/path.member/path.compare.pass.cpp +++ b/libcxx/test/std/input.output/filesystems/class.path/path.member/path.compare.pass.cpp @@ -24,9 +24,16 @@ // bool operator>=(path const&, path const&) noexcept; // // size_t hash_value(path const&) noexcept; - +// +// template +// struct hash +// { +// size_t operator()(T val) const; +// }; #include "filesystem_include.h" + +#include #include #include #include @@ -131,9 +138,13 @@ auto h1 = hash_value(p1); auto h2 = hash_value(p2); assert((h1 == h2) == (p1 == p2)); + assert(h1 == std::hash()(p1)); + assert(h2 == std::hash()(p2)); // check signature ASSERT_SAME_TYPE(size_t, decltype(hash_value(p1))); ASSERT_NOEXCEPT(hash_value(p1)); + ASSERT_SAME_TYPE(size_t, decltype(std::hash()(p1))); + ASSERT_NOEXCEPT(std::hash()(p1)); } } } diff --git a/libcxx/test/std/input.output/filesystems/class.path/path.nonmember/hash_value_tested_elswhere.pass.cpp b/libcxx/test/std/input.output/filesystems/class.path/path.nonmember/enabled_hash.pass.cpp rename from libcxx/test/std/input.output/filesystems/class.path/path.nonmember/hash_value_tested_elswhere.pass.cpp rename to libcxx/test/std/input.output/filesystems/class.path/path.nonmember/enabled_hash.pass.cpp --- a/libcxx/test/std/input.output/filesystems/class.path/path.nonmember/hash_value_tested_elswhere.pass.cpp +++ b/libcxx/test/std/input.output/filesystems/class.path/path.nonmember/enabled_hash.pass.cpp @@ -8,8 +8,20 @@ // UNSUPPORTED: c++03 -// The "hash_value" function is tested as part of [path.compare] -// in class.path/path.members/path.compare.pass.cpp +// + +// Test that provides all of the arithmetic, enum, and pointer +// hash specializations. + +#include + +#include "poisoned_hash_helper.h" + +#include "test_macros.h" + int main(int, char**) { + test_library_hash_specializations_available(); + { test_hash_enabled_for_type(); } + return 0; } diff --git a/libcxx/test/std/input.output/filesystems/class.path/path.nonmember/hash_value_tested_elswhere.pass.cpp b/libcxx/test/std/input.output/filesystems/class.path/path.nonmember/hash_tested_elswhere.pass.cpp rename from libcxx/test/std/input.output/filesystems/class.path/path.nonmember/hash_value_tested_elswhere.pass.cpp rename to libcxx/test/std/input.output/filesystems/class.path/path.nonmember/hash_tested_elswhere.pass.cpp --- a/libcxx/test/std/input.output/filesystems/class.path/path.nonmember/hash_value_tested_elswhere.pass.cpp +++ b/libcxx/test/std/input.output/filesystems/class.path/path.nonmember/hash_tested_elswhere.pass.cpp @@ -8,8 +8,8 @@ // UNSUPPORTED: c++03 -// The "hash_value" function is tested as part of [path.compare] -// in class.path/path.members/path.compare.pass.cpp -int main(int, char**) { - return 0; -} +// The "hash_value" function and std::hash specialization are +// tested as part of [path.compare] in +// class.path/path.members/path.compare.pass.cpp + +int main(int, char**) { return 0; }