From: Haojian Wu Date: Fri, 29 May 2020 21:27:05 +0000 (+0200) Subject: [AST] Fix a null initializer crash for InitListExpr X-Git-Tag: llvmorg-12-init~4447 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=97b8dabba5c5c1d799bd8b6856d4a81360361769;p=platform%2Fupstream%2Fllvm.git [AST] Fix a null initializer crash for InitListExpr Summary: The Initializer of a InitListExpr can be reset to null, which leads to nullptr-acces crashes. Reviewers: sammccall Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D80980 --- diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 56d7ac8..0a98cb2 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -1638,7 +1638,7 @@ void InitListChecker::CheckReferenceType(const InitializedEntity &Entity, expr = Result.getAs(); // FIXME: Why are we updating the syntactic init list? - if (!VerifyOnly) + if (!VerifyOnly && expr) IList->setInit(Index, expr); if (hadError) diff --git a/clang/test/AST/ast-dump-recovery.cpp b/clang/test/AST/ast-dump-recovery.cpp index 9b13f4d..a212ff4 100644 --- a/clang/test/AST/ast-dump-recovery.cpp +++ b/clang/test/AST/ast-dump-recovery.cpp @@ -181,3 +181,14 @@ void InitializerForAuto() { // Verified that the generated call operator is invalid. // CHECK: |-CXXMethodDecl {{.*}} invalid operator() 'auto () const -> auto' using Escape = decltype([] { return undef(); }()); + +// CHECK: VarDecl {{.*}} NoCrashOnInvalidInitList +// CHECK-NEXT: `-RecoveryExpr {{.*}} '' contains-errors lvalue +// CHECK-NEXT: `-InitListExpr +// CHECK-NEXT: `-DesignatedInitExpr {{.*}} 'void' +// CHECK-NEXT: `-CXXNullPtrLiteralExpr {{.*}} 'nullptr_t' +struct { + int& abc; +} NoCrashOnInvalidInitList = { + .abc = nullptr, +};