summaryrefslogtreecommitdiff
path: root/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
diff options
context:
space:
mode:
authorAndy Kaylor <akaylor@nvidia.com>2025-09-04 14:00:31 -0700
committerGitHub <noreply@github.com>2025-09-04 14:00:31 -0700
commit83da177dba86eece8b19d55857ad842f92ced30e (patch)
tree52bb870ac8cb2c4cbf56bde1c4d8328157186087 /clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
parent8796dfdcbae0fbf6c58f80379c73f62f36a57653 (diff)
[CIR] Add support for delegating constructor initialization (#156757)
This adds support for zero-initialization during delegating constructor processing. Note, this also adds code to skip emitting constructors that are trivial and default to match the classic codegen behavior. The incubator does not skip these constructors, but I have found a case where this results in a call to a default constructor that is never defined.
Diffstat (limited to 'clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp')
-rw-r--r--clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index 3b76c0981fe8..ee9f58c829ca 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -1368,6 +1368,15 @@ mlir::LogicalResult CIRToLLVMConstantOpLowering::matchAndRewrite(
rewriter.replaceOp(op, lowerCirAttrAsValue(op, op.getValue(), rewriter,
getTypeConverter()));
return mlir::success();
+ } else if (auto recTy = mlir::dyn_cast<cir::RecordType>(op.getType())) {
+ if (mlir::isa<cir::ZeroAttr, cir::UndefAttr>(attr)) {
+ mlir::Value initVal =
+ lowerCirAttrAsValue(op, attr, rewriter, typeConverter);
+ rewriter.replaceOp(op, initVal);
+ return mlir::success();
+ }
+ return op.emitError() << "unsupported lowering for record constant type "
+ << op.getType();
} else if (auto complexTy = mlir::dyn_cast<cir::ComplexType>(op.getType())) {
mlir::Type complexElemTy = complexTy.getElementType();
mlir::Type complexElemLLVMTy = typeConverter->convertType(complexElemTy);