-
Notifications
You must be signed in to change notification settings - Fork 15k
[libc++] Simplify std::launder #147985
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[libc++] Simplify std::launder #147985
Conversation
f1bcc04 to
fa02359
Compare
|
@llvm/pr-subscribers-libcxx Author: Nikolas Klauser (philnik777) ChangesBoth Clang and GCC diagnose invalid calls to Full diff: https://github.com/llvm/llvm-project/pull/147985.diff 2 Files Affected:
diff --git a/libcxx/include/__new/launder.h b/libcxx/include/__new/launder.h
index 83d80015913d9..78a7a415625e0 100644
--- a/libcxx/include/__new/launder.h
+++ b/libcxx/include/__new/launder.h
@@ -10,8 +10,6 @@
#define _LIBCPP___NEW_LAUNDER_H
#include <__config>
-#include <__type_traits/is_function.h>
-#include <__type_traits/is_void.h>
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
# pragma GCC system_header
@@ -20,15 +18,13 @@
_LIBCPP_BEGIN_NAMESPACE_STD
template <class _Tp>
[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Tp* __launder(_Tp* __p) _NOEXCEPT {
- static_assert(!(is_function<_Tp>::value), "can't launder functions");
- static_assert(!is_void<_Tp>::value, "can't launder cv-void");
return __builtin_launder(__p);
}
#if _LIBCPP_STD_VER >= 17
template <class _Tp>
[[nodiscard]] inline _LIBCPP_HIDE_FROM_ABI constexpr _Tp* launder(_Tp* __p) noexcept {
- return std::__launder(__p);
+ return __builtin_launder(__p);
}
#endif
_LIBCPP_END_NAMESPACE_STD
diff --git a/libcxx/test/std/language.support/support.dynamic/ptr.launder/launder.types.verify.cpp b/libcxx/test/std/language.support/support.dynamic/ptr.launder/launder.types.verify.cpp
index 4f2b627b8601a..5f6e53f98ad34 100644
--- a/libcxx/test/std/language.support/support.dynamic/ptr.launder/launder.types.verify.cpp
+++ b/libcxx/test/std/language.support/support.dynamic/ptr.launder/launder.types.verify.cpp
@@ -25,12 +25,11 @@ int main(int, char**) {
(void)std::launder((void*)nullptr);
(void)std::launder((const void*)nullptr);
(void)std::launder((volatile void*)nullptr);
- (void)std::launder(
- (const volatile void*)nullptr); // expected-error-re@*:* 4 {{static assertion failed{{.*}}can't launder cv-void}}
- // expected-error@*:* 0-4 {{void pointer argument to '__builtin_launder' is not allowed}}
+ (void)std::launder((const volatile void*)nullptr);
+ // expected-error@*:* 4 {{void pointer argument to '__builtin_launder' is not allowed}}
- (void)std::launder(foo); // expected-error-re@*:* 1 {{static assertion failed{{.*}}can't launder functions}}
- // expected-error@*:* 0-1 {{function pointer argument to '__builtin_launder' is not allowed}}
+ (void)std::launder(foo);
+ // expected-error@*:* 1 {{function pointer argument to '__builtin_launder' is not allowed}}
return 0;
}
|
fa02359 to
6f3806a
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
Both Clang and GCC diagnose invalid calls to
__builtin_launder, which causes duplicate diagnostics when usingstd::launderin an invalid way. While the diagnostic message for the builtin isn't perferct, it's definitely good enough to understand the problem and adding our own diagnostic doesn't really make things any clearer. Because of that, this patch simply removes thestatic_asserts and lets the compiler handle diagnosing incorrect arguments instead. This not only simplifies our implementation, but also improves compile times a bit, since we avoid instantiating some type traits.