diff --git a/compiler/rustc_target/src/callconv/mips64.rs b/compiler/rustc_target/src/callconv/mips64.rs index 313ad6ddce800..a4e94ce816051 100644 --- a/compiler/rustc_target/src/callconv/mips64.rs +++ b/compiler/rustc_target/src/callconv/mips64.rs @@ -148,12 +148,12 @@ where Ty: TyAbiInterface<'a, C> + Copy, C: HasDataLayout, { - if !fn_abi.ret.is_ignore() { + if !fn_abi.ret.is_ignore() && fn_abi.ret.layout.is_sized() { classify_ret(cx, &mut fn_abi.ret); } for arg in fn_abi.args.iter_mut() { - if arg.is_ignore() { + if arg.is_ignore() || !arg.layout.is_sized() { continue; } classify_arg(cx, arg); diff --git a/compiler/rustc_target/src/callconv/sparc64.rs b/compiler/rustc_target/src/callconv/sparc64.rs index 73e9a46ed5b2d..fc732170dcb73 100644 --- a/compiler/rustc_target/src/callconv/sparc64.rs +++ b/compiler/rustc_target/src/callconv/sparc64.rs @@ -216,11 +216,14 @@ where Ty: TyAbiInterface<'a, C> + Copy, C: HasDataLayout + HasTargetSpec, { - if !fn_abi.ret.is_ignore() { + if !fn_abi.ret.is_ignore() && fn_abi.ret.layout.is_sized() { classify_arg(cx, &mut fn_abi.ret, Size::from_bytes(32)); } for arg in fn_abi.args.iter_mut() { + if !arg.layout.is_sized() { + continue; + } if arg.is_ignore() { // sparc64-unknown-linux-{gnu,musl,uclibc} doesn't ignore ZSTs. if cx.target_spec().os == Os::Linux diff --git a/tests/ui/abi/compatibility.rs b/tests/ui/abi/compatibility.rs index ce662d3fe28b0..84294ab343111 100644 --- a/tests/ui/abi/compatibility.rs +++ b/tests/ui/abi/compatibility.rs @@ -280,7 +280,8 @@ macro_rules! test_transparent_unsized { }; } -#[cfg(not(any(target_arch = "mips64", target_arch = "sparc64")))] +// NOTE: non-rustic ABIs do not support unsized types: they are skipped during ABI generation, and +// will trigger an error if they make it to rustc_monomorphize/src/mono_checks/abi_check.rs mod unsized_ { use super::*; test_transparent_unsized!(str_, str);