forked from OSchip/llvm-project
Fix two bugs with an @throw that doesn't have a statement.
- ObjCAtThrowStmt::getSourceRange() needs to check if it has a statement (and not go "boom":-) - RewriteTest::RewriteObjCThrowStmt() needs to generate refer to the current exception. llvm-svn: 46184
This commit is contained in:
parent
802583656e
commit
c7d2df23f8
|
|
@ -1207,7 +1207,10 @@ Stmt *RewriteTest::RewriteObjCThrowStmt(ObjCAtThrowStmt *S) {
|
|||
|
||||
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 ';'");
|
||||
|
|
|
|||
|
|
@ -974,8 +974,11 @@ public:
|
|||
|
||||
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) {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,18 @@
|
|||
// RUN: clang -rewrite-test %s | clang
|
||||
|
||||
@interface foo @end
|
||||
@interface GARF @end
|
||||
|
||||
int main()
|
||||
{
|
||||
|
||||
@try {
|
||||
MYTRY();
|
||||
}
|
||||
|
||||
@catch (foo* localException) {
|
||||
MYCATCH();
|
||||
@throw;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue