diff options
author | John McCall <rjmccall@apple.com> | 2010-08-27 19:56:05 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-08-27 19:56:05 +0000 |
commit | 1ababa63ded36f8ed6a3e55df8e26d9860ab2867 (patch) | |
tree | 05469b2e17dccc2c9b4b4906c472b665ffc42267 /clang/lib/Sema/TreeTransform.h | |
parent | 9bad2fb378803b34d911c35175803cf1c88386d6 (diff) | |
download | bcm5719-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.h | 16 |
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()); |