From 2aa6fd9c6025357c9c04d58af579aad4aa5f0328 Mon Sep 17 00:00:00 2001 From: AmrDeveloper Date: Mon, 13 Oct 2025 21:36:50 +0200 Subject: [PATCH] [CIR] Backport ChooseExpr for AggregateExpr --- clang/lib/CIR/CodeGen/CIRGenExpr.cpp | 2 ++ clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp | 2 +- clang/test/CIR/CodeGen/struct.cpp | 12 ++++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/clang/lib/CIR/CodeGen/CIRGenExpr.cpp b/clang/lib/CIR/CodeGen/CIRGenExpr.cpp index 62cd9d48d399..3c3855b6dfd4 100644 --- a/clang/lib/CIR/CodeGen/CIRGenExpr.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenExpr.cpp @@ -2706,6 +2706,8 @@ LValue CIRGenFunction::emitLValue(const Expr *E) { llvm_unreachable("cannot emit a property reference directly"); case Expr::StmtExprClass: return emitStmtExprLValue(cast(E)); + case Expr::ChooseExprClass: + return emitLValue(cast(E)->getChosenSubExpr()); } llvm_unreachable("NYI"); diff --git a/clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp b/clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp index d792fe7af52b..6964fc260dac 100644 --- a/clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp @@ -291,7 +291,7 @@ class AggExprEmitter : public StmtVisitor { } void VisitAbstractConditionalOperator(const AbstractConditionalOperator *E); - void VisitChooseExpr(const ChooseExpr *E) { llvm_unreachable("NYI"); } + void VisitChooseExpr(const ChooseExpr *E) { Visit(E->getChosenSubExpr()); } void VisitInitListExpr(InitListExpr *E); void VisitCXXParenListInitExpr(CXXParenListInitExpr *E); void VisitCXXParenListOrInitListExpr(Expr *ExprToVisit, ArrayRef Args, diff --git a/clang/test/CIR/CodeGen/struct.cpp b/clang/test/CIR/CodeGen/struct.cpp index 951caef7c1f8..37c5454116fa 100644 --- a/clang/test/CIR/CodeGen/struct.cpp +++ b/clang/test/CIR/CodeGen/struct.cpp @@ -195,3 +195,15 @@ void designated_init_update_expr() { // CHECK: %[[CONST_1:.*]] = cir.const #cir.int<1> : !s32i // CHECK: cir.store{{.*}} %[[CONST_1]], %[[ELEM_0_PTR]] : !s32i, !cir.ptr // CHECK: %[[ELEM_1_PTR:.*]] = cir.get_member %[[C_ADDR]][1] {name = "b"} : !cir.ptr -> !cir.ptr + +void choose_expr() { + CompleteS a; + CompleteS b; + CompleteS c = __builtin_choose_expr(true, a, b); +} + +// CHECK: cir.func{{.*}} @_Z11choose_exprv() +// CHECK: %[[A_ADDR:.*]] = cir.alloca !rec_CompleteS, !cir.ptr, ["a"] +// CHECK: %[[B_ADDR:.*]] = cir.alloca !rec_CompleteS, !cir.ptr, ["b"] +// CHECK: %[[C_ADDR:.*]] = cir.alloca !rec_CompleteS, !cir.ptr, ["c", init] +// CHECK: cir.copy %[[A_ADDR]] to %[[C_ADDR]] : !cir.ptr