[libcxx-commits] [libcxx] [libc++][chrono] Applied `[[nodiscard]]` to The Civil Calendar (PR #174968)

Hristo Hristov via libcxx-commits libcxx-commits at lists.llvm.org
Sat Jan 10 10:15:07 PST 2026


https://github.com/H-G-Hristov updated https://github.com/llvm/llvm-project/pull/174968

>From fa460a464cc8feefc434ef871fd6bfea002b613b Mon Sep 17 00:00:00 2001
From: Hristo Hristov <hghristov.rmm at gmail.com>
Date: Thu, 8 Jan 2026 14:50:01 +0200
Subject: [PATCH] [libc++][chrono] Applied `[[nodiscard]]` to The Civil
 Calendar

- https://libcxx.llvm.org/CodingGuidelines.html
- https://wg21.link/time.cal

Towards #172124
---
 libcxx/include/__chrono/day.h                |  14 +-
 libcxx/include/__chrono/hh_mm_ss.h           |  20 +-
 libcxx/include/__chrono/literals.h           |   4 +-
 libcxx/include/__chrono/month.h              |  12 +-
 libcxx/include/__chrono/month_weekday.h      |  40 +-
 libcxx/include/__chrono/monthday.h           |  34 +-
 libcxx/include/__chrono/weekday.h            |  44 +-
 libcxx/include/__chrono/year.h               |  24 +-
 libcxx/include/__chrono/year_month.h         |  33 +-
 libcxx/include/__chrono/year_month_day.h     |  85 +-
 libcxx/include/__chrono/year_month_weekday.h |  96 ++-
 libcxx/test/libcxx/time/nodiscard.verify.cpp | 811 ++++++++++++++++---
 12 files changed, 943 insertions(+), 274 deletions(-)

diff --git a/libcxx/include/__chrono/day.h b/libcxx/include/__chrono/day.h
index 46822c599192d..58fdc72616cb6 100644
--- a/libcxx/include/__chrono/day.h
+++ b/libcxx/include/__chrono/day.h
@@ -55,7 +55,7 @@ class day {
   _LIBCPP_HIDE_FROM_ABI constexpr day& operator+=(const days& __dd) noexcept;
   _LIBCPP_HIDE_FROM_ABI constexpr day& operator-=(const days& __dd) noexcept;
   _LIBCPP_HIDE_FROM_ABI explicit inline constexpr operator unsigned() const noexcept { return __d_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __d_ >= 1 && __d_ <= 31; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __d_ >= 1 && __d_ <= 31; }
 };
 
 _LIBCPP_HIDE_FROM_ABI inline constexpr bool operator==(const day& __lhs, const day& __rhs) noexcept {
@@ -66,19 +66,19 @@ _LIBCPP_HIDE_FROM_ABI inline constexpr strong_ordering operator<=>(const day& __
   return static_cast<unsigned>(__lhs) <=> static_cast<unsigned>(__rhs);
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr day operator+(const day& __lhs, const days& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr day operator+(const day& __lhs, const days& __rhs) noexcept {
   return day(static_cast<unsigned>(__lhs) + __rhs.count());
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr day operator+(const days& __lhs, const day& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr day operator+(const days& __lhs, const day& __rhs) noexcept {
   return __rhs + __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr day operator-(const day& __lhs, const days& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr day operator-(const day& __lhs, const days& __rhs) noexcept {
   return __lhs + -__rhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr days operator-(const day& __lhs, const day& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr days operator-(const day& __lhs, const day& __rhs) noexcept {
   return days(static_cast<int>(static_cast<unsigned>(__lhs)) - static_cast<int>(static_cast<unsigned>(__rhs)));
 }
 
@@ -98,7 +98,9 @@ _LIBCPP_HIDE_FROM_ABI inline constexpr day& day::operator-=(const days& __dd) no
 
 template <>
 struct hash<chrono::day> {
-  _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::day& __d) noexcept { return static_cast<unsigned>(__d); }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::day& __d) noexcept {
+    return static_cast<unsigned>(__d);
+  }
 };
 
 #  endif // _LIBCPP_STD_VER >= 26
diff --git a/libcxx/include/__chrono/hh_mm_ss.h b/libcxx/include/__chrono/hh_mm_ss.h
index 6ea8a28ee0938..746eba903d4f8 100644
--- a/libcxx/include/__chrono/hh_mm_ss.h
+++ b/libcxx/include/__chrono/hh_mm_ss.h
@@ -59,13 +59,13 @@ class hh_mm_ss {
         __s_(chrono::duration_cast<chrono::seconds>(chrono::abs(__d) - hours() - minutes())),
         __f_(chrono::duration_cast<precision>(chrono::abs(__d) - hours() - minutes() - seconds())) {}
 
-  _LIBCPP_HIDE_FROM_ABI constexpr bool is_negative() const noexcept { return __is_neg_; }
-  _LIBCPP_HIDE_FROM_ABI constexpr chrono::hours hours() const noexcept { return __h_; }
-  _LIBCPP_HIDE_FROM_ABI constexpr chrono::minutes minutes() const noexcept { return __m_; }
-  _LIBCPP_HIDE_FROM_ABI constexpr chrono::seconds seconds() const noexcept { return __s_; }
-  _LIBCPP_HIDE_FROM_ABI constexpr precision subseconds() const noexcept { return __f_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool is_negative() const noexcept { return __is_neg_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr chrono::hours hours() const noexcept { return __h_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr chrono::minutes minutes() const noexcept { return __m_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr chrono::seconds seconds() const noexcept { return __s_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr precision subseconds() const noexcept { return __f_; }
 
-  _LIBCPP_HIDE_FROM_ABI constexpr precision to_duration() const noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr precision to_duration() const noexcept {
     auto __dur = __h_ + __m_ + __s_ + __f_;
     return __is_neg_ ? -__dur : __dur;
   }
@@ -81,14 +81,14 @@ class hh_mm_ss {
 };
 _LIBCPP_CTAD_SUPPORTED_FOR_TYPE(hh_mm_ss);
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr bool is_am(const hours& __h) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr bool is_am(const hours& __h) noexcept {
   return __h >= hours(0) && __h < hours(12);
 }
-_LIBCPP_HIDE_FROM_ABI inline constexpr bool is_pm(const hours& __h) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr bool is_pm(const hours& __h) noexcept {
   return __h >= hours(12) && __h < hours(24);
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr hours make12(const hours& __h) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr hours make12(const hours& __h) noexcept {
   if (__h == hours(0))
     return hours(12);
   else if (__h <= hours(12))
@@ -97,7 +97,7 @@ _LIBCPP_HIDE_FROM_ABI inline constexpr hours make12(const hours& __h) noexcept {
     return __h - hours(12);
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr hours make24(const hours& __h, bool __is_pm) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr hours make24(const hours& __h, bool __is_pm) noexcept {
   if (__is_pm)
     return __h == hours(12) ? __h : __h + hours(12);
   else
diff --git a/libcxx/include/__chrono/literals.h b/libcxx/include/__chrono/literals.h
index 89800440edf43..b26acbafbf834 100644
--- a/libcxx/include/__chrono/literals.h
+++ b/libcxx/include/__chrono/literals.h
@@ -24,11 +24,11 @@ _LIBCPP_BEGIN_NAMESPACE_STD
 
 inline namespace literals {
 inline namespace chrono_literals {
-_LIBCPP_HIDE_FROM_ABI constexpr chrono::day operator""d(unsigned long long __d) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr chrono::day operator""d(unsigned long long __d) noexcept {
   return chrono::day(static_cast<unsigned>(__d));
 }
 
-_LIBCPP_HIDE_FROM_ABI constexpr chrono::year operator""y(unsigned long long __y) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr chrono::year operator""y(unsigned long long __y) noexcept {
   return chrono::year(static_cast<int>(__y));
 }
 } // namespace chrono_literals
diff --git a/libcxx/include/__chrono/month.h b/libcxx/include/__chrono/month.h
index 669ac66360ab6..abf07e89a556b 100644
--- a/libcxx/include/__chrono/month.h
+++ b/libcxx/include/__chrono/month.h
@@ -55,7 +55,7 @@ class month {
   _LIBCPP_HIDE_FROM_ABI constexpr month& operator+=(const months& __m1) noexcept;
   _LIBCPP_HIDE_FROM_ABI constexpr month& operator-=(const months& __m1) noexcept;
   _LIBCPP_HIDE_FROM_ABI explicit inline constexpr operator unsigned() const noexcept { return __m_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __m_ >= 1 && __m_ <= 12; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __m_ >= 1 && __m_ <= 12; }
 };
 
 _LIBCPP_HIDE_FROM_ABI inline constexpr bool operator==(const month& __lhs, const month& __rhs) noexcept {
@@ -66,21 +66,21 @@ _LIBCPP_HIDE_FROM_ABI inline constexpr strong_ordering operator<=>(const month&
   return static_cast<unsigned>(__lhs) <=> static_cast<unsigned>(__rhs);
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month operator+(const month& __lhs, const months& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month operator+(const month& __lhs, const months& __rhs) noexcept {
   auto const __mu = static_cast<long long>(static_cast<unsigned>(__lhs)) + (__rhs.count() - 1);
   auto const __yr = (__mu >= 0 ? __mu : __mu - 11) / 12;
   return month{static_cast<unsigned>(__mu - __yr * 12 + 1)};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month operator+(const months& __lhs, const month& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month operator+(const months& __lhs, const month& __rhs) noexcept {
   return __rhs + __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month operator-(const month& __lhs, const months& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month operator-(const month& __lhs, const months& __rhs) noexcept {
   return __lhs + -__rhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr months operator-(const month& __lhs, const month& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr months operator-(const month& __lhs, const month& __rhs) noexcept {
   auto const __dm = static_cast<unsigned>(__lhs) - static_cast<unsigned>(__rhs);
   return months(__dm <= 11 ? __dm : __dm + 12);
 }
@@ -114,7 +114,7 @@ inline constexpr month December{12};
 
 template <>
 struct hash<chrono::month> {
-  _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::month& __m) noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::month& __m) noexcept {
     return static_cast<unsigned>(__m);
   }
 };
diff --git a/libcxx/include/__chrono/month_weekday.h b/libcxx/include/__chrono/month_weekday.h
index edb7d386067d8..f149806dc6c7c 100644
--- a/libcxx/include/__chrono/month_weekday.h
+++ b/libcxx/include/__chrono/month_weekday.h
@@ -35,9 +35,11 @@ class month_weekday {
   _LIBCPP_HIDE_FROM_ABI constexpr month_weekday(const chrono::month& __mval,
                                                 const chrono::weekday_indexed& __wdival) noexcept
       : __m_{__mval}, __wdi_{__wdival} {}
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday_indexed weekday_indexed() const noexcept { return __wdi_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __m_.ok() && __wdi_.ok(); }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday_indexed weekday_indexed() const noexcept {
+    return __wdi_;
+  }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __m_.ok() && __wdi_.ok(); }
 };
 
 _LIBCPP_HIDE_FROM_ABI inline constexpr bool
@@ -45,21 +47,23 @@ operator==(const month_weekday& __lhs, const month_weekday& __rhs) noexcept {
   return __lhs.month() == __rhs.month() && __lhs.weekday_indexed() == __rhs.weekday_indexed();
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month_weekday
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month_weekday
 operator/(const month& __lhs, const weekday_indexed& __rhs) noexcept {
   return month_weekday{__lhs, __rhs};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month_weekday operator/(int __lhs, const weekday_indexed& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month_weekday
+operator/(int __lhs, const weekday_indexed& __rhs) noexcept {
   return month_weekday{month(__lhs), __rhs};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month_weekday
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month_weekday
 operator/(const weekday_indexed& __lhs, const month& __rhs) noexcept {
   return month_weekday{__rhs, __lhs};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month_weekday operator/(const weekday_indexed& __lhs, int __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month_weekday
+operator/(const weekday_indexed& __lhs, int __rhs) noexcept {
   return month_weekday{month(__rhs), __lhs};
 }
 
@@ -71,9 +75,11 @@ class month_weekday_last {
   _LIBCPP_HIDE_FROM_ABI constexpr month_weekday_last(const chrono::month& __mval,
                                                      const chrono::weekday_last& __wdlval) noexcept
       : __m_{__mval}, __wdl_{__wdlval} {}
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday_last weekday_last() const noexcept { return __wdl_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __m_.ok() && __wdl_.ok(); }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday_last weekday_last() const noexcept {
+    return __wdl_;
+  }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __m_.ok() && __wdl_.ok(); }
 };
 
 _LIBCPP_HIDE_FROM_ABI inline constexpr bool
@@ -81,21 +87,23 @@ operator==(const month_weekday_last& __lhs, const month_weekday_last& __rhs) noe
   return __lhs.month() == __rhs.month() && __lhs.weekday_last() == __rhs.weekday_last();
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month_weekday_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month_weekday_last
 operator/(const month& __lhs, const weekday_last& __rhs) noexcept {
   return month_weekday_last{__lhs, __rhs};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month_weekday_last operator/(int __lhs, const weekday_last& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month_weekday_last
+operator/(int __lhs, const weekday_last& __rhs) noexcept {
   return month_weekday_last{month(__lhs), __rhs};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month_weekday_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month_weekday_last
 operator/(const weekday_last& __lhs, const month& __rhs) noexcept {
   return month_weekday_last{__rhs, __lhs};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month_weekday_last operator/(const weekday_last& __lhs, int __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month_weekday_last
+operator/(const weekday_last& __lhs, int __rhs) noexcept {
   return month_weekday_last{month(__rhs), __lhs};
 }
 } // namespace chrono
@@ -104,7 +112,7 @@ _LIBCPP_HIDE_FROM_ABI inline constexpr month_weekday_last operator/(const weekda
 
 template <>
 struct hash<chrono::month_weekday> {
-  _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::month_weekday& __mw) noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::month_weekday& __mw) noexcept {
     return std::__hash_combine(
         hash<chrono::month>{}(__mw.month()), hash<chrono::weekday_indexed>{}(__mw.weekday_indexed()));
   }
@@ -112,7 +120,7 @@ struct hash<chrono::month_weekday> {
 
 template <>
 struct hash<chrono::month_weekday_last> {
-  _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::month_weekday_last& __mwl) noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::month_weekday_last& __mwl) noexcept {
     return std::__hash_combine(
         hash<chrono::month>{}(__mwl.month()), hash<chrono::weekday_last>{}(__mwl.weekday_last()));
   }
diff --git a/libcxx/include/__chrono/monthday.h b/libcxx/include/__chrono/monthday.h
index 2a7262be09dc6..443d7ea217144 100644
--- a/libcxx/include/__chrono/monthday.h
+++ b/libcxx/include/__chrono/monthday.h
@@ -37,9 +37,9 @@ class month_day {
   month_day() = default;
   _LIBCPP_HIDE_FROM_ABI constexpr month_day(const chrono::month& __mval, const chrono::day& __dval) noexcept
       : __m_{__mval}, __d_{__dval} {}
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::day day() const noexcept { return __d_; }
-  _LIBCPP_HIDE_FROM_ABI constexpr bool ok() const noexcept;
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::day day() const noexcept { return __d_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool ok() const noexcept;
 };
 
 _LIBCPP_HIDE_FROM_ABI inline constexpr bool month_day::ok() const noexcept {
@@ -70,23 +70,25 @@ operator<=>(const month_day& __lhs, const month_day& __rhs) noexcept {
   return __lhs.day() <=> __rhs.day();
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month_day operator/(const month& __lhs, const day& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month_day
+operator/(const month& __lhs, const day& __rhs) noexcept {
   return month_day{__lhs, __rhs};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month_day operator/(const day& __lhs, const month& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month_day
+operator/(const day& __lhs, const month& __rhs) noexcept {
   return __rhs / __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month_day operator/(const month& __lhs, int __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month_day operator/(const month& __lhs, int __rhs) noexcept {
   return __lhs / day(__rhs);
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month_day operator/(int __lhs, const day& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month_day operator/(int __lhs, const day& __rhs) noexcept {
   return month(__lhs) / __rhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month_day operator/(const day& __lhs, int __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month_day operator/(const day& __lhs, int __rhs) noexcept {
   return month(__rhs) / __lhs;
 }
 
@@ -96,8 +98,8 @@ class month_day_last {
 
 public:
   _LIBCPP_HIDE_FROM_ABI explicit constexpr month_day_last(const chrono::month& __val) noexcept : __m_{__val} {}
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __m_.ok(); }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __m_.ok(); }
 };
 
 _LIBCPP_HIDE_FROM_ABI inline constexpr bool
@@ -110,19 +112,19 @@ operator<=>(const month_day_last& __lhs, const month_day_last& __rhs) noexcept {
   return __lhs.month() <=> __rhs.month();
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month_day_last operator/(const month& __lhs, last_spec) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month_day_last operator/(const month& __lhs, last_spec) noexcept {
   return month_day_last{__lhs};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month_day_last operator/(last_spec, const month& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month_day_last operator/(last_spec, const month& __rhs) noexcept {
   return month_day_last{__rhs};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month_day_last operator/(int __lhs, last_spec) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month_day_last operator/(int __lhs, last_spec) noexcept {
   return month_day_last{month(__lhs)};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr month_day_last operator/(last_spec, int __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr month_day_last operator/(last_spec, int __rhs) noexcept {
   return month_day_last{month(__rhs)};
 }
 
@@ -132,14 +134,14 @@ _LIBCPP_HIDE_FROM_ABI inline constexpr month_day_last operator/(last_spec, int _
 
 template <>
 struct hash<chrono::month_day> {
-  _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::month_day& __md) noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::month_day& __md) noexcept {
     return std::__hash_combine(hash<chrono::month>{}(__md.month()), hash<chrono::day>{}(__md.day()));
   }
 };
 
 template <>
 struct hash<chrono::month_day_last> {
-  _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::month_day_last& __mdl) noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::month_day_last& __mdl) noexcept {
     return hash<chrono::month>{}(__mdl.month());
   }
 };
diff --git a/libcxx/include/__chrono/weekday.h b/libcxx/include/__chrono/weekday.h
index 143803495dac8..5e1065de9302a 100644
--- a/libcxx/include/__chrono/weekday.h
+++ b/libcxx/include/__chrono/weekday.h
@@ -65,11 +65,13 @@ class weekday {
   }
   _LIBCPP_HIDE_FROM_ABI constexpr weekday& operator+=(const days& __dd) noexcept;
   _LIBCPP_HIDE_FROM_ABI constexpr weekday& operator-=(const days& __dd) noexcept;
-  _LIBCPP_HIDE_FROM_ABI inline constexpr unsigned c_encoding() const noexcept { return __wd_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr unsigned iso_encoding() const noexcept { return __wd_ == 0u ? 7 : __wd_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __wd_ <= 6; }
-  _LIBCPP_HIDE_FROM_ABI constexpr weekday_indexed operator[](unsigned __index) const noexcept;
-  _LIBCPP_HIDE_FROM_ABI constexpr weekday_last operator[](last_spec) const noexcept;
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr unsigned c_encoding() const noexcept { return __wd_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr unsigned iso_encoding() const noexcept {
+    return __wd_ == 0u ? 7 : __wd_;
+  }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __wd_ <= 6; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr weekday_indexed operator[](unsigned __index) const noexcept;
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr weekday_last operator[](last_spec) const noexcept;
 };
 
 // https://howardhinnant.github.io/date_algorithms.html#weekday_from_days
@@ -81,21 +83,25 @@ _LIBCPP_HIDE_FROM_ABI inline constexpr bool operator==(const weekday& __lhs, con
   return __lhs.c_encoding() == __rhs.c_encoding();
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr weekday operator+(const weekday& __lhs, const days& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr weekday
+operator+(const weekday& __lhs, const days& __rhs) noexcept {
   auto const __mu = static_cast<long long>(__lhs.c_encoding()) + __rhs.count();
   auto const __yr = (__mu >= 0 ? __mu : __mu - 6) / 7;
   return weekday{static_cast<unsigned>(__mu - __yr * 7)};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr weekday operator+(const days& __lhs, const weekday& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr weekday
+operator+(const days& __lhs, const weekday& __rhs) noexcept {
   return __rhs + __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr weekday operator-(const weekday& __lhs, const days& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr weekday
+operator-(const weekday& __lhs, const days& __rhs) noexcept {
   return __lhs + -__rhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr days operator-(const weekday& __lhs, const weekday& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr days
+operator-(const weekday& __lhs, const weekday& __rhs) noexcept {
   const int __wdu = __lhs.c_encoding() - __rhs.c_encoding();
   const int __wk  = (__wdu >= 0 ? __wdu : __wdu - 6) / 7;
   return days{__wdu - __wk * 7};
@@ -120,9 +126,11 @@ class weekday_indexed {
   weekday_indexed() = default;
   _LIBCPP_HIDE_FROM_ABI inline constexpr weekday_indexed(const chrono::weekday& __wdval, unsigned __idxval) noexcept
       : __wd_{__wdval}, __idx_(__idxval) {}
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday weekday() const noexcept { return __wd_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr unsigned index() const noexcept { return __idx_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __wd_.ok() && __idx_ >= 1 && __idx_ <= 5; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday weekday() const noexcept { return __wd_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr unsigned index() const noexcept { return __idx_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept {
+    return __wd_.ok() && __idx_ >= 1 && __idx_ <= 5;
+  }
 };
 
 _LIBCPP_HIDE_FROM_ABI inline constexpr bool
@@ -136,8 +144,8 @@ class weekday_last {
 
 public:
   _LIBCPP_HIDE_FROM_ABI explicit constexpr weekday_last(const chrono::weekday& __val) noexcept : __wd_{__val} {}
-  _LIBCPP_HIDE_FROM_ABI constexpr chrono::weekday weekday() const noexcept { return __wd_; }
-  _LIBCPP_HIDE_FROM_ABI constexpr bool ok() const noexcept { return __wd_.ok(); }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr chrono::weekday weekday() const noexcept { return __wd_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool ok() const noexcept { return __wd_.ok(); }
 };
 
 _LIBCPP_HIDE_FROM_ABI inline constexpr bool operator==(const weekday_last& __lhs, const weekday_last& __rhs) noexcept {
@@ -166,19 +174,21 @@ inline constexpr weekday Saturday{6};
 
 template <>
 struct hash<chrono::weekday> {
-  _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::weekday& __w) noexcept { return __w.c_encoding(); }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::weekday& __w) noexcept {
+    return __w.c_encoding();
+  }
 };
 
 template <>
 struct hash<chrono::weekday_indexed> {
-  _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::weekday_indexed& __wi) noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::weekday_indexed& __wi) noexcept {
     return std::__hash_combine(hash<chrono::weekday>{}(__wi.weekday()), __wi.index());
   }
 };
 
 template <>
 struct hash<chrono::weekday_last> {
-  _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::weekday_last& __wl) noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::weekday_last& __wl) noexcept {
     return hash<chrono::weekday>{}(__wl.weekday());
   }
 };
diff --git a/libcxx/include/__chrono/year.h b/libcxx/include/__chrono/year.h
index aaef38acd92f2..208d6eba0f165 100644
--- a/libcxx/include/__chrono/year.h
+++ b/libcxx/include/__chrono/year.h
@@ -58,16 +58,16 @@ class year {
   }
   _LIBCPP_HIDE_FROM_ABI constexpr year& operator+=(const years& __dy) noexcept;
   _LIBCPP_HIDE_FROM_ABI constexpr year& operator-=(const years& __dy) noexcept;
-  _LIBCPP_HIDE_FROM_ABI inline constexpr year operator+() const noexcept { return *this; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr year operator-() const noexcept { return year{-__y_}; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year operator+() const noexcept { return *this; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year operator-() const noexcept { return year{-__y_}; }
 
-  _LIBCPP_HIDE_FROM_ABI inline constexpr bool is_leap() const noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr bool is_leap() const noexcept {
     return __y_ % 4 == 0 && (__y_ % 100 != 0 || __y_ % 400 == 0);
   }
   _LIBCPP_HIDE_FROM_ABI explicit inline constexpr operator int() const noexcept { return __y_; }
-  _LIBCPP_HIDE_FROM_ABI constexpr bool ok() const noexcept;
-  _LIBCPP_HIDE_FROM_ABI static inline constexpr year min() noexcept { return year{-32767}; }
-  _LIBCPP_HIDE_FROM_ABI static inline constexpr year max() noexcept { return year{32767}; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool ok() const noexcept;
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static inline constexpr year min() noexcept { return year{-32767}; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static inline constexpr year max() noexcept { return year{32767}; }
 };
 
 _LIBCPP_HIDE_FROM_ABI inline constexpr bool operator==(const year& __lhs, const year& __rhs) noexcept {
@@ -78,19 +78,19 @@ _LIBCPP_HIDE_FROM_ABI constexpr strong_ordering operator<=>(const year& __lhs, c
   return static_cast<int>(__lhs) <=> static_cast<int>(__rhs);
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year operator+(const year& __lhs, const years& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year operator+(const year& __lhs, const years& __rhs) noexcept {
   return year(static_cast<int>(__lhs) + __rhs.count());
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year operator+(const years& __lhs, const year& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year operator+(const years& __lhs, const year& __rhs) noexcept {
   return __rhs + __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year operator-(const year& __lhs, const years& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year operator-(const year& __lhs, const years& __rhs) noexcept {
   return __lhs + -__rhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr years operator-(const year& __lhs, const year& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr years operator-(const year& __lhs, const year& __rhs) noexcept {
   return years{static_cast<int>(__lhs) - static_cast<int>(__rhs)};
 }
 
@@ -115,7 +115,9 @@ _LIBCPP_HIDE_FROM_ABI constexpr bool year::ok() const noexcept {
 
 template <>
 struct hash<chrono::year> {
-  _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::year& __y) noexcept { return static_cast<int>(__y); }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::year& __y) noexcept {
+    return static_cast<int>(__y);
+  }
 };
 
 #  endif // _LIBCPP_STD_VER >= 26
diff --git a/libcxx/include/__chrono/year_month.h b/libcxx/include/__chrono/year_month.h
index e36091c02161b..fdeeed1f386f8 100644
--- a/libcxx/include/__chrono/year_month.h
+++ b/libcxx/include/__chrono/year_month.h
@@ -36,20 +36,20 @@ class year_month {
   year_month() = default;
   _LIBCPP_HIDE_FROM_ABI constexpr year_month(const chrono::year& __yval, const chrono::month& __mval) noexcept
       : __y_{__yval}, __m_{__mval} {}
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::year year() const noexcept { return __y_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::year year() const noexcept { return __y_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; }
   _LIBCPP_HIDE_FROM_ABI inline constexpr year_month& operator+=(const months& __dm) noexcept;
   _LIBCPP_HIDE_FROM_ABI inline constexpr year_month& operator-=(const months& __dm) noexcept;
   _LIBCPP_HIDE_FROM_ABI inline constexpr year_month& operator+=(const years& __dy) noexcept;
   _LIBCPP_HIDE_FROM_ABI inline constexpr year_month& operator-=(const years& __dy) noexcept;
-  _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __y_.ok() && __m_.ok(); }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __y_.ok() && __m_.ok(); }
 };
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month operator/(const year& __y, const month& __m) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month operator/(const year& __y, const month& __m) noexcept {
   return year_month{__y, __m};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month operator/(const year& __y, int __m) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month operator/(const year& __y, int __m) noexcept {
   return year_month{__y, month(__m)};
 }
 
@@ -64,35 +64,42 @@ operator<=>(const year_month& __lhs, const year_month& __rhs) noexcept {
   return __lhs.month() <=> __rhs.month();
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month operator+(const year_month& __lhs, const months& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month
+operator+(const year_month& __lhs, const months& __rhs) noexcept {
   int __dmi      = static_cast<int>(static_cast<unsigned>(__lhs.month())) - 1 + __rhs.count();
   const int __dy = (__dmi >= 0 ? __dmi : __dmi - 11) / 12;
   __dmi          = __dmi - __dy * 12 + 1;
   return (__lhs.year() + years(__dy)) / month(static_cast<unsigned>(__dmi));
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month operator+(const months& __lhs, const year_month& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month
+operator+(const months& __lhs, const year_month& __rhs) noexcept {
   return __rhs + __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month operator+(const year_month& __lhs, const years& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month
+operator+(const year_month& __lhs, const years& __rhs) noexcept {
   return (__lhs.year() + __rhs) / __lhs.month();
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month operator+(const years& __lhs, const year_month& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month
+operator+(const years& __lhs, const year_month& __rhs) noexcept {
   return __rhs + __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr months operator-(const year_month& __lhs, const year_month& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr months
+operator-(const year_month& __lhs, const year_month& __rhs) noexcept {
   return (__lhs.year() - __rhs.year()) +
          months(static_cast<unsigned>(__lhs.month()) - static_cast<unsigned>(__rhs.month()));
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month operator-(const year_month& __lhs, const months& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month
+operator-(const year_month& __lhs, const months& __rhs) noexcept {
   return __lhs + -__rhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month operator-(const year_month& __lhs, const years& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month
+operator-(const year_month& __lhs, const years& __rhs) noexcept {
   return __lhs + -__rhs;
 }
 
@@ -122,7 +129,7 @@ _LIBCPP_HIDE_FROM_ABI inline constexpr year_month& year_month::operator-=(const
 
 template <>
 struct hash<chrono::year_month> {
-  _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::year_month& __ym) noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::year_month& __ym) noexcept {
     return std::__hash_combine(hash<chrono::year>{}(__ym.year()), hash<chrono::month>{}(__ym.month()));
   }
 };
diff --git a/libcxx/include/__chrono/year_month_day.h b/libcxx/include/__chrono/year_month_day.h
index 0a2aaedd60505..dee16008c2281 100644
--- a/libcxx/include/__chrono/year_month_day.h
+++ b/libcxx/include/__chrono/year_month_day.h
@@ -59,15 +59,17 @@ class year_month_day {
   _LIBCPP_HIDE_FROM_ABI constexpr year_month_day& operator+=(const years& __dy) noexcept;
   _LIBCPP_HIDE_FROM_ABI constexpr year_month_day& operator-=(const years& __dy) noexcept;
 
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::year year() const noexcept { return __y_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::day day() const noexcept { return __d_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr operator sys_days() const noexcept { return sys_days{__to_days()}; }
-  _LIBCPP_HIDE_FROM_ABI inline explicit constexpr operator local_days() const noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::year year() const noexcept { return __y_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::day day() const noexcept { return __d_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr operator sys_days() const noexcept {
+    return sys_days{__to_days()};
+  }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline explicit constexpr operator local_days() const noexcept {
     return local_days{__to_days()};
   }
 
-  _LIBCPP_HIDE_FROM_ABI constexpr bool ok() const noexcept;
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool ok() const noexcept;
 
   _LIBCPP_HIDE_FROM_ABI static constexpr year_month_day __from_days(days __d) noexcept;
   _LIBCPP_HIDE_FROM_ABI constexpr days __to_days() const noexcept;
@@ -119,56 +121,62 @@ operator<=>(const year_month_day& __lhs, const year_month_day& __rhs) noexcept {
   return __lhs.day() <=> __rhs.day();
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day operator/(const year_month& __lhs, const day& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day
+operator/(const year_month& __lhs, const day& __rhs) noexcept {
   return year_month_day{__lhs.year(), __lhs.month(), __rhs};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day operator/(const year_month& __lhs, int __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day
+operator/(const year_month& __lhs, int __rhs) noexcept {
   return __lhs / day(__rhs);
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day operator/(const year& __lhs, const month_day& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day
+operator/(const year& __lhs, const month_day& __rhs) noexcept {
   return __lhs / __rhs.month() / __rhs.day();
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day operator/(int __lhs, const month_day& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day
+operator/(int __lhs, const month_day& __rhs) noexcept {
   return year(__lhs) / __rhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day operator/(const month_day& __lhs, const year& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day
+operator/(const month_day& __lhs, const year& __rhs) noexcept {
   return __rhs / __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day operator/(const month_day& __lhs, int __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day
+operator/(const month_day& __lhs, int __rhs) noexcept {
   return year(__rhs) / __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day
 operator+(const year_month_day& __lhs, const months& __rhs) noexcept {
   return (__lhs.year() / __lhs.month() + __rhs) / __lhs.day();
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day
 operator+(const months& __lhs, const year_month_day& __rhs) noexcept {
   return __rhs + __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day
 operator-(const year_month_day& __lhs, const months& __rhs) noexcept {
   return __lhs + -__rhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day
 operator+(const year_month_day& __lhs, const years& __rhs) noexcept {
   return (__lhs.year() + __rhs) / __lhs.month() / __lhs.day();
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day
 operator+(const years& __lhs, const year_month_day& __rhs) noexcept {
   return __rhs + __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day
 operator-(const year_month_day& __lhs, const years& __rhs) noexcept {
   return __lhs + -__rhs;
 }
@@ -204,17 +212,19 @@ class year_month_day_last {
   _LIBCPP_HIDE_FROM_ABI constexpr year_month_day_last& operator+=(const years& __y) noexcept;
   _LIBCPP_HIDE_FROM_ABI constexpr year_month_day_last& operator-=(const years& __y) noexcept;
 
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::year year() const noexcept { return __y_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __mdl_.month(); }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month_day_last month_day_last() const noexcept { return __mdl_; }
-  _LIBCPP_HIDE_FROM_ABI constexpr chrono::day day() const noexcept;
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::year year() const noexcept { return __y_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __mdl_.month(); }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month_day_last month_day_last() const noexcept {
+    return __mdl_;
+  }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr chrono::day day() const noexcept;
   _LIBCPP_HIDE_FROM_ABI inline constexpr operator sys_days() const noexcept {
     return sys_days{year() / month() / day()};
   }
   _LIBCPP_HIDE_FROM_ABI inline explicit constexpr operator local_days() const noexcept {
     return local_days{year() / month() / day()};
   }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __y_.ok() && __mdl_.ok(); }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __y_.ok() && __mdl_.ok(); }
 };
 
 _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::day year_month_day_last::day() const noexcept {
@@ -248,54 +258,57 @@ operator<=>(const year_month_day_last& __lhs, const year_month_day_last& __rhs)
   return __lhs.month_day_last() <=> __rhs.month_day_last();
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last operator/(const year_month& __lhs, last_spec) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
+operator/(const year_month& __lhs, last_spec) noexcept {
   return year_month_day_last{__lhs.year(), month_day_last{__lhs.month()}};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
 operator/(const year& __lhs, const month_day_last& __rhs) noexcept {
   return year_month_day_last{__lhs, __rhs};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last operator/(int __lhs, const month_day_last& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
+operator/(int __lhs, const month_day_last& __rhs) noexcept {
   return year_month_day_last{year{__lhs}, __rhs};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
 operator/(const month_day_last& __lhs, const year& __rhs) noexcept {
   return __rhs / __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last operator/(const month_day_last& __lhs, int __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
+operator/(const month_day_last& __lhs, int __rhs) noexcept {
   return year{__rhs} / __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
 operator+(const year_month_day_last& __lhs, const months& __rhs) noexcept {
   return (__lhs.year() / __lhs.month() + __rhs) / last;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
 operator+(const months& __lhs, const year_month_day_last& __rhs) noexcept {
   return __rhs + __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
 operator-(const year_month_day_last& __lhs, const months& __rhs) noexcept {
   return __lhs + (-__rhs);
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
 operator+(const year_month_day_last& __lhs, const years& __rhs) noexcept {
   return year_month_day_last{__lhs.year() + __rhs, __lhs.month_day_last()};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
 operator+(const years& __lhs, const year_month_day_last& __rhs) noexcept {
   return __rhs + __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last
 operator-(const year_month_day_last& __lhs, const years& __rhs) noexcept {
   return __lhs + (-__rhs);
 }
@@ -336,7 +349,7 @@ _LIBCPP_HIDE_FROM_ABI inline constexpr bool year_month_day::ok() const noexcept
 
 template <>
 struct hash<chrono::year_month_day> {
-  _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::year_month_day& __ymd) noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::year_month_day& __ymd) noexcept {
     return std::__hash_combine(
         hash<chrono::year>{}(__ymd.year()),
         std::__hash_combine(hash<chrono::month>{}(__ymd.month()), hash<chrono::day>{}(__ymd.day())));
@@ -345,7 +358,7 @@ struct hash<chrono::year_month_day> {
 
 template <>
 struct hash<chrono::year_month_day_last> {
-  _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::year_month_day_last& __ymdl) noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::year_month_day_last& __ymdl) noexcept {
     return std::__hash_combine(
         hash<chrono::year>{}(__ymdl.year()), hash<chrono::month_day_last>{}(__ymdl.month_day_last()));
   }
diff --git a/libcxx/include/__chrono/year_month_weekday.h b/libcxx/include/__chrono/year_month_weekday.h
index 6ed1e21fe97e5..e4d9711d5b655 100644
--- a/libcxx/include/__chrono/year_month_weekday.h
+++ b/libcxx/include/__chrono/year_month_weekday.h
@@ -54,17 +54,23 @@ class year_month_weekday {
   _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday& operator+=(const years&) noexcept;
   _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday& operator-=(const years&) noexcept;
 
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::year year() const noexcept { return __y_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday weekday() const noexcept { return __wdi_.weekday(); }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr unsigned index() const noexcept { return __wdi_.index(); }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday_indexed weekday_indexed() const noexcept { return __wdi_; }
-
-  _LIBCPP_HIDE_FROM_ABI inline constexpr operator sys_days() const noexcept { return sys_days{__to_days()}; }
-  _LIBCPP_HIDE_FROM_ABI inline explicit constexpr operator local_days() const noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::year year() const noexcept { return __y_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday weekday() const noexcept {
+    return __wdi_.weekday();
+  }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr unsigned index() const noexcept { return __wdi_.index(); }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday_indexed weekday_indexed() const noexcept {
+    return __wdi_;
+  }
+
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr operator sys_days() const noexcept {
+    return sys_days{__to_days()};
+  }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline explicit constexpr operator local_days() const noexcept {
     return local_days{__to_days()};
   }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept {
     if (!__y_.ok() || !__m_.ok() || !__wdi_.ok())
       return false;
     if (__wdi_.index() <= 4)
@@ -96,55 +102,57 @@ operator==(const year_month_weekday& __lhs, const year_month_weekday& __rhs) noe
          __lhs.weekday_indexed() == __rhs.weekday_indexed();
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
 operator/(const year_month& __lhs, const weekday_indexed& __rhs) noexcept {
   return year_month_weekday{__lhs.year(), __lhs.month(), __rhs};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
 operator/(const year& __lhs, const month_weekday& __rhs) noexcept {
   return year_month_weekday{__lhs, __rhs.month(), __rhs.weekday_indexed()};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday operator/(int __lhs, const month_weekday& __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
+operator/(int __lhs, const month_weekday& __rhs) noexcept {
   return year(__lhs) / __rhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
 operator/(const month_weekday& __lhs, const year& __rhs) noexcept {
   return __rhs / __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday operator/(const month_weekday& __lhs, int __rhs) noexcept {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
+operator/(const month_weekday& __lhs, int __rhs) noexcept {
   return year(__rhs) / __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
 operator+(const year_month_weekday& __lhs, const months& __rhs) noexcept {
   return (__lhs.year() / __lhs.month() + __rhs) / __lhs.weekday_indexed();
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
 operator+(const months& __lhs, const year_month_weekday& __rhs) noexcept {
   return __rhs + __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
 operator-(const year_month_weekday& __lhs, const months& __rhs) noexcept {
   return __lhs + (-__rhs);
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
 operator+(const year_month_weekday& __lhs, const years& __rhs) noexcept {
   return year_month_weekday{__lhs.year() + __rhs, __lhs.month(), __lhs.weekday_indexed()};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
 operator+(const years& __lhs, const year_month_weekday& __rhs) noexcept {
   return __rhs + __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday
 operator-(const year_month_weekday& __lhs, const years& __rhs) noexcept {
   return __lhs + (-__rhs);
 }
@@ -181,15 +189,23 @@ class year_month_weekday_last {
   _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday_last& operator+=(const years& __dy) noexcept;
   _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday_last& operator-=(const years& __dy) noexcept;
 
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::year year() const noexcept { return __y_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday weekday() const noexcept { return __wdl_.weekday(); }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday_last weekday_last() const noexcept { return __wdl_; }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr operator sys_days() const noexcept { return sys_days{__to_days()}; }
-  _LIBCPP_HIDE_FROM_ABI inline explicit constexpr operator local_days() const noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::year year() const noexcept { return __y_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday weekday() const noexcept {
+    return __wdl_.weekday();
+  }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday_last weekday_last() const noexcept {
+    return __wdl_;
+  }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr operator sys_days() const noexcept {
+    return sys_days{__to_days()};
+  }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline explicit constexpr operator local_days() const noexcept {
     return local_days{__to_days()};
   }
-  _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __y_.ok() && __m_.ok() && __wdl_.ok(); }
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept {
+    return __y_.ok() && __m_.ok() && __wdl_.ok();
+  }
 
   _LIBCPP_HIDE_FROM_ABI constexpr days __to_days() const noexcept;
 };
@@ -204,57 +220,57 @@ operator==(const year_month_weekday_last& __lhs, const year_month_weekday_last&
   return __lhs.year() == __rhs.year() && __lhs.month() == __rhs.month() && __lhs.weekday_last() == __rhs.weekday_last();
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
 operator/(const year_month& __lhs, const weekday_last& __rhs) noexcept {
   return year_month_weekday_last{__lhs.year(), __lhs.month(), __rhs};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
 operator/(const year& __lhs, const month_weekday_last& __rhs) noexcept {
   return year_month_weekday_last{__lhs, __rhs.month(), __rhs.weekday_last()};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
 operator/(int __lhs, const month_weekday_last& __rhs) noexcept {
   return year(__lhs) / __rhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
 operator/(const month_weekday_last& __lhs, const year& __rhs) noexcept {
   return __rhs / __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
 operator/(const month_weekday_last& __lhs, int __rhs) noexcept {
   return year(__rhs) / __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
 operator+(const year_month_weekday_last& __lhs, const months& __rhs) noexcept {
   return (__lhs.year() / __lhs.month() + __rhs) / __lhs.weekday_last();
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
 operator+(const months& __lhs, const year_month_weekday_last& __rhs) noexcept {
   return __rhs + __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
 operator-(const year_month_weekday_last& __lhs, const months& __rhs) noexcept {
   return __lhs + (-__rhs);
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
 operator+(const year_month_weekday_last& __lhs, const years& __rhs) noexcept {
   return year_month_weekday_last{__lhs.year() + __rhs, __lhs.month(), __lhs.weekday_last()};
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
 operator+(const years& __lhs, const year_month_weekday_last& __rhs) noexcept {
   return __rhs + __lhs;
 }
 
-_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last
 operator-(const year_month_weekday_last& __lhs, const years& __rhs) noexcept {
   return __lhs + (-__rhs);
 }
@@ -286,7 +302,7 @@ year_month_weekday_last::operator-=(const years& __dy) noexcept {
 
 template <>
 struct hash<chrono::year_month_weekday> {
-  _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::year_month_weekday& __ymw) noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::year_month_weekday& __ymw) noexcept {
     return std::__hash_combine(
         hash<chrono::year>{}(__ymw.year()),
         std::__hash_combine(
@@ -296,7 +312,7 @@ struct hash<chrono::year_month_weekday> {
 
 template <>
 struct hash<chrono::year_month_weekday_last> {
-  _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::year_month_weekday_last& __ymwl) noexcept {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static size_t operator()(const chrono::year_month_weekday_last& __ymwl) noexcept {
     return std::__hash_combine(
         hash<chrono::year>{}(__ymwl.year()),
         std::__hash_combine(
diff --git a/libcxx/test/libcxx/time/nodiscard.verify.cpp b/libcxx/test/libcxx/time/nodiscard.verify.cpp
index 94be9679bde7f..40b406127b7de 100644
--- a/libcxx/test/libcxx/time/nodiscard.verify.cpp
+++ b/libcxx/test/libcxx/time/nodiscard.verify.cpp
@@ -107,223 +107,832 @@ void test(std::chrono::time_zone tz, std::chrono::time_zone_link link, std::chro
 }
 #endif // TEST_STD_VER >= 20
 
-void test() {
-  { // [time.duration]
-    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::microseconds(2));
+void test_duration() { // [time.duration]
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::microseconds(2));
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::duration_values<int>::zero();
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::duration_values<int>::max();
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::duration_values<int>::min();
+
+  std::chrono::duration<int, std::ratio<1, 30> > dr;
+
+#if TEST_STD_VER >= 17
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::floor<std::chrono::seconds>(dr);
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::ceil<std::chrono::seconds>(dr);
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::round<std::chrono::seconds>(dr);
+#endif
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  dr.count();
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  +dr;
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  -dr;
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::duration<int, std::ratio<1, 30> >::zero();
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::duration<int, std::ratio<1, 30> >::max();
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::duration<int, std::ratio<1, 30> >::min();
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  dr + dr;
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  dr - dr;
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  dr * 94;
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  94 * dr;
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  dr / 82;
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  dr / dr;
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  dr % 47;
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  dr % dr;
+
+#if TEST_STD_VER >= 17
+  using namespace std::chrono_literals;
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  94h;
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  82.5h;
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  94min;
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  82.5min;
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  94s;
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  82.5s;
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  94ms;
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  82.5ms;
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  94us;
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  82.5us;
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  94ns;
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  82.5ns;
+#endif // TEST_STD_VER >= 14
+
+#if TEST_STD_VER >= 26
+  std::hash<std::chrono::duration<int, std::ratio<1, 30>>> hash;
 
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  hash(dr);
+#endif
+}
+
+#if TEST_STD_VER >= 20
+void test_hh_mm_ss() { // [time.hms]
+  const std::chrono::hh_mm_ss<std::chrono::seconds> hms;
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  hms.is_negative();
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  hms.hours();
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  hms.minutes();
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  hms.seconds();
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  hms.subseconds();
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  hms.to_duration();
+
+  using namespace std::chrono_literals;
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::is_am(1h);
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::is_pm(1h);
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::make12(1h);
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::make24(1h, false);
+}
+#endif
+
+void test_time_point() { // [time.point]
+  std::chrono::time_point<std::chrono::system_clock> tp;
+  std::chrono::duration<double, std::ratio<1, 30> > dr;
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  tp.time_since_epoch();
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  tp.min();
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  tp.max();
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::time_point_cast<std::chrono::seconds>(tp);
+
+#if TEST_STD_VER >= 17
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::floor<std::chrono::seconds>(tp);
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::ceil<std::chrono::seconds>(tp);
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::round<std::chrono::seconds>(tp);
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  std::chrono::abs(dr);
+#endif
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  tp + dr;
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  dr + tp;
+
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  tp - dr;
+  // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+  tp - tp;
+}
+
+void test_clocks() {
+#if TEST_STD_VER >= 20
+  { // [time.clock.file]
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::duration_values<int>::zero();
+    std::chrono::file_clock::now();
+
+    using Duration = std::chrono::duration<double, std::ratio<1, 30>>;
+
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::duration_values<int>::max();
+    std::chrono::file_clock::to_sys(std::chrono::file_time<Duration>{});
+
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::duration_values<int>::min();
+    std::chrono::file_clock::from_sys(std::chrono::sys_time<Duration>{});
+  }
+#endif
 
-    std::chrono::duration<int, std::ratio<1, 30> > dr;
+#if TEST_STD_VER >= 20
+  { // [time.clock.gps]
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    std::chrono::gps_clock::now();
 
-#if TEST_STD_VER >= 17
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::floor<std::chrono::seconds>(dr);
+    std::chrono::gps_clock::to_utc(std::chrono::gps_seconds{});
+
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::ceil<std::chrono::seconds>(dr);
+    std::chrono::gps_clock::from_utc(std::chrono::utc_seconds{});
+  }
+#endif // TEST_STD_VER >= 20
+
+#if _LIBCPP_HAS_MONOTONIC_CLOCK
+  { // [time.clock.steady]
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::round<std::chrono::seconds>(dr);
+    std::chrono::steady_clock::now();
+  }
 #endif
 
+  { // [time.clock.system]
+
+    std::chrono::time_point<std::chrono::system_clock> tp;
+    std::time_t time = std::time(nullptr);
+
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    dr.count();
+    std::chrono::system_clock::now();
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    +dr;
+    std::chrono::system_clock::to_time_t(tp);
+
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    -dr;
+    std::chrono::system_clock::from_time_t(time);
+
+#if TEST_STD_VER >= 26
+    std::hash<std::chrono::time_point<std::chrono::system_clock>> hash;
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::duration<int, std::ratio<1, 30> >::zero();
+    hash(tp);
+#endif
+  }
+
+#if TEST_STD_VER >= 20
+  { // [time.clock.tai]
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::duration<int, std::ratio<1, 30> >::max();
+    std::chrono::tai_clock::now();
+
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::duration<int, std::ratio<1, 30> >::min();
+    std::chrono::tai_clock::to_utc(std::chrono::tai_seconds{});
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    dr + dr;
+    std::chrono::tai_clock::from_utc(std::chrono::utc_seconds{});
+  }
+#endif
+
+#if TEST_STD_VER >= 20
+  { // [time.clock.utc]
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    dr - dr;
+    std::chrono::utc_clock::now();
+
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    dr * 94;
+    std::chrono::utc_clock::to_sys(std::chrono::utc_seconds{});
+
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    94 * dr;
+    std::chrono::utc_clock::from_sys(std::chrono::sys_seconds{});
+
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    dr / 82;
+    std::chrono::get_leap_second_info(std::chrono::utc_seconds{});
+  }
+#endif // TEST_STD_VER >= 20
+}
+
+#if TEST_STD_VER >= 20
+void test_calendar() { // [time.cal]
+
+  { // [time.cal.day]
+    const std::chrono::day day{};
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    day.ok();
+
+    std::chrono::days days;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    day + days;
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    dr / dr;
+    days + day;
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    dr % 47;
+    day - days;
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    dr % dr;
+    day - day;
 
-#if TEST_STD_VER >= 17
+#  if TEST_STD_VER >= 26
+    std::hash<std::chrono::day> hash;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    hash(day);
+#  endif
+  }
+
+  {
     using namespace std::chrono_literals;
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    94h;
+    94d;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    82y;
+  }
+
+  { // [time.cal.month]
+    const std::chrono::month month{};
+
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    82.5h;
+    month.ok();
 
+    std::chrono::months months;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    month + months;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    months + month;
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    94min;
+    month - months;
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    82.5min;
+    month - month;
+
+#  if TEST_STD_VER >= 26
+    std::hash<std::chrono::month> hash;
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    94s;
+    hash(month);
+#  endif
+  }
+
+  { // [time.cal.mwd]
+    std::chrono::month month;
+    std::chrono::weekday_indexed wdidx;
+
+    const std::chrono::month_weekday mwd{month, wdidx};
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    mwd.month();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    mwd.weekday_indexed();
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    82.5s;
+    mwd.ok();
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    94ms;
+    month / wdidx;
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    82.5ms;
+    94 / wdidx;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    wdidx / month;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    wdidx / 82;
+
+#  if TEST_STD_VER >= 26
+    std::hash<std::chrono::month_weekday> hash;
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    94us;
+    hash(mwd);
+#  endif
+  }
+
+  { // [time.cal.mwdlast]
+    std::chrono::month month;
+    std::chrono::weekday_last wdl{{}};
+
+    const std::chrono::month_weekday_last mwdl{month, wdl};
+
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    82.5us;
+    mwdl.month();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    mwdl.weekday_last();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    mwdl.ok();
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    94ns;
+    month / wdl;
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    82.5ns;
-#endif // TEST_STD_VER >= 14
+    94 / wdl;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    wdl / month;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    wdl / 82;
 
-#if TEST_STD_VER >= 26
-    std::hash<std::chrono::duration<int, std::ratio<1, 30>>> hash;
+#  if TEST_STD_VER >= 26
+    std::hash<std::chrono::month_weekday_last> hash;
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    hash(dr);
-#endif
+    hash(mwdl);
+#  endif
   }
 
-#if TEST_STD_VER >= 20
-  { // [time.clock.file]
+  { // [time.cal.month]
+    const std::chrono::month month{};
+
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::file_clock::now();
+    month.ok();
 
-    using Duration = std::chrono::duration<double, std::ratio<1, 30>>;
+    std::chrono::months months;
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::file_clock::to_sys(std::chrono::file_time<Duration>{});
+    month + months;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    months + month;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    month - months;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    month - month;
+
+#  if TEST_STD_VER >= 26
+    std::hash<std::chrono::month> hash;
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::file_clock::from_sys(std::chrono::sys_time<Duration>{});
+    hash(month);
+#  endif
   }
-#endif
 
-#if TEST_STD_VER >= 20
-  { // [time.clock.gps]
+  { // [time.cal.md]
+    const std::chrono::month_day md{};
+
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::gps_clock::now();
+    md.month();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    md.day();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    md.ok();
+
+    std::chrono::month month;
+    std::chrono::day day;
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::gps_clock::to_utc(std::chrono::gps_seconds{});
+    month / day;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    day / month;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    month / 94;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    82 / day;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    day / 49;
+
+#  if TEST_STD_VER >= 26
+    std::hash<std::chrono::month_day> hash;
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::gps_clock::from_utc(std::chrono::utc_seconds{});
+    hash(md);
+#  endif
   }
-#endif // TEST_STD_VER >= 20
 
-#if _LIBCPP_HAS_MONOTONIC_CLOCK
-  { // [time.clock.steady]
+  { // [time.cal.mdlast]
+    std::chrono::month month;
+
+    const std::chrono::month_day_last mdl{month};
+
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::steady_clock::now();
+    mdl.month();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    mdl.ok();
+
+    std::chrono::last_spec ls;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    month / ls;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ls / month;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    94 / ls;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ls / 82;
+
+#  if TEST_STD_VER >= 26
+    std::hash<std::chrono::month_day_last> hash;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    hash(mdl);
+#  endif
   }
-#endif
 
-  { // [time.clock.system]
+  { // [time.cal.wd]
+    const std::chrono::weekday wd{};
 
-    std::chrono::time_point<std::chrono::system_clock> tp;
-    std::time_t time = std::time(nullptr);
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    wd.c_encoding();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    wd.iso_encoding();
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::system_clock::now();
+    wd.ok();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    wd[0];
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    wd[std::chrono::last_spec{}];
+
+    std::chrono::days days;
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::system_clock::to_time_t(tp);
+    wd + days;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    days + wd;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    wd - days;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    wd - wd;
+
+#  if TEST_STD_VER >= 26
+    std::hash<std::chrono::weekday> hash;
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::system_clock::from_time_t(time);
+    hash(wd);
+#  endif
+  }
 
-#if TEST_STD_VER >= 26
-    std::hash<std::chrono::time_point<std::chrono::system_clock>> hash;
+  { // [time.cal.wdidx]
+    const std::chrono::weekday_indexed wdidx{};
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    hash(tp);
-#endif
+    wdidx.weekday();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    wdidx.ok();
+
+#  if TEST_STD_VER >= 26
+    std::hash<std::chrono::weekday_indexed> hash;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    hash(wdidx);
+#  endif
   }
 
-#if TEST_STD_VER >= 20
-  { // [time.clock.tai]
+  { // [time.cal.wdlast]
+    const std::chrono::weekday_last wdl{std::chrono::weekday{}};
+
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::tai_clock::now();
+    wdl.weekday();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    wdl.ok();
+
+#  if TEST_STD_VER >= 26
+    std::hash<std::chrono::weekday_last> hash;
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::tai_clock::to_utc(std::chrono::tai_seconds{});
+    hash(wdl);
+#  endif
+  }
+
+  { // [time.cal.ymd]
+    const std::chrono::year_month_day ymd{};
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::tai_clock::from_utc(std::chrono::utc_seconds{});
+    ymd.year();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymd.month();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymd.day();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymd.year();
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymd.ok();
+
+    std::chrono::year_month ym;
+    std::chrono::day day;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ym / day;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ym / 94;
+
+    std::chrono::year year;
+    std::chrono::month_day md;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    year / md;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    82 / md;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    md / year;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    md / 49;
+
+    std::chrono::months months;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymd + months;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    months + ymd;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymd - months;
+
+    std::chrono::years years;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymd + years;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    years + ymd;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymd - years;
+
+#  if TEST_STD_VER >= 26
+    std::hash<std::chrono::year_month_day> hash;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    hash(ymd);
+#  endif
   }
-#endif
 
-  { // [time.point]
-    std::chrono::time_point<std::chrono::system_clock> tp;
-    std::chrono::duration<double, std::ratio<1, 30> > dr;
+  { // [time.cal.ymdlast]
+    std::chrono::year year;
+    std::chrono::month_day_last mdl{{}};
 
+    const std::chrono::year_month_day_last ymdl{year, mdl};
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymdl.year();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymdl.month();
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    tp.time_since_epoch();
+    ymdl.month_day_last();
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    tp.min();
+    ymdl.day();
+
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    tp.max();
+    ymdl.ok();
+
+    std::chrono::year_month ym;
+    std::chrono::last_spec ls;
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::time_point_cast<std::chrono::seconds>(tp);
+    ym / ls;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    year / mdl;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    94 / mdl;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    mdl / year;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    mdl / 82;
+
+    std::chrono::months months;
+    std::chrono::years years;
 
-#if TEST_STD_VER >= 17
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::floor<std::chrono::seconds>(tp);
+    months + ymdl;
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::ceil<std::chrono::seconds>(tp);
+    ymdl - months;
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::round<std::chrono::seconds>(tp);
+    ymdl + years;
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::abs(dr);
-#endif
+    years + ymdl;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymdl - years;
+
+#  if TEST_STD_VER >= 26
+    std::hash<std::chrono::year_month_day_last> hash;
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    tp + dr;
+    hash(ymdl);
+#  endif
+  }
+
+  { // [time.cal.ymwd]
+    const std::chrono::year_month_weekday ymwd{};
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymwd.year();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymwd.month();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymwd.weekday();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymwd.index();
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    dr + tp;
+    ymwd.weekday_indexed();
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    tp - dr;
+    ymwd.ok();
+
+    std::chrono::year_month ym;
+    std::chrono::weekday_indexed wdidx;
+    std::chrono::year year;
+    std::chrono::month_weekday mw{std::chrono::month{}, wdidx};
+    std::chrono::months months;
+    std::chrono::years years;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ym / wdidx;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    year / mw;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    94 / mw;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    mw / year;
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    tp - tp;
+    mw / 82;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymwd + months;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    months + ymwd;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymwd - months;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymwd + years;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    years + ymwd;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymwd - years;
+
+#  if TEST_STD_VER >= 26
+    std::hash<std::chrono::year_month_weekday> hash;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    hash(ymwd);
+#  endif
   }
 
-#if TEST_STD_VER >= 20
-  { // [time.clock.utc]
+  { // [time.cal.ymwdlast]
+    std::chrono::year year;
+    std::chrono::month month;
+    std::chrono::weekday_last wdl{std::chrono::weekday{}};
+
+    const std::chrono::year_month_weekday_last ymwdl{year, month, wdl};
+
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::utc_clock::now();
+    ymwdl.year();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymwdl.month();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymwdl.weekday();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymwdl.weekday_last();
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::utc_clock::to_sys(std::chrono::utc_seconds{});
+    ymwdl.ok();
+
+    std::chrono::year_month ym;
+    std::chrono::month_weekday_last mwdl{std::chrono::month{}, std::chrono::weekday_last{std::chrono::weekday{}}};
+    std::chrono::months months;
+    std::chrono::years years;
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::utc_clock::from_sys(std::chrono::sys_seconds{});
+    ym / wdl;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    year / mwdl;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    94 / mwdl;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    mwdl / year;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    mwdl / 82;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymwdl + months;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    months + ymwdl;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ymwdl + years;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    years + ymwdl;
+
+#  if TEST_STD_VER >= 26
+    std::hash<std::chrono::year_month_weekday_last> hash;
 
     // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
-    std::chrono::get_leap_second_info(std::chrono::utc_seconds{});
+    hash(ymwdl);
+#  endif
+  }
+
+  { // [time.cal.ym]
+    const std::chrono::year_month ym{};
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ym.year();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ym.month();
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ym.ok();
+
+    std::chrono::year year;
+    std::chrono::month month;
+    std::chrono::months months;
+    std::chrono::years years;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    year / month;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    year / 94;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ym + months;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    months + ym;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ym + years;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    years + ym;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ym - months;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    ym - years;
+
+#  if TEST_STD_VER >= 26
+    std::hash<std::chrono::year_month> hash;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    hash(ym);
+#  endif
+  }
+
+  { // [time.cal.year]
+    const std::chrono::year year{};
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    +year;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    -year;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    year.is_leap();
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    year.ok();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    year.min();
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    year.max();
+
+    std::chrono::years years;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    year + years;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    years + year;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    year - years;
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    year - year;
+
+#  if TEST_STD_VER >= 26
+    std::hash<std::chrono::year> hash;
+
+    // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+    hash(year);
+#  endif
   }
-#endif // TEST_STD_VER >= 20
 }
+#endif



More information about the libcxx-commits mailing list