diff --git a/clang/include/clang/AST/StmtObjC.h b/clang/include/clang/AST/StmtObjC.h index 5f56f49358f93b..c46ff4634c825f 100644 --- a/clang/include/clang/AST/StmtObjC.h +++ b/clang/include/clang/AST/StmtObjC.h @@ -268,6 +268,27 @@ class ObjCAtTryStmt final const_child_range children() const { return const_child_range(const_cast(this)->children()); } + + using catch_stmt_iterator = CastIterator; + using const_catch_stmt_iterator = ConstCastIterator; + using catch_range = llvm::iterator_range; + using catch_const_range = llvm::iterator_range; + + catch_stmt_iterator catch_stmts_begin() { return getStmts() + 1; } + catch_stmt_iterator catch_stmts_end() { + return catch_stmts_begin() + NumCatchStmts; + } + catch_range catch_stmts() { + return catch_range(catch_stmts_begin(), catch_stmts_end()); + } + + const_catch_stmt_iterator catch_stmts_begin() const { return getStmts() + 1; } + const_catch_stmt_iterator catch_stmts_end() const { + return catch_stmts_begin() + NumCatchStmts; + } + catch_const_range catch_stmts() const { + return catch_const_range(catch_stmts_begin(), catch_stmts_end()); + } }; /// Represents Objective-C's \@synchronized statement. diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp index 80638336aa1e7d..ce0b3bf62eb4ed 100644 --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -521,13 +521,10 @@ void StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) { OS << NL; } - for (unsigned I = 0, N = Node->getNumCatchStmts(); I != N; ++I) { - ObjCAtCatchStmt *catchStmt = Node->getCatchStmt(I); + for (ObjCAtCatchStmt *catchStmt : Node->catch_stmts()) { Indent() << "@catch("; - if (catchStmt->getCatchParamDecl()) { - if (Decl *DS = catchStmt->getCatchParamDecl()) - PrintRawDecl(DS); - } + if (Decl *DS = catchStmt->getCatchParamDecl()) + PrintRawDecl(DS); OS << ")"; if (auto *CS = dyn_cast(catchStmt->getCatchBody())) { PrintRawCompoundStmt(CS); diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index 1ac960862ddbab..11987dfd556560 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -3935,10 +3935,9 @@ CFGBlock *CFGBuilder::VisitObjCAtTryStmt(ObjCAtTryStmt *Terminator) { NewTryTerminatedBlock->setTerminator(Terminator); bool HasCatchAll = false; - for (unsigned I = 0, E = Terminator->getNumCatchStmts(); I != E; ++I) { + for (ObjCAtCatchStmt *CS : Terminator->catch_stmts()) { // The code after the try is the implicit successor. Succ = TrySuccessor; - ObjCAtCatchStmt *CS = Terminator->getCatchStmt(I); if (CS->hasEllipsis()) { HasCatchAll = true; } diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index dbe39dd47d63d3..36555ce3cbd9e1 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -4721,9 +4721,7 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF, // matched and avoid generating code for falling off the end if // so. bool AllMatched = false; - for (unsigned I = 0, N = AtTryStmt->getNumCatchStmts(); I != N; ++I) { - const ObjCAtCatchStmt *CatchStmt = AtTryStmt->getCatchStmt(I); - + for (const ObjCAtCatchStmt *CatchStmt : AtTryStmt->catch_stmts()) { const VarDecl *CatchParam = CatchStmt->getCatchParamDecl(); const ObjCObjectPointerType *OPT = nullptr; diff --git a/clang/lib/CodeGen/CGObjCRuntime.cpp b/clang/lib/CodeGen/CGObjCRuntime.cpp index 7f26f8a3b8ff60..33ae3c7c2b28a2 100644 --- a/clang/lib/CodeGen/CGObjCRuntime.cpp +++ b/clang/lib/CodeGen/CGObjCRuntime.cpp @@ -163,8 +163,7 @@ void CGObjCRuntime::EmitTryCatchStmt(CodeGenFunction &CGF, // Enter the catch, if there is one. if (S.getNumCatchStmts()) { - for (unsigned I = 0, N = S.getNumCatchStmts(); I != N; ++I) { - const ObjCAtCatchStmt *CatchStmt = S.getCatchStmt(I); + for (const ObjCAtCatchStmt *CatchStmt : S.catch_stmts()) { const VarDecl *CatchDecl = CatchStmt->getCatchParamDecl(); Handlers.push_back(CatchHandler()); diff --git a/clang/lib/Frontend/Rewrite/RewriteModernObjC.cpp b/clang/lib/Frontend/Rewrite/RewriteModernObjC.cpp index fd54bcbf7c3532..626ec4d71ccdd8 100644 --- a/clang/lib/Frontend/Rewrite/RewriteModernObjC.cpp +++ b/clang/lib/Frontend/Rewrite/RewriteModernObjC.cpp @@ -1957,15 +1957,15 @@ Stmt *RewriteModernObjC::RewriteObjCTryStmt(ObjCAtTryStmt *S) { // @try -> try ReplaceText(startLoc, 1, ""); - for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { - ObjCAtCatchStmt *Catch = S->getCatchStmt(I); + for (ObjCAtCatchStmt *Catch : S->catch_stmts()) { VarDecl *catchDecl = Catch->getCatchParamDecl(); startLoc = Catch->getBeginLoc(); bool AtRemoved = false; if (catchDecl) { QualType t = catchDecl->getType(); - if (const ObjCObjectPointerType *Ptr = t->getAs()) { + if (const ObjCObjectPointerType *Ptr = + t->getAs()) { // Should be a pointer to a class. ObjCInterfaceDecl *IDecl = Ptr->getObjectType()->getInterface(); if (IDecl) { diff --git a/clang/lib/Sema/JumpDiagnostics.cpp b/clang/lib/Sema/JumpDiagnostics.cpp index ffc264ebec728b..94f39e1eea6e65 100644 --- a/clang/lib/Sema/JumpDiagnostics.cpp +++ b/clang/lib/Sema/JumpDiagnostics.cpp @@ -493,8 +493,7 @@ void JumpScopeChecker::BuildScopeInformation(Stmt *S, } // Jump from the catch to the finally or try is not valid. - for (unsigned I = 0, N = AT->getNumCatchStmts(); I != N; ++I) { - ObjCAtCatchStmt *AC = AT->getCatchStmt(I); + for (ObjCAtCatchStmt *AC : AT->catch_stmts()) { unsigned NewParentScope = Scopes.size(); Scopes.push_back(GotoScope(ParentScope, diag::note_protected_by_objc_catch, diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp index 000bf808d32b4e..0e87bcce0e4383 100644 --- a/clang/lib/Serialization/ASTWriterStmt.cpp +++ b/clang/lib/Serialization/ASTWriterStmt.cpp @@ -1482,8 +1482,8 @@ void ASTStmtWriter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) { Record.push_back(S->getNumCatchStmts()); Record.push_back(S->getFinallyStmt() != nullptr); Record.AddStmt(S->getTryBody()); - for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) - Record.AddStmt(S->getCatchStmt(I)); + for (ObjCAtCatchStmt *C : S->catch_stmts()) + Record.AddStmt(C); if (S->getFinallyStmt()) Record.AddStmt(S->getFinallyStmt()); Record.AddSourceLocation(S->getAtTryLoc());