
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_assert`s 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.
35 lines
1.1 KiB
C++
35 lines
1.1 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef _LIBCPP___NEW_LAUNDER_H
|
|
#define _LIBCPP___NEW_LAUNDER_H
|
|
|
|
#include <__config>
|
|
|
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
|
# pragma GCC system_header
|
|
#endif
|
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
|
template <class _Tp>
|
|
[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Tp* __launder(_Tp* __p) _NOEXCEPT {
|
|
// The compiler diagnoses misuses of __builtin_launder, so we don't need to add any static_asserts
|
|
// to implement the Mandates.
|
|
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 __builtin_launder(__p);
|
|
}
|
|
#endif
|
|
_LIBCPP_END_NAMESPACE_STD
|
|
|
|
#endif // _LIBCPP___NEW_LAUNDER_H
|