Rollup merge of #84262 - camelid:sized-ice, r=estebank
Fix ICE during type layout when there's a `[type error]` Fixes #84108. Based on estebank's [comment], except I used `delay_span_bug` because it should work in more cases, and I think it expresses its intent more clearly. r? `@estebank` [comment]: https://github.com/rust-lang/rust/issues/84108#issuecomment-818916848
This commit is contained in:
commit
ac6e239b3b
3 changed files with 66 additions and 1 deletions
|
@ -367,7 +367,14 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
|
||||||
for &i in &inverse_memory_index {
|
for &i in &inverse_memory_index {
|
||||||
let field = fields[i as usize];
|
let field = fields[i as usize];
|
||||||
if !sized {
|
if !sized {
|
||||||
bug!("univariant: field #{} of `{}` comes after unsized field", offsets.len(), ty);
|
self.tcx.sess.delay_span_bug(
|
||||||
|
DUMMY_SP,
|
||||||
|
&format!(
|
||||||
|
"univariant: field #{} of `{}` comes after unsized field",
|
||||||
|
offsets.len(),
|
||||||
|
ty
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if field.is_unsized() {
|
if field.is_unsized() {
|
||||||
|
|
14
src/test/ui/layout/issue-84108.rs
Normal file
14
src/test/ui/layout/issue-84108.rs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
// See issue #84108 -- this is a test to ensure we do not ICE
|
||||||
|
// on this invalid code.
|
||||||
|
|
||||||
|
#![crate_type = "lib"]
|
||||||
|
|
||||||
|
static FOO: (dyn AsRef<OsStr>, u8) = ("hello", 42);
|
||||||
|
//~^ ERROR cannot find type `OsStr` in this scope
|
||||||
|
|
||||||
|
const BAR: (&Path, [u8], usize) = ("hello", [], 42);
|
||||||
|
//~^ ERROR cannot find type `Path` in this scope
|
||||||
|
//~| ERROR the size for values of type `[u8]` cannot be known at compilation time
|
||||||
|
|
||||||
|
static BAZ: ([u8], usize) = ([], 0);
|
||||||
|
//~^ ERROR the size for values of type `[u8]` cannot be known at compilation time
|
44
src/test/ui/layout/issue-84108.stderr
Normal file
44
src/test/ui/layout/issue-84108.stderr
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
error[E0412]: cannot find type `OsStr` in this scope
|
||||||
|
--> $DIR/issue-84108.rs:6:24
|
||||||
|
|
|
||||||
|
LL | static FOO: (dyn AsRef<OsStr>, u8) = ("hello", 42);
|
||||||
|
| ^^^^^ not found in this scope
|
||||||
|
|
|
||||||
|
help: consider importing this struct
|
||||||
|
|
|
||||||
|
LL | use std::ffi::OsStr;
|
||||||
|
|
|
||||||
|
|
||||||
|
error[E0412]: cannot find type `Path` in this scope
|
||||||
|
--> $DIR/issue-84108.rs:9:14
|
||||||
|
|
|
||||||
|
LL | const BAR: (&Path, [u8], usize) = ("hello", [], 42);
|
||||||
|
| ^^^^ not found in this scope
|
||||||
|
|
|
||||||
|
help: consider importing this struct
|
||||||
|
|
|
||||||
|
LL | use std::path::Path;
|
||||||
|
|
|
||||||
|
|
||||||
|
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||||
|
--> $DIR/issue-84108.rs:9:12
|
||||||
|
|
|
||||||
|
LL | const BAR: (&Path, [u8], usize) = ("hello", [], 42);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||||
|
|
|
||||||
|
= help: the trait `Sized` is not implemented for `[u8]`
|
||||||
|
= note: only the last element of a tuple may have a dynamically sized type
|
||||||
|
|
||||||
|
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||||
|
--> $DIR/issue-84108.rs:13:13
|
||||||
|
|
|
||||||
|
LL | static BAZ: ([u8], usize) = ([], 0);
|
||||||
|
| ^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||||
|
|
|
||||||
|
= help: the trait `Sized` is not implemented for `[u8]`
|
||||||
|
= note: only the last element of a tuple may have a dynamically sized type
|
||||||
|
|
||||||
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0277, E0412.
|
||||||
|
For more information about an error, try `rustc --explain E0277`.
|
Loading…
Add table
Add a link
Reference in a new issue