aboutsummaryrefslogtreecommitdiff
path: root/Driver/RewriteTest.cpp
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2008-02-01 20:02:07 +0000
committerSteve Naroff <snaroff@apple.com>2008-02-01 20:02:07 +0000
commite12e69223ec279e89ac681023d42184b115e0068 (patch)
tree376ded40280d48bb68f9fe90edb142fbc4d6c8c4 /Driver/RewriteTest.cpp
parent5f0ad3f34c328f71aa53a68f3d4b788ae0541924 (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.cpp19
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...