Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions libcxx/include/__new/launder.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -20,15 +18,14 @@
_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");
// The compiler diagnoses misuses of __builtin_launder, so we don't need to add any static_asserts.
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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Loading