diff options
Diffstat (limited to 'vcpkg/ports/protobuf/fix-abseil.patch')
| -rw-r--r-- | vcpkg/ports/protobuf/fix-abseil.patch | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/vcpkg/ports/protobuf/fix-abseil.patch b/vcpkg/ports/protobuf/fix-abseil.patch new file mode 100644 index 0000000..0314591 --- /dev/null +++ b/vcpkg/ports/protobuf/fix-abseil.patch @@ -0,0 +1,91 @@ +diff --git a/src/google/protobuf/arena.h b/src/google/protobuf/arena.h +index 545fd5126..55b1ec83b 100644 +--- a/src/google/protobuf/arena.h ++++ b/src/google/protobuf/arena.h +@@ -32,7 +32,6 @@ using type_info = ::type_info; + #include "absl/base/optimization.h" + #include "absl/base/prefetch.h" + #include "absl/log/absl_check.h" +-#include "absl/utility/internal/if_constexpr.h" + #include "google/protobuf/arena_align.h" + #include "google/protobuf/arena_allocation_policy.h" + #include "google/protobuf/port.h" +@@ -214,41 +213,31 @@ class PROTOBUF_EXPORT PROTOBUF_ALIGNAS(8) Arena final { + // otherwise, returns a heap-allocated object. + template <typename T, typename... Args> + PROTOBUF_NDEBUG_INLINE static T* Create(Arena* arena, Args&&... args) { +- return absl::utility_internal::IfConstexprElse< +- is_arena_constructable<T>::value>( +- // Arena-constructable +- [arena](auto&&... args) { +- using Type = std::remove_const_t<T>; +-#ifdef __cpp_if_constexpr +- // DefaultConstruct/CopyConstruct are optimized for messages, which +- // are both arena constructible and destructor skippable and they +- // assume much. Don't use these functions unless the invariants +- // hold. +- if constexpr (is_destructor_skippable<T>::value) { +- constexpr auto construct_type = GetConstructType<T, Args&&...>(); +- // We delegate to DefaultConstruct/CopyConstruct where appropriate +- // because protobuf generated classes have external templates for +- // these functions for code size reasons. When `if constexpr` is not +- // available always use the fallback. +- if constexpr (construct_type == ConstructType::kDefault) { +- return static_cast<Type*>(DefaultConstruct<Type>(arena)); +- } else if constexpr (construct_type == ConstructType::kCopy) { +- return static_cast<Type*>(CopyConstruct<Type>(arena, &args...)); +- } +- } +-#endif +- return CreateArenaCompatible<Type>(arena, +- std::forward<Args>(args)...); +- }, +- // Non arena-constructable +- [arena](auto&&... args) { +- if (PROTOBUF_PREDICT_FALSE(arena == nullptr)) { +- return new T(std::forward<Args>(args)...); +- } +- return new (arena->AllocateInternal<T>()) +- T(std::forward<Args>(args)...); +- }, +- std::forward<Args>(args)...); ++ if constexpr (is_arena_constructable<T>::value) { ++ using Type = std::remove_const_t<T>; ++ // DefaultConstruct/CopyConstruct are optimized for messages, which ++ // are both arena constructible and destructor skippable and they ++ // assume much. Don't use these functions unless the invariants ++ // hold. ++ if constexpr (is_destructor_skippable<T>::value) { ++ constexpr auto construct_type = GetConstructType<T, Args&&...>(); ++ // We delegate to DefaultConstruct/CopyConstruct where appropriate ++ // because protobuf generated classes have external templates for ++ // these functions for code size reasons. When `if constexpr` is not ++ // available always use the fallback. ++ if constexpr (construct_type == ConstructType::kDefault) { ++ return static_cast<Type*>(DefaultConstruct<Type>(arena)); ++ } else if constexpr (construct_type == ConstructType::kCopy) { ++ return static_cast<Type*>(CopyConstruct<Type>(arena, &args...)); ++ } ++ } ++ return CreateArenaCompatible<Type>(arena, std::forward<Args>(args)...); ++ } else { ++ if (ABSL_PREDICT_FALSE(arena == nullptr)) { ++ return new T(std::forward<Args>(args)...); ++ } ++ return new (arena->AllocateInternal<T>()) T(std::forward<Args>(args)...); ++ } + } + + // API to delete any objects not on an arena. This can be used to safely +diff --git a/cmake/abseil-cpp.cmake b/cmake/abseil-cpp.cmake +index 1b64affa5..c45fb222a 100644 +--- a/cmake/abseil-cpp.cmake ++++ b/cmake/abseil-cpp.cmake +@@ -72,7 +72,6 @@ else() + absl::flat_hash_set + absl::function_ref + absl::hash +- absl::if_constexpr + absl::layout + absl::log_initialize + absl::log_globals |