[libcxx-commits] [libcxx] [libc++][chrono] Implement LWG 4481: disallow chrono::duration<const T, P> (PR #207558)

via libcxx-commits libcxx-commits at lists.llvm.org
Sun Jul 5 08:04:16 PDT 2026


https://github.com/emmett2020 updated https://github.com/llvm/llvm-project/pull/207558

>From f20f20873cde0b8800e0cc5d690f3ee7cb6a4b27 Mon Sep 17 00:00:00 2001
From: Emmett <emmettzhang2020 at outlook.com>
Date: Sun, 5 Jul 2026 13:38:58 +0800
Subject: [PATCH] [libc++][chrono] Disallow cv-qualified representations in
 duration

Implement LWG 4481 by rejecting chrono::duration specializations whose
Rep type is const- or volatile-qualified.

Fixes #189846
---
 libcxx/docs/Status/Cxx26Issues.csv            |  2 +-
 libcxx/include/__chrono/duration.h            |  4 +++
 libcxx/include/chrono                         |  2 ++
 .../time/time.duration/duration.verify.cpp    | 27 +++++++++++++++++++
 4 files changed, 34 insertions(+), 1 deletion(-)
 create mode 100644 libcxx/test/std/time/time.duration/duration.verify.cpp

diff --git a/libcxx/docs/Status/Cxx26Issues.csv b/libcxx/docs/Status/Cxx26Issues.csv
index 23adfde5bd4d7..5de35c96d4c0a 100644
--- a/libcxx/docs/Status/Cxx26Issues.csv
+++ b/libcxx/docs/Status/Cxx26Issues.csv
@@ -301,7 +301,7 @@
 "`LWG4477 <https://wg21.link/LWG4477>`__","Placement ``operator delete`` should be constexpr","2026-03 (Croydon)","|Complete|","23","`#189843 <https://github.com/llvm/llvm-project/issues/189843>`__",""
 "`LWG4478 <https://wg21.link/LWG4478>`__","``meta::has_identifier`` is not specified for annotations","2026-03 (Croydon)","","","`#189844 <https://github.com/llvm/llvm-project/issues/189844>`__",""
 "`LWG4480 <https://wg21.link/LWG4480>`__","``<stdatomic.h>`` should provide ``ATOMIC_CHAR8_T_LOCK_FREE``","2026-03 (Croydon)","","","`#189845 <https://github.com/llvm/llvm-project/issues/189845>`__",""
-"`LWG4481 <https://wg21.link/LWG4481>`__","Disallow ``chrono::duration<const T, P>``","2026-03 (Croydon)","","","`#189846 <https://github.com/llvm/llvm-project/issues/189846>`__",""
+"`LWG4481 <https://wg21.link/LWG4481>`__","Disallow ``chrono::duration<const T, P>``","2026-03 (Croydon)","|Complete|","23","`#189846 <https://github.com/llvm/llvm-project/issues/189846>`__",""
 "`LWG4483 <https://wg21.link/LWG4483>`__","Multidimensional arrays are not supported by ``meta::reflect_constant_array`` and related functions","2026-03 (Croydon)","","","`#189847 <https://github.com/llvm/llvm-project/issues/189847>`__",""
 "`LWG4485 <https://wg21.link/LWG4485>`__","Move specification for ``task::stop_token_type``","2026-03 (Croydon)","","","`#189848 <https://github.com/llvm/llvm-project/issues/189848>`__",""
 "`LWG4486 <https://wg21.link/LWG4486>`__","``integral-constant-like`` and ``constexpr-wrapper-like`` exposition-only concept duplication","2026-03 (Croydon)","","","`#189849 <https://github.com/llvm/llvm-project/issues/189849>`__",""
diff --git a/libcxx/include/__chrono/duration.h b/libcxx/include/__chrono/duration.h
index 92efd82f72145..ebff8fd5263fe 100644
--- a/libcxx/include/__chrono/duration.h
+++ b/libcxx/include/__chrono/duration.h
@@ -17,8 +17,10 @@
 #include <__functional/hash.h>
 #include <__type_traits/common_type.h>
 #include <__type_traits/enable_if.h>
+#include <__type_traits/is_const.h>
 #include <__type_traits/is_convertible.h>
 #include <__type_traits/is_floating_point.h>
+#include <__type_traits/is_volatile.h>
 #include <limits>
 #include <ratio>
 
@@ -164,6 +166,8 @@ template <class _ToDuration, class _Rep, class _Period, enable_if_t<__is_duratio
 
 template <class _Rep, class _Period>
 class duration {
+  static_assert(!is_const<_Rep>::value, "A duration representation can not be const-qualified");
+  static_assert(!is_volatile<_Rep>::value, "A duration representation can not be volatile-qualified");
   static_assert(!__is_duration_v<_Rep>, "A duration representation can not be a duration");
   static_assert(__is_ratio_v<_Period>, "Second template parameter of duration must be a std::ratio");
   static_assert(_Period::num > 0, "duration period must be positive");
diff --git a/libcxx/include/chrono b/libcxx/include/chrono
index 39822d5e74f79..2f844b8b9a870 100644
--- a/libcxx/include/chrono
+++ b/libcxx/include/chrono
@@ -46,6 +46,8 @@ public:
 template <class Rep, class Period = ratio<1>>
 class duration
 {
+    static_assert(!is_const<Rep>::value, "A duration representation can not be const-qualified");
+    static_assert(!is_volatile<Rep>::value, "A duration representation can not be volatile-qualified");
     static_assert(!__is_duration<Rep>::value, "A duration representation can not be a duration");
     static_assert(__is_ratio<Period>::value, "Second template parameter of duration must be a std::ratio");
     static_assert(Period::num > 0, "duration period must be positive");
diff --git a/libcxx/test/std/time/time.duration/duration.verify.cpp b/libcxx/test/std/time/time.duration/duration.verify.cpp
new file mode 100644
index 0000000000000..3a740e3996ac4
--- /dev/null
+++ b/libcxx/test/std/time/time.duration/duration.verify.cpp
@@ -0,0 +1,27 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <chrono>
+
+// XFAIL: FROZEN-CXX03-HEADERS-FIXME
+
+// LWG 4481
+// A program that instantiates duration with a cv-qualified Rep is ill-formed.
+
+#include <chrono>
+
+void test() {
+  // expected-error-re@*:* {{static assertion failed {{.*}}A duration representation can not be const-qualified}}
+  (void)sizeof(std::chrono::duration<const int>);
+
+  // expected-error-re@*:* {{static assertion failed {{.*}}A duration representation can not be volatile-qualified}}
+  (void)sizeof(std::chrono::duration<volatile int>);
+
+  // expected-error-re@*:* {{static assertion failed {{.*}}A duration representation can not be const-qualified}}
+  (void)sizeof(std::chrono::duration<const volatile int>);
+}



More information about the libcxx-commits mailing list