- ObjCAtThrowStmt::getSourceRange() needs to check if it has a statement (and not go "boom":-)
- RewriteTest::RewriteObjCThrowStmt() needs to generate refer to the current exception.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46184
91177308-0d34-0410-b5e6-
96231b3b80d8
std::string buf;
/* void objc_exception_throw(id) __attribute__((noreturn)); */
- buf = "objc_exception_throw(";
+ if (S->getThrowExpr())
+ buf = "objc_exception_throw(";
+ else // add an implicit argument
+ buf = "objc_exception_throw(_caught";
Rewrite.ReplaceText(startLoc, 6, buf.c_str(), buf.size());
const char *semiBuf = strchr(startBuf, ';');
assert((*semiBuf == ';') && "@throw: can't find ';'");
Expr *const getThrowExpr() const { return reinterpret_cast<Expr*>(Throw); }
- virtual SourceRange getSourceRange() const {
- return SourceRange(AtThrowLoc, Throw->getLocEnd());
+ virtual SourceRange getSourceRange() const {
+ if (Throw)
+ return SourceRange(AtThrowLoc, Throw->getLocEnd());
+ else
+ return SourceRange(AtThrowLoc);
}
static bool classof(const Stmt *T) {
--- /dev/null
+// RUN: clang -rewrite-test %s | clang
+
+@interface foo @end
+@interface GARF @end
+
+int main()
+{
+
+@try {
+ MYTRY();
+}
+
+@catch (foo* localException) {
+ MYCATCH();
+ @throw;
+}
+}
+