// RUN: cir-opt %s --verify-roundtrip | FileCheck %s !u8i = !cir.int !u16i = !cir.int !s32i = !cir.int !u32i = !cir.int !rec_C = !cir.struct !rec_S = !cir.struct<"S" incomplete> !rec_U = !cir.union<"U" incomplete> // CHECK-DAG: !rec_C = !cir.struct // CHECK-DAG: !rec_S = !cir.struct<"S" incomplete> // CHECK-DAG: !rec_U = !cir.union<"U" incomplete> !rec_anon_struct = !cir.struct< packed {!s32i, !s32i, !cir.array}> !rec_anon_struct1 = !cir.struct<{!cir.array x 5>}> !rec_anon_struct2 = !cir.struct<{!cir.ptr, !cir.ptr, !cir.ptr}> !rec_S1 = !cir.struct<"S1" {!s32i, !s32i}> !rec_Sc = !cir.struct<"Sc" {!u8i, !u16i, !u32i}> // CHECK-DAG: !cir.struct<{!cir.array x 5>}> // CHECK-DAG: !cir.struct<{!cir.ptr, !cir.ptr, !cir.ptr}> // CHECK-DAG: !rec_S1 = !cir.struct<"S1" {!s32i, !s32i}> // CHECK-DAG: !rec_Sc = !cir.struct<"Sc" {!u8i, !u16i, !u32i}> // Packed and padded structs !rec_P1 = !cir.struct<"P1" packed {!s32i, !s32i}> !rec_P2 = !cir.struct<"P2" padded {!u8i, !u16i, !u32i}> !rec_P3 = !cir.struct<"P3" packed padded {!u8i, !u16i, !u32i}> // CHECK-DAG: !rec_P1 = !cir.struct<"P1" packed {!s32i, !s32i}> // CHECK-DAG: !rec_P2 = !cir.struct<"P2" padded {!u8i, !u16i, !u32i}> // CHECK-DAG: !rec_P3 = !cir.struct<"P3" packed padded {!u8i, !u16i, !u32i}> !rec_U1 = !cir.union<"U1" {!s32i, !u8i}, padding = {!u8i}> !rec_U2 = !cir.union<"U2" packed {!s32i}, padding = {!cir.array}> // CHECK-DAG: !rec_U1 = !cir.union<"U1" {!s32i, !u8i}, padding = {!u8i}> // CHECK-DAG: !rec_U2 = !cir.union<"U2" packed {!s32i}, padding = {!cir.array}> // Complete a previously incomplete record !rec_A = !cir.struct !rec_Ac = !cir.struct // CHECK-DAG: !rec_A = !cir.struct // Test recursive struct parsing/printing. !rec_Node = !cir.struct<"Node" {!cir.ptr>}> // CHECK-DAG: !cir.struct<"Node" {!cir.ptr>}> module { cir.global external @p1 = #cir.ptr : !cir.ptr cir.global external @p2 = #cir.ptr : !cir.ptr cir.global external @p3 = #cir.ptr : !cir.ptr cir.global external @arr = #cir.const_record<{#cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.zero : !cir.array}> : !rec_anon_struct // CHECK: cir.global external @p1 = #cir.ptr : !cir.ptr // CHECK: cir.global external @p2 = #cir.ptr : !cir.ptr // CHECK: cir.global external @p3 = #cir.ptr : !cir.ptr // CHECK: cir.global external @arr = #cir.const_record<{#cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.zero : !cir.array}> : !rec_anon_struct // Dummy function to use types and force them to be printed. cir.func @useTypes(%arg0: !rec_Node, %arg1: !rec_anon_struct2, %arg2: !rec_anon_struct1, %arg3: !rec_S1, %arg4: !rec_Ac, %arg5: !rec_P1, %arg6: !rec_P2, %arg7: !rec_P3, %arg8: !rec_U1, %arg9: !rec_U2) { cir.return } cir.func @structs() { %0 = cir.alloca !cir.ptr>, !cir.ptr>>, ["sc", init] {alignment = 8 : i64} %1 = cir.alloca !cir.ptr>, !cir.ptr>>, ["u", init] {alignment = 8 : i64} cir.return } // CHECK: cir.func @structs() { // CHECK: %0 = cir.alloca !cir.ptr, !cir.ptr>, ["sc", init] // CHECK: %1 = cir.alloca !cir.ptr, !cir.ptr>, ["u", init] cir.func @struct_extract_member_test() { %0 = cir.const #cir.const_record<{#cir.int<1> : !u8i, #cir.int<2> : !u16i, #cir.int<3> : !u32i}> : !rec_Sc %1 = cir.extract_member %0[0] : !rec_Sc -> !u8i cir.return } // CHECK: cir.func{{.*}} @struct_extract_member_test() { // CHECK: %[[RECORD:.*]] = cir.const #cir.const_record<{#cir.int<1> : !u8i, #cir.int<2> : !u16i, #cir.int<3> : !u32i}> : !rec_Sc // CHECK: %[[ELEM_0:.*]] = cir.extract_member %[[RECORD]][0] : !rec_Sc -> !u8i // CHECK: cir.return // CHECK: } }