/// parameter-declaration
/// '...' [OBJC2]
///
-Parser::DeclTy *Parser::ParseObjCTryStmt(SourceLocation atLoc) {
+Parser::StmtResult Parser::ParseObjCTryStmt(SourceLocation atLoc) {
bool catch_or_finally_seen = false;
ConsumeToken(); // consume try
if (Tok.isNot(tok::l_brace)) {
Diag (Tok, diag::err_expected_lbrace);
- return 0;
+ return true;
}
StmtResult TryBody = ParseCompoundStatementBody();
while (Tok.is(tok::at)) {
else
ConsumeToken(); // consume '...'
ConsumeParen();
- StmtResult CatchMody = ParseCompoundStatementBody();
+ StmtResult CatchBody = ParseCompoundStatementBody();
}
else {
Diag(catchLoc, diag::err_expected_lparen_after, "@catch clause");
- return 0;
+ return true;
}
catch_or_finally_seen = true;
}
}
if (!catch_or_finally_seen)
Diag(atLoc, diag::err_missing_catch_finally);
- return 0;
+ return true;
}
/// objc-method-def: objc-method-proto ';'[opt] '{' body '}'
virtual child_iterator child_begin();
virtual child_iterator child_end();
};
-
+
+/// ObjcAtCatchStmt - This represents objective-c's @catch statement.
+class ObjcAtCatchStmt : public Stmt {
+private:
+ // Points to next @catch statement, or null
+ ObjcAtCatchStmt *NextAtCatchStmt;
+ ScopedDecl *AtCatchDeclarator;
+ Stmt *AtCatchStmt;
+
+ SourceLocation AtCatchLoc, RParenLoc;
+public:
+ ObjcAtCatchStmt(SourceLocation atCatchLoc, SourceLocation rparenloc,
+ ScopedDecl *atCatchDeclarator, Stmt *atCatchStmt)
+ : Stmt(ObjcAtCatchStmtClass), NextAtCatchStmt(0),
+ AtCatchDeclarator(atCatchDeclarator), AtCatchStmt(atCatchStmt),
+ AtCatchLoc(atCatchLoc), RParenLoc(rparenloc) {}
+
+ virtual SourceRange getSourceRange() const {
+ return SourceRange(AtCatchLoc, AtCatchStmt->getLocEnd());
+ }
+
+ static bool classof(const Stmt *T) {
+ return T->getStmtClass() == ObjcAtCatchStmtClass;
+ }
+ static bool classof(const ObjcAtCatchStmt *) { return true; }
+
+ virtual child_iterator child_begin();
+ virtual child_iterator child_end();
+
+};
+
+/// ObjcAtFinallyStmt - This represent objective-c's @finally Statement
+class ObjcAtFinallyStmt : public Stmt {
+ private:
+ Stmt *AtFinallyStmt;
+ SourceLocation AtFinallyLoc;
+
+ public:
+ ObjcAtFinallyStmt(SourceLocation atFinallyLoc, Stmt *atFinallyStmt)
+ : Stmt(ObjcAtFinallyStmtClass),
+ AtFinallyStmt(atFinallyStmt), AtFinallyLoc(atFinallyLoc) {}
+
+ virtual SourceRange getSourceRange() const {
+ return SourceRange(AtFinallyLoc, AtFinallyStmt->getLocEnd());
+ }
+
+ static bool classof(const Stmt *T) {
+ return T->getStmtClass() == ObjcAtFinallyStmtClass;
+ }
+ static bool classof(const ObjcAtFinallyStmt *) { return true; }
+
+ virtual child_iterator child_begin();
+ virtual child_iterator child_end();
+
+};
+
+/// ObjcAtTryStmt - This represent objective-c's over-all
+/// @try ... @catch ... @finally statement.
+class ObjcAtTryStmt : public Stmt {
+private:
+ enum { TRY, CATCH, FINALLY, END_TRY };
+ Stmt* SubStmts[END_TRY];
+
+ SourceLocation AtTryLoc;
+
+public:
+ ObjcAtTryStmt(SourceLocation atTryLoc, Stmt *atTryStmt,
+ ObjcAtCatchStmt *atCatchStmt,
+ ObjcAtFinallyStmt *atFinallyStmt)
+ : Stmt(ObjcAtTryStmtClass), AtTryLoc(atTryLoc) {
+ SubStmts[TRY] = atTryStmt;
+ SubStmts[CATCH] = atCatchStmt;
+ SubStmts[FINALLY] = atFinallyStmt;
+ SubStmts[END_TRY] = NULL;
+ }
+
+ virtual SourceRange getSourceRange() const {
+ return SourceRange(AtTryLoc, SubStmts[TRY]->getLocEnd());
+ }
+
+ static bool classof(const Stmt *T) {
+ return T->getStmtClass() == ObjcAtTryStmtClass;
+ }
+ static bool classof(const ObjcAtTryStmt *) { return true; }
+
+ virtual child_iterator child_begin();
+ virtual child_iterator child_end();
+
+};
} // end namespace clang
DeclTy *ParseObjCAtAliasDeclaration(SourceLocation atLoc);
DeclTy *ParseObjCPropertySynthesize(SourceLocation atLoc);
DeclTy *ParseObjCPropertyDynamic(SourceLocation atLoc);
- DeclTy *ParseObjCTryStmt(SourceLocation atLoc);
DeclTy *ParseObjCThrowStmt(SourceLocation atLoc);
IdentifierInfo *ParseObjCSelector(SourceLocation &MethodLocation);
StmtResult ParseBreakStatement();
StmtResult ParseReturnStatement();
StmtResult ParseAsmStatement();
+ StmtResult ParseObjCTryStmt(SourceLocation atLoc);
void ParseAsmOperandsOpt();
//===--------------------------------------------------------------------===//