[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
Tue Jan 6 22:53:21 PST 2026


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

>From 8382b40b9eaf697a8bd1997c012cf654fa513af6 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/2] [libc++] Fix LWG 4265: std::midpoint should not accept
 const bool

---
 libcxx/docs/Status/Cxx2cIssues.csv                |  2 +-
 libcxx/include/__numeric/midpoint.h               |  5 +++--
 .../numeric.ops.midpoint/midpoint.verify.cpp      | 15 ++++++++-------
 3 files changed, 12 insertions(+), 10 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 2ba80e5cca07d..07ade9d5e1c55 100644
--- a/libcxx/include/__numeric/midpoint.h
+++ b/libcxx/include/__numeric/midpoint.h
@@ -35,8 +35,9 @@ _LIBCPP_BEGIN_NAMESPACE_STD
 
 #if _LIBCPP_STD_VER >= 20
 template <class _Tp>
-_LIBCPP_HIDE_FROM_ABI constexpr enable_if_t<is_integral_v<_Tp> && !is_same_v<bool, _Tp> && !is_null_pointer_v<_Tp>, _Tp>
-midpoint(_Tp __a, _Tp __b) noexcept _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK {
+_LIBCPP_HIDE_FROM_ABI constexpr enable_if_t<
+    is_integral_v<_Tp> && !is_same_v<bool, __remove_cv_t<_Tp>> && !is_null_pointer_v<_Tp>,
+    _Tp> midpoint(_Tp __a, _Tp __b) noexcept _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK {
   using _Up                = make_unsigned_t<_Tp>;
   constexpr _Up __bitshift = numeric_limits<_Up>::digits - 1;
 
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 7028e0f32945c..0218770ded4ed 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
@@ -27,13 +27,14 @@ void       *vp = nullptr;
 
 int main(int, char**)
 {
-    (void) std::midpoint(false, true);  // expected-error {{no matching function for call to 'midpoint'}}
+  (void)std::midpoint(false, true);             // expected-error {{no matching function for call to 'midpoint'}}
+  (void)std::midpoint<const bool>(false, true); // expected-error {{no matching function for call to 'midpoint'}}
 
-//  A couple of odd pointer types that should fail
-    (void) std::midpoint(nullptr, nullptr);  // expected-error {{no matching function for call to 'midpoint'}}
-    (void) std::midpoint(func1, func2);      // expected-error {{no matching function for call to 'midpoint'}}
-    (void) std::midpoint(ip, ip);            // expected-error {{no matching function for call to 'midpoint'}}
-    (void) std::midpoint(vp, vp);            // expected-error {{no matching function for call to 'midpoint'}}
+  //  A couple of odd pointer types that should fail
+  (void)std::midpoint(nullptr, nullptr); // expected-error {{no matching function for call to 'midpoint'}}
+  (void)std::midpoint(func1, func2);     // expected-error {{no matching function for call to 'midpoint'}}
+  (void)std::midpoint(ip, ip);           // expected-error {{no matching function for call to 'midpoint'}}
+  (void)std::midpoint(vp, vp);           // expected-error {{no matching function for call to 'midpoint'}}
 
-    return 0;
+  return 0;
 }

>From 23291a45ee4d4a540fa6f683a810a25e295839ba 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/2] 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 07ade9d5e1c55..66ac699d65274 100644
--- a/libcxx/include/__numeric/midpoint.h
+++ b/libcxx/include/__numeric/midpoint.h
@@ -21,6 +21,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 <__type_traits/remove_pointer.h>
 #include <limits>
 
@@ -36,7 +37,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
 #if _LIBCPP_STD_VER >= 20
 template <class _Tp>
 _LIBCPP_HIDE_FROM_ABI constexpr enable_if_t<
-    is_integral_v<_Tp> && !is_same_v<bool, __remove_cv_t<_Tp>> && !is_null_pointer_v<_Tp>,
+    is_integral_v<_Tp> && !is_same_v<bool, remove_cv_t<_Tp>> && !is_null_pointer_v<_Tp>,
     _Tp> midpoint(_Tp __a, _Tp __b) noexcept _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK {
   using _Up                = make_unsigned_t<_Tp>;
   constexpr _Up __bitshift = numeric_limits<_Up>::digits - 1;



More information about the libcxx-commits mailing list