Skip to content

Conversation

@philnik777
Copy link
Contributor

Both Clang and GCC diagnose invalid calls to __builtin_launder, which causes duplicate diagnostics when using std::launder in 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 the static_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.

@philnik777 philnik777 marked this pull request as ready for review July 15, 2025 09:43
@philnik777 philnik777 requested a review from a team as a code owner July 15, 2025 09:43
@llvmbot llvmbot added the libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi. label Jul 15, 2025
@llvmbot
Copy link
Member

llvmbot commented Jul 15, 2025

@llvm/pr-subscribers-libcxx

Author: Nikolas Klauser (philnik777)

Changes

Both Clang and GCC diagnose invalid calls to __builtin_launder, which causes duplicate diagnostics when using std::launder in 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 the static_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.


Full diff: https://github.com/llvm/llvm-project/pull/147985.diff

2 Files Affected:

  • (modified) libcxx/include/__new/launder.h (+1-5)
  • (modified) libcxx/test/std/language.support/support.dynamic/ptr.launder/launder.types.verify.cpp (+4-5)
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;
 }

Copy link
Member

@ldionne ldionne left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@philnik777 philnik777 merged commit db2eb4d into llvm:main Jul 16, 2025
77 checks passed
@philnik777 philnik777 deleted the simplify_launder branch July 16, 2025 07:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants