ArcsinX created this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. ArcsinX requested review of this revision.
This patch prevents `InitListChecker::UpdateStructuredListElement()` call with `expr == nullptr` which could cause a crash. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D85193 Files: clang/lib/Sema/SemaInit.cpp clang/test/Sema/init-invalid-struct-array.c Index: clang/test/Sema/init-invalid-struct-array.c =================================================================== --- /dev/null +++ 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, + { } +}; Index: clang/lib/Sema/SemaInit.cpp =================================================================== --- clang/lib/Sema/SemaInit.cpp +++ 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<Expr>()); + else + UpdateStructuredListElement(StructuredList, StructuredIndex, + Result.getAs<Expr>()); } else if (!Seq) { hadError = true; } else if (StructuredList) { @@ -1436,8 +1436,9 @@ if (ExprRes.isInvalid()) hadError = true; } - UpdateStructuredListElement(StructuredList, StructuredIndex, - ExprRes.getAs<Expr>()); + if (!hadError) + UpdateStructuredListElement(StructuredList, StructuredIndex, + ExprRes.getAs<Expr>()); ++Index; return; }
Index: clang/test/Sema/init-invalid-struct-array.c =================================================================== --- /dev/null +++ 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, + { } +}; Index: clang/lib/Sema/SemaInit.cpp =================================================================== --- clang/lib/Sema/SemaInit.cpp +++ 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<Expr>()); + else + UpdateStructuredListElement(StructuredList, StructuredIndex, + Result.getAs<Expr>()); } else if (!Seq) { hadError = true; } else if (StructuredList) { @@ -1436,8 +1436,9 @@ if (ExprRes.isInvalid()) hadError = true; } - UpdateStructuredListElement(StructuredList, StructuredIndex, - ExprRes.getAs<Expr>()); + if (!hadError) + UpdateStructuredListElement(StructuredList, StructuredIndex, + ExprRes.getAs<Expr>()); ++Index; return; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits