Skip to content

Commit 56b451a

Browse files
committed
Fix DiagCtxtInner::reset_err_count.
Several fields were not being reset. Using destructuring makes it much harder to miss a field.
1 parent c1ffb0b commit 56b451a

File tree

1 file changed

+45
-15
lines changed
  • compiler/rustc_errors/src

1 file changed

+45
-15
lines changed

Diff for: compiler/rustc_errors/src/lib.rs

+45-15
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ use std::fmt;
7878
use std::hash::Hash;
7979
use std::io::Write;
8080
use std::num::NonZeroUsize;
81+
use std::ops::DerefMut;
8182
use std::panic;
8283
use std::path::{Path, PathBuf};
8384

@@ -666,22 +667,51 @@ impl DiagCtxt {
666667
/// tools that want to reuse a `Parser` cleaning the previously emitted diagnostics as well as
667668
/// the overall count of emitted error diagnostics.
668669
pub fn reset_err_count(&self) {
670+
// Use destructuring so that if a field gets added to `DiagCtxtInner`, it's impossible to
671+
// fail to update this method as well.
669672
let mut inner = self.inner.borrow_mut();
670-
inner.stashed_err_count = 0;
671-
inner.deduplicated_err_count = 0;
672-
inner.deduplicated_warn_count = 0;
673-
inner.must_produce_diag = false;
674-
inner.has_printed = false;
675-
inner.suppressed_expected_diag = false;
676-
677-
// actually free the underlying memory (which `clear` would not do)
678-
inner.err_guars = Default::default();
679-
inner.lint_err_guars = Default::default();
680-
inner.delayed_bugs = Default::default();
681-
inner.taught_diagnostics = Default::default();
682-
inner.emitted_diagnostic_codes = Default::default();
683-
inner.emitted_diagnostics = Default::default();
684-
inner.stashed_diagnostics = Default::default();
673+
let DiagCtxtInner {
674+
flags: _,
675+
err_guars,
676+
lint_err_guars,
677+
delayed_bugs,
678+
stashed_err_count,
679+
deduplicated_err_count,
680+
deduplicated_warn_count,
681+
emitter: _,
682+
must_produce_diag,
683+
has_printed,
684+
suppressed_expected_diag,
685+
taught_diagnostics,
686+
emitted_diagnostic_codes,
687+
emitted_diagnostics,
688+
stashed_diagnostics,
689+
future_breakage_diagnostics,
690+
check_unstable_expect_diagnostics,
691+
unstable_expect_diagnostics,
692+
fulfilled_expectations,
693+
ice_file: _,
694+
} = inner.deref_mut();
695+
696+
// For the `Vec`s and `HashMap`s, we overwrite with an empty container to free the
697+
// underlying memory (which `clear` would not do).
698+
*err_guars = Default::default();
699+
*lint_err_guars = Default::default();
700+
*delayed_bugs = Default::default();
701+
*stashed_err_count = 0;
702+
*deduplicated_err_count = 0;
703+
*deduplicated_warn_count = 0;
704+
*must_produce_diag = false;
705+
*has_printed = false;
706+
*suppressed_expected_diag = false;
707+
*taught_diagnostics = Default::default();
708+
*emitted_diagnostic_codes = Default::default();
709+
*emitted_diagnostics = Default::default();
710+
*stashed_diagnostics = Default::default();
711+
*future_breakage_diagnostics = Default::default();
712+
*check_unstable_expect_diagnostics = false;
713+
*unstable_expect_diagnostics = Default::default();
714+
*fulfilled_expectations = Default::default();
685715
}
686716

687717
/// Stash a given diagnostic with the given `Span` and [`StashKey`] as the key.

0 commit comments

Comments
 (0)