aboutsummaryrefslogtreecommitdiff
path: root/vcpkg/ports/protobuf/fix-abseil.patch
diff options
context:
space:
mode:
authorEthan Morgan <ethan@gweithio.com>2026-02-14 16:44:06 +0000
committerEthan Morgan <ethan@gweithio.com>2026-02-14 16:44:06 +0000
commit54409423f767d8b1cf30cb7d0efca6b4ca138823 (patch)
treed915ac7828703ce4b963efdd9728a1777ba18c1e /vcpkg/ports/protobuf/fix-abseil.patch
move to own git serverHEADmaster
Diffstat (limited to 'vcpkg/ports/protobuf/fix-abseil.patch')
-rw-r--r--vcpkg/ports/protobuf/fix-abseil.patch91
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