about summary refs log tree commit diff
path: root/compiler
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2023-11-19 16:03:07 +0100
committerRalf Jung <post@ralfj.de>2023-11-19 16:03:07 +0100
commitc7b8dd4e93ff1fa5e2136cdd43e1e563ae45f3b8 (patch)
tree37168a4b5c40bc95ce42592687802f58bae5a87c /compiler
parentcfb47ca5df93c82983563fa37673f7108eb94df4 (diff)
downloadrust-c7b8dd4e93ff1fa5e2136cdd43e1e563ae45f3b8.tar.gz
rust-c7b8dd4e93ff1fa5e2136cdd43e1e563ae45f3b8.zip
make_direct_deprecated: dont overwrite already set attributes
Diffstat (limited to 'compiler')
-rw-r--r--compiler/rustc_target/src/abi/call/mod.rs14
1 files 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 <https://github.com/rust-lang/rust/issues/115666>).
     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<Align>) {