hpb: add arena check for set_alias + maps
PiperOrigin-RevId: 810537103
diff --git a/hpb_generator/gen_accessors.cc b/hpb_generator/gen_accessors.cc
index 3427fa1..d874a18 100644
--- a/hpb_generator/gen_accessors.cc
+++ b/hpb_generator/gen_accessors.cc
@@ -432,6 +432,11 @@
R"cc(
bool $class_name$::set_alias_$field_name$($const_key$ key,
$const_val_ptr$ value) {
+#ifndef NDEBUG
+ ABSL_CHECK(
+ upb_Arena_IsFused(arena_, hpb::interop::upb::GetArena(value)) ||
+ upb_Arena_HasRef(arena_, hpb::interop::upb::GetArena(value)));
+#endif
$optional_conversion_code$return
$upb_msg_name$_$upb_field_name$_set(
msg_, $converted_key_name$,
@@ -453,6 +458,12 @@
R"cc(
bool $class_name$::set_alias_$field_name$($const_key$ key,
$mut_val_ptr$ value) {
+#ifndef NDEBUG
+ ABSL_CHECK(
+
+ upb_Arena_IsFused(arena_, hpb::interop::upb::GetArena(value)) ||
+ upb_Arena_HasRef(arena_, hpb::interop::upb::GetArena(value)));
+#endif
$optional_conversion_code$return
$upb_msg_name$_$upb_field_name$_set(
msg_, $converted_key_name$,
diff --git a/hpb_generator/tests/test_generated.cc b/hpb_generator/tests/test_generated.cc
index a7e95c7..89ec0c1 100644
--- a/hpb_generator/tests/test_generated.cc
+++ b/hpb_generator/tests/test_generated.cc
@@ -768,6 +768,19 @@
hpb::interop::upb::GetMessage(c2.value()));
}
+#ifndef NDEBUG
+TEST(CppGeneratedCode, SetAliasMapFailsDifferentArena) {
+ hpb::Arena arena1;
+ hpb::Arena arena2;
+ auto parent1 = hpb::CreateMessage<ParentWithMap>(arena1);
+
+ auto child = hpb::CreateMessage<Child>(arena2);
+ constexpr int key = 1;
+ EXPECT_DEATH(parent1.set_alias_child_map(key, child),
+ "hpb::interop::upb::GetArena");
+}
+#endif
+
TEST(CppGeneratedCode, SetAliasSucceedsForDifferentArenaRefs) {
hpb::Arena arena;
auto parent1 = hpb::CreateMessage<Parent>(arena);