Auto merge of #96098 - JakobDegen:always-return-place, r=oli-obk

Refactor call terminator to always include destination place

In #71117 people seemed to agree that call terminators should always have a destination place, even if the call was guaranteed to diverge. This implements that. Unsurprisingly, the diff touches a lot of code, but thankfully I had to do almost nothing interesting. The only interesting thing came up in const prop, where the stack frame having no return place was also used to indicate that the layout could not be computed (or similar). I replaced this with a ZST allocation, which should continue to do the right things.

cc `@RalfJung` `@eddyb` who were involved in the original conversation

r? rust-lang/mir-opt
This commit is contained in:
bors 2022-05-24 07:13:26 +00:00
commit 286b717808
2 changed files with 3 additions and 2 deletions

View file

@ -292,7 +292,7 @@ fn is_call_with_ref_arg<'tcx>(
if let (inner_ty, 1) = walk_ptrs_ty_depth(args[0].ty(&*mir, cx.tcx)); if let (inner_ty, 1) = walk_ptrs_ty_depth(args[0].ty(&*mir, cx.tcx));
if !is_copy(cx, inner_ty); if !is_copy(cx, inner_ty);
then { then {
Some((def_id, *local, inner_ty, destination.as_ref().map(|(dest, _)| dest)?.as_local()?)) Some((def_id, *local, inner_ty, destination.as_local()?))
} else { } else {
None None
} }
@ -584,7 +584,7 @@ impl<'a, 'tcx> mir::visit::Visitor<'tcx> for PossibleBorrowerVisitor<'a, 'tcx> {
fn visit_terminator(&mut self, terminator: &mir::Terminator<'_>, _loc: mir::Location) { fn visit_terminator(&mut self, terminator: &mir::Terminator<'_>, _loc: mir::Location) {
if let mir::TerminatorKind::Call { if let mir::TerminatorKind::Call {
args, args,
destination: Some((mir::Place { local: dest, .. }, _)), destination: mir::Place { local: dest, .. },
.. ..
} = &terminator.kind } = &terminator.kind
{ {

View file

@ -301,6 +301,7 @@ fn check_terminator<'a, 'tcx>(
args, args,
from_hir_call: _, from_hir_call: _,
destination: _, destination: _,
target: _,
cleanup: _, cleanup: _,
fn_span: _, fn_span: _,
} => { } => {