[clang] 5611268 - [CIR] Handle default arguments in ctors (#168649)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 19 11:53:23 PST 2025
Author: Andy Kaylor
Date: 2025-11-19T11:53:19-08:00
New Revision: 56112685f7a25078868b8f09c72feaf4ceae50f9
URL: https://github.com/llvm/llvm-project/commit/56112685f7a25078868b8f09c72feaf4ceae50f9
DIFF: https://github.com/llvm/llvm-project/commit/56112685f7a25078868b8f09c72feaf4ceae50f9.diff
LOG: [CIR] Handle default arguments in ctors (#168649)
This adds the scalar expression visitor needed to handle default
arguments being passed to constructors.
Added:
Modified:
clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp
clang/test/CIR/CodeGen/defaultarg.cpp
Removed:
################################################################################
diff --git a/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp b/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp
index fc5a501e6a700..90d661782b929 100644
--- a/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp
@@ -711,6 +711,10 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
return Visit(e->getSubExpr());
}
+ mlir::Value VisitCXXDefaultArgExpr(CXXDefaultArgExpr *dae) {
+ CIRGenFunction::CXXDefaultArgExprScope scope(cgf, dae);
+ return Visit(dae->getExpr());
+ }
mlir::Value VisitCXXDefaultInitExpr(CXXDefaultInitExpr *die) {
CIRGenFunction::CXXDefaultInitExprScope scope(cgf, die);
return Visit(die->getExpr());
diff --git a/clang/test/CIR/CodeGen/defaultarg.cpp b/clang/test/CIR/CodeGen/defaultarg.cpp
index 807230bd003f5..29c929ccd7838 100644
--- a/clang/test/CIR/CodeGen/defaultarg.cpp
+++ b/clang/test/CIR/CodeGen/defaultarg.cpp
@@ -30,3 +30,25 @@ void foo() {
// OGCG: %[[TMP0:.*]] = alloca i32
// OGCG: store i32 42, ptr %[[TMP0]]
// OGCG: call void @_Z3barRKi(ptr {{.*}} %[[TMP0]])
+
+struct S
+{
+ S(int n = 2);
+};
+
+void test_ctor_defaultarg() {
+ S s;
+}
+
+// CIR: cir.func {{.*}} @_Z20test_ctor_defaultargv()
+// CIR: %[[S:.*]] = cir.alloca !rec_S, !cir.ptr<!rec_S>, ["s", init]
+// CIR: %[[TWO:.*]] = cir.const #cir.int<2> : !s32i
+// CIR: cir.call @_ZN1SC1Ei(%[[S]], %[[TWO]]) : (!cir.ptr<!rec_S>, !s32i) -> ()
+
+// LLVM: define{{.*}} @_Z20test_ctor_defaultargv()
+// LLVM: %[[S:.*]] = alloca %struct.S
+// LLVM: call void @_ZN1SC1Ei(ptr %[[S]], i32 2)
+
+// OGCG: define{{.*}} @_Z20test_ctor_defaultargv()
+// OGCG: %[[S:.*]] = alloca %struct.S
+// OGCG: call void @_ZN1SC1Ei(ptr{{.*}} %[[S]], i32 {{.*}} 2)
More information about the cfe-commits
mailing list