Skip to content

Commit 1e3f8c6

Browse files
committed
Auto merge of rust-lang#113128 - WaffleLapkin:become_trully_unuwuable, r=oli-obk,RalfJung
Support tail calls in mir via `TerminatorKind::TailCall` This is one of the interesting bits in tail call implementation — MIR support. This adds a new `TerminatorKind` which represents a tail call: ```rust TailCall { func: Operand<'tcx>, args: Vec<Operand<'tcx>>, fn_span: Span, }, ``` *Structurally* this is very similar to a normal `Call` but is missing a few fields: - `destination` — tail calls don't write to destination, instead they pass caller's destination to the callee (such that eventual `return` will write to the caller of the function that used tail call) - `target` — similarly to `destination` tail calls pass the caller's return address to the callee, so there is nothing to do - `unwind` — I _think_ this is applicable too, although it's a bit confusing - `call_source` — `become` forbids operators and is not created as a lowering of something else; tail calls always come from HIR (at least for now) It might be helpful to read the interpreter implementation to understand what `TailCall` means exactly, although I've tried documenting it too. ----- There are a few `FIXME`-questions still left, ideally we'd be able to answer them during review ':) ----- r? `@oli-obk` cc `@scottmcm` `@DrMeepster` `@JakobDegen`
2 parents 4d26177 + 791ff40 commit 1e3f8c6

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

clippy_utils/src/qualify_min_const_fn.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,8 @@ fn check_terminator<'tcx>(
330330
target: _,
331331
unwind: _,
332332
fn_span: _,
333-
} => {
333+
}
334+
| TerminatorKind::TailCall { func, args, fn_span: _ } => {
334335
let fn_ty = func.ty(body, tcx);
335336
if let ty::FnDef(fn_def_id, _) = *fn_ty.kind() {
336337
if !is_const_fn(tcx, fn_def_id, msrv) {

0 commit comments

Comments
 (0)