danix800 updated this revision to Diff 542950. danix800 added a comment. 1. Remove unnecessary condition & cleanup code 2. Move testcase into correct place.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D155396/new/ https://reviews.llvm.org/D155396 Files: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaExpr.cpp clang/lib/Sema/SemaStmt.cpp clang/test/AST/ast-dump-recovery.m Index: clang/test/AST/ast-dump-recovery.m =================================================================== --- clang/test/AST/ast-dump-recovery.m +++ clang/test/AST/ast-dump-recovery.m @@ -1,4 +1,4 @@ -// RUN: not %clang_cc1 -triple x86_64-unknown-unknown -frecovery-ast -frecovery-ast-type -ast-dump %s | FileCheck -strict-whitespace %s +// RUN: not %clang_cc1 -triple x86_64-unknown-unknown -frecovery-ast -frecovery-ast-type -fblocks -ast-dump %s | FileCheck -strict-whitespace %s @interface Foo - (void)method:(int)n; @@ -16,3 +16,11 @@ // CHECK-NEXT: `-DeclRefExpr {{.*}} 'foo' foo.undef; } + +// CHECK: |-VarDecl {{.*}} 'int (^)()' cinit +// CHECK: | `-RecoveryExpr {{.*}} '<dependent type> (^)(void)' contains-errors lvalue +// CHECK: | `-BlockExpr {{.*}} '<dependent type> (^)(void)' +// CHECK: | `-BlockDecl {{.*}} invalid +int (^a)() = ^() { + return c; +}; Index: clang/lib/Sema/SemaStmt.cpp =================================================================== --- clang/lib/Sema/SemaStmt.cpp +++ clang/lib/Sema/SemaStmt.cpp @@ -3730,6 +3730,11 @@ if (FunctionScopes.back()->FirstReturnLoc.isInvalid()) FunctionScopes.back()->FirstReturnLoc = ReturnLoc; + if (auto *CurBlock = dyn_cast<BlockScopeInfo>(CurCap); + CurBlock && CurCap->HasImplicitReturnType && RetValExp && + RetValExp->containsErrors()) + CurBlock->TheDecl->setInvalidDecl(); + return Result; } Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -17159,6 +17159,9 @@ if (getCurFunction()) getCurFunction()->addBlock(BD); + if (BD->isInvalidDecl()) + return CreateRecoveryExpr(Result->getBeginLoc(), Result->getEndLoc(), + {Result}, Result->getType()); return Result; } Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -663,6 +663,10 @@ - Correcly diagnose jumps into statement expressions. This ensures the behavior of Clang is consistent with GCC. (`#63682 <https://github.com/llvm/llvm-project/issues/63682>`_) +- Invalidate BlockDecl with implicit return type, in case any of the return + value exprs is invalid. Propagating the error info up by replacing BlockExpr + with a RecoveryExpr. This fixes: + (`#63863 <https://github.com/llvm/llvm-project/issues/63863>_`) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Index: clang/test/AST/ast-dump-recovery.m =================================================================== --- clang/test/AST/ast-dump-recovery.m +++ clang/test/AST/ast-dump-recovery.m @@ -1,4 +1,4 @@ -// RUN: not %clang_cc1 -triple x86_64-unknown-unknown -frecovery-ast -frecovery-ast-type -ast-dump %s | FileCheck -strict-whitespace %s +// RUN: not %clang_cc1 -triple x86_64-unknown-unknown -frecovery-ast -frecovery-ast-type -fblocks -ast-dump %s | FileCheck -strict-whitespace %s @interface Foo - (void)method:(int)n; @@ -16,3 +16,11 @@ // CHECK-NEXT: `-DeclRefExpr {{.*}} 'foo' foo.undef; } + +// CHECK: |-VarDecl {{.*}} 'int (^)()' cinit +// CHECK: | `-RecoveryExpr {{.*}} '<dependent type> (^)(void)' contains-errors lvalue +// CHECK: | `-BlockExpr {{.*}} '<dependent type> (^)(void)' +// CHECK: | `-BlockDecl {{.*}} invalid +int (^a)() = ^() { + return c; +}; Index: clang/lib/Sema/SemaStmt.cpp =================================================================== --- clang/lib/Sema/SemaStmt.cpp +++ clang/lib/Sema/SemaStmt.cpp @@ -3730,6 +3730,11 @@ if (FunctionScopes.back()->FirstReturnLoc.isInvalid()) FunctionScopes.back()->FirstReturnLoc = ReturnLoc; + if (auto *CurBlock = dyn_cast<BlockScopeInfo>(CurCap); + CurBlock && CurCap->HasImplicitReturnType && RetValExp && + RetValExp->containsErrors()) + CurBlock->TheDecl->setInvalidDecl(); + return Result; } Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -17159,6 +17159,9 @@ if (getCurFunction()) getCurFunction()->addBlock(BD); + if (BD->isInvalidDecl()) + return CreateRecoveryExpr(Result->getBeginLoc(), Result->getEndLoc(), + {Result}, Result->getType()); return Result; } Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -663,6 +663,10 @@ - Correcly diagnose jumps into statement expressions. This ensures the behavior of Clang is consistent with GCC. (`#63682 <https://github.com/llvm/llvm-project/issues/63682>`_) +- Invalidate BlockDecl with implicit return type, in case any of the return + value exprs is invalid. Propagating the error info up by replacing BlockExpr + with a RecoveryExpr. This fixes: + (`#63863 <https://github.com/llvm/llvm-project/issues/63863>_`) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits