================
@@ -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()))
----------------
AaronBallman wrote:
> Should we allow this for SemaRef.getLangOpts().C23 too perhaps?
Empty initialization ends up in C's "default initialization" rules, which does:
> If an object that has automatic storage duration is not initialized
> explicitly, its representation is indeterminate. If an object that has static
> or thread storage duration is not initialized explicitly, or any object is
> initialized with an empty initializer, then it is subject to default
> initialization, which initializes an object as follows:
— if it has pointer type, it is initialized to a null pointer;
— if it has decimal floating type, it is initialized to positive zero, and the
quantum exponent is
implementation-defined;
— if it has arithmetic type, and it does not have decimal floating type, it is
initialized to (positive
or unsigned) zero;
— if it is an aggregate, every member is initialized (recursively) according to
these rules, and any padding is initialized to zero bits;
— if it is a union, the first named member is initialized (recursively)
according to these rules, and any padding is initialized to zero bits.
So yeah, I think we should do this in C23 mode.
https://github.com/llvm/llvm-project/pull/109271
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits