mirror of
https://github.com/intel/llvm.git
synced 2026-02-08 08:57:43 +08:00
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. llvm-svn: 46644
This commit is contained in:
@@ -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...
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
// RUN: clang -rewrite-test %s | clang
|
||||
|
||||
@interface foo @end
|
||||
@interface Foo @end
|
||||
@interface GARF @end
|
||||
|
||||
void foo() {
|
||||
@try { TRY(); }
|
||||
@catch (...) { SPLATCH(); @throw; }
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
|
||||
@@ -10,7 +15,7 @@ int main()
|
||||
MYTRY();
|
||||
}
|
||||
|
||||
@catch (foo* localException) {
|
||||
@catch (Foo* localException) {
|
||||
MYCATCH();
|
||||
@throw;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user