Skip to content

Commit

Permalink
Fix ICE during type layout when there's a [type error]
Browse files Browse the repository at this point in the history
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.

[comment]: rust-lang#84108 (comment)
  • Loading branch information
camelid committed Apr 14, 2021
1 parent 132b4e5 commit c30eac5
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 1 deletion.
9 changes: 8 additions & 1 deletion compiler/rustc_middle/src/ty/layout.rs
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,14 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
for &i in &inverse_memory_index {
let field = fields[i as usize];
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() {
Expand Down
14 changes: 14 additions & 0 deletions src/test/ui/layout/issue-84108.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 44 additions & 0 deletions src/test/ui/layout/issue-84108.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit c30eac5

Please sign in to comment.