diff --git a/clang/lib/CIR/CIRGenExprScalar.cpp b/clang/lib/CIR/CIRGenExprScalar.cpp index 0af27a40468f..a8f057f2b0e8 100644 --- a/clang/lib/CIR/CIRGenExprScalar.cpp +++ b/clang/lib/CIR/CIRGenExprScalar.cpp @@ -328,7 +328,9 @@ class ScalarExprEmitter : public StmtVisitor { mlir::Value VisitBinLAnd(const BinaryOperator *E) { llvm_unreachable("NYI"); } mlir::Value VisitBinLOr(const BinaryOperator *E) { llvm_unreachable("NYI"); } mlir::Value VisitBinComma(const BinaryOperator *E) { - llvm_unreachable("NYI"); + CGF.buildIgnoredExpr(E->getLHS()); + // NOTE: We don't need to EnsureInsertPoint() like LLVM codegen. + return Visit(E->getRHS()); } mlir::Value VisitBinPtrMemD(const Expr *E) { llvm_unreachable("NYI"); } diff --git a/clang/test/CIR/CodeGen/comma.cpp b/clang/test/CIR/CodeGen/comma.cpp new file mode 100644 index 000000000000..e57a9e6e701f --- /dev/null +++ b/clang/test/CIR/CodeGen/comma.cpp @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fenable-clangir -Wno-unused-value -emit-cir %s -o %t.cir +// RUN: FileCheck --input-file=%t.cir %s + +int c0() { + int a = 1; + int b = 2; + return b + 1, a; +} + +// CHECK: cir.func @_Z2c0v() -> i32 { +// CHECK: %[[#RET:]] = cir.alloca i32, cir.ptr , ["__retval", uninitialized] +// CHECK: %[[#A:]] = cir.alloca i32, cir.ptr , ["a", cinit] +// CHECK: %[[#B:]] = cir.alloca i32, cir.ptr , ["b", cinit] +// CHECK: %[[#LOADED_B:]] = cir.load %[[#B]] : cir.ptr , i32 +// CHECK: %[[#]] = cir.binop(add, %[[#LOADED_B]], %[[#]]) : i32 +// CHECK: %[[#LOADED_A:]] = cir.load %[[#A]] : cir.ptr , i32 +// CHECK: cir.store %[[#LOADED_A]], %[[#RET]] : i32, cir.ptr