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:
Steve Naroff 2008-01-19 00:42:38 +00:00
parent 802583656e
commit c7d2df23f8
3 changed files with 27 additions and 3 deletions

View File

@ -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 ';'");

View File

@ -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) {

View File

@ -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;
}
}