Skip to content

Commit 2ce6154

Browse files
committed
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.
1 parent b53c72f commit 2ce6154

11 files changed

+52
-7
lines changed

compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,16 +103,17 @@ fn build_fixed_size_array_di_node<'ll, 'tcx>(
103103
cx: &CodegenCx<'ll, 'tcx>,
104104
unique_type_id: UniqueTypeId<'tcx>,
105105
array_type: Ty<'tcx>,
106+
span: Span,
106107
) -> DINodeCreationResult<'ll> {
107108
let ty::Array(element_type, len) = array_type.kind() else {
108109
bug!("build_fixed_size_array_di_node() called with non-ty::Array type `{:?}`", array_type)
109110
};
110111

111-
let element_type_di_node = type_di_node(cx, *element_type);
112+
let element_type_di_node = spanned_type_di_node(cx, *element_type, span);
112113

113114
return_if_di_node_created_in_meantime!(cx, unique_type_id);
114115

115-
let (size, align) = cx.size_and_align_of(array_type);
116+
let (size, align) = cx.spanned_size_and_align_of(array_type, span);
116117

117118
let upper_bound = len
118119
.try_to_target_usize(cx.tcx)
@@ -447,7 +448,7 @@ pub(crate) fn spanned_type_di_node<'ll, 'tcx>(
447448
build_basic_type_di_node(cx, t)
448449
}
449450
ty::Tuple(elements) if elements.is_empty() => build_basic_type_di_node(cx, t),
450-
ty::Array(..) => build_fixed_size_array_di_node(cx, unique_type_id, t),
451+
ty::Array(..) => build_fixed_size_array_di_node(cx, unique_type_id, t, span),
451452
ty::Slice(_) | ty::Str => build_slice_type_di_node(cx, t, unique_type_id),
452453
ty::Dynamic(..) => build_dyn_type_di_node(cx, t, unique_type_id),
453454
ty::Foreign(..) => build_foreign_type_di_node(cx, t, unique_type_id),

compiler/rustc_codegen_llvm/src/type_of.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use rustc_middle::bug;
77
use rustc_middle::ty::layout::{LayoutOf, TyAndLayout};
88
use rustc_middle::ty::print::{with_no_trimmed_paths, with_no_visible_paths};
99
use rustc_middle::ty::{self, CoroutineArgsExt, Ty, TypeVisitableExt};
10+
use rustc_span::{DUMMY_SP, Span};
1011
use tracing::debug;
1112

1213
use crate::common::*;
@@ -149,7 +150,11 @@ impl<'a, 'tcx> CodegenCx<'a, 'tcx> {
149150
}
150151

151152
pub(crate) fn size_and_align_of(&self, ty: Ty<'tcx>) -> (Size, Align) {
152-
let layout = self.layout_of(ty);
153+
self.spanned_size_and_align_of(ty, DUMMY_SP)
154+
}
155+
156+
pub(crate) fn spanned_size_and_align_of(&self, ty: Ty<'tcx>, span: Span) -> (Size, Align) {
157+
let layout = self.spanned_layout_of(ty, span);
153158
(layout.size, layout.align.abi)
154159
}
155160
}

tests/ui/limits/huge-array-simple-64.stderr renamed to tests/ui/limits/huge-array-simple-64.full-debuginfo.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error: values of the type `[u8; 2305843011361177600]` are too big for the target architecture
2-
--> $DIR/huge-array-simple-64.rs:7:9
2+
--> $DIR/huge-array-simple-64.rs:12:9
33
|
44
LL | let _fat: [u8; (1<<61)+(1<<31)] =
55
| ^^^^
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
error: values of the type `[u8; 2305843011361177600]` are too big for the target architecture
2+
--> $DIR/huge-array-simple-64.rs:12:9
3+
|
4+
LL | let _fat: [u8; (1<<61)+(1<<31)] =
5+
| ^^^^
6+
7+
error: aborting due to 1 previous error
8+

tests/ui/limits/huge-array-simple-64.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
// FIXME(#61117): Remove revisions once x86_64-gnu-debug CI job sets rust.debuginfo-level-tests=2
2+
// NOTE: The .stderr for both revisions shall be identical.
3+
//@ revisions: no-debuginfo full-debuginfo
4+
//@[no-debuginfo] compile-flags: -Cdebuginfo=0
5+
//@[full-debuginfo] compile-flags: -Cdebuginfo=2
16
//@ build-fail
27
//@ ignore-32bit
38

tests/ui/limits/huge-array.stderr renamed to tests/ui/limits/huge-array.full-debuginfo.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error: values of the type `[[u8; 1518599999]; 1518600000]` are too big for the target architecture
2-
--> $DIR/huge-array.rs:4:9
2+
--> $DIR/huge-array.rs:9:9
33
|
44
LL | let s: [T; 1518600000] = [t; 1518600000];
55
| ^
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
error: values of the type `[[u8; 1518599999]; 1518600000]` are too big for the target architecture
2+
--> $DIR/huge-array.rs:9:9
3+
|
4+
LL | let s: [T; 1518600000] = [t; 1518600000];
5+
| ^
6+
7+
error: aborting due to 1 previous error
8+

tests/ui/limits/huge-array.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
// FIXME(#61117): Remove revisions once x86_64-gnu-debug CI job sets rust.debuginfo-level-tests=2
2+
// NOTE: The .stderr for both revisions shall be identical.
3+
//@ revisions: no-debuginfo full-debuginfo
4+
//@[no-debuginfo] compile-flags: -Cdebuginfo=0
5+
//@[full-debuginfo] compile-flags: -Cdebuginfo=2
16
//@ build-fail
27

38
fn generic<T: Copy>(t: T) {

tests/ui/limits/issue-15919-64.stderr renamed to tests/ui/limits/issue-15919-64.full-debuginfo.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error: values of the type `[usize; usize::MAX]` are too big for the target architecture
2-
--> $DIR/issue-15919-64.rs:5:9
2+
--> $DIR/issue-15919-64.rs:10:9
33
|
44
LL | let x = [0usize; 0xffff_ffff_ffff_ffff];
55
| ^
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
error: values of the type `[usize; usize::MAX]` are too big for the target architecture
2+
--> $DIR/issue-15919-64.rs:10:9
3+
|
4+
LL | let x = [0usize; 0xffff_ffff_ffff_ffff];
5+
| ^
6+
7+
error: aborting due to 1 previous error
8+

0 commit comments

Comments
 (0)