[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