modern objective-c translation: writing @try/@catch/@finally
statements.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152875 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Rewrite/RewriteModernObjC.cpp b/lib/Rewrite/RewriteModernObjC.cpp
index 7474520..1081b9d 100644
--- a/lib/Rewrite/RewriteModernObjC.cpp
+++ b/lib/Rewrite/RewriteModernObjC.cpp
@@ -1836,11 +1836,15 @@
Stmt *RewriteModernObjC::RewriteObjCTryStmt(ObjCAtTryStmt *S) {
ObjCAtFinallyStmt *finalStmt = S->getFinallyStmt();
- // bool noCatch = S->getNumCatchStmts() == 0;
+ bool noCatch = S->getNumCatchStmts() == 0;
std::string buf;
if (finalStmt) {
- buf = "{ id volatile _rethrow = 0;\n";
+ if (noCatch)
+ buf = "{ id volatile _rethrow = 0;\n";
+ else {
+ buf = "{ id volatile _rethrow = 0;\ntry {\n";
+ }
}
// Get the start location and compute the semi location.
SourceLocation startLoc = S->getLocStart();
@@ -1853,24 +1857,6 @@
// @try -> try
ReplaceText(startLoc, 1, "");
- if (finalStmt) {
- buf.clear();
- buf = "catch (id e) {_rethrow = e;}\n";
- SourceLocation startFinalLoc = finalStmt->getLocStart();
- ReplaceText(startFinalLoc, 8, buf);
- Stmt *body = finalStmt->getFinallyBody();
- SourceLocation startFinalBodyLoc = body->getLocStart();
- buf.clear();
- buf = "{ struct _FIN { _FIN(id reth) : rethrow(reth) {}\n";
- buf += "\t~_FIN() { if (rethrow) objc_exception_throw(rethrow); }\n";
- buf += "\tid rethrow;\n";
- buf += "\t} _fin_force_rethow(_rethrow);";
- ReplaceText(startFinalBodyLoc, 1, buf);
-
- SourceLocation endFinalBodyLoc = body->getLocEnd();
- ReplaceText(endFinalBodyLoc, 1, "}\n}");
- }
-
for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
ObjCAtCatchStmt *Catch = S->getCatchStmt(I);
VarDecl *catchDecl = Catch->getCatchParamDecl();
@@ -1914,6 +1900,28 @@
ReplaceText(startLoc, 1, "");
}
+ if (finalStmt) {
+ buf.clear();
+ if (noCatch)
+ buf = "catch (id e) {_rethrow = e;}\n";
+ else
+ buf = "}\ncatch (id e) {_rethrow = e;}\n";
+
+ SourceLocation startFinalLoc = finalStmt->getLocStart();
+ ReplaceText(startFinalLoc, 8, buf);
+ Stmt *body = finalStmt->getFinallyBody();
+ SourceLocation startFinalBodyLoc = body->getLocStart();
+ buf.clear();
+ buf = "{ struct _FIN { _FIN(id reth) : rethrow(reth) {}\n";
+ buf += "\t~_FIN() { if (rethrow) objc_exception_throw(rethrow); }\n";
+ buf += "\tid rethrow;\n";
+ buf += "\t} _fin_force_rethow(_rethrow);";
+ ReplaceText(startFinalBodyLoc, 1, buf);
+
+ SourceLocation endFinalBodyLoc = body->getLocEnd();
+ ReplaceText(endFinalBodyLoc, 1, "}\n}");
+ }
+
return 0;
}