diff --git a/libcxx/docs/Status/Cxx26Issues.csv b/libcxx/docs/Status/Cxx26Issues.csv index 23adfde5bd4d..5de35c96d4c0 100644 --- a/libcxx/docs/Status/Cxx26Issues.csv +++ b/libcxx/docs/Status/Cxx26Issues.csv @@ -301,7 +301,7 @@ "`LWG4477 `__","Placement ``operator delete`` should be constexpr","2026-03 (Croydon)","|Complete|","23","`#189843 `__","" "`LWG4478 `__","``meta::has_identifier`` is not specified for annotations","2026-03 (Croydon)","","","`#189844 `__","" "`LWG4480 `__","```` should provide ``ATOMIC_CHAR8_T_LOCK_FREE``","2026-03 (Croydon)","","","`#189845 `__","" -"`LWG4481 `__","Disallow ``chrono::duration``","2026-03 (Croydon)","","","`#189846 `__","" +"`LWG4481 `__","Disallow ``chrono::duration``","2026-03 (Croydon)","|Complete|","23","`#189846 `__","" "`LWG4483 `__","Multidimensional arrays are not supported by ``meta::reflect_constant_array`` and related functions","2026-03 (Croydon)","","","`#189847 `__","" "`LWG4485 `__","Move specification for ``task::stop_token_type``","2026-03 (Croydon)","","","`#189848 `__","" "`LWG4486 `__","``integral-constant-like`` and ``constexpr-wrapper-like`` exposition-only concept duplication","2026-03 (Croydon)","","","`#189849 `__","" diff --git a/libcxx/include/__chrono/duration.h b/libcxx/include/__chrono/duration.h index 92efd82f7214..fe5bbd07f6d8 100644 --- a/libcxx/include/__chrono/duration.h +++ b/libcxx/include/__chrono/duration.h @@ -19,6 +19,7 @@ #include <__type_traits/enable_if.h> #include <__type_traits/is_convertible.h> #include <__type_traits/is_floating_point.h> +#include <__type_traits/is_unqualified.h> #include #include @@ -164,6 +165,7 @@ template class duration { + static_assert(__is_unqualified_v<_Rep>, "A duration representation cannot be 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 39822d5e74f7..8cc6b9bb883b 100644 --- a/libcxx/include/chrono +++ b/libcxx/include/chrono @@ -46,6 +46,7 @@ public: template > class duration { + static_assert(__is_unqualified_v, "A duration representation cannot be qualified"); static_assert(!__is_duration::value, "A duration representation can not be a duration"); static_assert(__is_ratio::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 000000000000..f8c3307b2ceb --- /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 +// +//===----------------------------------------------------------------------===// + +// + +// XFAIL: FROZEN-CXX03-HEADERS-FIXME + +// LWG 4481 +// A program that instantiates duration with a cv-qualified Rep is ill-formed. + +#include + +void test() { + // expected-error-re@*:* {{static assertion failed {{.*}}A duration representation cannot be qualified}} + (void)sizeof(std::chrono::duration); + + // expected-error-re@*:* {{static assertion failed {{.*}}A duration representation cannot be qualified}} + (void)sizeof(std::chrono::duration); + + // expected-error-re@*:* {{static assertion failed {{.*}}A duration representation cannot be qualified}} + (void)sizeof(std::chrono::duration); +}