Add static assertions for size and alignment to generated Rust code.
Followup CLs will add corresponding assertions to the generated C++ code as well
as assertions for field offsets.
PiperOrigin-RevId: 398421352
diff --git a/rs_bindings_from_cc/src_code_gen.rs b/rs_bindings_from_cc/src_code_gen.rs
index 73aa68d..20d9d14 100644
--- a/rs_bindings_from_cc/src_code_gen.rs
+++ b/rs_bindings_from_cc/src_code_gen.rs
@@ -99,11 +99,16 @@
}
})
.collect_vec();
+ let size = record.size;
+ let alignment = record.alignment;
Ok(quote! {
#[repr(C)]
pub struct #ident {
#( #field_accesses #field_idents: #field_types, )*
}
+
+ const_assert_eq!(std::mem::size_of::<#ident>(), #size);
+ const_assert_eq!(std::mem::align_of::<#ident>(), #alignment);
})
}
@@ -156,7 +161,17 @@
}
};
+ let imports = if records.is_empty() {
+ quote! {}
+ } else {
+ quote! {
+ use static_assertions::const_assert_eq;
+ }
+ };
+
let result = quote! {
+ #imports
+
#( #api_funcs )*
#( #records )*
@@ -454,12 +469,17 @@
assert_eq!(
generate_rs_api(&ir)?,
quote! {
+ use static_assertions::const_assert_eq;
+
#[repr(C)]
pub struct SomeStruct {
pub public_int: i32,
protected_int: i32,
private_int: i32,
}
+
+ const_assert_eq!(std::mem::size_of::<SomeStruct>(), 12usize);
+ const_assert_eq!(std::mem::align_of::<SomeStruct>(), 4usize);
}
.to_string()
);