Fix delayed_good_path_bug
ice for expected diagnostics (RFC 2383)
This commit is contained in:
parent
7e9b92cb43
commit
157e68d01b
2 changed files with 25 additions and 12 deletions
|
@ -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 {
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
// check-pass
|
||||||
|
#![feature(lint_reasons)]
|
||||||
|
|
||||||
|
#[expect(drop_bounds)]
|
||||||
|
fn trigger_rustc_lints<T: Drop>() {
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
Loading…
Add table
Add a link
Reference in a new issue