[libcxx-commits] [libcxx] [libc++] Fix LWG 4265: std::midpoint should not accept const bool (PR #174579)

via libcxx-commits libcxx-commits at lists.llvm.org
Thu Jan 8 02:56:53 PST 2026


https://github.com/eiytoq updated https://github.com/llvm/llvm-project/pull/174579

>From 6626c67f0c2dad1ba4032b8f44a83d645ad65914 Mon Sep 17 00:00:00 2001
From: eiytoq <eiytoq at outlook.com>
Date: Tue, 6 Jan 2026 20:04:14 +0800
Subject: [PATCH 1/3] [libc++] Fix LWG 4265: std::midpoint should not accept
 const bool

---
 libcxx/docs/Status/Cxx2cIssues.csv  | 2 +-
 libcxx/include/__numeric/midpoint.h | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/libcxx/docs/Status/Cxx2cIssues.csv b/libcxx/docs/Status/Cxx2cIssues.csv
index 9445149a203a2..101a708b7b2de 100644
--- a/libcxx/docs/Status/Cxx2cIssues.csv
+++ b/libcxx/docs/Status/Cxx2cIssues.csv
@@ -164,7 +164,7 @@
 "`LWG4256 <https://wg21.link/LWG4256>`__","Incorrect constrains for ``function_ref`` constructors from ``nontype_t``","2025-11 (Kona)","","","`#171321 <https://github.com/llvm/llvm-project/issues/171321>`__",""
 "`LWG4257 <https://wg21.link/LWG4257>`__","Stream insertion for ``chrono::local_time`` should be constrained","2025-11 (Kona)","","","`#171322 <https://github.com/llvm/llvm-project/issues/171322>`__",""
 "`LWG4260 <https://wg21.link/LWG4260>`__","Query objects must be default constructible","2025-11 (Kona)","","","`#171323 <https://github.com/llvm/llvm-project/issues/171323>`__",""
-"`LWG4265 <https://wg21.link/LWG4265>`__","``std::midpoint`` should not accept ``const bool``","2025-11 (Kona)","","","`#171324 <https://github.com/llvm/llvm-project/issues/171324>`__",""
+"`LWG4265 <https://wg21.link/LWG4265>`__","``std::midpoint`` should not accept ``const bool``","2025-11 (Kona)","|Complete|","22","`#171324 <https://github.com/llvm/llvm-project/issues/171324>`__",""
 "`LWG4266 <https://wg21.link/LWG4266>`__","``layout_stride::mapping`` should treat empty mappings as exhaustive","2025-11 (Kona)","","","`#171325 <https://github.com/llvm/llvm-project/issues/171325>`__",""
 "`LWG4269 <https://wg21.link/LWG4269>`__","``unique_copy`` passes arguments to its predicate backwards","2025-11 (Kona)","","","`#171326 <https://github.com/llvm/llvm-project/issues/171326>`__",""
 "`LWG4272 <https://wg21.link/LWG4272>`__","For ``rank == 0``, ``layout_stride`` is atypically convertible","2025-11 (Kona)","","","`#171327 <https://github.com/llvm/llvm-project/issues/171327>`__",""
diff --git a/libcxx/include/__numeric/midpoint.h b/libcxx/include/__numeric/midpoint.h
index dc40dac47f273..f2f1cb47d29a2 100644
--- a/libcxx/include/__numeric/midpoint.h
+++ b/libcxx/include/__numeric/midpoint.h
@@ -31,7 +31,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
 
 #if _LIBCPP_STD_VER >= 20
 template <class _Tp>
-  requires(is_integral_v<_Tp> && !is_same_v<_Tp, bool>)
+  requires(is_integral_v<_Tp> && !is_same_v<__remove_cv_t<_Tp>, bool>)
 [[nodiscard]]
 _LIBCPP_HIDE_FROM_ABI constexpr _Tp midpoint(_Tp __a, _Tp __b) noexcept _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK {
   using _Up                = make_unsigned_t<_Tp>;

>From 24756949d896683e08d592a06a2b328c758bcf8e Mon Sep 17 00:00:00 2001
From: eiytoq <eiytoq at outlook.com>
Date: Wed, 7 Jan 2026 14:52:58 +0800
Subject: [PATCH 2/3] Addressed comments

---
 libcxx/include/__numeric/midpoint.h | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/libcxx/include/__numeric/midpoint.h b/libcxx/include/__numeric/midpoint.h
index f2f1cb47d29a2..8b379f47c5684 100644
--- a/libcxx/include/__numeric/midpoint.h
+++ b/libcxx/include/__numeric/midpoint.h
@@ -18,6 +18,7 @@
 #include <__type_traits/is_same.h>
 #include <__type_traits/is_void.h>
 #include <__type_traits/make_unsigned.h>
+#include <__type_traits/remove_cv.h>
 #include <limits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
@@ -31,7 +32,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
 
 #if _LIBCPP_STD_VER >= 20
 template <class _Tp>
-  requires(is_integral_v<_Tp> && !is_same_v<__remove_cv_t<_Tp>, bool>)
+  requires(is_integral_v<_Tp> && !is_same_v<remove_cv_t<_Tp>, bool>)
 [[nodiscard]]
 _LIBCPP_HIDE_FROM_ABI constexpr _Tp midpoint(_Tp __a, _Tp __b) noexcept _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK {
   using _Up                = make_unsigned_t<_Tp>;

>From f204544c9243fc463d0ef6f18c744e6c70de1c7f Mon Sep 17 00:00:00 2001
From: eiytoq <eiytoq at outlook.com>
Date: Thu, 8 Jan 2026 01:56:27 +0800
Subject: [PATCH 3/3] Update test cases

Co-authored-by: Hristo Hristov <hghristov.rmm at gmail.com>
---
 .../numeric.ops/numeric.ops.midpoint/midpoint.verify.cpp    | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.verify.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.verify.cpp
index 35ef436a29ebb..62a2a2db0231c 100644
--- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.verify.cpp
+++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.verify.cpp
@@ -29,6 +29,12 @@ void* vp       = nullptr;
 void test() {
   // expected-error at +1 {{no matching function for call to 'midpoint'}}
   (void)std::midpoint(false, true);
+  // expected-error at +1 {{no matching function for call to 'midpoint'}}
+  (void)std::midpoint<const bool>(false, true);
+  // expected-error at +1 {{no matching function for call to 'midpoint'}}
+  (void)std::midpoint<const volatile bool>(false, true);
+  // expected-error at +1 {{no matching function for call to 'midpoint'}}
+  (void)std::midpoint<volatile bool>(false, true);
 
   //  A couple of odd pointer types that should fail
   (void)std::midpoint(nullptr, nullptr); // expected-error {{no matching function for call to 'midpoint'}}



More information about the libcxx-commits mailing list