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)


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to