[libcxx-commits] [libcxx] [libc++][chrono] P2592R3: Hashing for chrono (PR #165132)
Sergei Barannikov via libcxx-commits
libcxx-commits at lists.llvm.org
Fri Jan 23 02:03:29 PST 2026
================
@@ -0,0 +1,95 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: std-at-least-c++26
+
+// <chrono>
+
+// Test that <chrono> provides all of the hash specializations.
+
+#include <chrono>
+#include <type_traits>
+#include "poisoned_hash_helper.h"
+#include "test_macros.h"
+
+static_assert(std::is_nothrow_invocable_v<std::hash<std::chrono::day>, std::chrono::day>);
+static_assert(std::is_nothrow_invocable_v<std::hash<std::chrono::month>, std::chrono::month>);
+static_assert(std::is_nothrow_invocable_v<std::hash<std::chrono::year>, std::chrono::year>);
+static_assert(std::is_nothrow_invocable_v<std::hash<std::chrono::weekday>, std::chrono::weekday>);
+static_assert(std::is_nothrow_invocable_v<std::hash<std::chrono::weekday_indexed>, std::chrono::weekday_indexed>);
+static_assert(std::is_nothrow_invocable_v<std::hash<std::chrono::weekday_last>, std::chrono::weekday_last>);
+static_assert(std::is_nothrow_invocable_v<std::hash<std::chrono::month_day>, std::chrono::month_day>);
+static_assert(std::is_nothrow_invocable_v<std::hash<std::chrono::month_day_last>, std::chrono::month_day_last>);
+static_assert(std::is_nothrow_invocable_v<std::hash<std::chrono::month_weekday>, std::chrono::month_weekday>);
+static_assert(std::is_nothrow_invocable_v<std::hash<std::chrono::month_weekday_last>, std::chrono::month_weekday_last>);
+static_assert(std::is_nothrow_invocable_v<std::hash<std::chrono::year_month>, std::chrono::year_month>);
+static_assert(std::is_nothrow_invocable_v<std::hash<std::chrono::year_month_day>, std::chrono::year_month_day>);
+static_assert(
+ std::is_nothrow_invocable_v<std::hash<std::chrono::year_month_day_last>, std::chrono::year_month_day_last>);
+static_assert(std::is_nothrow_invocable_v<std::hash<std::chrono::year_month_weekday>, std::chrono::year_month_weekday>);
+static_assert(
+ std::is_nothrow_invocable_v<std::hash<std::chrono::year_month_weekday_last>, std::chrono::year_month_weekday_last>);
+#ifndef TEST_HAS_NO_EXPERIMENTAL_TZDB
+static_assert(std::is_nothrow_invocable_v<std::hash<std::chrono::leap_second>, std::chrono::leap_second>);
+#endif // TEST_HAS_NO_EXPERIMENTAL_TZDB
----------------
s-barannikov wrote:
`leap_second` is only available when `_LIBCPP_HAS_TIME_ZONE_DATABASE && _LIBCPP_HAS_FILESYSTEM && _LIBCPP_HAS_LOCALIZATION`, see https://github.com/llvm/llvm-project/blob/ec7b63771ca7ee74566156a075a5388a3b6fc7c2/libcxx/include/chrono#L1128
This results in a compiler error when `_LIBCPP_HAS_TIME_ZONE_DATABASE == 0` and `_LIBCPP_HAS_EXPERIMENTAL_LIBRARY == 1` (and consequently `_LIBCPP_HAS_EXPERIMENTAL_TZDB == 1`).
```
# .---command stderr------------
# | /home/sergei/Projects/llvm-nmc/libcxx/test/std/time/time.hash/time.hash_enabled.pass.cpp:38:66: error: no member named 'leap_second' in namespace 'std::chrono'
# | 38 | static_assert(std::is_nothrow_invocable_v<std::hash<std::chrono::leap_second>, std::chrono::leap_second>);
# | | ^~~~~~~~~~~
# | /home/sergei/Projects/llvm-nmc/libcxx/test/std/time/time.hash/time.hash_enabled.pass.cpp:83:34: error: no member named 'leap_second' in namespace 'std::chrono'
# | 83 | test_hash_enabled(std::chrono::leap_second({}, std::chrono::sys_seconds{}, std::chrono::seconds{}));
# | | ^~~~~~~~~~~
# | 2 errors generated.
# `-----------------------------
```
https://github.com/llvm/llvm-project/pull/165132
More information about the libcxx-commits
mailing list