From e098327271327f86fb6aac22e64136f4a3268d31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maja=20K=C4=85dzio=C5=82ka?= Date: Tue, 10 Feb 2026 15:10:04 +0100 Subject: [PATCH] Don't ICE on layout error in vtable computation --- compiler/rustc_middle/src/ty/vtable.rs | 7 ++++--- .../vtable-try-as-dyn.full-debuginfo.stderr | 4 ++++ .../limits/vtable-try-as-dyn.no-debuginfo.stderr | 4 ++++ tests/ui/limits/vtable-try-as-dyn.rs | 15 +++++++++++++++ tests/ui/limits/vtable.rs | 8 ++++++++ tests/ui/limits/vtable.stderr | 4 ++++ 6 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 tests/ui/limits/vtable-try-as-dyn.full-debuginfo.stderr create mode 100644 tests/ui/limits/vtable-try-as-dyn.no-debuginfo.stderr create mode 100644 tests/ui/limits/vtable-try-as-dyn.rs create mode 100644 tests/ui/limits/vtable.rs create mode 100644 tests/ui/limits/vtable.stderr diff --git a/compiler/rustc_middle/src/ty/vtable.rs b/compiler/rustc_middle/src/ty/vtable.rs index a3e9054fdcb8b..edb1eaea30275 100644 --- a/compiler/rustc_middle/src/ty/vtable.rs +++ b/compiler/rustc_middle/src/ty/vtable.rs @@ -99,9 +99,10 @@ pub(super) fn vtable_allocation_provider<'tcx>( // This confirms that the layout computation for &dyn Trait has an accurate sizing. assert!(vtable_entries.len() >= vtable_min_entries(tcx, poly_trait_ref)); - let layout = tcx - .layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(ty)) - .expect("failed to build vtable representation"); + let layout = match tcx.layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(ty)) { + Ok(layout) => layout, + Err(e) => tcx.dcx().emit_fatal(e.into_diagnostic()), + }; assert!(layout.is_sized(), "can't create a vtable for an unsized type"); let size = layout.size.bytes(); let align = layout.align.bytes(); diff --git a/tests/ui/limits/vtable-try-as-dyn.full-debuginfo.stderr b/tests/ui/limits/vtable-try-as-dyn.full-debuginfo.stderr new file mode 100644 index 0000000000000..a3772e509ed67 --- /dev/null +++ b/tests/ui/limits/vtable-try-as-dyn.full-debuginfo.stderr @@ -0,0 +1,4 @@ +error: values of the type `[u8; usize::MAX]` are too big for the target architecture + +error: aborting due to 1 previous error + diff --git a/tests/ui/limits/vtable-try-as-dyn.no-debuginfo.stderr b/tests/ui/limits/vtable-try-as-dyn.no-debuginfo.stderr new file mode 100644 index 0000000000000..a3772e509ed67 --- /dev/null +++ b/tests/ui/limits/vtable-try-as-dyn.no-debuginfo.stderr @@ -0,0 +1,4 @@ +error: values of the type `[u8; usize::MAX]` are too big for the target architecture + +error: aborting due to 1 previous error + diff --git a/tests/ui/limits/vtable-try-as-dyn.rs b/tests/ui/limits/vtable-try-as-dyn.rs new file mode 100644 index 0000000000000..4df4f92717f9c --- /dev/null +++ b/tests/ui/limits/vtable-try-as-dyn.rs @@ -0,0 +1,15 @@ +// At the time of writing, vtable.rs would ICE only with debuginfo disabled, while this testcase, +// originally reported as #152030, would ICE even with debuginfo enabled. +//@ revisions: no-debuginfo full-debuginfo +//@ compile-flags: --crate-type=lib --emit=mir +//@[no-debuginfo] compile-flags: -C debuginfo=0 +//@[full-debuginfo] compile-flags: -C debuginfo=2 +#![feature(try_as_dyn)] + +trait Trait {} +impl Trait for T {} + +//~? ERROR: values of the type `[u8; usize::MAX]` are too big for the target architecture +pub fn foo(x: &[u8; usize::MAX]) { + let _ = std::any::try_as_dyn::<[u8; usize::MAX], dyn Trait>(x); +} diff --git a/tests/ui/limits/vtable.rs b/tests/ui/limits/vtable.rs new file mode 100644 index 0000000000000..570eaaec491ca --- /dev/null +++ b/tests/ui/limits/vtable.rs @@ -0,0 +1,8 @@ +//@ compile-flags: --crate-type=lib --emit=mir -C debuginfo=0 +pub trait Trait {} +impl Trait for T {} + +//~? ERROR: values of the type `[u8; usize::MAX]` are too big for the target architecture +pub fn foo(x: &[u8; usize::MAX]) -> &dyn Trait { + x as &dyn Trait +} diff --git a/tests/ui/limits/vtable.stderr b/tests/ui/limits/vtable.stderr new file mode 100644 index 0000000000000..a3772e509ed67 --- /dev/null +++ b/tests/ui/limits/vtable.stderr @@ -0,0 +1,4 @@ +error: values of the type `[u8; usize::MAX]` are too big for the target architecture + +error: aborting due to 1 previous error +