blob: ed83c663bd60825351491779a136a60ee8f88a4d [file] [log] [blame]
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir
// RUN: FileCheck --input-file=%t.cir %s
// Should implicitly zero-initialize global array elements.
struct S {
int i;
} arr[3] = {{1}};
// CHECK: cir.global external @arr = #cir.const_array<[#cir.const_struct<{#cir.int<1> : !s32i}> : !ty_S, #cir.zero : !ty_S, #cir.zero : !ty_S]> : !cir.array<!ty_S x 3>
int a[4];
// CHECK: cir.global external @a = #cir.zero : !cir.array<!s32i x 4>
// Should create a pointer to a complete array.
int (*complete_ptr_a)[4] = &a;
// CHECK: cir.global external @complete_ptr_a = #cir.global_view<@a> : !cir.ptr<!cir.array<!s32i x 4>>
// Should create a pointer to an incomplete array.
int (*incomplete_ptr_a)[] = &a;
// CHECK: cir.global external @incomplete_ptr_a = #cir.global_view<@a> : !cir.ptr<!cir.array<!s32i x 0>>
// Should access incomplete array if external.
extern int foo[];
// CHECK: cir.global "private" external @foo : !cir.array<!s32i x 0>
void useFoo(int i) {
foo[i] = 42;
}
// CHECK: @useFoo
// CHECK: %[[#V2:]] = cir.get_global @foo : !cir.ptr<!cir.array<!s32i x 0>>
// CHECK: %[[#V3:]] = cir.load %{{.+}} : !cir.ptr<!s32i>, !s32i
// CHECK: %[[#V4:]] = cir.cast(array_to_ptrdecay, %[[#V2]] : !cir.ptr<!cir.array<!s32i x 0>>), !cir.ptr<!s32i>
// CHECK: %[[#V5:]] = cir.ptr_stride(%[[#V4]] : !cir.ptr<!s32i>, %[[#V3]] : !s32i), !cir.ptr<!s32i>
// CHECK: cir.store %{{.+}}, %[[#V5]] : !s32i, !cir.ptr<!s32i>