Skip to content

Commit

Permalink
Rollup merge of #94997 - michaelwoerister:fix-enum-type-name-layout-e…
Browse files Browse the repository at this point in the history
…rror, r=wesleywiser

debuginfo: Fix ICE when generating name for type that produces a layout error.

Fixes #94961.
  • Loading branch information
Dylan-DPC committed Mar 17, 2022
2 parents 0c73b25 + 243e2a6 commit e55400c
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 2 deletions.
25 changes: 23 additions & 2 deletions compiler/rustc_codegen_ssa/src/debuginfo/type_names.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,30 @@ fn push_debuginfo_type_name<'tcx>(
ty::Float(float_ty) => output.push_str(float_ty.name_str()),
ty::Foreign(def_id) => push_item_name(tcx, def_id, qualified, output),
ty::Adt(def, substs) => {
let ty_and_layout = tcx.layout_of(ParamEnv::reveal_all().and(t)).expect("layout error");
// `layout_for_cpp_like_fallback` will be `Some` if we want to use the fallback encoding.
let layout_for_cpp_like_fallback = if cpp_like_debuginfo && def.is_enum() {
match tcx.layout_of(ParamEnv::reveal_all().and(t)) {
Ok(layout) => {
if !wants_c_like_enum_debuginfo(layout) {
Some(layout)
} else {
// This is a C-like enum so we don't want to use the fallback encoding
// for the name.
None
}
}
Err(e) => {
// Computing the layout can still fail here, e.g. if the target architecture
// cannot represent the type. See https://github.com/rust-lang/rust/issues/94961.
tcx.sess.fatal(&format!("{}", e));
}
}
} else {
// We are not emitting cpp-like debuginfo or this isn't even an enum.
None
};

if def.is_enum() && cpp_like_debuginfo && !wants_c_like_enum_debuginfo(ty_and_layout) {
if let Some(ty_and_layout) = layout_for_cpp_like_fallback {
msvc_enum_fallback(
tcx,
ty_and_layout,
Expand Down
16 changes: 16 additions & 0 deletions src/test/ui/debuginfo/debuginfo-type-name-layout-ice-94961-1.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Make sure the compiler does not ICE when trying to generate the debuginfo name of a type that
// causes a layout error. See https://github.com/rust-lang/rust/issues/94961.

// compile-flags:-C debuginfo=2
// build-fail
// error-pattern: too big for the current architecture
// normalize-stderr-64bit "18446744073709551615" -> "SIZE"
// normalize-stderr-32bit "4294967295" -> "SIZE"

#![crate_type = "rlib"]

pub struct Foo<T>([T; usize::MAX]);

pub fn foo() -> usize {
std::mem::size_of::<Foo<u8>>()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
error: values of the type `[u8; SIZE]` are too big for the current architecture

error: aborting due to previous error

20 changes: 20 additions & 0 deletions src/test/ui/debuginfo/debuginfo-type-name-layout-ice-94961-2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Make sure the compiler does not ICE when trying to generate the debuginfo name of a type that
// causes a layout error.
// This version of the test already ICE'd before the commit that introduce the ICE described in
// https://github.com/rust-lang/rust/issues/94961.

// compile-flags:-C debuginfo=2
// build-fail
// error-pattern: too big for the current architecture
// normalize-stderr-64bit "18446744073709551615" -> "SIZE"
// normalize-stderr-32bit "4294967295" -> "SIZE"

#![crate_type = "rlib"]

pub enum Foo<T> {
Bar([T; usize::MAX]),
}

pub fn foo() -> usize {
std::mem::size_of::<Foo<u8>>()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
error: values of the type `[u8; SIZE]` are too big for the current architecture

error: aborting due to previous error

0 comments on commit e55400c

Please sign in to comment.