From 0ce08a07392951d4c05c8d754317cfd3105760d0 Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Sat, 8 Mar 2014 18:45:14 +0000 Subject: [PATCH] [C++11] Replacing EnumDecl iterators enumerator_begin() and enumerator_end() with iterator_range enumerators(). Updating all of the usages of the iterators with range-based for loops. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203353 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/Decl.h | 5 +++++ include/clang/AST/DeclBase.h | 4 ++++ lib/ARCMigrate/ObjCMT.cpp | 4 +--- lib/CodeGen/CGDebugInfo.cpp | 4 +--- lib/Frontend/ASTUnit.cpp | 7 +++---- lib/Rewrite/Frontend/RewriteModernObjC.cpp | 3 +-- lib/Sema/SemaCodeComplete.cpp | 8 +++----- lib/Sema/SemaDecl.cpp | 7 +++---- lib/Sema/SemaStmt.cpp | 10 ++++------ lib/Sema/SemaTemplateInstantiateDecl.cpp | 8 +++----- 10 files changed, 28 insertions(+), 32 deletions(-) diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index d20fd689d1..99693d6306 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -2899,6 +2899,11 @@ public: // enumerator_iterator - Iterates through the enumerators of this // enumeration. typedef specific_decl_iterator enumerator_iterator; + typedef specific_decl_range enumerator_range; + + enumerator_range enumerators() const { + return enumerator_range(enumerator_begin(), enumerator_end()); + } enumerator_iterator enumerator_begin() const { const EnumDecl *E = getDefinition(); diff --git a/include/clang/AST/DeclBase.h b/include/clang/AST/DeclBase.h index 4fb7cd10a4..665c728360 100644 --- a/include/clang/AST/DeclBase.h +++ b/include/clang/AST/DeclBase.h @@ -1396,6 +1396,10 @@ public: } }; + template + using specific_decl_range = + llvm::iterator_range>; + /// \brief Iterates over a filtered subrange of declarations stored /// in a DeclContext. /// diff --git a/lib/ARCMigrate/ObjCMT.cpp b/lib/ARCMigrate/ObjCMT.cpp index 307f910945..a88085fe6b 100644 --- a/lib/ARCMigrate/ObjCMT.cpp +++ b/lib/ARCMigrate/ObjCMT.cpp @@ -667,9 +667,7 @@ static bool UseNSOptionsMacro(Preprocessor &PP, ASTContext &Ctx, bool PowerOfTwo = true; bool AllHexdecimalEnumerator = true; uint64_t MaxPowerOfTwoVal = 0; - for (EnumDecl::enumerator_iterator EI = EnumDcl->enumerator_begin(), - EE = EnumDcl->enumerator_end(); EI != EE; ++EI) { - EnumConstantDecl *Enumerator = (*EI); + for (auto Enumerator : EnumDcl->enumerators()) { const Expr *InitExpr = Enumerator->getInitExpr(); if (!InitExpr) { PowerOfTwo = false; diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index d115f264ba..4e7e223ca0 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -1917,9 +1917,7 @@ llvm::DIType CGDebugInfo::CreateEnumType(const EnumType *Ty) { // Create DIEnumerator elements for each enumerator. SmallVector Enumerators; ED = ED->getDefinition(); - for (EnumDecl::enumerator_iterator - Enum = ED->enumerator_begin(), EnumEnd = ED->enumerator_end(); - Enum != EnumEnd; ++Enum) { + for (const auto *Enum : ED->enumerators()) { Enumerators.push_back( DBuilder.createEnumerator(Enum->getName(), Enum->getInitVal().getSExtValue())); diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp index 570ff9ccfb..4881e28e9b 100644 --- a/lib/Frontend/ASTUnit.cpp +++ b/lib/Frontend/ASTUnit.cpp @@ -817,10 +817,9 @@ void AddTopLevelDeclarationToHash(Decl *D, unsigned &Hash) { // For an unscoped enum include the enumerators in the hash since they // enter the top-level namespace. if (!EnumD->isScoped()) { - for (EnumDecl::enumerator_iterator EI = EnumD->enumerator_begin(), - EE = EnumD->enumerator_end(); EI != EE; ++EI) { - if ((*EI)->getIdentifier()) - Hash = llvm::HashString((*EI)->getIdentifier()->getName(), Hash); + for (const auto *EI : EnumD->enumerators()) { + if (EI->getIdentifier()) + Hash = llvm::HashString(EI->getIdentifier()->getName(), Hash); } } } diff --git a/lib/Rewrite/Frontend/RewriteModernObjC.cpp b/lib/Rewrite/Frontend/RewriteModernObjC.cpp index c9aa44733e..e0320ba3a2 100644 --- a/lib/Rewrite/Frontend/RewriteModernObjC.cpp +++ b/lib/Rewrite/Frontend/RewriteModernObjC.cpp @@ -3809,8 +3809,7 @@ bool RewriteModernObjC::RewriteObjCFieldDeclType(QualType &Type, } Result += " {\n"; - for (EnumDecl::enumerator_iterator EC = ED->enumerator_begin(), - ECEnd = ED->enumerator_end(); EC != ECEnd; ++EC) { + for (const auto *EC : ED->enumerators()) { Result += "\t"; Result += EC->getName(); Result += " = "; llvm::APSInt Val = EC->getInitVal(); Result += Val.toString(10); diff --git a/lib/Sema/SemaCodeComplete.cpp b/lib/Sema/SemaCodeComplete.cpp index 89310da648..4d237ee0e8 100644 --- a/lib/Sema/SemaCodeComplete.cpp +++ b/lib/Sema/SemaCodeComplete.cpp @@ -3795,13 +3795,11 @@ void Sema::CodeCompleteCase(Scope *S) { CodeCompleter->getCodeCompletionTUInfo(), CodeCompletionContext::CCC_Expression); Results.EnterNewScope(); - for (EnumDecl::enumerator_iterator E = Enum->enumerator_begin(), - EEnd = Enum->enumerator_end(); - E != EEnd; ++E) { - if (EnumeratorsSeen.count(*E)) + for (auto *E : Enum->enumerators()) { + if (EnumeratorsSeen.count(E)) continue; - CodeCompletionResult R(*E, CCP_EnumInCase, Qualifier); + CodeCompletionResult R(E, CCP_EnumInCase, Qualifier); Results.AddResult(R, CurContext, 0, false); } Results.ExitScope(); diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 40eb1d5271..38930bda1f 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -9630,10 +9630,9 @@ Decl *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, Decl *D) { // Similarly, dive into enums and fish their constants out, making them // accessible in this scope. - if (EnumDecl *ED = dyn_cast(D)) { - for (EnumDecl::enumerator_iterator EI = ED->enumerator_begin(), - EE = ED->enumerator_end(); EI != EE; ++EI) - PushOnScopeChains(*EI, FnBodyScope, /*AddToContext=*/false); + if (auto *ED = dyn_cast(D)) { + for (auto *EI : ED->enumerators()) + PushOnScopeChains(EI, FnBodyScope, /*AddToContext=*/false); } } } diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index 65ce405c55..5035b6cffd 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -1015,11 +1015,10 @@ Sema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, Stmt *Switch, // Gather all enum values, set their type and sort them, // allowing easier comparison with CaseVals. - for (EnumDecl::enumerator_iterator EDI = ED->enumerator_begin(); - EDI != ED->enumerator_end(); ++EDI) { + for (auto *EDI : ED->enumerators()) { llvm::APSInt Val = EDI->getInitVal(); AdjustAPSInt(Val, CondWidth, CondIsSigned); - EnumVals.push_back(std::make_pair(Val, *EDI)); + EnumVals.push_back(std::make_pair(Val, EDI)); } std::stable_sort(EnumVals.begin(), EnumVals.end(), CmpEnumVals); EnumValsTy::iterator EIend = @@ -1166,11 +1165,10 @@ Sema::DiagnoseAssignmentEnum(QualType DstType, QualType SrcType, // Gather all enum values, set their type and sort them, // allowing easier comparison with rhs constant. - for (EnumDecl::enumerator_iterator EDI = ED->enumerator_begin(); - EDI != ED->enumerator_end(); ++EDI) { + for (auto *EDI : ED->enumerators()) { llvm::APSInt Val = EDI->getInitVal(); AdjustAPSInt(Val, DstWidth, DstIsSigned); - EnumVals.push_back(std::make_pair(Val, *EDI)); + EnumVals.push_back(std::make_pair(Val, EDI)); } if (EnumVals.empty()) return; diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index 259c0030d0..93041a8cc9 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -733,9 +733,7 @@ void TemplateDeclInstantiator::InstantiateEnumDefinition( SmallVector Enumerators; EnumConstantDecl *LastEnumConst = 0; - for (EnumDecl::enumerator_iterator EC = Pattern->enumerator_begin(), - ECEnd = Pattern->enumerator_end(); - EC != ECEnd; ++EC) { + for (auto *EC : Pattern->enumerators()) { // The specified value for the enumerator. ExprResult Value = SemaRef.Owned((Expr *)0); if (Expr *UninstValue = EC->getInitExpr()) { @@ -765,7 +763,7 @@ void TemplateDeclInstantiator::InstantiateEnumDefinition( } if (EnumConst) { - SemaRef.InstantiateAttrs(TemplateArgs, *EC, EnumConst); + SemaRef.InstantiateAttrs(TemplateArgs, EC, EnumConst); EnumConst->setAccess(Enum->getAccess()); Enum->addDecl(EnumConst); @@ -776,7 +774,7 @@ void TemplateDeclInstantiator::InstantiateEnumDefinition( !Enum->isScoped()) { // If the enumeration is within a function or method, record the enum // constant as a local. - SemaRef.CurrentInstantiationScope->InstantiatedLocal(*EC, EnumConst); + SemaRef.CurrentInstantiationScope->InstantiatedLocal(EC, EnumConst); } } } -- 2.40.0