diff --git a/clang/lib/CIR/CodeGen/CIRGenExpr.cpp b/clang/lib/CIR/CodeGen/CIRGenExpr.cpp index 3c3855b6dfd4..0fda1375e3e4 100644 --- a/clang/lib/CIR/CodeGen/CIRGenExpr.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenExpr.cpp @@ -2671,6 +2671,8 @@ LValue CIRGenFunction::emitLValue(const Expr *E) { } case Expr::ParenExprClass: return emitLValue(cast(E)->getSubExpr()); + case Expr::GenericSelectionExprClass: + return emitLValue(cast(E)->getResultExpr()); case Expr::DeclRefExprClass: return emitDeclRefLValue(cast(E)); case Expr::UnaryOperatorClass: diff --git a/clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp b/clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp index 6964fc260dac..c6e27ce7e289 100644 --- a/clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp @@ -179,7 +179,7 @@ class AggExprEmitter : public StmtVisitor { } void VisitParenExpr(ParenExpr *PE) { Visit(PE->getSubExpr()); } void VisitGenericSelectionExpr(GenericSelectionExpr *GE) { - llvm_unreachable("NYI"); + Visit(GE->getResultExpr()); } void VisitCoawaitExpr(CoawaitExpr *E) { CGF.emitCoawaitExpr(*E, Dest, IsResultUnused); diff --git a/clang/test/CIR/CodeGen/struct.cpp b/clang/test/CIR/CodeGen/struct.cpp index 37c5454116fa..26a4d59cdb1a 100644 --- a/clang/test/CIR/CodeGen/struct.cpp +++ b/clang/test/CIR/CodeGen/struct.cpp @@ -196,6 +196,19 @@ void designated_init_update_expr() { // 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 generic_selection() { + CompleteS a; + CompleteS b; + int c; + CompleteS d = _Generic(c, int : a, default: b); +} + +// 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 !s32i, !cir.ptr, ["c"] +// CHECK: %[[D_ADDR:.*]] = cir.alloca !rec_CompleteS, !cir.ptr, ["d", init] +// CHECK: cir.copy %[[A_ADDR]] to %[[D_ADDR]] : !cir.ptr + void choose_expr() { CompleteS a; CompleteS b; @@ -206,4 +219,4 @@ void choose_expr() { // 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 +// CHECK: cir.copy %[[A_ADDR]] to %[[C_ADDR]] : !cir.ptr \ No newline at end of file