ArcsinX updated this revision to Diff 284612. ArcsinX added a comment. Check for `expr == nullptr` inside `InitListChecker::UpdateStructuredListElement()`
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D85193/new/ 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,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, {}}; Index: clang/lib/Sema/SemaInit.cpp =================================================================== --- clang/lib/Sema/SemaInit.cpp +++ clang/lib/Sema/SemaInit.cpp @@ -1585,10 +1585,7 @@ IList->setInit(Index, ResultExpr); } } - if (hadError) - ++StructuredIndex; - else - UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); + UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); ++Index; } @@ -1643,10 +1640,7 @@ if (!VerifyOnly && expr) IList->setInit(Index, expr); - if (hadError) - ++StructuredIndex; - else - UpdateStructuredListElement(StructuredList, StructuredIndex, expr); + UpdateStructuredListElement(StructuredList, StructuredIndex, expr); ++Index; } @@ -1697,11 +1691,7 @@ IList->setInit(Index, ResultExpr); } } - if (hadError) - ++StructuredIndex; - else - UpdateStructuredListElement(StructuredList, StructuredIndex, - ResultExpr); + UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); ++Index; return; } @@ -3100,8 +3090,10 @@ if (Expr *PrevInit = StructuredList->updateInit(SemaRef.Context, StructuredIndex, expr)) { - // This initializer overwrites a previous initializer. Warn. - diagnoseInitOverride(PrevInit, expr->getSourceRange()); + if (expr) { + // This initializer overwrites a previous initializer. Warn. + diagnoseInitOverride(PrevInit, expr->getSourceRange()); + } } ++StructuredIndex;
Index: clang/test/Sema/init-invalid-struct-array.c =================================================================== --- /dev/null +++ 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, {}}; Index: clang/lib/Sema/SemaInit.cpp =================================================================== --- clang/lib/Sema/SemaInit.cpp +++ clang/lib/Sema/SemaInit.cpp @@ -1585,10 +1585,7 @@ IList->setInit(Index, ResultExpr); } } - if (hadError) - ++StructuredIndex; - else - UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); + UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); ++Index; } @@ -1643,10 +1640,7 @@ if (!VerifyOnly && expr) IList->setInit(Index, expr); - if (hadError) - ++StructuredIndex; - else - UpdateStructuredListElement(StructuredList, StructuredIndex, expr); + UpdateStructuredListElement(StructuredList, StructuredIndex, expr); ++Index; } @@ -1697,11 +1691,7 @@ IList->setInit(Index, ResultExpr); } } - if (hadError) - ++StructuredIndex; - else - UpdateStructuredListElement(StructuredList, StructuredIndex, - ResultExpr); + UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr); ++Index; return; } @@ -3100,8 +3090,10 @@ if (Expr *PrevInit = StructuredList->updateInit(SemaRef.Context, StructuredIndex, expr)) { - // This initializer overwrites a previous initializer. Warn. - diagnoseInitOverride(PrevInit, expr->getSourceRange()); + if (expr) { + // This initializer overwrites a previous initializer. Warn. + diagnoseInitOverride(PrevInit, expr->getSourceRange()); + } } ++StructuredIndex;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits