[clang] [CIR] Handle non-zero-initializable types in emitNullInitialization (PR #201654)
Erich Keane via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 22 08:56:50 PDT 2026
================
@@ -1302,10 +1302,19 @@ void CIRGenFunction::emitNullInitialization(mlir::Location loc, Address destPtr,
// If the type contains a pointer to data member we can't memset it to zero.
// Instead, create a null constant and copy it to the destination.
- // TODO: there are other patterns besides zero that we can usefully memset,
- // like -1, which happens to be the pattern used by member-pointers.
+ // Member pointers use -1 as the null value, so a plain zero store would be
+ // incorrect; emitNullConstant produces the right per-field pattern.
if (!cgm.getTypes().isZeroInitializable(ty)) {
- cgm.errorNYI(loc, "type is not zero initializable");
+ // emitNullConstant does not yet handle types with virtual bases.
+ if (const auto *rd = ty->getAsCXXRecordDecl(); rd && rd->getNumVBases()) {
+ cgm.errorNYI(loc,
----------------
erichkeane wrote:
I think this is unnecessary then, it seems completely reasonable to have `emitNullConstant` emit the NYI instead of here.
https://github.com/llvm/llvm-project/pull/201654
More information about the cfe-commits
mailing list