diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 93f05e2e47285..cb57a2d1a555c 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -2395,7 +2395,8 @@ void InitListChecker::CheckStructUnionTypes( if (HasDesignatedInit && InitializedFields.count(*it)) continue; - if (!it->isUnnamedBitfield() && !it->hasInClassInitializer()) { + if (!it->isUnnamedBitfield() && !it->hasInClassInitializer() && + !it->getType()->isIncompleteArrayType()) { SemaRef.Diag(IList->getSourceRange().getEnd(), diag::warn_missing_field_initializers) << *it; diff --git a/clang/test/Sema/missing-field-initializers.c b/clang/test/Sema/missing-field-initializers.c index 90e0e2a345b08..1e65b2d62e1ab 100644 --- a/clang/test/Sema/missing-field-initializers.c +++ b/clang/test/Sema/missing-field-initializers.c @@ -50,3 +50,14 @@ struct { int:5; int a; int:5; int b; int:5; } noNamedImplicit[] = { { 1, 2 }, { 1 } // expected-warning {{missing field 'b' initializer}} }; + +// GH66300 +struct S { + int f0; + int f1[]; +}; + +// We previously would accidentally diagnose missing a field initializer for +// f1, now we no longer issue that warning (note, this code is still unsafe +// because of the buffer overrun). +struct S s = {1, {1, 2}};