rust/compiler/rustc_borrowck/src
bors 9af6fee87d Auto merge of #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`
2024-07-08 04:35:04 +00:00
..
constraints Add description for why this PR was made 2024-07-01 11:52:38 +02:00
diagnostics Use ControlFlow results for visitors that are only looking for a single value 2024-07-05 15:00:40 +00:00
polonius Support tail calls in mir via TerminatorKind::TailCall 2024-07-07 17:11:04 +02:00
region_infer Auto merge of #123720 - amandasystems:dyn-enable-refactor, r=nikomatsakis 2024-07-03 01:24:07 +00:00
type_check Auto merge of #113128 - WaffleLapkin:become_trully_unuwuable, r=oli-obk,RalfJung 2024-07-08 04:35:04 +00:00
util Move some utils out of rustc_const_eval 2023-04-16 12:05:54 +02:00
borrow_set.rs Remove confusing use_polonius flag and do less cloning 2024-06-05 10:57:27 +02:00
borrowck_errors.rs Rename 'cx to 'infcx 2024-06-27 09:07:57 +00:00
consumers.rs BorrowckInferCtxt: infcx by value 2024-05-06 15:20:13 +00:00
dataflow.rs Split lifetimes on mir borrowck dataflow 2024-06-26 16:01:44 +00:00
def_use.rs Remove extern crate rustc_middle from numerous crates. 2024-04-29 14:50:45 +10:00
facts.rs Remove usage of specialization from rustc_borrowck 2024-06-30 16:42:53 +00:00
lib.rs Auto merge of #113128 - WaffleLapkin:become_trully_unuwuable, r=oli-obk,RalfJung 2024-07-08 04:35:04 +00:00
location.rs Invert diagnostic lints. 2024-02-06 13:12:33 +11:00
member_constraints.rs Invert diagnostic lints. 2024-02-06 13:12:33 +11:00
nll.rs Restrict diagnostic context lifetime of mir borrowck to InferCtxt instead of TyCtxt 2024-06-26 16:01:44 +00:00
path_utils.rs remove a bunch of dead parameters in fn 2024-02-12 09:51:35 +08:00
place_ext.rs Move trait into attr so it's greppable 2024-02-16 15:07:37 +00:00
places_conflict.rs Remove extern crate rustc_middle from numerous crates. 2024-04-29 14:50:45 +10:00
prefixes.rs Separate the mir body lifetime from the other lifetimes 2024-06-24 14:28:14 +00:00
renumber.rs MIR visitor: constant -> const_operand 2024-06-13 15:37:13 +02:00
session_diagnostics.rs Prevent opaque types being instantiated twice with different regions within the same function 2024-03-18 10:26:10 +00:00
universal_regions.rs Stop proving outlives constraints on regions we already reported errors on 2024-05-29 09:27:07 +00:00
used_muts.rs Rename 'cx to 'infcx 2024-06-27 09:07:57 +00:00