1
Fork 0

InferCtxt emit error when incorrectly tainted by errors

This commit is contained in:
yukang 2022-08-10 22:21:34 +08:00
parent a9bb589cd6
commit 8be37644db
2 changed files with 11 additions and 9 deletions

View file

@ -74,7 +74,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
evaluation_cache: self.evaluation_cache.clone(), evaluation_cache: self.evaluation_cache.clone(),
reported_trait_errors: self.reported_trait_errors.clone(), reported_trait_errors: self.reported_trait_errors.clone(),
reported_closure_mismatch: self.reported_closure_mismatch.clone(), reported_closure_mismatch: self.reported_closure_mismatch.clone(),
tainted_by_errors_flag: self.tainted_by_errors_flag.clone(), tainted_by_errors: self.tainted_by_errors.clone(),
err_count_on_creation: self.err_count_on_creation, err_count_on_creation: self.err_count_on_creation,
in_snapshot: self.in_snapshot.clone(), in_snapshot: self.in_snapshot.clone(),
universe: self.universe.clone(), universe: self.universe.clone(),

View file

@ -32,7 +32,7 @@ pub use rustc_middle::ty::IntVarValue;
use rustc_middle::ty::{self, GenericParamDefKind, InferConst, Ty, TyCtxt}; use rustc_middle::ty::{self, GenericParamDefKind, InferConst, Ty, TyCtxt};
use rustc_middle::ty::{ConstVid, FloatVid, IntVid, TyVid}; use rustc_middle::ty::{ConstVid, FloatVid, IntVid, TyVid};
use rustc_span::symbol::Symbol; use rustc_span::symbol::Symbol;
use rustc_span::Span; use rustc_span::{Span, DUMMY_SP};
use std::cell::{Cell, Ref, RefCell}; use std::cell::{Cell, Ref, RefCell};
use std::fmt; use std::fmt;
@ -316,12 +316,12 @@ pub struct InferCtxt<'a, 'tcx> {
/// ///
/// Don't read this flag directly, call `is_tainted_by_errors()` /// Don't read this flag directly, call `is_tainted_by_errors()`
/// and `set_tainted_by_errors()`. /// and `set_tainted_by_errors()`.
tainted_by_errors_flag: Cell<bool>, tainted_by_errors: Cell<Option<ErrorGuaranteed>>,
/// Track how many errors were reported when this infcx is created. /// Track how many errors were reported when this infcx is created.
/// If the number of errors increases, that's also a sign (line /// If the number of errors increases, that's also a sign (line
/// `tainted_by_errors`) to avoid reporting certain kinds of errors. /// `tainted_by_errors`) to avoid reporting certain kinds of errors.
// FIXME(matthewjasper) Merge into `tainted_by_errors_flag` // FIXME(matthewjasper) Merge into `tainted_by_errors`
err_count_on_creation: usize, err_count_on_creation: usize,
/// This flag is true while there is an active snapshot. /// This flag is true while there is an active snapshot.
@ -624,7 +624,7 @@ impl<'tcx> InferCtxtBuilder<'tcx> {
evaluation_cache: Default::default(), evaluation_cache: Default::default(),
reported_trait_errors: Default::default(), reported_trait_errors: Default::default(),
reported_closure_mismatch: Default::default(), reported_closure_mismatch: Default::default(),
tainted_by_errors_flag: Cell::new(false), tainted_by_errors: Cell::new(None),
err_count_on_creation: tcx.sess.err_count(), err_count_on_creation: tcx.sess.err_count(),
in_snapshot: Cell::new(false), in_snapshot: Cell::new(false),
skip_leak_check: Cell::new(false), skip_leak_check: Cell::new(false),
@ -1227,23 +1227,25 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
pub fn is_tainted_by_errors(&self) -> bool { pub fn is_tainted_by_errors(&self) -> bool {
debug!( debug!(
"is_tainted_by_errors(err_count={}, err_count_on_creation={}, \ "is_tainted_by_errors(err_count={}, err_count_on_creation={}, \
tainted_by_errors_flag={})", tainted_by_errors={})",
self.tcx.sess.err_count(), self.tcx.sess.err_count(),
self.err_count_on_creation, self.err_count_on_creation,
self.tainted_by_errors_flag.get() self.tainted_by_errors.get().is_some()
); );
if self.tcx.sess.err_count() > self.err_count_on_creation { if self.tcx.sess.err_count() > self.err_count_on_creation {
return true; // errors reported since this infcx was made return true; // errors reported since this infcx was made
} }
self.tainted_by_errors_flag.get() self.tainted_by_errors.get().is_some()
} }
/// Set the "tainted by errors" flag to true. We call this when we /// Set the "tainted by errors" flag to true. We call this when we
/// observe an error from a prior pass. /// observe an error from a prior pass.
pub fn set_tainted_by_errors(&self) { pub fn set_tainted_by_errors(&self) {
debug!("set_tainted_by_errors()"); debug!("set_tainted_by_errors()");
self.tainted_by_errors_flag.set(true) self.tainted_by_errors.set(Some(
self.tcx.sess.delay_span_bug(DUMMY_SP, "`InferCtxt` incorrectly tainted by errors"),
));
} }
pub fn skip_region_resolution(&self) { pub fn skip_region_resolution(&self) {