Skip to content

Commit

Permalink
Rollup merge of rust-lang#126719 - nnethercote:fix-126521, r=oli-obk
Browse files Browse the repository at this point in the history
Fix assertion failure for some `Expect` diagnostics.

In rust-lang#120699 I moved some code dealing with `has_future_breakage` earlier in `emit_diagnostic`. Issue rust-lang#126521 identified a case where that reordering was invalid (leading to an assertion failure) for some `Expect` diagnostics.

This commit partially undoes the change, by moving the handling of unstable `Expect` diagnostics earlier again. This makes `emit_diagnostic` a bit uglier, but is necessary to fix the problem.

Fixes rust-lang#126521.

r? ``@oli-obk``
  • Loading branch information
matthiaskrgr authored Jun 20, 2024
2 parents ef2e8bf + 19b7192 commit f511f2b
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 10 deletions.
28 changes: 19 additions & 9 deletions compiler/rustc_errors/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1437,6 +1437,24 @@ impl DiagCtxtInner {

// Return value is only `Some` if the level is `Error` or `DelayedBug`.
fn emit_diagnostic(&mut self, mut diagnostic: DiagInner) -> Option<ErrorGuaranteed> {
match diagnostic.level {
Expect(expect_id) | ForceWarning(Some(expect_id)) => {
// The `LintExpectationId` can be stable or unstable depending on when it was
// created. Diagnostics created before the definition of `HirId`s are unstable and
// can not yet be stored. Instead, they are buffered until the `LintExpectationId`
// is replaced by a stable one by the `LintLevelsBuilder`.
if let LintExpectationId::Unstable { .. } = expect_id {
// We don't call TRACK_DIAGNOSTIC because we wait for the
// unstable ID to be updated, whereupon the diagnostic will be
// passed into this method again.
self.unstable_expect_diagnostics.push(diagnostic);
return None;
}
// Continue through to the `Expect`/`ForceWarning` case below.
}
_ => {}
}

if diagnostic.has_future_breakage() {
// Future breakages aren't emitted if they're `Level::Allow`,
// but they still need to be constructed and stashed below,
Expand Down Expand Up @@ -1512,16 +1530,8 @@ impl DiagCtxtInner {
return None;
}
Expect(expect_id) | ForceWarning(Some(expect_id)) => {
// Diagnostics created before the definition of `HirId`s are
// unstable and can not yet be stored. Instead, they are
// buffered until the `LintExpectationId` is replaced by a
// stable one by the `LintLevelsBuilder`.
if let LintExpectationId::Unstable { .. } = expect_id {
// We don't call TRACK_DIAGNOSTIC because we wait for the
// unstable ID to be updated, whereupon the diagnostic will
// be passed into this method again.
self.unstable_expect_diagnostics.push(diagnostic);
return None;
unreachable!(); // this case was handled at the top of this function
}
self.fulfilled_expectations.insert(expect_id.normalize());
if let Expect(_) = diagnostic.level {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
//@ known-bug: rust-lang/rust#126521
macro_rules! foo {
($val:ident) => {
true;
Expand All @@ -7,5 +6,6 @@ macro_rules! foo {

fn main() {
#[expect(semicolon_in_expressions_from_macros)]
//~^ ERROR the `#[expect]` attribute is an experimental feature
let _ = foo!(x);
}
13 changes: 13 additions & 0 deletions tests/ui/lint/expect-future_breakage-crash-issue-126521.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
error[E0658]: the `#[expect]` attribute is an experimental feature
--> $DIR/expect-future_breakage-crash-issue-126521.rs:8:5
|
LL | #[expect(semicolon_in_expressions_from_macros)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: see issue #54503 <https://github.com/rust-lang/rust/issues/54503> for more information
= help: add `#![feature(lint_reasons)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0658`.

0 comments on commit f511f2b

Please sign in to comment.