diff options
author | Steve Naroff <snaroff@apple.com> | 2008-02-01 20:02:07 +0000 |
---|---|---|
committer | Steve Naroff <snaroff@apple.com> | 2008-02-01 20:02:07 +0000 |
commit | e12e69223ec279e89ac681023d42184b115e0068 (patch) | |
tree | 376ded40280d48bb68f9fe90edb142fbc4d6c8c4 /Driver/RewriteTest.cpp | |
parent | 5f0ad3f34c328f71aa53a68f3d4b788ae0541924 (diff) |
Fix two rewriter bugs with @catch.
- Support @catch(...), rather than crash:-)
- Make sure all catch bodies get rewritten. This "fix" is really a workaround until the iterator for the "try" AST is fixed. Will fix this in a separate commit.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46644 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'Driver/RewriteTest.cpp')
-rw-r--r-- | Driver/RewriteTest.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/Driver/RewriteTest.cpp b/Driver/RewriteTest.cpp index f01af9738e..52775a25b5 100644 --- a/Driver/RewriteTest.cpp +++ b/Driver/RewriteTest.cpp @@ -1203,7 +1203,20 @@ Stmt *RewriteTest::RewriteObjCTryStmt(ObjCAtTryStmt *S) { const char *lParenLoc = strchr(startBuf, '('); - if (DeclStmt *declStmt = dyn_cast<DeclStmt>(catchStmt)) { + if (!catchStmt) { // handle "..." + // Now rewrite the body... + lastCatchBody = catchList->getCatchBody(); + SourceLocation rParenLoc = catchList->getRParenLoc(); + SourceLocation bodyLoc = lastCatchBody->getLocStart(); + const char *bodyBuf = SM->getCharacterData(bodyLoc); + const char *rParenBuf = SM->getCharacterData(rParenLoc); + assert((*rParenBuf == ')') && "bogus @catch paren location"); + assert((*bodyBuf == '{') && "bogus @catch body location"); + + buf += "1) { id _tmp = _caught;"; + Rewrite.ReplaceText(startLoc, bodyBuf-startBuf+1, + buf.c_str(), buf.size()); + } else if (DeclStmt *declStmt = dyn_cast<DeclStmt>(catchStmt)) { QualType t = dyn_cast<ValueDecl>(declStmt->getDecl())->getType(); if (t == Context->getObjCIdType()) { buf += "1) { "; @@ -1236,6 +1249,10 @@ Stmt *RewriteTest::RewriteObjCTryStmt(ObjCAtTryStmt *S) { } else if (!isa<NullStmt>(catchStmt)) { assert(false && "@catch rewrite bug"); } + // make sure all the catch bodies get rewritten! + // FIXME: this call should be removed when the iterator for ObjCAtTryStmt + // is fixed. Currently, it only returns the first catch statement! + RewriteFunctionBodyOrGlobalInitializer(lastCatchBody); catchList = catchList->getNextCatchStmt(); } // Complete the catch list... |