mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 07:14:28 +00:00
debuginfo: Fix ICE when generating name for type that produces a layout error.
This commit is contained in:
parent
d8e564715e
commit
243e2a698c
@ -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,
|
||||
|
@ -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>>()
|
||||
}
|
@ -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,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>>()
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
error: values of the type `[u8; SIZE]` are too big for the current architecture
|
||||
|
||||
error: aborting due to previous error
|
||||
|
Loading…
Reference in New Issue
Block a user