Adjust the has_errors* methods.

Currently `has_errors` excludes lint errors. This commit changes it to
include lint errors.

The motivation for this is that for most places it doesn't matter
whether lint errors are included or not. But there are multiple places
where they must be includes, and only one place where they must not be
included. So it makes sense for `has_errors` to do the thing that fits
the most situations, and the new `has_errors_excluding_lint_errors`
method in the one exceptional place.

The same change is made for `err_count`. Annoyingly, this requires the
introduction of `err_count_excluding_lint_errs` for one place, to
preserve existing error printing behaviour. But I still think the change
is worthwhile overall.
This commit is contained in:
Nicholas Nethercote 2024-02-19 09:36:08 +11:00
parent 9919c3dab3
commit 46f4983356
10 changed files with 41 additions and 35 deletions

View File

@ -754,13 +754,20 @@ impl DiagCtxt {
self.inner.borrow_mut().emit_stashed_diagnostics() self.inner.borrow_mut().emit_stashed_diagnostics()
} }
/// This excludes lint errors, delayed bugs, and stashed errors. /// This excludes lint errors, delayed bugs and stashed errors.
#[inline] #[inline]
pub fn err_count(&self) -> usize { pub fn err_count_excluding_lint_errs(&self) -> usize {
self.inner.borrow().err_guars.len() self.inner.borrow().err_guars.len()
} }
/// This excludes normal errors, lint errors and delayed bugs. Unless /// This excludes delayed bugs and stashed errors.
#[inline]
pub fn err_count(&self) -> usize {
let inner = self.inner.borrow();
inner.err_guars.len() + inner.lint_err_guars.len()
}
/// This excludes normal errors, lint errors, and delayed bugs. Unless
/// absolutely necessary, avoid using this. It's dubious because stashed /// absolutely necessary, avoid using this. It's dubious because stashed
/// errors can later be cancelled, so the presence of a stashed error at /// errors can later be cancelled, so the presence of a stashed error at
/// some point of time doesn't guarantee anything -- there are no /// some point of time doesn't guarantee anything -- there are no
@ -769,21 +776,21 @@ impl DiagCtxt {
self.inner.borrow().stashed_err_count self.inner.borrow().stashed_err_count
} }
/// This excludes lint errors, delayed bugs, and stashed errors. /// This excludes lint errors, delayed bugs, and stashed errors. Unless
/// absolutely necessary, prefer `has_errors` to this method.
pub fn has_errors_excluding_lint_errors(&self) -> Option<ErrorGuaranteed> {
self.inner.borrow().has_errors_excluding_lint_errors()
}
/// This excludes delayed bugs and stashed errors.
pub fn has_errors(&self) -> Option<ErrorGuaranteed> { pub fn has_errors(&self) -> Option<ErrorGuaranteed> {
self.inner.borrow().has_errors() self.inner.borrow().has_errors()
} }
/// This excludes delayed bugs and stashed errors. Unless absolutely
/// necessary, prefer `has_errors` to this method.
pub fn has_errors_or_lint_errors(&self) -> Option<ErrorGuaranteed> {
self.inner.borrow().has_errors_or_lint_errors()
}
/// This excludes stashed errors. Unless absolutely necessary, prefer /// This excludes stashed errors. Unless absolutely necessary, prefer
/// `has_errors` or `has_errors_or_lint_errors` to this method. /// `has_errors` to this method.
pub fn has_errors_or_lint_errors_or_delayed_bugs(&self) -> Option<ErrorGuaranteed> { pub fn has_errors_or_delayed_bugs(&self) -> Option<ErrorGuaranteed> {
self.inner.borrow().has_errors_or_lint_errors_or_delayed_bugs() self.inner.borrow().has_errors_or_delayed_bugs()
} }
pub fn print_error_count(&self, registry: &Registry) { pub fn print_error_count(&self, registry: &Registry) {
@ -1328,7 +1335,7 @@ impl DiagCtxtInner {
DelayedBug => { DelayedBug => {
// If we have already emitted at least one error, we don't need // If we have already emitted at least one error, we don't need
// to record the delayed bug, because it'll never be used. // to record the delayed bug, because it'll never be used.
return if let Some(guar) = self.has_errors_or_lint_errors() { return if let Some(guar) = self.has_errors() {
Some(guar) Some(guar)
} else { } else {
let backtrace = std::backtrace::Backtrace::capture(); let backtrace = std::backtrace::Backtrace::capture();
@ -1444,17 +1451,16 @@ impl DiagCtxtInner {
.is_some_and(|c| self.err_guars.len() + self.lint_err_guars.len() + 1 >= c.get()) .is_some_and(|c| self.err_guars.len() + self.lint_err_guars.len() + 1 >= c.get())
} }
fn has_errors(&self) -> Option<ErrorGuaranteed> { fn has_errors_excluding_lint_errors(&self) -> Option<ErrorGuaranteed> {
self.err_guars.get(0).copied() self.err_guars.get(0).copied()
} }
fn has_errors_or_lint_errors(&self) -> Option<ErrorGuaranteed> { fn has_errors(&self) -> Option<ErrorGuaranteed> {
self.has_errors().or_else(|| self.lint_err_guars.get(0).copied()) self.has_errors_excluding_lint_errors().or_else(|| self.lint_err_guars.get(0).copied())
} }
fn has_errors_or_lint_errors_or_delayed_bugs(&self) -> Option<ErrorGuaranteed> { fn has_errors_or_delayed_bugs(&self) -> Option<ErrorGuaranteed> {
self.has_errors_or_lint_errors() self.has_errors().or_else(|| self.delayed_bugs.get(0).map(|(_, guar)| guar).copied())
.or_else(|| self.delayed_bugs.get(0).map(|(_, guar)| guar).copied())
} }
/// Translate `message` eagerly with `args` to `SubdiagnosticMessage::Eager`. /// Translate `message` eagerly with `args` to `SubdiagnosticMessage::Eager`.

View File

@ -312,7 +312,7 @@ pub fn finalize_session_directory(sess: &Session, svh: Option<Svh>) {
let incr_comp_session_dir: PathBuf = sess.incr_comp_session_dir().clone(); let incr_comp_session_dir: PathBuf = sess.incr_comp_session_dir().clone();
if sess.dcx().has_errors_or_lint_errors_or_delayed_bugs().is_some() { if sess.dcx().has_errors_or_delayed_bugs().is_some() {
// If there have been any errors during compilation, we don't want to // If there have been any errors during compilation, we don't want to
// publish this session directory. Rather, we'll just delete it. // publish this session directory. Rather, we'll just delete it.

View File

@ -32,7 +32,7 @@ pub fn save_dep_graph(tcx: TyCtxt<'_>) {
return; return;
} }
// This is going to be deleted in finalize_session_directory, so let's not create it. // This is going to be deleted in finalize_session_directory, so let's not create it.
if sess.dcx().has_errors_or_lint_errors_or_delayed_bugs().is_some() { if sess.dcx().has_errors_or_delayed_bugs().is_some() {
return; return;
} }
@ -87,7 +87,7 @@ pub fn save_work_product_index(
return; return;
} }
// This is going to be deleted in finalize_session_directory, so let's not create it // This is going to be deleted in finalize_session_directory, so let's not create it
if sess.dcx().has_errors_or_lint_errors().is_some() { if sess.dcx().has_errors().is_some() {
return; return;
} }

View File

@ -713,7 +713,7 @@ impl<'tcx> InferCtxtBuilder<'tcx> {
reported_trait_errors: Default::default(), reported_trait_errors: Default::default(),
reported_signature_mismatch: Default::default(), reported_signature_mismatch: Default::default(),
tainted_by_errors: Cell::new(None), tainted_by_errors: Cell::new(None),
err_count_on_creation: tcx.dcx().err_count(), err_count_on_creation: tcx.dcx().err_count_excluding_lint_errs(),
stashed_err_count_on_creation: tcx.dcx().stashed_err_count(), stashed_err_count_on_creation: tcx.dcx().stashed_err_count(),
universe: Cell::new(ty::UniverseIndex::ROOT), universe: Cell::new(ty::UniverseIndex::ROOT),
intercrate, intercrate,
@ -1268,8 +1268,11 @@ impl<'tcx> InferCtxt<'tcx> {
pub fn tainted_by_errors(&self) -> Option<ErrorGuaranteed> { pub fn tainted_by_errors(&self) -> Option<ErrorGuaranteed> {
if let Some(guar) = self.tainted_by_errors.get() { if let Some(guar) = self.tainted_by_errors.get() {
Some(guar) Some(guar)
} else if self.dcx().err_count() > self.err_count_on_creation { } else if self.dcx().err_count_excluding_lint_errs() > self.err_count_on_creation {
// Errors reported since this infcx was made. // Errors reported since this infcx was made. Lint errors are
// excluded to avoid some being swallowed in the presence of
// non-lint errors. (It's arguable whether or not this exclusion is
// important.)
let guar = self.dcx().has_errors().unwrap(); let guar = self.dcx().has_errors().unwrap();
self.set_tainted_by_errors(guar); self.set_tainted_by_errors(guar);
Some(guar) Some(guar)

View File

@ -772,7 +772,7 @@ fn analysis(tcx: TyCtxt<'_>, (): ()) -> Result<()> {
// lot of annoying errors in the ui tests (basically, // lot of annoying errors in the ui tests (basically,
// lint warnings and so on -- kindck used to do this abort, but // lint warnings and so on -- kindck used to do this abort, but
// kindck is gone now). -nmatsakis // kindck is gone now). -nmatsakis
if let Some(reported) = sess.dcx().has_errors() { if let Some(reported) = sess.dcx().has_errors_excluding_lint_errors() {
return Err(reported); return Err(reported);
} else if sess.dcx().stashed_err_count() > 0 { } else if sess.dcx().stashed_err_count() > 0 {
// Without this case we sometimes get delayed bug ICEs and I don't // Without this case we sometimes get delayed bug ICEs and I don't

View File

@ -926,7 +926,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
what: &str, what: &str,
needs_dep: &dyn Fn(&CrateMetadata) -> bool, needs_dep: &dyn Fn(&CrateMetadata) -> bool,
) { ) {
// don't perform this validation if the session has errors, as one of // Don't perform this validation if the session has errors, as one of
// those errors may indicate a circular dependency which could cause // those errors may indicate a circular dependency which could cause
// this to stack overflow. // this to stack overflow.
if self.dcx().has_errors().is_some() { if self.dcx().has_errors().is_some() {

View File

@ -817,7 +817,7 @@ impl<D: Deps> DepGraphData<D> {
None => {} None => {}
} }
if let None = qcx.dep_context().sess().dcx().has_errors_or_lint_errors_or_delayed_bugs() { if let None = qcx.dep_context().sess().dcx().has_errors_or_delayed_bugs() {
panic!("try_mark_previous_green() - Forcing the DepNode should have set its color") panic!("try_mark_previous_green() - Forcing the DepNode should have set its color")
} }

View File

@ -313,8 +313,7 @@ impl Session {
} }
pub fn compile_status(&self) -> Result<(), ErrorGuaranteed> { pub fn compile_status(&self) -> Result<(), ErrorGuaranteed> {
// We must include lint errors here. if let Some(reported) = self.dcx().has_errors() {
if let Some(reported) = self.dcx().has_errors_or_lint_errors() {
self.dcx().emit_stashed_diagnostics(); self.dcx().emit_stashed_diagnostics();
Err(reported) Err(reported)
} else { } else {

View File

@ -452,8 +452,7 @@ pub(crate) fn run_global_ctxt(
tcx.sess.time("check_lint_expectations", || tcx.check_expectations(Some(sym::rustdoc))); tcx.sess.time("check_lint_expectations", || tcx.check_expectations(Some(sym::rustdoc)));
// We must include lint errors here. if tcx.dcx().has_errors().is_some() {
if tcx.dcx().has_errors_or_lint_errors().is_some() {
rustc_errors::FatalError.raise(); rustc_errors::FatalError.raise();
} }

View File

@ -153,8 +153,7 @@ pub(crate) fn run(options: RustdocOptions) -> Result<(), ErrorGuaranteed> {
collector collector
}); });
// We must include lint errors here. if compiler.sess.dcx().has_errors().is_some() {
if compiler.sess.dcx().has_errors_or_lint_errors().is_some() {
FatalError.raise(); FatalError.raise();
} }