Skip to content

Commit

Permalink
FIx ICE while casting a type with error
Browse files Browse the repository at this point in the history
  • Loading branch information
gurry committed May 11, 2024
1 parent ee9a9f8 commit fb619ec
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 1 deletion.
5 changes: 4 additions & 1 deletion compiler/rustc_hir_typeck/src/cast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,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);
}
})
}
Expand Down
18 changes: 18 additions & 0 deletions tests/ui/cast/ice-cast-type-with-error-124848.rs
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
}
63 changes: 63 additions & 0 deletions tests/ui/cast/ice-cast-type-with-error-124848.stderr
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`.

0 comments on commit fb619ec

Please sign in to comment.