forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of rust-lang#124997 - gurry:124848-ice-should-be-sized, r=Nadrieril Fix ICE while casting a type with error Fixes rust-lang#124848 The ICE originates here: https://github.com/rust-lang/rust/blob/f9a3fd966162b3c7386d90fe4626471f66ba3b8f/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: https://github.com/rust-lang/rust/blob/f9a3fd966162b3c7386d90fe4626471f66ba3b8f/compiler/rustc_hir_typeck/src/cast.rs#L87-L91 Thanks to the changes in PR rust-lang#123491, `type_is_sized_modulo_regions` in `pointer_kind` returned `false` which caused control to reach the `span_bug` here: https://github.com/rust-lang/rust/blob/f9a3fd966162b3c7386d90fe4626471f66ba3b8f/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`.
- Loading branch information
Showing
3 changed files
with
85 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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`. |