diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2022-06-04 00:42:51 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-04 00:42:51 +0200 |
| commit | 74f0bcc9c732b56a3d7367bf939121f697e065fd (patch) | |
| tree | ec718dc219e1f2b18b750dde3f7181f7ebcd32ca /compiler | |
| parent | 8971235e58839093a6d1572a13e1e2ae7c256b81 (diff) | |
| parent | 2e301c89c714c2126f2221664c3f754541f9b77b (diff) | |
| download | rust-74f0bcc9c732b56a3d7367bf939121f697e065fd.tar.gz rust-74f0bcc9c732b56a3d7367bf939121f697e065fd.zip | |
Rollup merge of #97696 - cjgillot:normalize-inline, r=compiler-errors
Do not ICE when failing to normalize during inlining. Fixes https://github.com/rust-lang/rust/issues/97695
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_mir_transform/src/inline.rs | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/compiler/rustc_mir_transform/src/inline.rs b/compiler/rustc_mir_transform/src/inline.rs index 9526c0acc66..a1490d77ccb 100644 --- a/compiler/rustc_mir_transform/src/inline.rs +++ b/compiler/rustc_mir_transform/src/inline.rs @@ -158,11 +158,13 @@ impl<'tcx> Inliner<'tcx> { return Err("optimization fuel exhausted"); } - let callee_body = callsite.callee.subst_mir_and_normalize_erasing_regions( + let Ok(callee_body) = callsite.callee.try_subst_mir_and_normalize_erasing_regions( self.tcx, self.param_env, callee_body.clone(), - ); + ) else { + return Err("failed to normalize callee body"); + }; let old_blocks = caller_body.basic_blocks().next_index(); self.inline_call(caller_body, &callsite, callee_body); @@ -253,7 +255,7 @@ impl<'tcx> Inliner<'tcx> { let func_ty = func.ty(caller_body, self.tcx); if let ty::FnDef(def_id, substs) = *func_ty.kind() { // To resolve an instance its substs have to be fully normalized. - let substs = self.tcx.normalize_erasing_regions(self.param_env, substs); + let substs = self.tcx.try_normalize_erasing_regions(self.param_env, substs).ok()?; let callee = Instance::resolve(self.tcx, self.param_env, def_id, substs).ok().flatten()?; @@ -408,14 +410,17 @@ impl<'tcx> Inliner<'tcx> { if let ty::FnDef(def_id, substs) = *callsite.callee.subst_mir(self.tcx, &f.literal.ty()).kind() { - let substs = self.tcx.normalize_erasing_regions(self.param_env, substs); - if let Ok(Some(instance)) = - Instance::resolve(self.tcx, self.param_env, def_id, substs) + if let Ok(substs) = + self.tcx.try_normalize_erasing_regions(self.param_env, substs) { - if callsite.callee.def_id() == instance.def_id() { - return Err("self-recursion"); - } else if self.history.contains(&instance) { - return Err("already inlined"); + if let Ok(Some(instance)) = + Instance::resolve(self.tcx, self.param_env, def_id, substs) + { + if callsite.callee.def_id() == instance.def_id() { + return Err("self-recursion"); + } else if self.history.contains(&instance) { + return Err("already inlined"); + } } } // Don't give intrinsics the extra penalty for calls |
