1
Fork 0

Fix delayed_good_path_bug ice for expected diagnostics (RFC 2383)

This commit is contained in:
xFrednet 2022-06-04 00:43:24 +02:00
parent 7e9b92cb43
commit 157e68d01b
No known key found for this signature in database
GPG key ID: F5C59D0E669E5302
2 changed files with 25 additions and 12 deletions

View file

@ -401,6 +401,9 @@ struct HandlerInner {
emitter: Box<dyn Emitter + sync::Send>, emitter: Box<dyn Emitter + sync::Send>,
delayed_span_bugs: Vec<Diagnostic>, delayed_span_bugs: Vec<Diagnostic>,
delayed_good_path_bugs: Vec<DelayedDiagnostic>, delayed_good_path_bugs: Vec<DelayedDiagnostic>,
/// This flag indicates that an expected diagnostic was emitted and suppressed.
/// This is used for the `delayed_good_path_bugs` check.
suppressed_expected_diag: bool,
/// This set contains the `DiagnosticId` of all emitted diagnostics to avoid /// This set contains the `DiagnosticId` of all emitted diagnostics to avoid
/// emitting the same diagnostic with extended help (`--teach`) twice, which /// emitting the same diagnostic with extended help (`--teach`) twice, which
@ -496,7 +499,7 @@ impl Drop for HandlerInner {
// instead of "require some error happened". Sadly that isn't ideal, as // instead of "require some error happened". Sadly that isn't ideal, as
// lints can be `#[allow]`'d, potentially leading to this triggering. // lints can be `#[allow]`'d, potentially leading to this triggering.
// Also, "good path" should be replaced with a better naming. // Also, "good path" should be replaced with a better naming.
if !self.has_any_message() { if !self.has_any_message() && !self.suppressed_expected_diag {
let bugs = std::mem::replace(&mut self.delayed_good_path_bugs, Vec::new()); let bugs = std::mem::replace(&mut self.delayed_good_path_bugs, Vec::new());
self.flush_delayed( self.flush_delayed(
bugs.into_iter().map(DelayedDiagnostic::decorate), bugs.into_iter().map(DelayedDiagnostic::decorate),
@ -578,6 +581,7 @@ impl Handler {
emitter, emitter,
delayed_span_bugs: Vec::new(), delayed_span_bugs: Vec::new(),
delayed_good_path_bugs: Vec::new(), delayed_good_path_bugs: Vec::new(),
suppressed_expected_diag: false,
taught_diagnostics: Default::default(), taught_diagnostics: Default::default(),
emitted_diagnostic_codes: Default::default(), emitted_diagnostic_codes: Default::default(),
emitted_diagnostics: Default::default(), emitted_diagnostics: Default::default(),
@ -1001,10 +1005,9 @@ impl Handler {
let mut inner = self.inner.borrow_mut(); let mut inner = self.inner.borrow_mut();
let diags = std::mem::take(&mut inner.unstable_expect_diagnostics); let diags = std::mem::take(&mut inner.unstable_expect_diagnostics);
inner.check_unstable_expect_diagnostics = true; inner.check_unstable_expect_diagnostics = true;
if diags.is_empty() {
return;
}
if !diags.is_empty() {
inner.suppressed_expected_diag = true;
for mut diag in diags.into_iter() { for mut diag in diags.into_iter() {
diag.update_unstable_expectation_id(unstable_to_stable); diag.update_unstable_expectation_id(unstable_to_stable);
@ -1016,6 +1019,7 @@ impl Handler {
(*TRACK_DIAGNOSTICS)(&diag); (*TRACK_DIAGNOSTICS)(&diag);
} }
}
inner inner
.stashed_diagnostics .stashed_diagnostics
@ -1101,6 +1105,7 @@ impl HandlerInner {
(*TRACK_DIAGNOSTICS)(diagnostic); (*TRACK_DIAGNOSTICS)(diagnostic);
if let Level::Expect(expectation_id) = diagnostic.level { if let Level::Expect(expectation_id) = diagnostic.level {
self.suppressed_expected_diag = true;
self.fulfilled_expectations.insert(expectation_id); self.fulfilled_expectations.insert(expectation_id);
return None; return None;
} else if diagnostic.level == Allow { } else if diagnostic.level == Allow {

View file

@ -0,0 +1,8 @@
// check-pass
#![feature(lint_reasons)]
#[expect(drop_bounds)]
fn trigger_rustc_lints<T: Drop>() {
}
fn main() {}