Update MIR passes that assumed inline can never unwind.
This commit is contained in:
parent
c1cfdd1fb2
commit
f45f826207
@ -1,4 +1,5 @@
|
||||
use crate::MirPass;
|
||||
use rustc_ast::InlineAsmOptions;
|
||||
use rustc_hir::def::DefKind;
|
||||
use rustc_middle::mir::*;
|
||||
use rustc_middle::ty::layout;
|
||||
@ -85,6 +86,12 @@ fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||
TerminatorKind::Assert { .. } | TerminatorKind::FalseUnwind { .. } => {
|
||||
layout::fn_can_unwind(tcx, None, Abi::Rust)
|
||||
}
|
||||
TerminatorKind::InlineAsm { options, .. } => {
|
||||
options.contains(InlineAsmOptions::MAY_UNWIND)
|
||||
}
|
||||
_ if terminator.unwind().is_some() => {
|
||||
span_bug!(span, "unexpected terminator that may unwind {:?}", terminator)
|
||||
}
|
||||
_ => continue,
|
||||
};
|
||||
|
||||
|
@ -1042,8 +1042,7 @@ fn can_unwind<'tcx>(tcx: TyCtxt<'tcx>, body: &Body<'tcx>) -> bool {
|
||||
| TerminatorKind::Unreachable
|
||||
| TerminatorKind::GeneratorDrop
|
||||
| TerminatorKind::FalseEdge { .. }
|
||||
| TerminatorKind::FalseUnwind { .. }
|
||||
| TerminatorKind::InlineAsm { .. } => {}
|
||||
| TerminatorKind::FalseUnwind { .. } => {}
|
||||
|
||||
// Resume will *continue* unwinding, but if there's no other unwinding terminator it
|
||||
// will never be reached.
|
||||
@ -1057,6 +1056,7 @@ fn can_unwind<'tcx>(tcx: TyCtxt<'tcx>, body: &Body<'tcx>) -> bool {
|
||||
TerminatorKind::Drop { .. }
|
||||
| TerminatorKind::DropAndReplace { .. }
|
||||
| TerminatorKind::Call { .. }
|
||||
| TerminatorKind::InlineAsm { .. }
|
||||
| TerminatorKind::Assert { .. } => return true,
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user