[clang] fix: compatible C++ empty record with align UB with gcc (PR #72197)
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 15 11:33:06 PST 2023
================
@@ -296,10 +296,16 @@ bool CodeGen::isEmptyRecord(ASTContext &Context, QualType T, bool AllowArrays,
return false;
// If this is a C++ record, check the bases first.
- if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
+ if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
for (const auto &I : CXXRD->bases())
if (!isEmptyRecord(Context, I.getType(), true, AsIfNoUniqueAddr))
return false;
+ // C++ object size >= 1 byte, empty struct is 1 byte.
+ // FIXME: an alignment on a empty record is a UB, may just warning it,
+ // this code just want to compatible gcc.
+ if (Context.getTypeSize(T) > 8)
+ return false;
----------------
AaronBallman wrote:
This is an ABI break; should we be adding ABI tags so you can get the old behavior if needed? (CC @rjmccall @efriedma-quic)
https://github.com/llvm/llvm-project/pull/72197
More information about the cfe-commits
mailing list