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:
@@ -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),
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)] =
|
||||
| ^^^^
|
||||
8
tests/ui/limits/huge-array-simple-64.no-debuginfo.stderr
Normal file
8
tests/ui/limits/huge-array-simple-64.no-debuginfo.stderr
Normal 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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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];
|
||||
| ^
|
||||
8
tests/ui/limits/huge-array.no-debuginfo.stderr
Normal file
8
tests/ui/limits/huge-array.no-debuginfo.stderr
Normal 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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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];
|
||||
| ^
|
||||
8
tests/ui/limits/issue-15919-64.no-debuginfo.stderr
Normal file
8
tests/ui/limits/issue-15919-64.no-debuginfo.stderr
Normal 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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user