summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/TreeTransform.h
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2010-08-27 19:56:05 +0000
committerJohn McCall <rjmccall@apple.com>2010-08-27 19:56:05 +0000
commit1ababa63ded36f8ed6a3e55df8e26d9860ab2867 (patch)
tree05469b2e17dccc2c9b4b4906c472b665ffc42267 /clang/lib/Sema/TreeTransform.h
parent9bad2fb378803b34d911c35175803cf1c88386d6 (diff)
downloadbcm5719-llvm-1ababa63ded36f8ed6a3e55df8e26d9860ab2867.tar.gz
bcm5719-llvm-1ababa63ded36f8ed6a3e55df8e26d9860ab2867.zip
Continue to instantiate sub-statements in a CompoundStmt as long as
we don't see a DeclStmt (failure to instantiate which generally causes panic). llvm-svn: 112282
Diffstat (limited to 'clang/lib/Sema/TreeTransform.h')
-rw-r--r--clang/lib/Sema/TreeTransform.h16
1 files changed, 14 insertions, 2 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index a796f2eaff9..dbc02d87272 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -3440,18 +3440,30 @@ template<typename Derived>
StmtResult
TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
bool IsStmtExpr) {
+ bool SubStmtInvalid = false;
bool SubStmtChanged = false;
ASTOwningVector<Stmt*> Statements(getSema());
for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
B != BEnd; ++B) {
StmtResult Result = getDerived().TransformStmt(*B);
- if (Result.isInvalid())
- return StmtError();
+ if (Result.isInvalid()) {
+ // Immediately fail if this was a DeclStmt, since it's very
+ // likely that this will cause problems for future statements.
+ if (isa<DeclStmt>(*B))
+ return StmtError();
+
+ // Otherwise, just keep processing substatements and fail later.
+ SubStmtInvalid = true;
+ continue;
+ }
SubStmtChanged = SubStmtChanged || Result.get() != *B;
Statements.push_back(Result.takeAs<Stmt>());
}
+ if (SubStmtInvalid)
+ return StmtError();
+
if (!getDerived().AlwaysRebuild() &&
!SubStmtChanged)
return SemaRef.Owned(S->Retain());
OpenPOWER on IntegriCloud