compiler: Include span of too huge array with -Cdebuginfo=2

We have a few ui tests to ensure we emit an error if we encounter too
big arrays. Before this fix, compiling the tests with `-Cdebuginfo=2`
would not include the spans of the instantiation sites, because the
error is then emitted from a different code path that does not include
the span.

Propagate the span to the error also in the debuginfo case, so the tests
passes regardless of debuginfo level.
This commit is contained in:
Martin Nordholts
2025-08-30 10:38:23 +02:00
parent b53c72ffaa
commit 2ce6154b32
11 changed files with 52 additions and 7 deletions

View File

@@ -103,16 +103,17 @@ fn build_fixed_size_array_di_node<'ll, 'tcx>(
cx: &CodegenCx<'ll, 'tcx>,
unique_type_id: UniqueTypeId<'tcx>,
array_type: Ty<'tcx>,
span: Span,
) -> DINodeCreationResult<'ll> {
let ty::Array(element_type, len) = array_type.kind() else {
bug!("build_fixed_size_array_di_node() called with non-ty::Array type `{:?}`", array_type)
};
let element_type_di_node = type_di_node(cx, *element_type);
let element_type_di_node = spanned_type_di_node(cx, *element_type, span);
return_if_di_node_created_in_meantime!(cx, unique_type_id);
let (size, align) = cx.size_and_align_of(array_type);
let (size, align) = cx.spanned_size_and_align_of(array_type, span);
let upper_bound = len
.try_to_target_usize(cx.tcx)
@@ -447,7 +448,7 @@ pub(crate) fn spanned_type_di_node<'ll, 'tcx>(
build_basic_type_di_node(cx, t)
}
ty::Tuple(elements) if elements.is_empty() => build_basic_type_di_node(cx, t),
ty::Array(..) => build_fixed_size_array_di_node(cx, unique_type_id, t),
ty::Array(..) => build_fixed_size_array_di_node(cx, unique_type_id, t, span),
ty::Slice(_) | ty::Str => build_slice_type_di_node(cx, t, unique_type_id),
ty::Dynamic(..) => build_dyn_type_di_node(cx, t, unique_type_id),
ty::Foreign(..) => build_foreign_type_di_node(cx, t, unique_type_id),

View File

@@ -7,6 +7,7 @@ use rustc_middle::bug;
use rustc_middle::ty::layout::{LayoutOf, TyAndLayout};
use rustc_middle::ty::print::{with_no_trimmed_paths, with_no_visible_paths};
use rustc_middle::ty::{self, CoroutineArgsExt, Ty, TypeVisitableExt};
use rustc_span::{DUMMY_SP, Span};
use tracing::debug;
use crate::common::*;
@@ -149,7 +150,11 @@ impl<'a, 'tcx> CodegenCx<'a, 'tcx> {
}
pub(crate) fn size_and_align_of(&self, ty: Ty<'tcx>) -> (Size, Align) {
let layout = self.layout_of(ty);
self.spanned_size_and_align_of(ty, DUMMY_SP)
}
pub(crate) fn spanned_size_and_align_of(&self, ty: Ty<'tcx>, span: Span) -> (Size, Align) {
let layout = self.spanned_layout_of(ty, span);
(layout.size, layout.align.abi)
}
}

View File

@@ -1,5 +1,5 @@
error: values of the type `[u8; 2305843011361177600]` are too big for the target architecture
--> $DIR/huge-array-simple-64.rs:7:9
--> $DIR/huge-array-simple-64.rs:12:9
|
LL | let _fat: [u8; (1<<61)+(1<<31)] =
| ^^^^

View File

@@ -0,0 +1,8 @@
error: values of the type `[u8; 2305843011361177600]` are too big for the target architecture
--> $DIR/huge-array-simple-64.rs:12:9
|
LL | let _fat: [u8; (1<<61)+(1<<31)] =
| ^^^^
error: aborting due to 1 previous error

View File

@@ -1,3 +1,8 @@
// FIXME(#61117): Remove revisions once x86_64-gnu-debug CI job sets rust.debuginfo-level-tests=2
// NOTE: The .stderr for both revisions shall be identical.
//@ revisions: no-debuginfo full-debuginfo
//@[no-debuginfo] compile-flags: -Cdebuginfo=0
//@[full-debuginfo] compile-flags: -Cdebuginfo=2
//@ build-fail
//@ ignore-32bit

View File

@@ -1,5 +1,5 @@
error: values of the type `[[u8; 1518599999]; 1518600000]` are too big for the target architecture
--> $DIR/huge-array.rs:4:9
--> $DIR/huge-array.rs:9:9
|
LL | let s: [T; 1518600000] = [t; 1518600000];
| ^

View File

@@ -0,0 +1,8 @@
error: values of the type `[[u8; 1518599999]; 1518600000]` are too big for the target architecture
--> $DIR/huge-array.rs:9:9
|
LL | let s: [T; 1518600000] = [t; 1518600000];
| ^
error: aborting due to 1 previous error

View File

@@ -1,3 +1,8 @@
// FIXME(#61117): Remove revisions once x86_64-gnu-debug CI job sets rust.debuginfo-level-tests=2
// NOTE: The .stderr for both revisions shall be identical.
//@ revisions: no-debuginfo full-debuginfo
//@[no-debuginfo] compile-flags: -Cdebuginfo=0
//@[full-debuginfo] compile-flags: -Cdebuginfo=2
//@ build-fail
fn generic<T: Copy>(t: T) {

View File

@@ -1,5 +1,5 @@
error: values of the type `[usize; usize::MAX]` are too big for the target architecture
--> $DIR/issue-15919-64.rs:5:9
--> $DIR/issue-15919-64.rs:10:9
|
LL | let x = [0usize; 0xffff_ffff_ffff_ffff];
| ^

View File

@@ -0,0 +1,8 @@
error: values of the type `[usize; usize::MAX]` are too big for the target architecture
--> $DIR/issue-15919-64.rs:10:9
|
LL | let x = [0usize; 0xffff_ffff_ffff_ffff];
| ^
error: aborting due to 1 previous error

View File

@@ -1,3 +1,8 @@
// FIXME(#61117): Remove revisions once x86_64-gnu-debug CI job sets rust.debuginfo-level-tests=2
// NOTE: The .stderr for both revisions shall be identical.
//@ revisions: no-debuginfo full-debuginfo
//@[no-debuginfo] compile-flags: -Cdebuginfo=0
//@[full-debuginfo] compile-flags: -Cdebuginfo=2
//@ build-fail
//@ ignore-32bit