diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index f4cfae0f7d859..f63d600032ce4 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -1585,10 +1585,7 @@ void InitListChecker::CheckScalarType(const InitializedEntity &Entity, IList->setInit(Index, ResultExpr); } } - if (hadError) - ++StructuredIndex; - else - UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); + UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); ++Index; } @@ -1643,10 +1640,7 @@ void InitListChecker::CheckReferenceType(const InitializedEntity &Entity, if (!VerifyOnly && expr) IList->setInit(Index, expr); - if (hadError) - ++StructuredIndex; - else - UpdateStructuredListElement(StructuredList, StructuredIndex, expr); + UpdateStructuredListElement(StructuredList, StructuredIndex, expr); ++Index; } @@ -1697,11 +1691,7 @@ void InitListChecker::CheckVectorType(const InitializedEntity &Entity, IList->setInit(Index, ResultExpr); } } - if (hadError) - ++StructuredIndex; - else - UpdateStructuredListElement(StructuredList, StructuredIndex, - ResultExpr); + UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); ++Index; return; } @@ -3100,8 +3090,12 @@ void InitListChecker::UpdateStructuredListElement(InitListExpr *StructuredList, if (Expr *PrevInit = StructuredList->updateInit(SemaRef.Context, StructuredIndex, expr)) { - // This initializer overwrites a previous initializer. Warn. - diagnoseInitOverride(PrevInit, expr->getSourceRange()); + // This initializer overwrites a previous initializer. + // No need to diagnose when `expr` is nullptr because a more relevant + // diagnostic has already been issued and this diagnostic is potentially + // noise. + if (expr) + diagnoseInitOverride(PrevInit, expr->getSourceRange()); } ++StructuredIndex; diff --git a/clang/test/Sema/init-invalid-struct-array.c b/clang/test/Sema/init-invalid-struct-array.c new file mode 100644 index 0000000000000..e234d68039c0d --- /dev/null +++ b/clang/test/Sema/init-invalid-struct-array.c @@ -0,0 +1,8 @@ +// RUN: %clang_cc1 %s -verify -fsyntax-only + +struct S { + Unknown u; // expected-error {{unknown type name 'Unknown'}} + int i; +}; +// Should not crash +struct S s[] = {[0].i = 0, [1].i = 1, {}};