From dae24073687fca6682c351379d41d61397e7c329 Mon Sep 17 00:00:00 2001 From: b-naber Date: Fri, 5 Nov 2021 18:11:08 +0100 Subject: [PATCH] resolve variables before erasing lifetimes --- compiler/rustc_infer/src/infer/mod.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/compiler/rustc_infer/src/infer/mod.rs b/compiler/rustc_infer/src/infer/mod.rs index 4873d3a6421f..5e687a7063ce 100644 --- a/compiler/rustc_infer/src/infer/mod.rs +++ b/compiler/rustc_infer/src/infer/mod.rs @@ -1585,9 +1585,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { unevaluated: ty::Unevaluated<'tcx>, span: Option, ) -> EvalToConstValueResult<'tcx> { - let param_env = self.tcx.erase_regions(param_env); let mut substs = unevaluated.substs(self.tcx); - substs = self.tcx.erase_regions(substs); substs = self.resolve_vars_if_possible(substs); // Postpone the evaluation of constants whose substs depend on inference @@ -1596,15 +1594,18 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { return Err(ErrorHandled::TooGeneric); } + let param_env_erased = self.tcx.erase_regions(param_env); + let substs_erased = self.tcx.erase_regions(substs); + let unevaluated = ty::Unevaluated { def: unevaluated.def, - substs_: Some(substs), + substs_: Some(substs_erased), promoted: unevaluated.promoted, }; // The return value is the evaluated value which doesn't contain any reference to inference // variables, thus we don't need to substitute back the original values. - self.tcx.const_eval_resolve(param_env, unevaluated, span) + self.tcx.const_eval_resolve(param_env_erased, unevaluated, span) } /// If `typ` is a type variable of some kind, resolve it one level