about summary refs log tree commit diff
path: root/tests/codegen-llvm/debuginfo-cyclic-structure.rs
blob: b8cc5447741581758058e41baa53e707ed7b3571 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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(с);
}