avoid computing cur_span all the time

This commit is contained in:
Ralf Jung 2020-06-11 09:53:38 +02:00
parent 0ac6fd0405
commit 32b01c78d0
2 changed files with 14 additions and 6 deletions

View File

@ -317,7 +317,10 @@ pub fn const_eval_raw_provider<'tcx>(
if is_static { if is_static {
// Ensure that if the above error was either `TooGeneric` or `Reported` // Ensure that if the above error was either `TooGeneric` or `Reported`
// an error must be reported. // an error must be reported.
let v = err.report_as_error(ecx.tcx_at(), "could not evaluate static initializer"); let v = err.report_as_error(
ecx.tcx.at(ecx.cur_span()),
"could not evaluate static initializer",
);
// If this is `Reveal:All`, then we need to make sure an error is reported but if // If this is `Reveal:All`, then we need to make sure an error is reported but if
// this is `Reveal::UserFacing`, then it's expected that we could get a // this is `Reveal::UserFacing`, then it's expected that we could get a
@ -373,13 +376,16 @@ pub fn const_eval_raw_provider<'tcx>(
// anything else (array lengths, enum initializers, constant patterns) are // anything else (array lengths, enum initializers, constant patterns) are
// reported as hard errors // reported as hard errors
} else { } else {
err.report_as_error(ecx.tcx_at(), "evaluation of constant value failed") err.report_as_error(
ecx.tcx.at(ecx.cur_span()),
"evaluation of constant value failed",
)
} }
} }
} }
} else { } else {
// use of broken constant from other crate // use of broken constant from other crate
err.report_as_error(ecx.tcx_at(), "could not evaluate constant") err.report_as_error(ecx.tcx.at(ecx.cur_span()), "could not evaluate constant")
} }
}) })
} }

View File

@ -323,7 +323,9 @@ pub fn cur_span(&self) -> Span {
#[inline(always)] #[inline(always)]
pub fn tcx_at(&self) -> TyCtxtAt<'tcx> { pub fn tcx_at(&self) -> TyCtxtAt<'tcx> {
self.tcx.at(self.cur_span()) // Computing the current span has a non-trivial cost, and for cycle errors
// the "root span" is good enough.
self.tcx.at(self.root_span)
} }
#[inline(always)] #[inline(always)]
@ -406,7 +408,7 @@ pub fn type_is_sized(&self, ty: Ty<'tcx>) -> bool {
#[inline] #[inline]
pub fn type_is_freeze(&self, ty: Ty<'tcx>) -> bool { pub fn type_is_freeze(&self, ty: Ty<'tcx>) -> bool {
ty.is_freeze(self.tcx, self.param_env, self.cur_span()) ty.is_freeze(self.tcx, self.param_env, self.root_span)
} }
pub fn load_mir( pub fn load_mir(
@ -889,7 +891,7 @@ pub fn const_eval_raw(
// FIXME: We can hit delay_span_bug if this is an invalid const, interning finds // FIXME: We can hit delay_span_bug if this is an invalid const, interning finds
// that problem, but we never run validation to show an error. Can we ensure // that problem, but we never run validation to show an error. Can we ensure
// this does not happen? // this does not happen?
let val = self.tcx_at().const_eval_raw(param_env.and(gid))?; let val = self.tcx.at(self.cur_span()).const_eval_raw(param_env.and(gid))?;
self.raw_const_to_mplace(val) self.raw_const_to_mplace(val)
} }