Skip to content

Commit 52959a8

Browse files
Fix musttail returns for cast/indirect ABIs
1 parent 3a02b35 commit 52959a8

File tree

4 files changed

+14
-11
lines changed

4 files changed

+14
-11
lines changed

compiler/rustc_codegen_llvm/src/builder.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ use rustc_codegen_ssa::mir::place::PlaceRef;
1616
use rustc_codegen_ssa::traits::*;
1717
use rustc_data_structures::small_c_str::SmallCStr;
1818
use rustc_hir::def_id::DefId;
19-
use rustc_middle::bug;
2019
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs;
2120
use rustc_middle::ty::layout::{
2221
FnAbiError, FnAbiOfHelpers, FnAbiRequest, HasTypingEnv, LayoutError, LayoutOfHelpers,
@@ -1458,10 +1457,7 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
14581457

14591458
match &fn_abi.ret.mode {
14601459
PassMode::Ignore | PassMode::Indirect { .. } => self.ret_void(),
1461-
PassMode::Direct(_) | PassMode::Pair { .. } => self.ret(call),
1462-
mode @ PassMode::Cast { .. } => {
1463-
bug!("Encountered `PassMode::{mode:?}` during codegen")
1464-
}
1460+
PassMode::Direct(_) | PassMode::Pair { .. } | PassMode::Cast { .. } => self.ret(call),
14651461
}
14661462
}
14671463

compiler/rustc_codegen_ssa/src/mir/block.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1063,7 +1063,17 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
10631063
let return_dest = self.make_return_dest(bx, destination, &fn_abi.ret, &mut llargs);
10641064
target.map(|target| (return_dest, target))
10651065
}
1066-
CallKind::Tail => None,
1066+
CallKind::Tail => {
1067+
if fn_abi.ret.is_indirect() {
1068+
match self.make_return_dest(bx, destination, &fn_abi.ret, &mut llargs) {
1069+
ReturnDest::Nothing => {}
1070+
_ => bug!(
1071+
"tail calls to functions with indirect returns cannot store into a destination"
1072+
),
1073+
}
1074+
}
1075+
None
1076+
}
10671077
};
10681078

10691079
// Split the rust-call tupled arguments off.

tests/ui/explicit-tail-calls/become-cast-return.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
//@ check-pass
1+
//@ run-pass
22
//@ ignore-backends: gcc
3-
//@ known-bug: #148239
4-
//@ compile-flags: -Zno-codegen
53
#![expect(incomplete_features)]
64
#![feature(explicit_tail_calls)]
75

tests/ui/explicit-tail-calls/become-indirect-return.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
//@ run-pass
22
//@ ignore-backends: gcc
3-
//@ known-bug: #148239
43
#![expect(incomplete_features)]
54
#![feature(explicit_tail_calls)]
65

@@ -17,5 +16,5 @@ fn dispatch(param: &Box<u8>) -> [u8; 24] {
1716
fn main() {
1817
let param = Box::new(0);
1918
let result = dispatch(&param);
20-
assert_ne!(result, [1; 24]); // the data is not right!
19+
assert_eq!(result, [1; 24]);
2120
}

0 commit comments

Comments
 (0)