summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2015-03-09 03:17:15 +0000
committerNico Weber <nicolasweber@gmx.de>2015-03-09 03:17:15 +0000
commitce90329824037c89af64a5ee852e4c86f0c62cc7 (patch)
tree69257a102a93ca8f330c72f704bef52722df4ca3
parent75eda5e913d9fb9539ba79dba625bc98fe91ad31 (diff)
downloadbcm5719-llvm-ce90329824037c89af64a5ee852e4c86f0c62cc7.tar.gz
bcm5719-llvm-ce90329824037c89af64a5ee852e4c86f0c62cc7.zip
Fix a theoretical bug when ParseCompoundStatement() returns StmtError.
ParseCompoundStatement() currently never returns StmtError, but if it did, Sema would keep the __finally scope on its stack indefinitely. Explicitly add an error callback that clears it. llvm-svn: 231625
-rw-r--r--clang/include/clang/Sema/Sema.h1
-rw-r--r--clang/lib/Parse/ParseStmt.cpp4
-rw-r--r--clang/lib/Sema/SemaStmt.cpp4
3 files changed, 8 insertions, 1 deletions
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index 9879ed96110..aa7107a259d 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -3297,6 +3297,7 @@ public:
Expr *FilterExpr,
Stmt *Block);
void ActOnStartSEHFinallyBlock();
+ void ActOnAbortSEHFinallyBlock();
StmtResult ActOnFinishSEHFinallyBlock(SourceLocation Loc, Stmt *Block);
StmtResult ActOnSEHLeaveStmt(SourceLocation Loc, Scope *CurScope);
diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp
index 9028e4ac2dd..27c757b5081 100644
--- a/clang/lib/Parse/ParseStmt.cpp
+++ b/clang/lib/Parse/ParseStmt.cpp
@@ -519,8 +519,10 @@ StmtResult Parser::ParseSEHFinallyBlock(SourceLocation FinallyLoc) {
Actions.ActOnStartSEHFinallyBlock();
StmtResult Block(ParseCompoundStatement());
- if(Block.isInvalid())
+ if(Block.isInvalid()) {
+ Actions.ActOnAbortSEHFinallyBlock();
return Block;
+ }
return Actions.ActOnFinishSEHFinallyBlock(FinallyLoc, Block.get());
}
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp
index 11ec4f5321e..1710c976afd 100644
--- a/clang/lib/Sema/SemaStmt.cpp
+++ b/clang/lib/Sema/SemaStmt.cpp
@@ -3422,6 +3422,10 @@ void Sema::ActOnStartSEHFinallyBlock() {
CurrentSEHFinally.push_back(CurScope);
}
+void Sema::ActOnAbortSEHFinallyBlock() {
+ CurrentSEHFinally.pop_back();
+}
+
StmtResult Sema::ActOnFinishSEHFinallyBlock(SourceLocation Loc, Stmt *Block) {
assert(Block);
CurrentSEHFinally.pop_back();
OpenPOWER on IntegriCloud