From c7b8dd4e93ff1fa5e2136cdd43e1e563ae45f3b8 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 19 Nov 2023 16:03:07 +0100 Subject: [PATCH] make_direct_deprecated: dont overwrite already set attributes --- compiler/rustc_target/src/abi/call/mod.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/compiler/rustc_target/src/abi/call/mod.rs b/compiler/rustc_target/src/abi/call/mod.rs index ab0a24a6ebb..bbf21f169bb 100644 --- a/compiler/rustc_target/src/abi/call/mod.rs +++ b/compiler/rustc_target/src/abi/call/mod.rs @@ -584,20 +584,26 @@ impl<'a, Ty> ArgAbi<'a, Ty> { /// Only exists because of past ABI mistakes that will take time to fix /// (see ). pub fn make_direct_deprecated(&mut self) { - self.mode = PassMode::Direct(ArgAttributes::new()); + match self.mode { + PassMode::Indirect { .. } => { + self.mode = PassMode::Direct(ArgAttributes::new()); + } + PassMode::Ignore | PassMode::Direct(_) | PassMode::Pair(_, _) => return, // already direct + _ => panic!("Tried to make {:?} direct", self.mode), + } } pub fn make_indirect(&mut self) { match self.mode { - PassMode::Direct(_) | PassMode::Pair(_, _) => {} + PassMode::Direct(_) | PassMode::Pair(_, _) => { + self.mode = Self::indirect_pass_mode(&self.layout); + } PassMode::Indirect { attrs: _, meta_attrs: _, on_stack: false } => { // already indirect return; } _ => panic!("Tried to make {:?} indirect", self.mode), } - - self.mode = Self::indirect_pass_mode(&self.layout); } pub fn make_indirect_byval(&mut self, byval_align: Option) {