@@ -280,3 +280,67 @@ void bin_comma() {
280280// OGCG: define{{.*}} void @_Z9bin_commav()
281281// OGCG: %[[A_ADDR:.*]] = alloca %struct.CompleteS, align 4
282282// OGCG: call void @llvm.memset.p0.i64(ptr align 4 %[[A_ADDR]], i8 0, i64 8, i1 false)
283+
284+ void compound_literal_expr () { CompleteS a = (CompleteS){}; }
285+
286+ // CIR: %[[A_ADDR:.*]] = cir.alloca !rec_CompleteS, !cir.ptr<!rec_CompleteS>, ["a", init]
287+ // CIR: %[[A_ELEM_0_PTR:.*]] = cir.get_member %[[A_ADDR]][0] {name = "a"} : !cir.ptr<!rec_CompleteS> -> !cir.ptr<!s32i>
288+ // CIR: %[[CONST_0:.*]] = cir.const #cir.int<0> : !s32i
289+ // CIR: cir.store{{.*}} %[[CONST_0]], %[[A_ELEM_0_PTR]] : !s32i, !cir.ptr<!s32i>
290+ // CIR: %[[A_ELEM_1_PTR:.*]] = cir.get_member %[[A_ADDR]][1] {name = "b"} : !cir.ptr<!rec_CompleteS> -> !cir.ptr<!s8i>
291+ // CIR: %[[CONST_0:.*]] = cir.const #cir.int<0> : !s8i
292+ // CIR: cir.store{{.*}} %[[CONST_0]], %[[A_ELEM_1_PTR]] : !s8i, !cir.ptr<!s8i>
293+
294+ // TODO(cir): zero-initialize the padding
295+
296+ // LLVM: %[[A_ADDR:.*]] = alloca %struct.CompleteS, i64 1, align 4
297+ // LLVM: %[[A_ELEM_0_PTR:.*]] = getelementptr %struct.CompleteS, ptr %[[A_ADDR]], i32 0, i32 0
298+ // LLVM: store i32 0, ptr %[[A_ELEM_0_PTR]], align 4
299+ // LLVM: %[[A_ELEM_1_PTR:.*]] = getelementptr %struct.CompleteS, ptr %[[A_ADDR]], i32 0, i32 1
300+ // LLVM: store i8 0, ptr %[[A_ELEM_1_PTR]], align 4
301+
302+ // OGCG: %[[A_ADDR:.*]] = alloca %struct.CompleteS, align 4
303+ // OGCG: call void @llvm.memset.p0.i64(ptr align 4 %[[A_ADDR]], i8 0, i64 8, i1 false)
304+
305+ struct StructWithConstMember {
306+ int a : 1 ;
307+ };
308+
309+ void struct_with_const_member_expr () {
310+ int a = (StructWithConstMember){}.a ;
311+ }
312+
313+ // CIR: %[[A_ADDR:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["a", init]
314+ // CIR: %[[RESULT:.*]] = cir.scope {
315+ // CIR: %[[REF_ADDR:.*]] = cir.alloca !rec_StructWithConstMember, !cir.ptr<!rec_StructWithConstMember>, ["ref.tmp0"]
316+ // CIR: %[[ELEM_0_PTR:.*]] = cir.get_member %[[REF_ADDR]][0] {name = "a"} : !cir.ptr<!rec_StructWithConstMember> -> !cir.ptr<!u8i>
317+ // CIR: %[[CONST_0:.*]] = cir.const #cir.int<0> : !s32i
318+ // CIR: %[[SET_BF:.*]] = cir.set_bitfield{{.*}} (#bfi_a, %[[ELEM_0_PTR]] : !cir.ptr<!u8i>, %[[CONST_0]] : !s32i) -> !s32i
319+ // CIR: %[[CONST_0:.*]] = cir.const #cir.int<0> : !s32i
320+ // CIR: cir.yield %[[CONST_0]] : !s32i
321+ // CIR: } : !s32i
322+ // CIR: cir.store{{.*}} %[[RESULT]], %[[A_ADDR]] : !s32i, !cir.ptr<!s32i>
323+
324+ // TODO(cir): zero-initialize the padding
325+
326+ // LLVM: %[[REF_ADDR:.*]] = alloca %struct.StructWithConstMember, i64 1, align 4
327+ // LLVM: %[[A_ADDR:.*]] = alloca i32, i64 1, align 4
328+ // LLVM: br label %[[BF_LABEL:.*]]
329+ // LLVM: [[BF_LABEL]]:
330+ // LLVM: %[[ELEM_0_PTR:.*]] = getelementptr %struct.StructWithConstMember, ptr %[[REF_ADDR]], i32 0, i32 0
331+ // LLVM: %[[TMP_REF:.*]] = load i8, ptr %[[ELEM_0_PTR]], align 4
332+ // LLVM: %[[BF_CLEAR:.*]] = and i8 %[[TMP_REF]], -2
333+ // LLVM: %[[BF_SET:.*]] = or i8 %[[BF_CLEAR]], 0
334+ // LLVM: store i8 %[[BF_SET]], ptr %[[ELEM_0_PTR]], align 4
335+ // LLVM: br label %[[RESULT_LABEL:.*]]
336+ // LLVM: [[RESULT_LABEL]]:
337+ // LLVM: %[[RESULT:.*]] = phi i32 [ 0, %[[BF_LABEL]] ]
338+ // LLVM: store i32 %[[RESULT]], ptr %[[A_ADDR]], align 4
339+
340+ // OGCG: %[[A_ADDR:.*]] = alloca i32, align 4
341+ // OGCG: %[[REF_ADDR:.*]] = alloca %struct.StructWithConstMember, align 4
342+ // OGCG: %[[TMP_REF:.*]] = load i8, ptr %[[REF_ADDR]], align 4
343+ // OGCG: %[[BF_CLEAR:.*]] = and i8 %[[TMP_REF]], -2
344+ // OGCG: %[[BF_SET:.*]] = or i8 %[[BF_CLEAR]], 0
345+ // OGCG: store i8 %[[BF_SET]], ptr %[[REF_ADDR]], align 4
346+ // OGCG: store i32 0, ptr %[[A_ADDR]], align 4
0 commit comments