[libcxx-commits] [libcxx] Make C++ 20 std::midpoint compatible with libc++ (PR #74217)
Sanjay Marreddi via libcxx-commits
libcxx-commits at lists.llvm.org
Sun Dec 17 23:57:16 PST 2023
https://github.com/SanjayMarreddi updated https://github.com/llvm/llvm-project/pull/74217
>From b537aab6278a2a047dc683926bf05c9c6b63673a Mon Sep 17 00:00:00 2001
From: SanjayMarreddi <sanjay.mareddi at gmail.com>
Date: Sun, 3 Dec 2023 00:55:07 +0000
Subject: [PATCH] [libc++] Make C++ 20 std::midpoint compatible with libc++
---
libcxx/include/__numeric/midpoint.h | 13 +++----------
.../numerics/numeric.ops/midpoint.integer.pass.cpp | 8 ++++----
.../numeric.ops.midpoint/midpoint.pointer.pass.cpp | 6 ++++++
3 files changed, 13 insertions(+), 14 deletions(-)
diff --git a/libcxx/include/__numeric/midpoint.h b/libcxx/include/__numeric/midpoint.h
index c92e450767c97d..e97f98f370979f 100644
--- a/libcxx/include/__numeric/midpoint.h
+++ b/libcxx/include/__numeric/midpoint.h
@@ -51,19 +51,12 @@ _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
return __a + __half_diff;
}
-
template <class _TPtr>
-_LIBCPP_HIDE_FROM_ABI constexpr
-enable_if_t<is_pointer_v<_TPtr>
- && is_object_v<remove_pointer_t<_TPtr>>
- && ! is_void_v<remove_pointer_t<_TPtr>>
- && (sizeof(remove_pointer_t<_TPtr>) > 0), _TPtr>
-midpoint(_TPtr __a, _TPtr __b) noexcept
-{
- return __a + std::midpoint(ptrdiff_t(0), __b - __a);
+_LIBCPP_INLINE_VISIBILITY constexpr enable_if_t<is_object_v<_TPtr> && !is_void_v<_TPtr> && (sizeof(_TPtr) > 0), _TPtr*>
+midpoint(_TPtr* __a, _TPtr* __b) noexcept {
+ return __a + _VSTD::midpoint(ptrdiff_t(0), __b - __a);
}
-
template <typename _Tp>
_LIBCPP_HIDE_FROM_ABI constexpr int __sign(_Tp __val) {
return (_Tp(0) < __val) - (__val < _Tp(0));
diff --git a/libcxx/test/libcxx/numerics/numeric.ops/midpoint.integer.pass.cpp b/libcxx/test/libcxx/numerics/numeric.ops/midpoint.integer.pass.cpp
index 302948756b198c..ef559adda772f8 100644
--- a/libcxx/test/libcxx/numerics/numeric.ops/midpoint.integer.pass.cpp
+++ b/libcxx/test/libcxx/numerics/numeric.ops/midpoint.integer.pass.cpp
@@ -22,14 +22,14 @@
// Users are not supposed to provide template argument lists for
// functions in the standard library (there's an exception for min and max)
-// However, libc++ protects against this for pointers, so we check to make
-// sure that our protection is working here.
-// In some cases midpoint<int>(0,0) might get deduced as the pointer overload.
+// However, libc++ protects against this for pointers. The use of T(0)
+// in the test cases resolves potential ambiguity in template argument deduction
+// for the std::midpoint function.
template <typename T>
void test()
{
- ASSERT_SAME_TYPE(T, decltype(std::midpoint<T>(0, 0)));
+ ASSERT_SAME_TYPE(T, decltype(std::midpoint<T>(T(0), T(0))));
}
int main(int, char**)
diff --git a/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.pointer.pass.cpp b/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.pointer.pass.cpp
index 62ae099b458f23..5138fd6a37469f 100644
--- a/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.pointer.pass.cpp
+++ b/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.pointer.pass.cpp
@@ -54,6 +54,12 @@ void runtime_test()
assert(std::midpoint(array + 9, array) == array + 5);
assert(std::midpoint(array + 10, array) == array + 5);
assert(std::midpoint(array + 11, array) == array + 6);
+
+ // explicit instantiation
+ ASSERT_SAME_TYPE(decltype(std::midpoint<T>(array, array)), T*);
+ ASSERT_NOEXCEPT(std::midpoint<T>(array, array));
+ assert(std::midpoint<T>(array, array) == array);
+ assert(std::midpoint<T>(array, array + 1000) == array + 500);
}
template <typename T>
More information about the libcxx-commits
mailing list