git: 29e3479f2d30 - stable/15 - libc++: avoid use of deprecated builtin
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 15 Dec 2025 15:03:01 UTC
The branch stable/15 has been updated by emaste:
URL: https://cgit.FreeBSD.org/src/commit/?id=29e3479f2d3068a2f3e2dbb578d3fabf6389e5a6
commit 29e3479f2d3068a2f3e2dbb578d3fabf6389e5a6
Author: Alex Richardson <arichardson@FreeBSD.org>
AuthorDate: 2025-09-15 22:10:07 +0000
Commit: Ed Maste <emaste@FreeBSD.org>
CommitDate: 2025-12-15 15:02:09 +0000
libc++: avoid use of deprecated builtin
This pulls in LLVM commit accfbd4cb327411ad66c0109ba1841482b871967 to
avoid the use of __libcpp_is_trivially_relocatable.
This fixes building FreeBSD libc++ with clang HEAD as of today.
Original commit message:
[libc++] Replace __is_trivially_relocatable by is_trivially_copyable (#124970)
The __is_trivially_relocatable builtin has semantics that do not
correspond to any current or future notion of trivial relocation.
Furthermore, it currently leads to incorrect optimizations for some
types on supported compilers:
- Clang on Windows where types with non-trivial destructors get
incorrectly optimized
- AppleClang where types with non-trivial move constructors get
incorrectly optimized
Until there is an agreed upon and bugfree implementation of what it
means to be trivially relocatable, it is safer to simply use trivially
copyable instead. This doesn't leave a lot of types behind and is
definitely correct.
Reviewed by: dim
MFC after: 1 week
Differential Revision: https://reviews.freebsd.org/D52529
(cherry picked from commit d61c75f634cf52fdef9590601d881f85275eee9a)
---
.../libcxx/include/__type_traits/is_trivially_relocatable.h | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/contrib/llvm-project/libcxx/include/__type_traits/is_trivially_relocatable.h b/contrib/llvm-project/libcxx/include/__type_traits/is_trivially_relocatable.h
index c0871731cc00..9b0e240de55f 100644
--- a/contrib/llvm-project/libcxx/include/__type_traits/is_trivially_relocatable.h
+++ b/contrib/llvm-project/libcxx/include/__type_traits/is_trivially_relocatable.h
@@ -11,7 +11,6 @@
#include <__config>
#include <__type_traits/enable_if.h>
-#include <__type_traits/integral_constant.h>
#include <__type_traits/is_same.h>
#include <__type_traits/is_trivially_copyable.h>
@@ -23,8 +22,11 @@ _LIBCPP_BEGIN_NAMESPACE_STD
// A type is trivially relocatable if a move construct + destroy of the original object is equivalent to
// `memcpy(dst, src, sizeof(T))`.
-
-#if __has_builtin(__is_trivially_relocatable)
+//
+// Note that we don't use the __is_trivially_relocatable Clang builtin right now because it does not
+// implement the semantics of any current or future trivial relocation proposal and it can lead to
+// incorrect optimizations on some platforms (Windows) and supported compilers (AppleClang).
+#if __has_builtin(__is_trivially_relocatable) && 0
template <class _Tp, class = void>
struct __libcpp_is_trivially_relocatable : integral_constant<bool, __is_trivially_relocatable(_Tp)> {};
#else