Skip to content

Commit

Permalink
Unrolled build for rust-lang#127409
Browse files Browse the repository at this point in the history
Rollup merge of rust-lang#127409 - gurry:127332-ice-with-expr-not-struct, r=oli-obk

Emit a wrap expr span_bug only if context is not tainted

Fixes rust-lang#127332

The ICE occurs because of this `span_bug`: https://github.com/rust-lang/rust/blob/51917e2e69702e5752bce6a4f3bfd285d0f4ae39/compiler/rustc_hir_typeck/src/expr_use_visitor.rs#L732-L738
which is triggered by the fact that we're trying to use an `enum` in a `with` expression instead of a `struct`.

The issue originates in commit rust-lang@814bfe9   from PR rust-lang#127202. As per the title of that commit the ICEing code should not be reachable any more, but looks like it still is.

This PR changes the code so that the `span_bug` will be emitted only if the context is not tainted by a previous error.
  • Loading branch information
rust-timer authored Jul 7, 2024
2 parents 959a2eb + 9da3638 commit fa5d922
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 10 deletions.
4 changes: 3 additions & 1 deletion compiler/rustc_hir_typeck/src/expr_use_visitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -734,7 +734,9 @@ impl<'tcx, Cx: TypeInformationCtxt<'tcx>, D: Delegate<'tcx>> ExprUseVisitor<'tcx
// struct; however, when EUV is run during typeck, it
// may not. This will generate an error earlier in typeck,
// so we can just ignore it.
span_bug!(with_expr.span, "with expression doesn't evaluate to a struct");
if self.cx.tainted_by_errors().is_ok() {
span_bug!(with_expr.span, "with expression doesn't evaluate to a struct");
}
}
}

Expand Down
9 changes: 0 additions & 9 deletions tests/crashes/127332.rs

This file was deleted.

15 changes: 15 additions & 0 deletions tests/ui/typeck/ice-with-expr-not-struct-127332.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// Regression test for ICE #127332

// Tests that we do not ICE when a with expr is
// not a struct but something else like an enum

fn main() {
let x = || {
enum Foo {
A { x: u32 },
}
let orig = Foo::A { x: 5 };
Foo::A { x: 6, ..orig };
//~^ ERROR functional record update syntax requires a struct
};
}
9 changes: 9 additions & 0 deletions tests/ui/typeck/ice-with-expr-not-struct-127332.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
error[E0436]: functional record update syntax requires a struct
--> $DIR/ice-with-expr-not-struct-127332.rs:12:26
|
LL | Foo::A { x: 6, ..orig };
| ^^^^

error: aborting due to 1 previous error

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

0 comments on commit fa5d922

Please sign in to comment.