Auto merge of #115987 - loongarch-rs:fix-transparent-union-abi, r=bjorn3
rustc_target/loongarch: Fix passing of transparent unions with only one non-ZST member This ensures that `MaybeUninit<T>` has the same ABI as `T` when passed through an `extern "C"` function. Fixes https://github.com/rust-lang/rust/issues/115509 r? `@bjorn3`
This commit is contained in:
commit
ad36b5a622
@ -83,6 +83,17 @@ where
|
||||
}
|
||||
FieldsShape::Union(_) => {
|
||||
if !arg_layout.is_zst() {
|
||||
if arg_layout.is_transparent() {
|
||||
let non_1zst_elem = arg_layout.non_1zst_field(cx).expect("not exactly one non-1-ZST field in non-ZST repr(transparent) union").1;
|
||||
return should_use_fp_conv_helper(
|
||||
cx,
|
||||
&non_1zst_elem,
|
||||
xlen,
|
||||
flen,
|
||||
field1_kind,
|
||||
field2_kind,
|
||||
);
|
||||
}
|
||||
return Err(CannotUseFpConv);
|
||||
}
|
||||
}
|
||||
|
@ -10,7 +10,6 @@ use std::ptr::NonNull;
|
||||
// Hence there are `cfg` throughout this test to disable parts of it on those targets.
|
||||
// sparc64: https://github.com/rust-lang/rust/issues/115336
|
||||
// mips64: https://github.com/rust-lang/rust/issues/115404
|
||||
// loongarch64: https://github.com/rust-lang/rust/issues/115509
|
||||
|
||||
macro_rules! assert_abi_compatible {
|
||||
($name:ident, $t1:ty, $t2:ty) => {
|
||||
@ -109,7 +108,6 @@ macro_rules! test_transparent {
|
||||
test_abi_compatible!(wrap1, $t, Wrapper1<$t>);
|
||||
test_abi_compatible!(wrap2, $t, Wrapper2<$t>);
|
||||
test_abi_compatible!(wrap3, $t, Wrapper3<$t>);
|
||||
#[cfg(not(target_arch = "loongarch64"))]
|
||||
test_abi_compatible!(wrap4, $t, WrapperUnion<$t>);
|
||||
}
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user