diff --git a/crates/rustc_codegen_spirv/src/abi.rs b/crates/rustc_codegen_spirv/src/abi.rs index 3c0c025845..f80bf6092c 100644 --- a/crates/rustc_codegen_spirv/src/abi.rs +++ b/crates/rustc_codegen_spirv/src/abi.rs @@ -69,6 +69,15 @@ pub(crate) fn provide(providers: &mut Providers) { // arg.make_direct_deprecated(); + // FIXME(eddyb) detect `#[rust_gpu::vector::v1]` more specifically, + // to avoid affecting anything should actually be passed as a pair. + if let PassMode::Pair(..) = arg.mode { + // HACK(eddyb) this avoids breaking e.g. `&[T]` pairs. + if let TyKind::Adt(..) = arg.layout.ty.kind() { + arg.mode = PassMode::Direct(ArgAttributes::new()); + } + } + // Avoid pointlessly passing ZSTs, just like the official Rust ABI. if arg.layout.is_zst() { arg.mode = PassMode::Ignore;