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
|
||||
/// 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
|
||||
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
|
||||
/// stored along side the main panic backtrace.
|
||||
ice_file: Option<PathBuf>,
|
||||
@ -724,7 +724,6 @@ pub fn reset_err_count(&self) {
|
||||
stashed_diagnostics,
|
||||
future_breakage_diagnostics,
|
||||
fulfilled_expectations,
|
||||
stolen_fulfilled_expectations: _,
|
||||
ice_file: _,
|
||||
} = inner.deref_mut();
|
||||
|
||||
@ -1078,7 +1077,6 @@ pub fn emit_unused_externs(
|
||||
/// [`DiagCtxtInner`] and indicate that the linked expectation has been fulfilled.
|
||||
#[must_use]
|
||||
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)
|
||||
}
|
||||
|
||||
@ -1388,7 +1386,6 @@ fn new(emitter: Box<DynEmitter>) -> Self {
|
||||
stashed_diagnostics: Default::default(),
|
||||
future_breakage_diagnostics: Vec::new(),
|
||||
fulfilled_expectations: Default::default(),
|
||||
stolen_fulfilled_expectations: false,
|
||||
ice_file: None,
|
||||
}
|
||||
}
|
||||
@ -1492,10 +1489,6 @@ fn emit_diagnostic(
|
||||
return None;
|
||||
}
|
||||
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);
|
||||
if let Expect(_) = diagnostic.level {
|
||||
// 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