Do not ICE on expect(warnings).
This commit is contained in:
parent
94f8347bae
commit
6dfc4033be
@ -502,14 +502,14 @@ struct DiagCtxtInner {
|
|||||||
/// marked as fulfilled. This is a collection of all [`LintExpectationId`]s
|
/// marked as fulfilled. This is a collection of all [`LintExpectationId`]s
|
||||||
/// that have been marked as fulfilled this way.
|
/// that have been marked as fulfilled this way.
|
||||||
///
|
///
|
||||||
|
/// Emitting expectations after having stolen this field can happen. In particular, an
|
||||||
|
/// `#[expect(warnings)]` can easily make the `UNFULFILLED_LINT_EXPECTATIONS` lint expect
|
||||||
|
/// itself. To avoid needless complexity in this corner case, we tolerate failing to track
|
||||||
|
/// those expectations.
|
||||||
|
///
|
||||||
/// [RFC-2383]: https://rust-lang.github.io/rfcs/2383-lint-reasons.html
|
/// [RFC-2383]: https://rust-lang.github.io/rfcs/2383-lint-reasons.html
|
||||||
fulfilled_expectations: FxIndexSet<LintExpectationId>,
|
fulfilled_expectations: FxIndexSet<LintExpectationId>,
|
||||||
|
|
||||||
/// Whether `fulfilled_expectations` has been stolen. This is used to ICE in case we emit
|
|
||||||
/// an expectation diagnostic after stealing it, which means that expectation would not be
|
|
||||||
/// correctly handled.
|
|
||||||
stolen_fulfilled_expectations: bool,
|
|
||||||
|
|
||||||
/// The file where the ICE information is stored. This allows delayed_span_bug backtraces to be
|
/// The file where the ICE information is stored. This allows delayed_span_bug backtraces to be
|
||||||
/// stored along side the main panic backtrace.
|
/// stored along side the main panic backtrace.
|
||||||
ice_file: Option<PathBuf>,
|
ice_file: Option<PathBuf>,
|
||||||
@ -724,7 +724,6 @@ pub fn reset_err_count(&self) {
|
|||||||
stashed_diagnostics,
|
stashed_diagnostics,
|
||||||
future_breakage_diagnostics,
|
future_breakage_diagnostics,
|
||||||
fulfilled_expectations,
|
fulfilled_expectations,
|
||||||
stolen_fulfilled_expectations: _,
|
|
||||||
ice_file: _,
|
ice_file: _,
|
||||||
} = inner.deref_mut();
|
} = inner.deref_mut();
|
||||||
|
|
||||||
@ -1078,7 +1077,6 @@ pub fn emit_unused_externs(
|
|||||||
/// [`DiagCtxtInner`] and indicate that the linked expectation has been fulfilled.
|
/// [`DiagCtxtInner`] and indicate that the linked expectation has been fulfilled.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn steal_fulfilled_expectation_ids(&self) -> FxIndexSet<LintExpectationId> {
|
pub fn steal_fulfilled_expectation_ids(&self) -> FxIndexSet<LintExpectationId> {
|
||||||
self.inner.borrow_mut().stolen_fulfilled_expectations = true;
|
|
||||||
std::mem::take(&mut self.inner.borrow_mut().fulfilled_expectations)
|
std::mem::take(&mut self.inner.borrow_mut().fulfilled_expectations)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1388,7 +1386,6 @@ fn new(emitter: Box<DynEmitter>) -> Self {
|
|||||||
stashed_diagnostics: Default::default(),
|
stashed_diagnostics: Default::default(),
|
||||||
future_breakage_diagnostics: Vec::new(),
|
future_breakage_diagnostics: Vec::new(),
|
||||||
fulfilled_expectations: Default::default(),
|
fulfilled_expectations: Default::default(),
|
||||||
stolen_fulfilled_expectations: false,
|
|
||||||
ice_file: None,
|
ice_file: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1492,10 +1489,6 @@ fn emit_diagnostic(
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
Expect(expect_id) | ForceWarning(Some(expect_id)) => {
|
Expect(expect_id) | ForceWarning(Some(expect_id)) => {
|
||||||
assert!(
|
|
||||||
!self.stolen_fulfilled_expectations,
|
|
||||||
"Attempting to emit an expected diagnostic after `check_expectations`.",
|
|
||||||
);
|
|
||||||
self.fulfilled_expectations.insert(expect_id);
|
self.fulfilled_expectations.insert(expect_id);
|
||||||
if let Expect(_) = diagnostic.level {
|
if let Expect(_) = diagnostic.level {
|
||||||
// Nothing emitted here for expected lints.
|
// Nothing emitted here for expected lints.
|
||||||
|
6
tests/ui/lint/rfc-2383-lint-reason/expect_warnings.rs
Normal file
6
tests/ui/lint/rfc-2383-lint-reason/expect_warnings.rs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
//@ check-pass
|
||||||
|
|
||||||
|
#![expect(warnings)]
|
||||||
|
|
||||||
|
#[expect(unused)]
|
||||||
|
fn main() {}
|
Loading…
Reference in New Issue
Block a user