Skip to content

Commit d645aa7

Browse files
authored
[CIR] Backport DesignatedInitUpdateExpr for AggregateExpr (#1935)
Backport DesignatedInitUpdateExpr for AggregateExpr from the upstream
1 parent e964257 commit d645aa7

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,8 +284,12 @@ class AggExprEmitter : public StmtVisitor<AggExprEmitter> {
284284
void VisitObjCIVarRefExpr(ObjCIvarRefExpr *E) { llvm_unreachable("NYI"); }
285285

286286
void VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr *E) {
287-
llvm_unreachable("NYI");
287+
AggValueSlot dest = EnsureSlot(CGF.getLoc(E->getExprLoc()), E->getType());
288+
LValue destLV = CGF.makeAddrLValue(dest.getAddress(), E->getType());
289+
emitInitializationToLValue(E->getBase(), destLV);
290+
VisitInitListExpr(E->getUpdater());
288291
}
292+
289293
void VisitAbstractConditionalOperator(const AbstractConditionalOperator *E);
290294
void VisitChooseExpr(const ChooseExpr *E) { llvm_unreachable("NYI"); }
291295
void VisitInitListExpr(InitListExpr *E);

clang/test/CIR/CodeGen/struct.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,3 +173,25 @@ void ppp() { Entry x; }
173173
// CHECK: cir.func linkonce_odr @_ZN5EntryC2Ev(%arg0: !cir.ptr<!rec_Entry>
174174

175175
// CHECK: cir.get_member %1[0] {name = "procAddr"} : !cir.ptr<!rec_Entry> -> !cir.ptr<!cir.ptr<!cir.func<(!s32i, !cir.ptr<!s8i>, !cir.ptr<!void>) -> !u32i>>>
176+
177+
struct CompleteS {
178+
int a;
179+
char b;
180+
};
181+
182+
void designated_init_update_expr() {
183+
CompleteS a;
184+
185+
struct Container {
186+
CompleteS c;
187+
} b = {a, .c.a = 1};
188+
}
189+
190+
// CHECK: %[[A_ADDR:.*]] = cir.alloca !rec_CompleteS, !cir.ptr<!rec_CompleteS>, ["a"]
191+
// CHECK: %[[B_ADDR:.*]] = cir.alloca !rec_Container, !cir.ptr<!rec_Container>, ["b", init]
192+
// CHECK: %[[C_ADDR:.*]] = cir.get_member %[[B_ADDR]][0] {name = "c"} : !cir.ptr<!rec_Container> -> !cir.ptr<!rec_CompleteS>
193+
// CHECK: cir.copy %[[A_ADDR]] to %[[C_ADDR]] : !cir.ptr<!rec_CompleteS>
194+
// CHECK: %[[ELEM_0_PTR:.*]] = cir.get_member %[[C_ADDR]][0] {name = "a"} : !cir.ptr<!rec_CompleteS> -> !cir.ptr<!s32i>
195+
// CHECK: %[[CONST_1:.*]] = cir.const #cir.int<1> : !s32i
196+
// CHECK: cir.store{{.*}} %[[CONST_1]], %[[ELEM_0_PTR]] : !s32i, !cir.ptr<!s32i>
197+
// CHECK: %[[ELEM_1_PTR:.*]] = cir.get_member %[[C_ADDR]][1] {name = "b"} : !cir.ptr<!rec_CompleteS> -> !cir.ptr<!s8i>

0 commit comments

Comments
 (0)