summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/TreeTransform.h
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-04-23 22:50:49 +0000
committerDouglas Gregor <dgregor@apple.com>2010-04-23 22:50:49 +0000
commit96c79498fbcc1e7d03cba88725dffafb2b568c53 (patch)
tree8c74d92c11e42f011bf0ced629759b8ebdb5b626 /clang/lib/Sema/TreeTransform.h
parent11d1df442dfd0f526f659a5447df6dfe7695f41d (diff)
downloadbcm5719-llvm-96c79498fbcc1e7d03cba88725dffafb2b568c53.tar.gz
bcm5719-llvm-96c79498fbcc1e7d03cba88725dffafb2b568c53.zip
Improve the AST representation of Objective-C @try/@catch/@finally
statements. Instead of the @try having a single @catch, where all of the @catch's were chained (using an O(n^2) algorithm nonetheless), @try just holds an array of its @catch blocks. The resulting AST is slightly more compact (not important) and better represents the actual language semantics (good). llvm-svn: 102221
Diffstat (limited to 'clang/lib/Sema/TreeTransform.h')
-rw-r--r--clang/lib/Sema/TreeTransform.h20
1 files changed, 12 insertions, 8 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index a41cbc38a29..8b2aa4e3088 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -896,9 +896,9 @@ public:
/// Subclasses may override this routine to provide different behavior.
OwningStmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
StmtArg TryBody,
- StmtArg Catch,
+ MultiStmtArg CatchStmts,
StmtArg Finally) {
- return getSema().ActOnObjCAtTryStmt(AtLoc, move(TryBody), move(Catch),
+ return getSema().ActOnObjCAtTryStmt(AtLoc, move(TryBody), move(CatchStmts),
move(Finally));
}
@@ -3688,12 +3688,16 @@ TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
if (TryBody.isInvalid())
return SemaRef.StmtError();
- // Transform the @catch statement (if present).
- OwningStmtResult Catch(SemaRef);
- if (S->getCatchStmts()) {
- Catch = getDerived().TransformStmt(S->getCatchStmts());
+ // Transform the @catch statements (if present).
+ bool AnyCatchChanged = false;
+ ASTOwningVector<&ActionBase::DeleteStmt> CatchStmts(SemaRef);
+ for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
+ OwningStmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
if (Catch.isInvalid())
return SemaRef.StmtError();
+ if (Catch.get() != S->getCatchStmt(I))
+ AnyCatchChanged = true;
+ CatchStmts.push_back(Catch.release());
}
// Transform the @finally statement (if present).
@@ -3707,13 +3711,13 @@ TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
// If nothing changed, just retain this statement.
if (!getDerived().AlwaysRebuild() &&
TryBody.get() == S->getTryBody() &&
- Catch.get() == S->getCatchStmts() &&
+ !AnyCatchChanged &&
Finally.get() == S->getFinallyStmt())
return SemaRef.Owned(S->Retain());
// Build a new statement.
return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), move(TryBody),
- move(Catch), move(Finally));
+ move_arg(CatchStmts), move(Finally));
}
template<typename Derived>
OpenPOWER on IntegriCloud