Commit 63d26fad by Abseil Team Committed by Derek Mauro

Export of internal Abseil changes

--
c475e8ac1ea163248415e7d4bdc05e3c47dd8f3d by Derek Mauro <dmauro@google.com>:

Replace absl::bit_cast with std::bit_cast in C++20

Remove the deprecated implementation that is less-strict than the
standard, and also relies on undefined behavior

PiperOrigin-RevId: 425391711

--
dc97c996aed85161f0e490baafd3ed851e8bea9d by Abseil Team <absl-team@google.com>:

Add enum example for ABSL_DEPRECATED()

PiperOrigin-RevId: 425311634
GitOrigin-RevId: c475e8ac1ea163248415e7d4bdc05e3c47dd8f3d
Change-Id: Id8f159b37fe3f3cace6ab7bce08daf9888c44bcf
parent 940c06c2
...@@ -656,6 +656,10 @@ ...@@ -656,6 +656,10 @@
// ABSL_DEPRECATED("Use DoThat() instead") // ABSL_DEPRECATED("Use DoThat() instead")
// void DoThis(); // void DoThis();
// //
// enum FooEnum {
// kBar ABSL_DEPRECATED("Use kBaz instead"),
// };
//
// Every usage of a deprecated entity will trigger a warning when compiled with // Every usage of a deprecated entity will trigger a warning when compiled with
// clang's `-Wdeprecated-declarations` option. This option is turned off by // clang's `-Wdeprecated-declarations` option. This option is turned off by
// default, but the warnings will be reported by clang-tidy. // default, but the warnings will be reported by clang-tidy.
......
...@@ -29,6 +29,10 @@ ...@@ -29,6 +29,10 @@
#include <type_traits> #include <type_traits>
#include <utility> #include <utility>
#if defined(__cpp_lib_bit_cast) && __cpp_lib_bit_cast >= 201806L
#include <bit> // For std::bit_cast.
#endif // defined(__cpp_lib_bit_cast) && __cpp_lib_bit_cast >= 201806L
#include "absl/base/internal/identity.h" #include "absl/base/internal/identity.h"
#include "absl/base/macros.h" #include "absl/base/macros.h"
#include "absl/meta/type_traits.h" #include "absl/meta/type_traits.h"
...@@ -36,23 +40,6 @@ ...@@ -36,23 +40,6 @@
namespace absl { namespace absl {
ABSL_NAMESPACE_BEGIN ABSL_NAMESPACE_BEGIN
namespace internal_casts {
template <class Dest, class Source>
struct is_bitcastable
: std::integral_constant<
bool,
sizeof(Dest) == sizeof(Source) &&
type_traits_internal::is_trivially_copyable<Source>::value &&
type_traits_internal::is_trivially_copyable<Dest>::value
#if !ABSL_HAVE_BUILTIN(__builtin_bit_cast)
&& std::is_default_constructible<Dest>::value
#endif
> {
};
} // namespace internal_casts
// implicit_cast() // implicit_cast()
// //
// Performs an implicit conversion between types following the language // Performs an implicit conversion between types following the language
...@@ -123,7 +110,7 @@ constexpr To implicit_cast(typename absl::internal::identity_t<To> to) { ...@@ -123,7 +110,7 @@ constexpr To implicit_cast(typename absl::internal::identity_t<To> to) {
// floating point value: // floating point value:
// //
// float f = 3.14159265358979; // float f = 3.14159265358979;
// int i = bit_cast<int32_t>(f); // int i = bit_cast<int>(f);
// // i = 0x40490fdb // // i = 0x40490fdb
// //
// Reinterpreting and accessing a value directly as a different type (as shown // Reinterpreting and accessing a value directly as a different type (as shown
...@@ -151,48 +138,41 @@ constexpr To implicit_cast(typename absl::internal::identity_t<To> to) { ...@@ -151,48 +138,41 @@ constexpr To implicit_cast(typename absl::internal::identity_t<To> to) {
// introducing this undefined behavior (since the original value is never // introducing this undefined behavior (since the original value is never
// accessed in the wrong way). // accessed in the wrong way).
// //
// NOTE: The requirements here are more strict than the bit_cast of standard // The requirements of `absl::bit_cast` are more strict than that of
// proposal P0476 when __builtin_bit_cast is not available. // `std::bit_cast` unless compiler support is available. Specifically, without
// Specifically, this implementation also requires `Dest` to be // compiler support, this implementation also requires `Dest` to be
// default-constructible. // default-constructible. In C++20, `absl::bit_cast` is replaced by
template < // `std::bit_cast`.
typename Dest, typename Source, #if defined(__cpp_lib_bit_cast) && __cpp_lib_bit_cast >= 201806L
typename std::enable_if<internal_casts::is_bitcastable<Dest, Source>::value,
int>::type = 0> using std::bit_cast;
#else // defined(__cpp_lib_bit_cast) && __cpp_lib_bit_cast >= 201806L
template <typename Dest, typename Source,
typename std::enable_if<
sizeof(Dest) == sizeof(Source) &&
type_traits_internal::is_trivially_copyable<Source>::value &&
type_traits_internal::is_trivially_copyable<Dest>::value
#if !ABSL_HAVE_BUILTIN(__builtin_bit_cast)
&& std::is_default_constructible<Dest>::value
#endif // !ABSL_HAVE_BUILTIN(__builtin_bit_cast)
,
int>::type = 0>
#if ABSL_HAVE_BUILTIN(__builtin_bit_cast) #if ABSL_HAVE_BUILTIN(__builtin_bit_cast)
inline constexpr Dest bit_cast(const Source& source) { inline constexpr Dest bit_cast(const Source& source) {
return __builtin_bit_cast(Dest, source); return __builtin_bit_cast(Dest, source);
} }
#else #else // ABSL_HAVE_BUILTIN(__builtin_bit_cast)
inline Dest bit_cast(const Source& source) { inline Dest bit_cast(const Source& source) {
Dest dest; Dest dest;
memcpy(static_cast<void*>(std::addressof(dest)), memcpy(static_cast<void*>(std::addressof(dest)),
static_cast<const void*>(std::addressof(source)), sizeof(dest)); static_cast<const void*>(std::addressof(source)), sizeof(dest));
return dest; return dest;
} }
#endif #endif // ABSL_HAVE_BUILTIN(__builtin_bit_cast)
// NOTE: This overload is only picked if the requirements of bit_cast are
// not met. It is therefore UB, but is provided temporarily as previous
// versions of this function template were unchecked. Do not use this in
// new code.
template <
typename Dest, typename Source,
typename std::enable_if<
!internal_casts::is_bitcastable<Dest, Source>::value,
int>::type = 0>
ABSL_DEPRECATED(
"absl::bit_cast type requirements were violated. Update the types "
"being used such that they are the same size and are both "
"TriviallyCopyable.")
inline Dest bit_cast(const Source& source) {
static_assert(sizeof(Dest) == sizeof(Source),
"Source and destination types should have equal sizes.");
Dest dest; #endif // defined(__cpp_lib_bit_cast) && __cpp_lib_bit_cast >= 201806L
memcpy(&dest, &source, sizeof(dest));
return dest;
}
ABSL_NAMESPACE_END ABSL_NAMESPACE_END
} // namespace absl } // namespace absl
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment