[clang] Allow packing fields into tail padding of record fields (PR #122197)
Reid Kleckner via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 16 13:02:10 PDT 2025
================
@@ -803,10 +804,16 @@ bool ConstStructBuilder::Build(const InitListExpr *ILE, bool AllowOverwrite) {
if (!AppendField(Field, Layout.getFieldOffset(FieldNo), EltInit,
AllowOverwrite))
return false;
- // After emitting a non-empty field with [[no_unique_address]], we may
- // need to overwrite its tail padding.
- if (Field->hasAttr<NoUniqueAddressAttr>())
- AllowOverwrite = true;
+
+ // Allow overwrites after a field with tail padding. This allows
+ // overwriting tail padding of fields carrying [[no_unique_address]]
+ // without checking for it, since it is not necessarily present in debug
+ // info.
+ if (const CXXRecordDecl *FieldRD = FieldTy->getAsCXXRecordDecl()) {
+ const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(FieldRD);
+ if (Layout.getDataSize() < Layout.getSize())
+ AllowOverwrite = true;
----------------
rnk wrote:
I hadn't caught the other one! I only happened to find this one through testing, not inspection. I'll have to figure out how to exercise the other codepath.
https://github.com/llvm/llvm-project/pull/122197
More information about the cfe-commits
mailing list