[clang] [clang][CodeGen] Check initializer of zero-size fields for nullptr (PR #109271)
Michael Buch via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 20 07:31:38 PDT 2024
================
@@ -738,7 +738,7 @@ bool ConstStructBuilder::Build(const InitListExpr *ILE, bool AllowOverwrite) {
// Zero-sized fields are not emitted, but their initializers may still
// prevent emission of this struct as a constant.
if (isEmptyFieldForLayout(CGM.getContext(), Field)) {
- if (Init->HasSideEffects(CGM.getContext()))
+ if (Init && Init->HasSideEffects(CGM.getContext()))
----------------
Michael137 wrote:
This is where C and C++ diverge (in `InitListChecker::PerformEmptyInit`):
```
// C++ [dcl.init.aggr]p7:
// If there are fewer initializer-clauses in the list than there are
// members in the aggregate, then each member not explicitly initialized
// ...
bool EmptyInitList = SemaRef.getLangOpts().CPlusPlus11 &&
Entity.getType()->getBaseElementTypeUnsafe()->isRecordType();
if (EmptyInitList) {
// C++1y / DR1070:
// shall be initialized [...] from an empty initializer list.
//
// We apply the resolution of this DR to C++11 but not C++98, since C++98
// does not have useful semantics for initialization from an init list.
// We treat this as copy-initialization, because aggregate initialization
// always performs copy-initialization on its elements.
//
// Only do this if we're initializing a class type, to avoid filling in
// the initializer list where possible.
InitExpr = VerifyOnly
? &DummyInitList
: new (SemaRef.Context)
InitListExpr(SemaRef.Context, Loc, std::nullopt, Loc);
InitExpr->setType(SemaRef.Context.VoidTy);
SubInit = InitExpr;
Kind = InitializationKind::CreateCopy(Loc, Loc);
} else {
// C++03:
// shall be value-initialized.
}
```
Technically this was only allowed as a GNU extension in C until C23 AFAIU (and in C++ since C++11).
Should we allow this for `SemaRef.getLangOpts().C23` too perhaps?
@AaronBallman
https://github.com/llvm/llvm-project/pull/109271
More information about the cfe-commits
mailing list