FIx ICE while casting a type with error
This commit is contained in:
parent
ee9a9f84c5
commit
fb619ec208
@ -140,7 +140,10 @@ fn pointer_kind(
|
||||
| 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);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
18
tests/ui/cast/ice-cast-type-with-error-124848.rs
Normal file
18
tests/ui/cast/ice-cast-type-with-error-124848.rs
Normal 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
|
||||
}
|
63
tests/ui/cast/ice-cast-type-with-error-124848.stderr
Normal file
63
tests/ui/cast/ice-cast-type-with-error-124848.stderr
Normal 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`.
|
Loading…
Reference in New Issue
Block a user