diff --git a/compiler/rustc_mir_transform/src/deduce_param_attrs.rs b/compiler/rustc_mir_transform/src/deduce_param_attrs.rs index 21762c8dd68c9..1b3e01f3a3809 100644 --- a/compiler/rustc_mir_transform/src/deduce_param_attrs.rs +++ b/compiler/rustc_mir_transform/src/deduce_param_attrs.rs @@ -195,6 +195,11 @@ pub(super) fn deduced_param_attrs<'tcx>( // Grab the optimized MIR. Analyze it to determine which arguments have been mutated. let body: &Body<'tcx> = tcx.optimized_mir(def_id); + // Arguments spread at ABI level are currently unsupported. + if body.spread_arg.is_some() { + return &[]; + } + let mut deduce = DeduceParamAttrs::new(body); deduce.visit_body(body); tracing::trace!(?deduce.usage); diff --git a/tests/codegen-llvm/deduced-param-attrs.rs b/tests/codegen-llvm/deduced-param-attrs.rs index 8062419ed5c6e..eec15a434645e 100644 --- a/tests/codegen-llvm/deduced-param-attrs.rs +++ b/tests/codegen-llvm/deduced-param-attrs.rs @@ -3,7 +3,7 @@ //@ revisions: LLVM21 LLVM20 //@ [LLVM21] min-llvm-version: 21 //@ [LLVM20] max-llvm-major-version: 20 -#![feature(custom_mir, core_intrinsics)] +#![feature(custom_mir, core_intrinsics, unboxed_closures)] #![crate_type = "lib"] extern crate core; use core::intrinsics::mir::*; @@ -170,3 +170,11 @@ pub fn not_captured_return_place() -> [u8; 80] { pub fn captured_return_place() -> [u8; 80] { black_box([0u8; 80]) } + +// Arguments spread at ABI level are unsupported. +// +// CHECK-LABEL: @spread_arg( +// CHECK-NOT: readonly +// CHECK-SAME: ) +#[no_mangle] +pub extern "rust-call" fn spread_arg(_: (Big, Big, Big)) {}