libstdc++: Add missing constraints to std::bit_cast [PR105027]
Our std::bit_cast was relying on the compiler to check for errors inside __builtin_bit_cast, instead of checking them as constraints. That means std::bit_cast was not SFINAE-friendly. This fix uses a requires-clause, so for old versions of Clang without concepts support the function will still be unconstrained. At some point in future we can remove the #ifdef __cpp_concepts check and rely on all compilers having full concepts support in C++20 mode. libstdc++-v3/ChangeLog: PR libstdc++/105027 * include/std/bit (bit_cast): Add constraints. * testsuite/26_numerics/bit/bit.cast/105027.cc: New test.
This commit is contained in:
parent
018805e279
commit
4894d69a1f
@ -73,6 +73,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
[[nodiscard]]
|
||||
constexpr _To
|
||||
bit_cast(const _From& __from) noexcept
|
||||
#ifdef __cpp_concepts
|
||||
requires (sizeof(_To) == sizeof(_From))
|
||||
&& __is_trivially_copyable(_To) && __is_trivially_copyable(_From)
|
||||
#endif
|
||||
{
|
||||
return __builtin_bit_cast(_To, __from);
|
||||
}
|
||||
|
18
libstdc++-v3/testsuite/26_numerics/bit/bit.cast/105027.cc
Normal file
18
libstdc++-v3/testsuite/26_numerics/bit/bit.cast/105027.cc
Normal file
@ -0,0 +1,18 @@
|
||||
// { dg-options "-std=gnu++20" }
|
||||
// { dg-do compile { target c++20 } }
|
||||
|
||||
// PR libstdc++/105027 - Missing constraints on std::bit_cast
|
||||
|
||||
#include <bit>
|
||||
|
||||
template<class T, class U>
|
||||
concept BitCastable = requires(const U& u) { std::bit_cast<T>(u); };
|
||||
|
||||
static_assert(BitCastable<int, unsigned>); // OK
|
||||
|
||||
static_assert(!BitCastable<int, char>); // #1: different size
|
||||
|
||||
struct A { A(A const&); int i; };
|
||||
static_assert(!BitCastable<int, A>); // #2: not trivially copyable
|
||||
|
||||
static_assert(!BitCastable<long, int()>); // #3: sizeof(int()) is ill-formed
|
Loading…
Reference in New Issue
Block a user