From 47aa3ca54bb0e2103306fda97af0de9a7efa5012 Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Fri, 14 Mar 2014 17:01:24 +0000 Subject: [PATCH] [C++11] Replacing DeclStmt iterators decl_begin() and decl_end() with iterator_range decls(). Updating all of the usages of the iterators with range-based for loops. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203947 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DataRecursiveASTVisitor.h | 5 ++--- include/clang/AST/RecursiveASTVisitor.h | 5 ++--- include/clang/AST/Stmt.h | 6 ++++++ lib/AST/ExprConstant.cpp | 5 ++--- lib/AST/StmtPrinter.cpp | 6 +----- lib/AST/StmtProfile.cpp | 5 ++--- lib/Analysis/CFG.cpp | 6 ++---- lib/Analysis/Consumed.cpp | 8 +++----- lib/Analysis/LiveVariables.cpp | 5 ++--- lib/Analysis/PseudoConstantAnalysis.cpp | 5 ++--- lib/Analysis/UninitializedValues.cpp | 10 ++++------ lib/CodeGen/CGDecl.cpp | 7 +++---- lib/CodeGen/CGStmt.cpp | 5 ++--- lib/Rewrite/Frontend/RewriteObjC.cpp | 4 +--- lib/Sema/JumpDiagnostics.cpp | 5 ++--- lib/Sema/SemaDeclCXX.cpp | 11 +++++------ lib/Sema/SemaStmt.cpp | 9 ++++----- lib/Sema/TreeTransform.h | 8 +++----- lib/StaticAnalyzer/Checkers/CStringChecker.cpp | 5 ++--- lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp | 6 ++---- .../Checkers/LLVMConventionsChecker.cpp | 4 ++-- lib/StaticAnalyzer/Checkers/MallocSizeofChecker.cpp | 5 ++--- tools/libclang/CIndex.cpp | 5 ++--- 23 files changed, 58 insertions(+), 82 deletions(-) diff --git a/include/clang/AST/DataRecursiveASTVisitor.h b/include/clang/AST/DataRecursiveASTVisitor.h index 7eec752b88..66bbad6132 100644 --- a/include/clang/AST/DataRecursiveASTVisitor.h +++ b/include/clang/AST/DataRecursiveASTVisitor.h @@ -1935,9 +1935,8 @@ DEF_TRAVERSE_STMT(CXXCatchStmt, { }) DEF_TRAVERSE_STMT(DeclStmt, { - for (DeclStmt::decl_iterator I = S->decl_begin(), E = S->decl_end(); - I != E; ++I) { - TRY_TO(TraverseDecl(*I)); + for (auto *I : S->decls()) { + TRY_TO(TraverseDecl(I)); } // Suppress the default iteration over children() by // returning. Here's why: A DeclStmt looks like 'type var [= diff --git a/include/clang/AST/RecursiveASTVisitor.h b/include/clang/AST/RecursiveASTVisitor.h index 465a53cb6e..b9f887d5c5 100644 --- a/include/clang/AST/RecursiveASTVisitor.h +++ b/include/clang/AST/RecursiveASTVisitor.h @@ -1950,9 +1950,8 @@ DEF_TRAVERSE_STMT(CXXCatchStmt, { }) DEF_TRAVERSE_STMT(DeclStmt, { - for (DeclStmt::decl_iterator I = S->decl_begin(), E = S->decl_end(); - I != E; ++I) { - TRY_TO(TraverseDecl(*I)); + for (auto *I : S->decls()) { + TRY_TO(TraverseDecl(I)); } // Suppress the default iteration over children() by // returning. Here's why: A DeclStmt looks like 'type var [= diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index 4303e7b36e..9243b137e0 100644 --- a/include/clang/AST/Stmt.h +++ b/include/clang/AST/Stmt.h @@ -485,7 +485,13 @@ public: typedef DeclGroupRef::iterator decl_iterator; typedef DeclGroupRef::const_iterator const_decl_iterator; + typedef llvm::iterator_range decl_range; + typedef llvm::iterator_range decl_const_range; + decl_range decls() { return decl_range(decl_begin(), decl_end()); } + decl_const_range decls() const { + return decl_const_range(decl_begin(), decl_end()); + } decl_iterator decl_begin() { return DG.begin(); } decl_iterator decl_end() { return DG.end(); } const_decl_iterator decl_begin() const { return DG.begin(); } diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index ecbce91fe3..b6e8b6dcf6 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -3318,13 +3318,12 @@ static EvalStmtResult EvaluateStmt(APValue &Result, EvalInfo &Info, case Stmt::DeclStmtClass: { const DeclStmt *DS = cast(S); - for (DeclStmt::const_decl_iterator DclIt = DS->decl_begin(), - DclEnd = DS->decl_end(); DclIt != DclEnd; ++DclIt) { + for (const auto *DclIt : DS->decls()) { // Each declaration initialization is its own full-expression. // FIXME: This isn't quite right; if we're performing aggregate // initialization, each braced subexpression is its own full-expression. FullExpressionRAII Scope(Info); - if (!EvaluateDecl(Info, *DclIt) && !Info.keepEvaluatingAfterFailure()) + if (!EvaluateDecl(Info, DclIt) && !Info.keepEvaluatingAfterFailure()) return ESR_Failed; } return ESR_Succeeded; diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp index a0a73be0a5..625ab1624a 100644 --- a/lib/AST/StmtPrinter.cpp +++ b/lib/AST/StmtPrinter.cpp @@ -126,11 +126,7 @@ void StmtPrinter::PrintRawDecl(Decl *D) { } void StmtPrinter::PrintRawDeclStmt(const DeclStmt *S) { - DeclStmt::const_decl_iterator Begin = S->decl_begin(), End = S->decl_end(); - SmallVector Decls; - for ( ; Begin != End; ++Begin) - Decls.push_back(*Begin); - + SmallVector Decls(S->decls()); Decl::printGroup(Decls.data(), Decls.size(), OS, Policy, IndentLevel); } diff --git a/lib/AST/StmtProfile.cpp b/lib/AST/StmtProfile.cpp index eeffe743b7..e663778e99 100644 --- a/lib/AST/StmtProfile.cpp +++ b/lib/AST/StmtProfile.cpp @@ -79,9 +79,8 @@ void StmtProfiler::VisitStmt(const Stmt *S) { void StmtProfiler::VisitDeclStmt(const DeclStmt *S) { VisitStmt(S); - for (DeclStmt::const_decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); - D != DEnd; ++D) - VisitDecl(*D); + for (const auto *D : S->decls()) + VisitDecl(D); } void StmtProfiler::VisitNullStmt(const NullStmt *S) { diff --git a/lib/Analysis/CFG.cpp b/lib/Analysis/CFG.cpp index 9dd962278c..471b0e362e 100644 --- a/lib/Analysis/CFG.cpp +++ b/lib/Analysis/CFG.cpp @@ -961,11 +961,9 @@ LocalScope* CFGBuilder::addLocalScopeForDeclStmt(DeclStmt *DS, if (!BuildOpts.AddImplicitDtors) return Scope; - for (DeclStmt::decl_iterator DI = DS->decl_begin(), DE = DS->decl_end() - ; DI != DE; ++DI) { - if (VarDecl *VD = dyn_cast(*DI)) + for (auto *DI : DS->decls()) + if (VarDecl *VD = dyn_cast(DI)) Scope = addLocalScopeForVarDecl(VD, Scope); - } return Scope; } diff --git a/lib/Analysis/Consumed.cpp b/lib/Analysis/Consumed.cpp index 466e54703f..5551a21e59 100644 --- a/lib/Analysis/Consumed.cpp +++ b/lib/Analysis/Consumed.cpp @@ -851,11 +851,9 @@ void ConsumedStmtVisitor::VisitDeclRefExpr(const DeclRefExpr *DeclRef) { } void ConsumedStmtVisitor::VisitDeclStmt(const DeclStmt *DeclS) { - for (DeclStmt::const_decl_iterator DI = DeclS->decl_begin(), - DE = DeclS->decl_end(); DI != DE; ++DI) { - - if (isa(*DI)) VisitVarDecl(cast(*DI)); - } + for (const auto *DI : DeclS->decls()) + if (isa(DI)) + VisitVarDecl(cast(DI)); if (DeclS->isSingleDecl()) if (const VarDecl *Var = dyn_cast_or_null(DeclS->getSingleDecl())) diff --git a/lib/Analysis/LiveVariables.cpp b/lib/Analysis/LiveVariables.cpp index 799799c542..5d7de84631 100644 --- a/lib/Analysis/LiveVariables.cpp +++ b/lib/Analysis/LiveVariables.cpp @@ -389,9 +389,8 @@ void TransferFunctions::VisitDeclRefExpr(DeclRefExpr *DR) { } void TransferFunctions::VisitDeclStmt(DeclStmt *DS) { - for (DeclStmt::decl_iterator DI=DS->decl_begin(), DE = DS->decl_end(); - DI != DE; ++DI) - if (VarDecl *VD = dyn_cast(*DI)) { + for (const auto *DI : DS->decls()) + if (const auto *VD = dyn_cast(DI)) { if (!isAlwaysAlive(VD)) val.liveDecls = LV.DSetFact.remove(val.liveDecls, VD); } diff --git a/lib/Analysis/PseudoConstantAnalysis.cpp b/lib/Analysis/PseudoConstantAnalysis.cpp index 5d659ce585..314ce7cfd8 100644 --- a/lib/Analysis/PseudoConstantAnalysis.cpp +++ b/lib/Analysis/PseudoConstantAnalysis.cpp @@ -171,10 +171,9 @@ void PseudoConstantAnalysis::RunAnalysis() { case Stmt::DeclStmtClass: { const DeclStmt *DS = cast(Head); // Iterate over each decl and see if any of them contain reference decls - for (DeclStmt::const_decl_iterator I = DS->decl_begin(), - E = DS->decl_end(); I != E; ++I) { + for (const auto *I : DS->decls()) { // We only care about VarDecls - const VarDecl *VD = dyn_cast(*I); + const VarDecl *VD = dyn_cast(I); if (!VD) continue; diff --git a/lib/Analysis/UninitializedValues.cpp b/lib/Analysis/UninitializedValues.cpp index a011878dd6..005426dc7d 100644 --- a/lib/Analysis/UninitializedValues.cpp +++ b/lib/Analysis/UninitializedValues.cpp @@ -373,9 +373,8 @@ void ClassifyRefs::classify(const Expr *E, Class C) { } void ClassifyRefs::VisitDeclStmt(DeclStmt *DS) { - for (DeclStmt::decl_iterator DI = DS->decl_begin(), DE = DS->decl_end(); - DI != DE; ++DI) { - VarDecl *VD = dyn_cast(*DI); + for (auto *DI : DS->decls()) { + VarDecl *VD = dyn_cast(DI); if (VD && isTrackedVar(VD)) if (const DeclRefExpr *DRE = getSelfInitExpr(VD)) Classification[DRE] = SelfInit; @@ -694,9 +693,8 @@ void TransferFunctions::VisitBinaryOperator(BinaryOperator *BO) { } void TransferFunctions::VisitDeclStmt(DeclStmt *DS) { - for (DeclStmt::decl_iterator DI = DS->decl_begin(), DE = DS->decl_end(); - DI != DE; ++DI) { - VarDecl *VD = dyn_cast(*DI); + for (auto *DI : DS->decls()) { + VarDecl *VD = dyn_cast(DI); if (VD && isTrackedVar(VD)) { if (getSelfInitExpr(VD)) { // If the initializer consists solely of a reference to itself, we diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp index 1f0dd8535a..4b063c49c7 100644 --- a/lib/CodeGen/CGDecl.cpp +++ b/lib/CodeGen/CGDecl.cpp @@ -1013,10 +1013,9 @@ static bool isCapturedBy(const VarDecl &var, const Expr *e) { } else if (DeclStmt *DS = dyn_cast((*BI))) { // special case declarations - for (DeclStmt::decl_iterator I = DS->decl_begin(), E = DS->decl_end(); - I != E; ++I) { - if (VarDecl *VD = dyn_cast((*I))) { - Expr *Init = VD->getInit(); + for (const auto *I : DS->decls()) { + if (const auto *VD = dyn_cast((I))) { + const Expr *Init = VD->getInit(); if (Init && isCapturedBy(var, Init)) return true; } diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index d69c5cdf9e..4e95c8ad1c 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/lib/CodeGen/CGStmt.cpp @@ -891,9 +891,8 @@ void CodeGenFunction::EmitDeclStmt(const DeclStmt &S) { if (HaveInsertPoint()) EmitStopPoint(&S); - for (DeclStmt::const_decl_iterator I = S.decl_begin(), E = S.decl_end(); - I != E; ++I) - EmitDecl(**I); + for (const auto *I : S.decls()) + EmitDecl(*I); } void CodeGenFunction::EmitBreakStmt(const BreakStmt &S) { diff --git a/lib/Rewrite/Frontend/RewriteObjC.cpp b/lib/Rewrite/Frontend/RewriteObjC.cpp index e2bbc92baa..4cd71d89f1 100644 --- a/lib/Rewrite/Frontend/RewriteObjC.cpp +++ b/lib/Rewrite/Frontend/RewriteObjC.cpp @@ -4753,9 +4753,7 @@ Stmt *RewriteObjC::RewriteFunctionBodyOrGlobalInitializer(Stmt *S) { RewriteObjCQualifiedInterfaceTypes(*DS->decl_begin()); // Blocks rewrite rules. - for (DeclStmt::decl_iterator DI = DS->decl_begin(), DE = DS->decl_end(); - DI != DE; ++DI) { - Decl *SD = *DI; + for (auto *SD : DS->decls()) { if (ValueDecl *ND = dyn_cast(SD)) { if (isTopLevelBlockPointerType(ND->getType())) RewriteBlockPointerDecl(ND); diff --git a/lib/Sema/JumpDiagnostics.cpp b/lib/Sema/JumpDiagnostics.cpp index 6d36f627e7..43a74e1ad8 100644 --- a/lib/Sema/JumpDiagnostics.cpp +++ b/lib/Sema/JumpDiagnostics.cpp @@ -367,9 +367,8 @@ void JumpScopeChecker::BuildScopeInformation(Stmt *S, unsigned &origParentScope) if (DeclStmt *DS = dyn_cast(SubStmt)) { // The decl statement creates a scope if any of the decls in it are VLAs // or have the cleanup attribute. - for (DeclStmt::decl_iterator I = DS->decl_begin(), E = DS->decl_end(); - I != E; ++I) - BuildScopeInformation(*I, ParentScope); + for (auto *I : DS->decls()) + BuildScopeInformation(I, ParentScope); continue; } // Disallow jumps into any part of an @try statement by pushing a scope and diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index da1664319b..c9fee1e1f5 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -813,9 +813,8 @@ static bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl, // C++11 [dcl.constexpr]p3 and p4: // The definition of a constexpr function(p3) or constructor(p4) [...] shall // contain only - for (DeclStmt::decl_iterator DclIt = DS->decl_begin(), - DclEnd = DS->decl_end(); DclIt != DclEnd; ++DclIt) { - switch ((*DclIt)->getKind()) { + for (const auto *DclIt : DS->decls()) { + switch (DclIt->getKind()) { case Decl::StaticAssert: case Decl::Using: case Decl::UsingShadow: @@ -831,7 +830,7 @@ static bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl, case Decl::TypeAlias: { // - typedef declarations and alias-declarations that do not define // classes or enumerations, - TypedefNameDecl *TN = cast(*DclIt); + const auto *TN = cast(DclIt); if (TN->getUnderlyingType()->isVariablyModifiedType()) { // Don't allow variably-modified types in constexpr functions. TypeLoc TL = TN->getTypeSourceInfo()->getTypeLoc(); @@ -846,7 +845,7 @@ static bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl, case Decl::Enum: case Decl::CXXRecord: // C++1y allows types to be defined, not just declared. - if (cast(*DclIt)->isThisDeclarationADefinition()) + if (cast(DclIt)->isThisDeclarationADefinition()) SemaRef.Diag(DS->getLocStart(), SemaRef.getLangOpts().CPlusPlus1y ? diag::warn_cxx11_compat_constexpr_type_definition @@ -865,7 +864,7 @@ static bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl, // C++1y [dcl.constexpr]p3 allows anything except: // a definition of a variable of non-literal type or of static or // thread storage duration or for which no initialization is performed. - VarDecl *VD = cast(*DclIt); + const auto *VD = cast(DclIt); if (VD->isThisDeclarationADefinition()) { if (VD->isStaticLocal()) { SemaRef.Diag(VD->getLocation(), diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index a7ea72f144..2be5d5cb83 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -1594,14 +1594,13 @@ Sema::ActOnForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, // C99 6.8.5p3: The declaration part of a 'for' statement shall only // declare identifiers for objects having storage class 'auto' or // 'register'. - for (DeclStmt::decl_iterator DI=DS->decl_begin(), DE=DS->decl_end(); - DI!=DE; ++DI) { - VarDecl *VD = dyn_cast(*DI); + for (auto *DI : DS->decls()) { + VarDecl *VD = dyn_cast(DI); if (VD && VD->isLocalVarDecl() && !VD->hasLocalStorage()) VD = 0; if (VD == 0) { - Diag((*DI)->getLocation(), diag::err_non_local_variable_decl_in_for); - (*DI)->setInvalidDecl(); + Diag(DI->getLocation(), diag::err_non_local_variable_decl_in_for); + DI->setInvalidDecl(); } } } diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index c1847fa7d5..7195871d94 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -5684,14 +5684,12 @@ StmtResult TreeTransform::TransformDeclStmt(DeclStmt *S) { bool DeclChanged = false; SmallVector Decls; - for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); - D != DEnd; ++D) { - Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(), - *D); + for (auto *D : S->decls()) { + Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); if (!Transformed) return StmtError(); - if (Transformed != *D) + if (Transformed != D) DeclChanged = true; Decls.push_back(Transformed); diff --git a/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index 01361c65df..d7c1d94354 100644 --- a/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -1935,9 +1935,8 @@ void CStringChecker::checkPreStmt(const DeclStmt *DS, CheckerContext &C) const { // Record string length for char a[] = "abc"; ProgramStateRef state = C.getState(); - for (DeclStmt::const_decl_iterator I = DS->decl_begin(), E = DS->decl_end(); - I != E; ++I) { - const VarDecl *D = dyn_cast(*I); + for (const auto *I : DS->decls()) { + const VarDecl *D = dyn_cast(I); if (!D) continue; diff --git a/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp b/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp index 87f1a3d19a..e804ae3009 100644 --- a/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp @@ -313,10 +313,8 @@ public: else if (const DeclStmt *DS = dyn_cast(S)) // Iterate through the decls. Warn if any initializers are complex // expressions that are not live (never used). - for (DeclStmt::const_decl_iterator DI=DS->decl_begin(), DE=DS->decl_end(); - DI != DE; ++DI) { - - VarDecl *V = dyn_cast(*DI); + for (const auto *DI : DS->decls()) { + const auto *V = dyn_cast(DI); if (!V) continue; diff --git a/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp b/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp index 0551c75feb..17ebf9edb6 100644 --- a/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp @@ -145,8 +145,8 @@ static void CheckStringRefAssignedTemporary(const Decl *D, BugReporter &BR, void StringRefCheckerVisitor::VisitDeclStmt(DeclStmt *S) { VisitChildren(S); - for (DeclStmt::decl_iterator I = S->decl_begin(), E = S->decl_end();I!=E; ++I) - if (VarDecl *VD = dyn_cast(*I)) + for (auto *I : S->decls()) + if (VarDecl *VD = dyn_cast(I)) VisitVarDecl(VD); } diff --git a/lib/StaticAnalyzer/Checkers/MallocSizeofChecker.cpp b/lib/StaticAnalyzer/Checkers/MallocSizeofChecker.cpp index ec1ed94c59..5b068c808c 100644 --- a/lib/StaticAnalyzer/Checkers/MallocSizeofChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/MallocSizeofChecker.cpp @@ -101,9 +101,8 @@ public: } TypeCallPair VisitDeclStmt(const DeclStmt *S) { - for (DeclStmt::const_decl_iterator I = S->decl_begin(), E = S->decl_end(); - I!=E; ++I) - if (const VarDecl *VD = dyn_cast(*I)) + for (const auto *I : S->decls()) + if (const VarDecl *VD = dyn_cast(I)) if (const Expr *Init = VD->getInit()) VisitChild(VD, Init); return TypeCallPair(); diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 864b753b05..255e642b15 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -2072,9 +2072,8 @@ void EnqueueVisitor::VisitDependentScopeDeclRefExpr( void EnqueueVisitor::VisitDeclStmt(const DeclStmt *S) { unsigned size = WL.size(); bool isFirst = true; - for (DeclStmt::const_decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); - D != DEnd; ++D) { - AddDecl(*D, isFirst); + for (const auto *D : S->decls()) { + AddDecl(D, isFirst); isFirst = false; } if (size == WL.size()) -- 2.40.0