From 39c2bc7a3d1b7d9a1e56d631b0b493b5bdb7a6f2 Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Thu, 13 Mar 2014 16:36:16 +0000 Subject: [PATCH] [C++11] Replacing CXXRecordDecl iterators method_begin() and method_end() with iterator_range methods(). Updating all of the usages of the iterators with range-based for loops. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203812 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DeclCXX.h | 6 +++++ lib/ARCMigrate/TransGCAttrs.cpp | 3 +-- lib/AST/CXXInheritance.cpp | 5 +---- lib/AST/RecordLayoutBuilder.cpp | 13 ++++------- lib/AST/VTableBuilder.cpp | 27 +++++----------------- lib/Sema/SemaDeclCXX.cpp | 40 +++++++++++++-------------------- 6 files changed, 34 insertions(+), 60 deletions(-) diff --git a/include/clang/AST/DeclCXX.h b/include/clang/AST/DeclCXX.h index 5783a469e2..994f5a4556 100644 --- a/include/clang/AST/DeclCXX.h +++ b/include/clang/AST/DeclCXX.h @@ -711,6 +711,12 @@ public: /// all method members of the class, including non-instance methods, /// special methods, etc. typedef specific_decl_iterator method_iterator; + typedef llvm::iterator_range> + method_range; + + method_range methods() const { + return method_range(method_begin(), method_end()); + } /// \brief Method begin iterator. Iterates in the order the methods /// were declared. diff --git a/lib/ARCMigrate/TransGCAttrs.cpp b/lib/ARCMigrate/TransGCAttrs.cpp index 29b849074e..cbb3d12d74 100644 --- a/lib/ARCMigrate/TransGCAttrs.cpp +++ b/lib/ARCMigrate/TransGCAttrs.cpp @@ -134,8 +134,7 @@ public: return hasObjCImpl(ContD); if (CXXRecordDecl *RD = dyn_cast(D)) { - for (CXXRecordDecl::method_iterator - MI = RD->method_begin(), ME = RD->method_end(); MI != ME; ++MI) { + for (const auto *MI : RD->methods()) { if (MI->isOutOfLine()) return true; } diff --git a/lib/AST/CXXInheritance.cpp b/lib/AST/CXXInheritance.cpp index 0f277b134a..98bfb81f87 100644 --- a/lib/AST/CXXInheritance.cpp +++ b/lib/AST/CXXInheritance.cpp @@ -546,10 +546,7 @@ void FinalOverriderCollector::Collect(const CXXRecordDecl *RD, } } - for (CXXRecordDecl::method_iterator M = RD->method_begin(), - MEnd = RD->method_end(); - M != MEnd; - ++M) { + for (auto *M : RD->methods()) { // We only care about virtual methods. if (!M->isVirtual()) continue; diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index 5f71a6b638..cb5b109343 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -1967,10 +1967,7 @@ static const CXXMethodDecl *computeKeyFunction(ASTContext &Context, bool allowInlineFunctions = Context.getTargetInfo().getCXXABI().canKeyFunctionBeInline(); - for (CXXRecordDecl::method_iterator I = RD->method_begin(), - E = RD->method_end(); I != E; ++I) { - const CXXMethodDecl *MD = *I; - + for (const auto *MD : RD->methods()) { if (!MD->isVirtual()) continue; @@ -2777,11 +2774,9 @@ MicrosoftRecordLayoutBuilder::computeVtorDispSet(const CXXRecordDecl *RD) { if (RD->hasUserDeclaredConstructor() || RD->hasUserDeclaredDestructor()) { llvm::SmallPtrSet Work; // Seed the working set with our non-destructor virtual methods. - for (CXXRecordDecl::method_iterator i = RD->method_begin(), - e = RD->method_end(); - i != e; ++i) - if ((*i)->isVirtual() && !isa(*i)) - Work.insert(*i); + for (const auto *I : RD->methods()) + if (I->isVirtual() && !isa(I)) + Work.insert(I); while (!Work.empty()) { const CXXMethodDecl *MD = *Work.begin(); CXXMethodDecl::method_iterator i = MD->begin_overridden_methods(), diff --git a/lib/AST/VTableBuilder.cpp b/lib/AST/VTableBuilder.cpp index 4bf5ef598d..4ddb3c8c95 100644 --- a/lib/AST/VTableBuilder.cpp +++ b/lib/AST/VTableBuilder.cpp @@ -402,10 +402,7 @@ void FinalOverriders::dump(raw_ostream &Out, BaseSubobject Base, Out << Base.getBaseOffset().getQuantity() << ")\n"; // Now dump the overriders for this base subobject. - for (CXXRecordDecl::method_iterator I = RD->method_begin(), - E = RD->method_end(); I != E; ++I) { - const CXXMethodDecl *MD = *I; - + for (const auto *MD : RD->methods()) { if (!MD->isVirtual()) continue; @@ -689,10 +686,7 @@ void VCallAndVBaseOffsetBuilder::AddVCallOffsets(BaseSubobject Base, } // Add the vcall offsets. - for (CXXRecordDecl::method_iterator I = RD->method_begin(), - E = RD->method_end(); I != E; ++I) { - const CXXMethodDecl *MD = *I; - + for (const auto *MD : RD->methods()) { if (!MD->isVirtual()) continue; @@ -1511,10 +1505,7 @@ void ItaniumVTableBuilder::AddMethods( NewVirtualFunctionsTy NewVirtualFunctions; // Now go through all virtual member functions and add them. - for (CXXRecordDecl::method_iterator I = RD->method_begin(), - E = RD->method_end(); I != E; ++I) { - const CXXMethodDecl *MD = *I; - + for (const auto *MD : RD->methods()) { if (!MD->isVirtual()) continue; @@ -2194,10 +2185,7 @@ void ItaniumVTableBuilder::dumpLayout(raw_ostream &Out) { // Store them in a map keyed by the index so we'll get a sorted table. std::map IndicesMap; - for (CXXRecordDecl::method_iterator i = MostDerivedClass->method_begin(), - e = MostDerivedClass->method_end(); i != e; ++i) { - const CXXMethodDecl *MD = *i; - + for (const auto *MD : MostDerivedClass->methods()) { // We only want virtual member functions. if (!MD->isVirtual()) continue; @@ -2772,17 +2760,14 @@ static void GroupNewVirtualOverloads( SmallVector Groups; typedef llvm::DenseMap VisitedGroupIndicesTy; VisitedGroupIndicesTy VisitedGroupIndices; - for (CXXRecordDecl::method_iterator I = RD->method_begin(), - E = RD->method_end(); I != E; ++I) { - const CXXMethodDecl *MD = *I; - + for (const auto *MD : RD->methods()) { VisitedGroupIndicesTy::iterator J; bool Inserted; std::tie(J, Inserted) = VisitedGroupIndices.insert( std::make_pair(MD->getDeclName(), Groups.size())); if (Inserted) Groups.push_back(MethodGroup()); - if (I->isVirtual()) + if (MD->isVirtual()) Groups[J->second].push_back(MD); } diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 6c7af8b79c..5b85d1d235 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -4423,27 +4423,25 @@ void Sema::CheckCompletedCXXClass(CXXRecordDecl *Record) { } if (!Record->isDependentType()) { - for (CXXRecordDecl::method_iterator M = Record->method_begin(), - MEnd = Record->method_end(); - M != MEnd; ++M) { + for (auto *M : Record->methods()) { // See if a method overloads virtual methods in a base // class without overriding any. if (!M->isStatic()) - DiagnoseHiddenVirtualMethods(*M); + DiagnoseHiddenVirtualMethods(M); // Check whether the explicitly-defaulted special members are valid. if (!M->isInvalidDecl() && M->isExplicitlyDefaulted()) - CheckExplicitlyDefaultedSpecialMember(*M); + CheckExplicitlyDefaultedSpecialMember(M); // For an explicitly defaulted or deleted special member, we defer // determining triviality until the class is complete. That time is now! if (!M->isImplicit() && !M->isUserProvided()) { - CXXSpecialMember CSM = getSpecialMember(*M); + CXXSpecialMember CSM = getSpecialMember(M); if (CSM != CXXInvalid) { - M->setTrivial(SpecialMemberIsTrivial(*M, CSM)); + M->setTrivial(SpecialMemberIsTrivial(M, CSM)); // Inform the class that we've finished declaring this member. - Record->finishedDefaultedOrDeletedMember(*M); + Record->finishedDefaultedOrDeletedMember(M); } } } @@ -4462,10 +4460,8 @@ void Sema::CheckCompletedCXXClass(CXXRecordDecl *Record) { // destructor for the class is trivial. if (LangOpts.CPlusPlus11 && !Record->isDependentType() && !Record->isLiteral() && !Record->getNumVBases()) { - for (CXXRecordDecl::method_iterator M = Record->method_begin(), - MEnd = Record->method_end(); - M != MEnd; ++M) { - if (M->isConstexpr() && M->isInstance() && !isa(*M)) { + for (const auto *M : Record->methods()) { + if (M->isConstexpr() && M->isInstance() && !isa(M)) { switch (Record->getTemplateSpecializationKind()) { case TSK_ImplicitInstantiation: case TSK_ExplicitInstantiationDeclaration: @@ -5301,10 +5297,9 @@ bool Sema::ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMember CSM, if (!Diagnose) return true; // Find any user-declared move assignment operator. - for (CXXRecordDecl::method_iterator I = RD->method_begin(), - E = RD->method_end(); I != E; ++I) { + for (auto *I : RD->methods()) { if (I->isMoveAssignmentOperator()) { - UserDeclaredMove = *I; + UserDeclaredMove = I; break; } } @@ -5752,8 +5747,7 @@ bool Sema::SpecialMemberIsTrivial(CXXMethodDecl *MD, CXXSpecialMember CSM, } // Must have a virtual method. - for (CXXRecordDecl::method_iterator MI = RD->method_begin(), - ME = RD->method_end(); MI != ME; ++MI) { + for (const auto *MI : RD->methods()) { if (MI->isVirtual()) { SourceLocation MLoc = MI->getLocStart(); Diag(MLoc, diag::note_nontrivial_has_virtual) << RD << 0; @@ -9308,10 +9302,9 @@ static void diagnoseDeprecatedCopyOperation(Sema &S, CXXMethodDecl *CopyOp, RD->hasUserDeclaredCopyAssignment() && !S.getLangOpts().MSVCCompat) { // Find any user-declared move assignment operator. - for (CXXRecordDecl::method_iterator I = RD->method_begin(), - E = RD->method_end(); I != E; ++I) { + for (auto *I : RD->methods()) { if (I->isCopyAssignmentOperator()) { - UserDeclaredOperation = *I; + UserDeclaredOperation = I; break; } } @@ -12346,10 +12339,9 @@ bool Sema::DefineUsedVTables() { void Sema::MarkVirtualMemberExceptionSpecsNeeded(SourceLocation Loc, const CXXRecordDecl *RD) { - for (CXXRecordDecl::method_iterator I = RD->method_begin(), - E = RD->method_end(); I != E; ++I) - if ((*I)->isVirtual() && !(*I)->isPure()) - ResolveExceptionSpec(Loc, (*I)->getType()->castAs()); + for (const auto *I : RD->methods()) + if (I->isVirtual() && !I->isPure()) + ResolveExceptionSpec(Loc, I->getType()->castAs()); } void Sema::MarkVirtualMembersReferenced(SourceLocation Loc, -- 2.40.0