diff --git a/rs_bindings_from_cc/generate_bindings/database/rs_snippet.rs b/rs_bindings_from_cc/generate_bindings/database/rs_snippet.rs index 555773d9a..37a57612a 100644 --- a/rs_bindings_from_cc/generate_bindings/database/rs_snippet.rs +++ b/rs_bindings_from_cc/generate_bindings/database/rs_snippet.rs @@ -247,6 +247,9 @@ pub fn should_derive_copy(record: &Record) -> bool { } } +/// Returns Ok if the type can exist by value. +/// +/// This does not necessarily imply that the type is Rust movable, e.g. trivially relocatable. pub fn check_by_value(record: &Record) -> Result<()> { ensure!( record.destructor != SpecialMemberFunc::Unavailable, diff --git a/rs_bindings_from_cc/generate_bindings/lib.rs b/rs_bindings_from_cc/generate_bindings/lib.rs index a11efa50a..d6c9f0a01 100644 --- a/rs_bindings_from_cc/generate_bindings/lib.rs +++ b/rs_bindings_from_cc/generate_bindings/lib.rs @@ -729,7 +729,11 @@ fn crubit_abi_type(db: &dyn BindingsGenerator, rs_type_kind: RsTypeKind) -> Resu BridgeRsTypeKind::StdString { in_cc_std } => Ok(CrubitAbiType::StdString { in_cc_std }), }, RsTypeKind::Record { record, crate_path, .. } => { - database::rs_snippet::check_by_value(record.as_ref())?; + ensure!( + record.is_unpin(), + "Record {} must be Unpin in order to copy through a bridge buffer", + record.cc_name + ); let rust_type = crate_path .to_fully_qualified_path(make_rs_ident(record.rs_name.identifier.as_ref()));