Rollup merge of #124997 - gurry:124848-ice-should-be-sized, r=Nadrieril

Fix ICE while casting a type with error

Fixes #124848

The ICE originates here: f9a3fd9661/compiler/rustc_hir_typeck/src/cast.rs (L143) The underlying cause is that a type with error, `MyType` was involved in a cast. During cast checks the below method `pointer_kind` was called: f9a3fd9661/compiler/rustc_hir_typeck/src/cast.rs (L87-L91) Thanks to the changes in PR #123491, `type_is_sized_modulo_regions` in `pointer_kind` returned `false` which caused control to reach the `span_bug` here: f9a3fd9661/compiler/rustc_hir_typeck/src/cast.rs (L143) resulting in an ICE.

This PR fixes the issue by changing the `span_bug` to a `span_delayed_bug`.
This commit is contained in:
Jacob Pratt 2024-05-13 21:14:15 -04:00 committed by GitHub
commit 18d9c039bb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 85 additions and 1 deletions

View File

@ -141,7 +141,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
| ty::Never
| ty::Dynamic(_, _, ty::DynStar)
| ty::Error(_) => {
self.dcx().span_bug(span, format!("`{t:?}` should be sized but is not?"));
let guar = self
.dcx()
.span_delayed_bug(span, format!("`{t:?}` should be sized but is not?"));
return Err(guar);
}
})
}

View File

@ -0,0 +1,18 @@
// Regression test for ICE #124848
// Tests that there is no ICE when a cast
// involves a type with error
use std::cell::Cell;
struct MyType<'a>(Cell<Option<&'unpinned mut MyType<'a>>>, Pin);
//~^ ERROR use of undeclared lifetime name `'unpinned`
//~| ERROR cannot find type `Pin` in this scope
fn main() {
let mut unpinned = MyType(Cell::new(None));
//~^ ERROR his struct takes 2 arguments but 1 argument was supplied
let bad_addr = &unpinned as *const Cell<Option<&'a mut MyType<'a>>> as usize;
//~^ ERROR use of undeclared lifetime name `'a`
//~| ERROR use of undeclared lifetime name `'a`
//~| ERROR casting `&MyType<'_>` as `*const Cell<Option<&mut MyType<'_>>>` is invalid
}

View File

@ -0,0 +1,63 @@
error[E0261]: use of undeclared lifetime name `'unpinned`
--> $DIR/ice-cast-type-with-error-124848.rs:7:32
|
LL | struct MyType<'a>(Cell<Option<&'unpinned mut MyType<'a>>>, Pin);
| - ^^^^^^^^^ undeclared lifetime
| |
| help: consider introducing lifetime `'unpinned` here: `'unpinned,`
error[E0261]: use of undeclared lifetime name `'a`
--> $DIR/ice-cast-type-with-error-124848.rs:14:53
|
LL | fn main() {
| - help: consider introducing lifetime `'a` here: `<'a>`
...
LL | let bad_addr = &unpinned as *const Cell<Option<&'a mut MyType<'a>>> as usize;
| ^^ undeclared lifetime
error[E0261]: use of undeclared lifetime name `'a`
--> $DIR/ice-cast-type-with-error-124848.rs:14:67
|
LL | fn main() {
| - help: consider introducing lifetime `'a` here: `<'a>`
...
LL | let bad_addr = &unpinned as *const Cell<Option<&'a mut MyType<'a>>> as usize;
| ^^ undeclared lifetime
error[E0412]: cannot find type `Pin` in this scope
--> $DIR/ice-cast-type-with-error-124848.rs:7:60
|
LL | struct MyType<'a>(Cell<Option<&'unpinned mut MyType<'a>>>, Pin);
| ^^^ not found in this scope
|
help: consider importing this struct
|
LL + use std::pin::Pin;
|
error[E0061]: this struct takes 2 arguments but 1 argument was supplied
--> $DIR/ice-cast-type-with-error-124848.rs:12:24
|
LL | let mut unpinned = MyType(Cell::new(None));
| ^^^^^^----------------- an argument is missing
|
note: tuple struct defined here
--> $DIR/ice-cast-type-with-error-124848.rs:7:8
|
LL | struct MyType<'a>(Cell<Option<&'unpinned mut MyType<'a>>>, Pin);
| ^^^^^^
help: provide the argument
|
LL | let mut unpinned = MyType(Cell::new(None), /* value */);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error[E0606]: casting `&MyType<'_>` as `*const Cell<Option<&mut MyType<'_>>>` is invalid
--> $DIR/ice-cast-type-with-error-124848.rs:14:20
|
LL | let bad_addr = &unpinned as *const Cell<Option<&'a mut MyType<'a>>> as usize;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 6 previous errors
Some errors have detailed explanations: E0061, E0261, E0412, E0606.
For more information about an error, try `rustc --explain E0061`.