fix(debuginfo): disable overflow check for

recursive non-enum types
This commit is contained in:
godzie44 2025-07-24 16:30:22 +03:00
parent 86ef320294
commit 49eda8edd5
2 changed files with 34 additions and 2 deletions

View file

@ -285,8 +285,8 @@ pub(super) fn build_type_with_children<'ll, 'tcx>(
// Item(T),
// }
// ```
let is_expanding_recursive =
debug_context(cx).adt_stack.borrow().iter().any(|(parent_def_id, parent_args)| {
let is_expanding_recursive = adt_def.is_enum()
&& debug_context(cx).adt_stack.borrow().iter().any(|(parent_def_id, parent_args)| {
if def_id == *parent_def_id {
args.iter().zip(parent_args.iter()).any(|(arg, parent_arg)| {
if let (Some(arg), Some(parent_arg)) = (arg.as_type(), parent_arg.as_type())

View file

@ -0,0 +1,32 @@
//@ compile-flags:-g -Copt-level=0 -C panic=abort
// Check that debug information exists for structures containing loops (cyclic references).
// Previously it may incorrectly prune member information during recursive type inference check.
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "Arc<debuginfo_cyclic_structure::Inner<alloc::sync::Arc<debuginfo_cyclic_structure::Handle{{.*}}elements: ![[FIELDS:[0-9]+]]
// CHECK: ![[FIELDS]] = !{!{{.*}}}
// CHECK-NOT: ![[FIELDS]] = !{}
#![crate_type = "lib"]
use std::mem::MaybeUninit;
use std::sync::Arc;
struct Inner<T> {
buffer: Box<MaybeUninit<T>>,
}
struct Shared {
shared: Arc<Inner<Arc<Handle>>>,
}
struct Handle {
shared: Shared,
}
struct Core {
inner: Arc<Inner<Arc<Handle>>>,
}
#[no_mangle]
extern "C" fn test() {
let с = Core { inner: Arc::new(Inner { buffer: Box::new(MaybeUninit::uninit()) }) };
std::hint::black_box(с);
}