diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -1378,9 +1378,9 @@ ExprResult Result = Seq.Perform(SemaRef, TmpEntity, Kind, expr); if (Result.isInvalid()) hadError = true; - - UpdateStructuredListElement(StructuredList, StructuredIndex, - Result.getAs()); + else + UpdateStructuredListElement(StructuredList, StructuredIndex, + Result.getAs()); } else if (!Seq) { hadError = true; } else if (StructuredList) { @@ -1436,8 +1436,9 @@ if (ExprRes.isInvalid()) hadError = true; } - UpdateStructuredListElement(StructuredList, StructuredIndex, - ExprRes.getAs()); + if (!hadError) + UpdateStructuredListElement(StructuredList, StructuredIndex, + ExprRes.getAs()); ++Index; return; } diff --git a/clang/test/Sema/init-invalid-struct-array.c b/clang/test/Sema/init-invalid-struct-array.c new file mode 100644 --- /dev/null +++ b/clang/test/Sema/init-invalid-struct-array.c @@ -0,0 +1,12 @@ +// 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, + { } +};