From 7191c6b0611c04ea2c872b52f1a16e5d819504f1 Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Thu, 13 Mar 2014 15:41:46 +0000 Subject: [PATCH] [C++11] Replacing CXXRecordDecl iterators bases_begin() and bases_end() with iterator_range bases(). Updating all of the usages of the iterators with range-based for loops. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203803 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DataRecursiveASTVisitor.h | 6 +- include/clang/AST/DeclCXX.h | 11 + include/clang/AST/RecursiveASTVisitor.h | 6 +- lib/AST/ASTContext.cpp | 15 +- lib/AST/ASTDumper.cpp | 12 +- lib/AST/ASTImporter.cpp | 24 +-- lib/AST/CXXInheritance.cpp | 53 +++-- lib/AST/DeclCXX.cpp | 33 ++- lib/AST/InheritViz.cpp | 13 +- lib/AST/RecordLayoutBuilder.cpp | 120 +++++------ lib/AST/VTTBuilder.cpp | 22 +- lib/AST/VTableBuilder.cpp | 62 +++--- lib/ASTMatchers/ASTMatchFinder.cpp | 6 +- lib/Analysis/CFG.cpp | 9 +- lib/CodeGen/CGCXX.cpp | 7 +- lib/CodeGen/CGClass.cpp | 22 +- lib/CodeGen/CGDebugInfo.cpp | 11 +- lib/CodeGen/CGExprConstant.cpp | 16 +- lib/CodeGen/CGRTTI.cpp | 25 +-- lib/CodeGen/CGRecordLayoutBuilder.cpp | 14 +- lib/CodeGen/CodeGenTypes.cpp | 12 +- lib/CodeGen/MicrosoftCXXABI.cpp | 5 +- lib/CodeGen/TargetInfo.cpp | 40 ++-- lib/Sema/SemaAccess.cpp | 14 +- lib/Sema/SemaCodeComplete.cpp | 10 +- lib/Sema/SemaDecl.cpp | 5 +- lib/Sema/SemaDeclCXX.cpp | 188 +++++++----------- lib/Sema/SemaExprMember.cpp | 6 +- lib/Sema/SemaInit.cpp | 6 +- lib/Sema/SemaLookup.cpp | 12 +- lib/Sema/SemaTemplateDeduction.cpp | 8 +- lib/Sema/SemaTemplateInstantiate.cpp | 44 ++-- lib/Sema/SemaType.cpp | 9 +- .../Checkers/LLVMConventionsChecker.cpp | 4 +- lib/StaticAnalyzer/Core/MemRegion.cpp | 12 +- tools/libclang/CIndex.cpp | 5 +- tools/libclang/IndexingContext.cpp | 4 +- 37 files changed, 361 insertions(+), 510 deletions(-) diff --git a/include/clang/AST/DataRecursiveASTVisitor.h b/include/clang/AST/DataRecursiveASTVisitor.h index ce3f3f66ab..0d249d126b 100644 --- a/include/clang/AST/DataRecursiveASTVisitor.h +++ b/include/clang/AST/DataRecursiveASTVisitor.h @@ -1627,10 +1627,8 @@ bool DataRecursiveASTVisitor::TraverseCXXRecordHelper( if (!TraverseRecordHelper(D)) return false; if (D->isCompleteDefinition()) { - for (CXXRecordDecl::base_class_iterator I = D->bases_begin(), - E = D->bases_end(); - I != E; ++I) { - TRY_TO(TraverseTypeLoc(I->getTypeSourceInfo()->getTypeLoc())); + for (const auto &I : D->bases()) { + TRY_TO(TraverseTypeLoc(I.getTypeSourceInfo()->getTypeLoc())); } // We don't traverse the friends or the conversions, as they are // already in decls_begin()/decls_end(). diff --git a/include/clang/AST/DeclCXX.h b/include/clang/AST/DeclCXX.h index 6971d17042..31e0b3051e 100644 --- a/include/clang/AST/DeclCXX.h +++ b/include/clang/AST/DeclCXX.h @@ -678,6 +678,17 @@ public: /// \brief Retrieves the number of base classes of this class. unsigned getNumBases() const { return data().NumBases; } + typedef llvm::iterator_range base_class_range; + typedef llvm::iterator_range + base_class_const_range; + + base_class_range bases() { + return base_class_range(bases_begin(), bases_end()); + } + base_class_const_range bases() const { + return base_class_const_range(bases_begin(), bases_end()); + } + base_class_iterator bases_begin() { return data().getBases(); } base_class_const_iterator bases_begin() const { return data().getBases(); } base_class_iterator bases_end() { return bases_begin() + data().NumBases; } diff --git a/include/clang/AST/RecursiveASTVisitor.h b/include/clang/AST/RecursiveASTVisitor.h index 64191188e4..e370db92c2 100644 --- a/include/clang/AST/RecursiveASTVisitor.h +++ b/include/clang/AST/RecursiveASTVisitor.h @@ -1660,10 +1660,8 @@ bool RecursiveASTVisitor::TraverseCXXRecordHelper( if (!TraverseRecordHelper(D)) return false; if (D->isCompleteDefinition()) { - for (CXXRecordDecl::base_class_iterator I = D->bases_begin(), - E = D->bases_end(); - I != E; ++I) { - TRY_TO(TraverseTypeLoc(I->getTypeSourceInfo()->getTypeLoc())); + for (const auto &I : D->bases()) { + TRY_TO(TraverseTypeLoc(I.getTypeSourceInfo()->getTypeLoc())); } // We don't traverse the friends or the conversions, as they are // already in decls_begin()/decls_end(). diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 12c7331a99..f6e1ef9d38 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -481,11 +481,10 @@ comments::FullComment *ASTContext::getCommentForDecl( if (!(RD = RD->getDefinition())) return NULL; // Check non-virtual bases. - for (CXXRecordDecl::base_class_const_iterator I = - RD->bases_begin(), E = RD->bases_end(); I != E; ++I) { - if (I->isVirtual() || (I->getAccessSpecifier() != AS_public)) + for (const auto &I : RD->bases()) { + if (I.isVirtual() || (I.getAccessSpecifier() != AS_public)) continue; - QualType Ty = I->getType(); + QualType Ty = I.getType(); if (Ty.isNull()) continue; if (const CXXRecordDecl *NonVirtualBase = Ty->getAsCXXRecordDecl()) { @@ -5596,11 +5595,9 @@ void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl, const ASTRecordLayout &layout = getASTRecordLayout(RDecl); if (CXXRec) { - for (CXXRecordDecl::base_class_iterator - BI = CXXRec->bases_begin(), - BE = CXXRec->bases_end(); BI != BE; ++BI) { - if (!BI->isVirtual()) { - CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl(); + for (const auto &BI : CXXRec->bases()) { + if (!BI.isVirtual()) { + CXXRecordDecl *base = BI.getType()->getAsCXXRecordDecl(); if (base->isEmpty()) continue; uint64_t offs = toBits(layout.getBaseClassOffset(base)); diff --git a/lib/AST/ASTDumper.cpp b/lib/AST/ASTDumper.cpp index 590f38f20f..455972d923 100644 --- a/lib/AST/ASTDumper.cpp +++ b/lib/AST/ASTDumper.cpp @@ -1030,15 +1030,13 @@ void ASTDumper::VisitCXXRecordDecl(const CXXRecordDecl *D) { if (!D->isCompleteDefinition()) return; - for (CXXRecordDecl::base_class_const_iterator I = D->bases_begin(), - E = D->bases_end(); - I != E; ++I) { + for (const auto &I : D->bases()) { IndentScope Indent(*this); - if (I->isVirtual()) + if (I.isVirtual()) OS << "virtual "; - dumpAccessSpecifier(I->getAccessSpecifier()); - dumpType(I->getType()); - if (I->isPackExpansion()) + dumpAccessSpecifier(I.getAccessSpecifier()); + dumpType(I.getType()); + if (I.isPackExpansion()) OS << "..."; } } diff --git a/lib/AST/ASTImporter.cpp b/lib/AST/ASTImporter.cpp index 9f3387664c..4beaaea0a4 100644 --- a/lib/AST/ASTImporter.cpp +++ b/lib/AST/ASTImporter.cpp @@ -1981,29 +1981,25 @@ bool ASTNodeImporter::ImportDefinition(RecordDecl *From, RecordDecl *To, ToData.IsLambda = FromData.IsLambda; SmallVector Bases; - for (CXXRecordDecl::base_class_iterator - Base1 = FromCXX->bases_begin(), - FromBaseEnd = FromCXX->bases_end(); - Base1 != FromBaseEnd; - ++Base1) { - QualType T = Importer.Import(Base1->getType()); + for (const auto &Base1 : FromCXX->bases()) { + QualType T = Importer.Import(Base1.getType()); if (T.isNull()) return true; SourceLocation EllipsisLoc; - if (Base1->isPackExpansion()) - EllipsisLoc = Importer.Import(Base1->getEllipsisLoc()); + if (Base1.isPackExpansion()) + EllipsisLoc = Importer.Import(Base1.getEllipsisLoc()); // Ensure that we have a definition for the base. - ImportDefinitionIfNeeded(Base1->getType()->getAsCXXRecordDecl()); + ImportDefinitionIfNeeded(Base1.getType()->getAsCXXRecordDecl()); Bases.push_back( new (Importer.getToContext()) - CXXBaseSpecifier(Importer.Import(Base1->getSourceRange()), - Base1->isVirtual(), - Base1->isBaseOfClass(), - Base1->getAccessSpecifierAsWritten(), - Importer.Import(Base1->getTypeSourceInfo()), + CXXBaseSpecifier(Importer.Import(Base1.getSourceRange()), + Base1.isVirtual(), + Base1.isBaseOfClass(), + Base1.getAccessSpecifierAsWritten(), + Importer.Import(Base1.getTypeSourceInfo()), EllipsisLoc)); } if (!Bases.empty()) diff --git a/lib/AST/CXXInheritance.cpp b/lib/AST/CXXInheritance.cpp index b51014b742..0f277b134a 100644 --- a/lib/AST/CXXInheritance.cpp +++ b/lib/AST/CXXInheritance.cpp @@ -141,9 +141,8 @@ bool CXXRecordDecl::forallBases(ForallBasesCallback *BaseMatches, const CXXRecordDecl *Record = this; bool AllMatches = true; while (true) { - for (CXXRecordDecl::base_class_const_iterator - I = Record->bases_begin(), E = Record->bases_end(); I != E; ++I) { - const RecordType *Ty = I->getType()->getAs(); + for (const auto &I : Record->bases()) { + const RecordType *Ty = I.getType()->getAs(); if (!Ty) { if (AllowShortCircuit) return false; AllMatches = false; @@ -186,14 +185,11 @@ bool CXXBasePaths::lookupInBases(ASTContext &Context, AccessSpecifier AccessToHere = ScratchPath.Access; bool IsFirstStep = ScratchPath.empty(); - for (CXXRecordDecl::base_class_const_iterator BaseSpec = Record->bases_begin(), - BaseSpecEnd = Record->bases_end(); - BaseSpec != BaseSpecEnd; - ++BaseSpec) { + for (const auto &BaseSpec : Record->bases()) { // Find the record of the base class subobjects for this type. - QualType BaseType = Context.getCanonicalType(BaseSpec->getType()) - .getUnqualifiedType(); - + QualType BaseType = + Context.getCanonicalType(BaseSpec.getType()).getUnqualifiedType(); + // C++ [temp.dep]p3: // In the definition of a class template or a member of a class template, // if a base class of the class template depends on a template-parameter, @@ -208,7 +204,7 @@ bool CXXBasePaths::lookupInBases(ASTContext &Context, std::pair& Subobjects = ClassSubobjects[BaseType]; bool VisitBase = true; bool SetVirtual = false; - if (BaseSpec->isVirtual()) { + if (BaseSpec.isVirtual()) { VisitBase = !Subobjects.first; Subobjects.first = true; if (isDetectingVirtual() && DetectedVirtual == 0) { @@ -223,9 +219,9 @@ bool CXXBasePaths::lookupInBases(ASTContext &Context, if (isRecordingPaths()) { // Add this base specifier to the current path. CXXBasePathElement Element; - Element.Base = &*BaseSpec; + Element.Base = &BaseSpec; Element.Class = Record; - if (BaseSpec->isVirtual()) + if (BaseSpec.isVirtual()) Element.SubobjectNumber = 0; else Element.SubobjectNumber = Subobjects.second; @@ -247,16 +243,16 @@ bool CXXBasePaths::lookupInBases(ASTContext &Context, // 3. Otherwise, overall access is determined by the most restrictive // access in the sequence. if (IsFirstStep) - ScratchPath.Access = BaseSpec->getAccessSpecifier(); + ScratchPath.Access = BaseSpec.getAccessSpecifier(); else ScratchPath.Access = CXXRecordDecl::MergeAccess(AccessToHere, - BaseSpec->getAccessSpecifier()); + BaseSpec.getAccessSpecifier()); } // Track whether there's a path involving this specific base. bool FoundPathThroughBase = false; - if (BaseMatches(BaseSpec, ScratchPath, UserData)) { + if (BaseMatches(&BaseSpec, ScratchPath, UserData)) { // We've found a path that terminates at this base. FoundPath = FoundPathThroughBase = true; if (isRecordingPaths()) { @@ -269,7 +265,7 @@ bool CXXBasePaths::lookupInBases(ASTContext &Context, } } else if (VisitBase) { CXXRecordDecl *BaseRecord - = cast(BaseSpec->getType()->castAs() + = cast(BaseSpec.getType()->castAs() ->getDecl()); if (lookupInBases(Context, BaseRecord, BaseMatches, UserData)) { // C++ [class.member.lookup]p2: @@ -501,14 +497,13 @@ void FinalOverriderCollector::Collect(const CXXRecordDecl *RD, SubobjectNumber = ++SubobjectCount[cast(RD->getCanonicalDecl())]; - for (CXXRecordDecl::base_class_const_iterator Base = RD->bases_begin(), - BaseEnd = RD->bases_end(); Base != BaseEnd; ++Base) { - if (const RecordType *RT = Base->getType()->getAs()) { + for (const auto &Base : RD->bases()) { + if (const RecordType *RT = Base.getType()->getAs()) { const CXXRecordDecl *BaseDecl = cast(RT->getDecl()); if (!BaseDecl->isPolymorphic()) continue; - if (Overriders.empty() && !Base->isVirtual()) { + if (Overriders.empty() && !Base.isVirtual()) { // There are no other overriders of virtual member functions, // so let the base class fill in our overriders for us. Collect(BaseDecl, false, InVirtualSubobject, Overriders); @@ -522,7 +517,7 @@ void FinalOverriderCollector::Collect(const CXXRecordDecl *RD, // its base classes) more than once. CXXFinalOverriderMap ComputedBaseOverriders; CXXFinalOverriderMap *BaseOverriders = &ComputedBaseOverriders; - if (Base->isVirtual()) { + if (Base.isVirtual()) { CXXFinalOverriderMap *&MyVirtualOverriders = VirtualOverriders[BaseDecl]; BaseOverriders = MyVirtualOverriders; if (!MyVirtualOverriders) { @@ -702,13 +697,12 @@ AddIndirectPrimaryBases(const CXXRecordDecl *RD, ASTContext &Context, if (Layout.isPrimaryBaseVirtual()) Bases.insert(Layout.getPrimaryBase()); - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - assert(!I->getType()->isDependentType() && + for (const auto &I : RD->bases()) { + assert(!I.getType()->isDependentType() && "Cannot get indirect primary bases for class with dependent bases."); const CXXRecordDecl *BaseDecl = - cast(I->getType()->castAs()->getDecl()); + cast(I.getType()->castAs()->getDecl()); // Only bases with virtual bases participate in computing the // indirect primary virtual base classes. @@ -725,13 +719,12 @@ CXXRecordDecl::getIndirectPrimaryBases(CXXIndirectPrimaryBaseSet& Bases) const { if (!getNumVBases()) return; - for (CXXRecordDecl::base_class_const_iterator I = bases_begin(), - E = bases_end(); I != E; ++I) { - assert(!I->getType()->isDependentType() && + for (const auto &I : bases()) { + assert(!I.getType()->isDependentType() && "Cannot get indirect primary bases for class with dependent bases."); const CXXRecordDecl *BaseDecl = - cast(I->getType()->castAs()->getDecl()); + cast(I.getType()->castAs()->getDecl()); // Only bases with virtual bases participate in computing the // indirect primary virtual base classes. diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp index f344e8cc03..30558aea5d 100644 --- a/lib/AST/DeclCXX.cpp +++ b/lib/AST/DeclCXX.cpp @@ -819,10 +819,8 @@ void CXXRecordDecl::addedMember(Decl *D) { // data member must come through here with Empty still true, and Empty // will subsequently be set to false below. if (data().IsStandardLayout && data().Empty) { - for (CXXRecordDecl::base_class_const_iterator BI = bases_begin(), - BE = bases_end(); - BI != BE; ++BI) { - if (Context.hasSameUnqualifiedType(BI->getType(), T)) { + for (const auto &BI : bases()) { + if (Context.hasSameUnqualifiedType(BI.getType(), T)) { data().IsStandardLayout = false; break; } @@ -1095,14 +1093,13 @@ static void CollectVisibleConversions(ASTContext &Context, } // Collect information recursively from any base classes. - for (CXXRecordDecl::base_class_iterator - I = Record->bases_begin(), E = Record->bases_end(); I != E; ++I) { - const RecordType *RT = I->getType()->getAs(); + for (const auto &I : Record->bases()) { + const RecordType *RT = I.getType()->getAs(); if (!RT) continue; AccessSpecifier BaseAccess - = CXXRecordDecl::MergeAccess(Access, I->getAccessSpecifier()); - bool BaseInVirtual = InVirtual || I->isVirtual(); + = CXXRecordDecl::MergeAccess(Access, I.getAccessSpecifier()); + bool BaseInVirtual = InVirtual || I.isVirtual(); CXXRecordDecl *Base = cast(RT->getDecl()); CollectVisibleConversions(Context, Base, BaseInVirtual, BaseAccess, @@ -1138,13 +1135,12 @@ static void CollectVisibleConversions(ASTContext &Context, HiddenTypes.insert(GetConversionType(Context, ConvI.getDecl())); // Recursively collect conversions from base classes. - for (CXXRecordDecl::base_class_iterator - I = Record->bases_begin(), E = Record->bases_end(); I != E; ++I) { - const RecordType *RT = I->getType()->getAs(); + for (const auto &I : Record->bases()) { + const RecordType *RT = I.getType()->getAs(); if (!RT) continue; CollectVisibleConversions(Context, cast(RT->getDecl()), - I->isVirtual(), I->getAccessSpecifier(), + I.isVirtual(), I.getAccessSpecifier(), HiddenTypes, Output, VBaseCs, HiddenVBaseCs); } @@ -1325,11 +1321,9 @@ bool CXXRecordDecl::mayBeAbstract() const { isDependentContext()) return false; - for (CXXRecordDecl::base_class_const_iterator B = bases_begin(), - BEnd = bases_end(); - B != BEnd; ++B) { + for (const auto &B : bases()) { CXXRecordDecl *BaseDecl - = cast(B->getType()->getAs()->getDecl()); + = cast(B.getType()->getAs()->getDecl()); if (BaseDecl->isAbstract()) return true; } @@ -1391,9 +1385,8 @@ CXXMethodDecl::getCorrespondingMethodInClass(const CXXRecordDecl *RD, return MD; } - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - const RecordType *RT = I->getType()->getAs(); + for (const auto &I : RD->bases()) { + const RecordType *RT = I.getType()->getAs(); if (!RT) continue; const CXXRecordDecl *Base = cast(RT->getDecl()); diff --git a/lib/AST/InheritViz.cpp b/lib/AST/InheritViz.cpp index 3d64310dc5..84cc167458 100644 --- a/lib/AST/InheritViz.cpp +++ b/lib/AST/InheritViz.cpp @@ -93,26 +93,25 @@ void InheritanceHierarchyWriter::WriteNode(QualType Type, bool FromVirtual) { // Display the base classes. const CXXRecordDecl *Decl = static_cast(Type->getAs()->getDecl()); - for (CXXRecordDecl::base_class_const_iterator Base = Decl->bases_begin(); - Base != Decl->bases_end(); ++Base) { - QualType CanonBaseType = Context.getCanonicalType(Base->getType()); + for (const auto &Base : Decl->bases()) { + QualType CanonBaseType = Context.getCanonicalType(Base.getType()); // If this is not virtual inheritance, bump the direct base // count for the type. - if (!Base->isVirtual()) + if (!Base.isVirtual()) ++DirectBaseCount[CanonBaseType]; // Write out the node (if we need to). - WriteNode(Base->getType(), Base->isVirtual()); + WriteNode(Base.getType(), Base.isVirtual()); // Write out the edge. Out << " "; WriteNodeReference(Type, FromVirtual); Out << " -> "; - WriteNodeReference(Base->getType(), Base->isVirtual()); + WriteNodeReference(Base.getType(), Base.isVirtual()); // Write out edge attributes to show the kind of inheritance. - if (Base->isVirtual()) { + if (Base.isVirtual()) { Out << " [ style=\"dashed\" ]"; } Out << ";"; diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index fa208acf4e..457a40a8f0 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -140,10 +140,9 @@ public: void EmptySubobjectMap::ComputeEmptySubobjectSizes() { // Check the bases. - for (CXXRecordDecl::base_class_const_iterator I = Class->bases_begin(), - E = Class->bases_end(); I != E; ++I) { + for (const auto &I : Class->bases()) { const CXXRecordDecl *BaseDecl = - cast(I->getType()->getAs()->getDecl()); + cast(I.getType()->getAs()->getDecl()); CharUnits EmptySize; const ASTRecordLayout &Layout = Context.getASTRecordLayout(BaseDecl); @@ -346,13 +345,12 @@ EmptySubobjectMap::CanPlaceFieldSubobjectAtOffset(const CXXRecordDecl *RD, const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); // Traverse all non-virtual bases. - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - if (I->isVirtual()) + for (const auto &I : RD->bases()) { + if (I.isVirtual()) continue; const CXXRecordDecl *BaseDecl = - cast(I->getType()->getAs()->getDecl()); + cast(I.getType()->getAs()->getDecl()); CharUnits BaseOffset = Offset + Layout.getBaseClassOffset(BaseDecl); if (!CanPlaceFieldSubobjectAtOffset(BaseDecl, Class, BaseOffset)) @@ -458,13 +456,12 @@ void EmptySubobjectMap::UpdateEmptyFieldSubobjects(const CXXRecordDecl *RD, const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); // Traverse all non-virtual bases. - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - if (I->isVirtual()) + for (const auto &I : RD->bases()) { + if (I.isVirtual()) continue; const CXXRecordDecl *BaseDecl = - cast(I->getType()->getAs()->getDecl()); + cast(I.getType()->getAs()->getDecl()); CharUnits BaseOffset = Offset + Layout.getBaseClassOffset(BaseDecl); UpdateEmptyFieldSubobjects(BaseDecl, Class, BaseOffset); @@ -781,16 +778,15 @@ protected: void RecordLayoutBuilder::SelectPrimaryVBase(const CXXRecordDecl *RD) { - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - assert(!I->getType()->isDependentType() && + for (const auto &I : RD->bases()) { + assert(!I.getType()->isDependentType() && "Cannot layout class with dependent bases."); const CXXRecordDecl *Base = - cast(I->getType()->getAs()->getDecl()); + cast(I.getType()->getAs()->getDecl()); // Check if this is a nearly empty virtual base. - if (I->isVirtual() && Context.isNearlyEmpty(Base)) { + if (I.isVirtual() && Context.isNearlyEmpty(Base)) { // If it's not an indirect primary base, then we've found our primary // base. if (!IndirectPrimaryBases.count(Base)) { @@ -823,14 +819,13 @@ void RecordLayoutBuilder::DeterminePrimaryBase(const CXXRecordDecl *RD) { // If the record has a dynamic base class, attempt to choose a primary base // class. It is the first (in direct base class order) non-virtual dynamic // base class, if one exists. - for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(), - e = RD->bases_end(); i != e; ++i) { + for (const auto &I : RD->bases()) { // Ignore virtual bases. - if (i->isVirtual()) + if (I.isVirtual()) continue; const CXXRecordDecl *Base = - cast(i->getType()->getAs()->getDecl()); + cast(I.getType()->getAs()->getDecl()); if (Base->isDynamicClass()) { // We found it. @@ -916,12 +911,11 @@ RecordLayoutBuilder::ComputeBaseSubobjectInfo(const CXXRecordDecl *RD, } // Now go through all direct bases. - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - bool IsVirtual = I->isVirtual(); + for (const auto &I : RD->bases()) { + bool IsVirtual = I.isVirtual(); const CXXRecordDecl *BaseDecl = - cast(I->getType()->getAs()->getDecl()); + cast(I.getType()->getAs()->getDecl()); Info->Bases.push_back(ComputeBaseSubobjectInfo(BaseDecl, IsVirtual, Info)); } @@ -942,12 +936,11 @@ RecordLayoutBuilder::ComputeBaseSubobjectInfo(const CXXRecordDecl *RD, } void RecordLayoutBuilder::ComputeBaseSubobjectInfo(const CXXRecordDecl *RD) { - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - bool IsVirtual = I->isVirtual(); + for (const auto &I : RD->bases()) { + bool IsVirtual = I.isVirtual(); const CXXRecordDecl *BaseDecl = - cast(I->getType()->getAs()->getDecl()); + cast(I.getType()->getAs()->getDecl()); // Compute the base subobject info for this base. BaseSubobjectInfo *Info = ComputeBaseSubobjectInfo(BaseDecl, IsVirtual, 0); @@ -1031,14 +1024,13 @@ RecordLayoutBuilder::LayoutNonVirtualBases(const CXXRecordDecl *RD) { } // Now lay out the non-virtual bases. - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { + for (const auto &I : RD->bases()) { // Ignore virtual bases. - if (I->isVirtual()) + if (I.isVirtual()) continue; - const CXXRecordDecl *BaseDecl = I->getType()->getAsCXXRecordDecl(); + const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl(); // Skip the primary base, because we've already laid it out. The // !PrimaryBaseIsVirtual check is required because we might have a @@ -1115,14 +1107,13 @@ RecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *RD, PrimaryBaseIsVirtual = Layout.isPrimaryBaseVirtual(); } - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - assert(!I->getType()->isDependentType() && + for (const auto &I : RD->bases()) { + assert(!I.getType()->isDependentType() && "Cannot layout class with dependent bases."); - const CXXRecordDecl *BaseDecl = I->getType()->getAsCXXRecordDecl(); + const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl(); - if (I->isVirtual()) { + if (I.isVirtual()) { if (PrimaryBase != BaseDecl || !PrimaryBaseIsVirtual) { bool IndirectPrimaryBase = IndirectPrimaryBases.count(BaseDecl); @@ -1322,13 +1313,12 @@ void RecordLayoutBuilder::Layout(const CXXRecordDecl *RD) { #ifndef NDEBUG // Check that we have base offsets for all bases. - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - if (I->isVirtual()) + for (const auto &I : RD->bases()) { + if (I.isVirtual()) continue; const CXXRecordDecl *BaseDecl = - cast(I->getType()->getAs()->getDecl()); + cast(I.getType()->getAs()->getDecl()); assert(Bases.count(BaseDecl) && "Did not find base offset!"); } @@ -2378,13 +2368,11 @@ MicrosoftRecordLayoutBuilder::layoutNonVirtualBases(const CXXRecordDecl *RD) { // zero sized members. const ASTRecordLayout* PreviousBaseLayout = 0; // Iterate through the bases and lay out the non-virtual ones. - for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(), - e = RD->bases_end(); - i != e; ++i) { - const CXXRecordDecl *BaseDecl = i->getType()->getAsCXXRecordDecl(); + for (const auto &I : RD->bases()) { + const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl(); const ASTRecordLayout &BaseLayout = Context.getASTRecordLayout(BaseDecl); // Mark and skip virtual bases. - if (i->isVirtual()) { + if (I.isVirtual()) { HasVBPtr = true; continue; } @@ -2417,12 +2405,10 @@ MicrosoftRecordLayoutBuilder::layoutNonVirtualBases(const CXXRecordDecl *RD) { // itself lead with a zero-sized object, something we track. bool CheckLeadingLayout = !PrimaryBase; // Iterate through the bases and lay out the non-virtual ones. - for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(), - e = RD->bases_end(); - i != e; ++i) { - if (i->isVirtual()) + for (const auto &I : RD->bases()) { + if (I.isVirtual()) continue; - const CXXRecordDecl *BaseDecl = i->getType()->getAsCXXRecordDecl(); + const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl(); const ASTRecordLayout &BaseLayout = Context.getASTRecordLayout(BaseDecl); // Only lay out bases without extendable VFPtrs on the second pass. if (BaseLayout.hasExtendableVFPtr()) @@ -2617,12 +2603,10 @@ void MicrosoftRecordLayoutBuilder::injectVPtrs(const CXXRecordDecl *RD) { const CXXRecordDecl *PenultBaseDecl = 0; const CXXRecordDecl *LastBaseDecl = 0; // Iterate through the bases and find the last two non-virtual bases. - for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(), - e = RD->bases_end(); - i != e; ++i) { - if (i->isVirtual()) + for (const auto &I : RD->bases()) { + if (I.isVirtual()) continue; - const CXXRecordDecl *BaseDecl = i->getType()->getAsCXXRecordDecl(); + const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl(); if (!LastBaseDecl || Bases[BaseDecl] > Bases[LastBaseDecl]) { PenultBaseDecl = LastBaseDecl; LastBaseDecl = BaseDecl; @@ -2743,13 +2727,11 @@ RequiresVtordisp(const llvm::SmallPtrSet &HasVtordisp, return true; // If any of a virtual bases non-virtual bases (recursively) requires a // vtordisp than so does this virtual base. - for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(), - e = RD->bases_end(); - i != e; ++i) - if (!i->isVirtual() && + for (const auto &I : RD->bases()) + if (!I.isVirtual() && RequiresVtordisp( HasVtordisp, - cast(i->getType()->getAs()->getDecl()))) + cast(I.getType()->getAs()->getDecl()))) return true; return false; } @@ -2783,11 +2765,9 @@ MicrosoftRecordLayoutBuilder::computeVtorDispSet(const CXXRecordDecl *RD) { // If any of our bases need a vtordisp for this type, so do we. Check our // direct bases for vtordisp requirements. - for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(), - e = RD->bases_end(); - i != e; ++i) { + for (const auto &I : RD->bases()) { const CXXRecordDecl *BaseDecl = - cast(i->getType()->getAs()->getDecl()); + cast(I.getType()->getAs()->getDecl()); const ASTRecordLayout &Layout = Context.getASTRecordLayout(BaseDecl); for (ASTRecordLayout::VBaseOffsetsMapTy::const_iterator bi = Layout.getVBaseOffsetsMap().begin(), @@ -3097,13 +3077,11 @@ static void DumpCXXRecordLayout(raw_ostream &OS, // Collect nvbases. SmallVector Bases; - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); - I != E; ++I) { - assert(!I->getType()->isDependentType() && + for (const auto &I : RD->bases()) { + assert(!I.getType()->isDependentType() && "Cannot layout class with dependent bases."); - if (!I->isVirtual()) - Bases.push_back(I->getType()->getAsCXXRecordDecl()); + if (!I.isVirtual()) + Bases.push_back(I.getType()->getAsCXXRecordDecl()); } // Sort nvbases by offset. diff --git a/lib/AST/VTTBuilder.cpp b/lib/AST/VTTBuilder.cpp index 5ca4e862ef..c213d1cef6 100644 --- a/lib/AST/VTTBuilder.cpp +++ b/lib/AST/VTTBuilder.cpp @@ -56,15 +56,13 @@ void VTTBuilder::AddVTablePointer(BaseSubobject Base, uint64_t VTableIndex, void VTTBuilder::LayoutSecondaryVTTs(BaseSubobject Base) { const CXXRecordDecl *RD = Base.getBase(); - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - + for (const auto &I : RD->bases()) { // Don't layout virtual bases. - if (I->isVirtual()) + if (I.isVirtual()) continue; const CXXRecordDecl *BaseDecl = - cast(I->getType()->getAs()->getDecl()); + cast(I.getType()->getAs()->getDecl()); const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(RD); CharUnits BaseOffset = Base.getBaseOffset() + @@ -88,10 +86,9 @@ VTTBuilder::LayoutSecondaryVirtualPointers(BaseSubobject Base, if (!RD->getNumVBases() && !BaseIsMorallyVirtual) return; - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { + for (const auto &I : RD->bases()) { const CXXRecordDecl *BaseDecl = - cast(I->getType()->getAs()->getDecl()); + cast(I.getType()->getAs()->getDecl()); // Itanium C++ ABI 2.6.2: // Secondary virtual pointers are present for all bases with either @@ -106,7 +103,7 @@ VTTBuilder::LayoutSecondaryVirtualPointers(BaseSubobject Base, bool BaseDeclIsMorallyVirtual = BaseIsMorallyVirtual; bool BaseDeclIsNonVirtualPrimaryBase = false; CharUnits BaseOffset; - if (I->isVirtual()) { + if (I.isVirtual()) { // Ignore virtual bases that we've already visited. if (!VBases.insert(BaseDecl)) continue; @@ -153,13 +150,12 @@ VTTBuilder::LayoutSecondaryVirtualPointers(BaseSubobject Base, void VTTBuilder::LayoutVirtualVTTs(const CXXRecordDecl *RD, VisitedVirtualBasesSetTy &VBases) { - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { + for (const auto &I : RD->bases()) { const CXXRecordDecl *BaseDecl = - cast(I->getType()->getAs()->getDecl()); + cast(I.getType()->getAs()->getDecl()); // Check if this is a virtual base. - if (I->isVirtual()) { + if (I.isVirtual()) { // Check if we've seen this base before. if (!VBases.insert(BaseDecl)) continue; diff --git a/lib/AST/VTableBuilder.cpp b/lib/AST/VTableBuilder.cpp index eb5fa32855..02f6d8ce87 100644 --- a/lib/AST/VTableBuilder.cpp +++ b/lib/AST/VTableBuilder.cpp @@ -338,13 +338,12 @@ FinalOverriders::ComputeBaseOffsets(BaseSubobject Base, bool IsVirtual, OffsetInLayoutClass; // Traverse our bases. - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - const CXXRecordDecl *BaseDecl = I->getType()->getAsCXXRecordDecl(); + for (const auto &I : RD->bases()) { + const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl(); CharUnits BaseOffset; CharUnits BaseOffsetInLayoutClass; - if (I->isVirtual()) { + if (I.isVirtual()) { // Check if we've visited this virtual base before. if (SubobjectOffsets.count(std::make_pair(BaseDecl, 0))) continue; @@ -364,7 +363,7 @@ FinalOverriders::ComputeBaseOffsets(BaseSubobject Base, bool IsVirtual, } ComputeBaseOffsets(BaseSubobject(BaseDecl, BaseOffset), - I->isVirtual(), BaseOffsetInLayoutClass, + I.isVirtual(), BaseOffsetInLayoutClass, SubobjectOffsets, SubobjectLayoutClassOffsets, SubobjectCounts); } @@ -375,16 +374,15 @@ void FinalOverriders::dump(raw_ostream &Out, BaseSubobject Base, const CXXRecordDecl *RD = Base.getBase(); const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - const CXXRecordDecl *BaseDecl = I->getType()->getAsCXXRecordDecl(); + for (const auto &I : RD->bases()) { + const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl(); // Ignore bases that don't have any virtual member functions. if (!BaseDecl->isPolymorphic()) continue; CharUnits BaseOffset; - if (I->isVirtual()) { + if (I.isVirtual()) { if (!VisitedVirtualBases.insert(BaseDecl)) { // We've visited this base before. continue; @@ -722,13 +720,11 @@ void VCallAndVBaseOffsetBuilder::AddVCallOffsets(BaseSubobject Base, } // And iterate over all non-virtual bases (ignoring the primary base). - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - - if (I->isVirtual()) + for (const auto &I : RD->bases()) { + if (I.isVirtual()) continue; - const CXXRecordDecl *BaseDecl = I->getType()->getAsCXXRecordDecl(); + const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl(); if (BaseDecl == PrimaryBase) continue; @@ -748,12 +744,11 @@ VCallAndVBaseOffsetBuilder::AddVBaseOffsets(const CXXRecordDecl *RD, Context.getASTRecordLayout(LayoutClass); // Add vbase offsets. - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - const CXXRecordDecl *BaseDecl = I->getType()->getAsCXXRecordDecl(); + for (const auto &I : RD->bases()) { + const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl(); // Check if this is a virtual base that we haven't visited before. - if (I->isVirtual() && VisitedVirtualBases.insert(BaseDecl)) { + if (I.isVirtual() && VisitedVirtualBases.insert(BaseDecl)) { CharUnits Offset = LayoutClassLayout.getVBaseClassOffset(BaseDecl) - OffsetInLayoutClass; @@ -1766,13 +1761,12 @@ ItaniumVTableBuilder::LayoutSecondaryVTables(BaseSubobject Base, const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase(); - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { + for (const auto &I : RD->bases()) { // Ignore virtual bases, we'll emit them later. - if (I->isVirtual()) + if (I.isVirtual()) continue; - const CXXRecordDecl *BaseDecl = I->getType()->getAsCXXRecordDecl(); + const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl(); // Ignore bases that don't have a vtable. if (!BaseDecl->isDynamicClass()) @@ -1845,13 +1839,12 @@ void ItaniumVTableBuilder::DeterminePrimaryVirtualBases( } // Traverse bases, looking for more primary virtual bases. - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - const CXXRecordDecl *BaseDecl = I->getType()->getAsCXXRecordDecl(); + for (const auto &I : RD->bases()) { + const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl(); CharUnits BaseOffsetInLayoutClass; - if (I->isVirtual()) { + if (I.isVirtual()) { if (!VBases.insert(BaseDecl)) continue; @@ -1875,13 +1868,12 @@ void ItaniumVTableBuilder::LayoutVTablesForVirtualBases( // Then come the virtual base virtual tables, also in inheritance graph // order, and again excluding primary bases (which share virtual tables with // the classes for which they are primary). - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - const CXXRecordDecl *BaseDecl = I->getType()->getAsCXXRecordDecl(); + for (const auto &I : RD->bases()) { + const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl(); // Check if this base needs a vtable. (If it's virtual, not a primary base // of some other class, and we haven't visited it before). - if (I->isVirtual() && BaseDecl->isDynamicClass() && + if (I.isVirtual() && BaseDecl->isDynamicClass() && !PrimaryVirtualBases.count(BaseDecl) && VBases.insert(BaseDecl)) { const ASTRecordLayout &MostDerivedClassLayout = Context.getASTRecordLayout(MostDerivedClass); @@ -3175,11 +3167,9 @@ void MicrosoftVTableContext::computeVTablePaths(bool ForVBTables, // Recursive case: get all the vbtables from our bases and remove anything // that shares a virtual base. llvm::SmallPtrSet VBasesSeen; - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); - I != E; ++I) { - const CXXRecordDecl *Base = I->getType()->getAsCXXRecordDecl(); - if (I->isVirtual() && VBasesSeen.count(Base)) + for (const auto &I : RD->bases()) { + const CXXRecordDecl *Base = I.getType()->getAsCXXRecordDecl(); + if (I.isVirtual() && VBasesSeen.count(Base)) continue; if (!Base->isDynamicClass()) @@ -3216,7 +3206,7 @@ void MicrosoftVTableContext::computeVTablePaths(bool ForVBTables, if (Base == (ForVBTables ? Layout.getBaseSharingVBPtr() : Layout.getPrimaryBase())) P->ReusingBase = RD; - if (I->isVirtual()) + if (I.isVirtual()) P->ContainingVBases.push_back(Base); else if (P->ContainingVBases.empty()) P->NonVirtualOffset += Layout.getBaseClassOffset(Base); diff --git a/lib/ASTMatchers/ASTMatchFinder.cpp b/lib/ASTMatchers/ASTMatchFinder.cpp index 3e9d3d2a1c..fb8ce75758 100644 --- a/lib/ASTMatchers/ASTMatchFinder.cpp +++ b/lib/ASTMatchers/ASTMatchFinder.cpp @@ -665,10 +665,8 @@ bool MatchASTVisitor::classIsDerivedFrom(const CXXRecordDecl *Declaration, if (!Declaration->hasDefinition()) return false; typedef CXXRecordDecl::base_class_const_iterator BaseIterator; - for (BaseIterator It = Declaration->bases_begin(), - End = Declaration->bases_end(); - It != End; ++It) { - const Type *TypeNode = It->getType().getTypePtr(); + for (const auto &It : Declaration->bases()) { + const Type *TypeNode = It.getType().getTypePtr(); if (typeHasMatchingAlias(TypeNode, Base, Builder)) return true; diff --git a/lib/Analysis/CFG.cpp b/lib/Analysis/CFG.cpp index f19f0edd1e..9b9b4767fc 100644 --- a/lib/Analysis/CFG.cpp +++ b/lib/Analysis/CFG.cpp @@ -890,13 +890,12 @@ void CFGBuilder::addImplicitDtorsForDestructor(const CXXDestructorDecl *DD) { } // Before virtual bases destroy direct base objects. - for (CXXRecordDecl::base_class_const_iterator BI = RD->bases_begin(), - BE = RD->bases_end(); BI != BE; ++BI) { - if (!BI->isVirtual()) { - const CXXRecordDecl *CD = BI->getType()->getAsCXXRecordDecl(); + for (const auto &BI : RD->bases()) { + if (!BI.isVirtual()) { + const CXXRecordDecl *CD = BI.getType()->getAsCXXRecordDecl(); if (!CD->hasTrivialDestructor()) { autoCreateBlock(); - appendBaseDtor(Block, BI); + appendBaseDtor(Block, &BI); } } } diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index 29222089a2..ef29af7e07 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -62,15 +62,14 @@ bool CodeGenModule::TryEmitBaseDestructorAsAlias(const CXXDestructorDecl *D) { // Try to find a unique base class with a non-trivial destructor. const CXXRecordDecl *UniqueBase = 0; - for (CXXRecordDecl::base_class_const_iterator I = Class->bases_begin(), - E = Class->bases_end(); I != E; ++I) { + for (const auto &I : Class->bases()) { // We're in the base destructor, so skip virtual bases. - if (I->isVirtual()) continue; + if (I.isVirtual()) continue; // Skip base classes with trivial destructors. const CXXRecordDecl *Base - = cast(I->getType()->getAs()->getDecl()); + = cast(I.getType()->getAs()->getDecl()); if (Base->hasTrivialDestructor()) continue; // If we've already found a base class with a non-trivial diff --git a/lib/CodeGen/CGClass.cpp b/lib/CodeGen/CGClass.cpp index 6bb3af2038..bc38a977af 100644 --- a/lib/CodeGen/CGClass.cpp +++ b/lib/CodeGen/CGClass.cpp @@ -1200,14 +1200,12 @@ HasTrivialDestructorBody(ASTContext &Context, return false; // Check non-virtual bases. - for (CXXRecordDecl::base_class_const_iterator I = - BaseClassDecl->bases_begin(), E = BaseClassDecl->bases_end(); - I != E; ++I) { - if (I->isVirtual()) + for (const auto &I : BaseClassDecl->bases()) { + if (I.isVirtual()) continue; const CXXRecordDecl *NonVirtualBase = - cast(I->getType()->castAs()->getDecl()); + cast(I.getType()->castAs()->getDecl()); if (!HasTrivialDestructorBody(Context, NonVirtualBase, MostDerivedClassDecl)) return false; @@ -1484,10 +1482,7 @@ void CodeGenFunction::EnterDtorCleanups(const CXXDestructorDecl *DD, assert(DtorType == Dtor_Base); // Destroy non-virtual bases. - for (CXXRecordDecl::base_class_const_iterator I = - ClassDecl->bases_begin(), E = ClassDecl->bases_end(); I != E; ++I) { - const CXXBaseSpecifier &Base = *I; - + for (const auto &Base : ClassDecl->bases()) { // Ignore virtual bases. if (Base.isVirtual()) continue; @@ -1933,10 +1928,9 @@ CodeGenFunction::InitializeVTablePointers(BaseSubobject Base, const CXXRecordDecl *RD = Base.getBase(); // Traverse bases. - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { + for (const auto &I : RD->bases()) { CXXRecordDecl *BaseDecl - = cast(I->getType()->getAs()->getDecl()); + = cast(I.getType()->getAs()->getDecl()); // Ignore classes without a vtable. if (!BaseDecl->isDynamicClass()) @@ -1946,7 +1940,7 @@ CodeGenFunction::InitializeVTablePointers(BaseSubobject Base, CharUnits BaseOffsetFromNearestVBase; bool BaseDeclIsNonVirtualPrimaryBase; - if (I->isVirtual()) { + if (I.isVirtual()) { // Check if we've visited this virtual base before. if (!VBases.insert(BaseDecl)) continue; @@ -1967,7 +1961,7 @@ CodeGenFunction::InitializeVTablePointers(BaseSubobject Base, } InitializeVTablePointers(BaseSubobject(BaseDecl, BaseOffset), - I->isVirtual() ? BaseDecl : NearestVBase, + I.isVirtual() ? BaseDecl : NearestVBase, BaseOffsetFromNearestVBase, BaseDeclIsNonVirtualPrimaryBase, VTableClass, VBases); diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 97c947097a..ebca5f8f10 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -1172,15 +1172,14 @@ CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit, llvm::DIType RecordTy) { const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); - for (CXXRecordDecl::base_class_const_iterator BI = RD->bases_begin(), - BE = RD->bases_end(); BI != BE; ++BI) { + for (const auto &BI : RD->bases()) { unsigned BFlags = 0; uint64_t BaseOffset; const CXXRecordDecl *Base = - cast(BI->getType()->getAs()->getDecl()); + cast(BI.getType()->getAs()->getDecl()); - if (BI->isVirtual()) { + if (BI.isVirtual()) { // virtual base offset offset is -ve. The code generator emits dwarf // expression where it expects +ve number. BaseOffset = @@ -1192,7 +1191,7 @@ CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit, // FIXME: Inconsistent units for BaseOffset. It is in bytes when // BI->isVirtual() and bits when not. - AccessSpecifier Access = BI->getAccessSpecifier(); + AccessSpecifier Access = BI.getAccessSpecifier(); if (Access == clang::AS_private) BFlags |= llvm::DIDescriptor::FlagPrivate; else if (Access == clang::AS_protected) @@ -1200,7 +1199,7 @@ CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit, llvm::DIType DTy = DBuilder.createInheritance(RecordTy, - getOrCreateType(BI->getType(), Unit), + getOrCreateType(BI.getType(), Unit), BaseOffset, BFlags); EltTys.push_back(DTy); } diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp index 2df5de0644..34aa3018fc 100644 --- a/lib/CodeGen/CGExprConstant.cpp +++ b/lib/CodeGen/CGExprConstant.cpp @@ -1268,15 +1268,14 @@ FillInNullDataMemberPointers(CodeGenModule &CGM, QualType T, const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD); // Go through all bases and fill in any null pointer to data members. - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - if (I->isVirtual()) { + for (const auto &I : RD->bases()) { + if (I.isVirtual()) { // Ignore virtual bases. continue; } const CXXRecordDecl *BaseDecl = - cast(I->getType()->getAs()->getDecl()); + cast(I.getType()->getAs()->getDecl()); // Ignore empty bases. if (BaseDecl->isEmpty()) @@ -1288,7 +1287,7 @@ FillInNullDataMemberPointers(CodeGenModule &CGM, QualType T, uint64_t BaseOffset = CGM.getContext().toBits(Layout.getBaseClassOffset(BaseDecl)); - FillInNullDataMemberPointers(CGM, I->getType(), + FillInNullDataMemberPointers(CGM, I.getType(), Elements, StartOffset + BaseOffset); } @@ -1338,16 +1337,15 @@ static llvm::Constant *EmitNullConstant(CodeGenModule &CGM, std::vector elements(numElements); // Fill in all the bases. - for (CXXRecordDecl::base_class_const_iterator - I = record->bases_begin(), E = record->bases_end(); I != E; ++I) { - if (I->isVirtual()) { + for (const auto &I : record->bases()) { + if (I.isVirtual()) { // Ignore virtual bases; if we're laying out for a complete // object, we'll lay these out later. continue; } const CXXRecordDecl *base = - cast(I->getType()->castAs()->getDecl()); + cast(I.getType()->castAs()->getDecl()); // Ignore empty bases. if (base->isEmpty()) diff --git a/lib/CodeGen/CGRTTI.cpp b/lib/CodeGen/CGRTTI.cpp index 8851209d08..e398cd47fd 100644 --- a/lib/CodeGen/CGRTTI.cpp +++ b/lib/CodeGen/CGRTTI.cpp @@ -763,9 +763,8 @@ static unsigned ComputeVMIClassTypeInfoFlags(const CXXBaseSpecifier *Base, } // Walk all bases. - for (CXXRecordDecl::base_class_const_iterator I = BaseDecl->bases_begin(), - E = BaseDecl->bases_end(); I != E; ++I) - Flags |= ComputeVMIClassTypeInfoFlags(I, Bases); + for (const auto &I : BaseDecl->bases()) + Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases); return Flags; } @@ -775,9 +774,8 @@ static unsigned ComputeVMIClassTypeInfoFlags(const CXXRecordDecl *RD) { SeenBases Bases; // Walk all bases. - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) - Flags |= ComputeVMIClassTypeInfoFlags(I, Bases); + for (const auto &I : RD->bases()) + Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases); return Flags; } @@ -824,15 +822,12 @@ void RTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) { // __offset_shift = 8 // }; // }; - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - const CXXBaseSpecifier *Base = I; - + for (const auto &Base : RD->bases()) { // The __base_type member points to the RTTI for the base type. - Fields.push_back(RTTIBuilder(CGM).BuildTypeInfo(Base->getType())); + Fields.push_back(RTTIBuilder(CGM).BuildTypeInfo(Base.getType())); const CXXRecordDecl *BaseDecl = - cast(Base->getType()->getAs()->getDecl()); + cast(Base.getType()->getAs()->getDecl()); int64_t OffsetFlags = 0; @@ -841,7 +836,7 @@ void RTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) { // subobject. For a virtual base, this is the offset in the virtual table of // the virtual base offset for the virtual base referenced (negative). CharUnits Offset; - if (Base->isVirtual()) + if (Base.isVirtual()) Offset = CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(RD, BaseDecl); else { @@ -853,9 +848,9 @@ void RTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) { // The low-order byte of __offset_flags contains flags, as given by the // masks from the enumeration __offset_flags_masks. - if (Base->isVirtual()) + if (Base.isVirtual()) OffsetFlags |= BCTI_Virtual; - if (Base->getAccessSpecifier() == AS_public) + if (Base.getAccessSpecifier() == AS_public) OffsetFlags |= BCTI_Public; Fields.push_back(llvm::ConstantInt::get(LongLTy, OffsetFlags)); diff --git a/lib/CodeGen/CGRecordLayoutBuilder.cpp b/lib/CodeGen/CGRecordLayoutBuilder.cpp index 888b07fea7..985ade22e4 100644 --- a/lib/CodeGen/CGRecordLayoutBuilder.cpp +++ b/lib/CodeGen/CGRecordLayoutBuilder.cpp @@ -419,12 +419,10 @@ void CGRecordLowering::accumulateBases() { CharUnits::Zero(), getStorageType(Layout.getPrimaryBase()))); // Accumulate the non-virtual bases. - for (CXXRecordDecl::base_class_const_iterator Base = RD->bases_begin(), - BaseEnd = RD->bases_end(); - Base != BaseEnd; ++Base) { - if (Base->isVirtual()) + for (const auto &Base : RD->bases()) { + if (Base.isVirtual()) continue; - const CXXRecordDecl *BaseDecl = Base->getType()->getAsCXXRecordDecl(); + const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl(); if (!BaseDecl->isEmpty()) Members.push_back(MemberInfo(Layout.getBaseClassOffset(BaseDecl), MemberInfo::Base, getStorageType(BaseDecl), BaseDecl)); @@ -472,10 +470,8 @@ bool CGRecordLowering::hasOwnStorage(const CXXRecordDecl *Decl, const ASTRecordLayout &DeclLayout = Context.getASTRecordLayout(Decl); if (DeclLayout.isPrimaryBaseVirtual() && DeclLayout.getPrimaryBase() == Query) return false; - for (CXXRecordDecl::base_class_const_iterator Base = Decl->bases_begin(), - BaseEnd = Decl->bases_end(); - Base != BaseEnd; ++Base) - if (!hasOwnStorage(Base->getType()->getAsCXXRecordDecl(), Query)) + for (const auto &Base : Decl->bases()) + if (!hasOwnStorage(Base.getType()->getAsCXXRecordDecl(), Query)) return false; return true; } diff --git a/lib/CodeGen/CodeGenTypes.cpp b/lib/CodeGen/CodeGenTypes.cpp index 36fd95db08..b7f37462a6 100644 --- a/lib/CodeGen/CodeGenTypes.cpp +++ b/lib/CodeGen/CodeGenTypes.cpp @@ -131,9 +131,8 @@ isSafeToConvert(const RecordDecl *RD, CodeGenTypes &CGT, // when a class is translated, even though they aren't embedded by-value into // the class. if (const CXXRecordDecl *CRD = dyn_cast(RD)) { - for (CXXRecordDecl::base_class_const_iterator I = CRD->bases_begin(), - E = CRD->bases_end(); I != E; ++I) - if (!isSafeToConvert(I->getType()->getAs()->getDecl(), + for (const auto &I : CRD->bases()) + if (!isSafeToConvert(I.getType()->getAs()->getDecl(), CGT, AlreadyChecked)) return false; } @@ -650,11 +649,10 @@ llvm::StructType *CodeGenTypes::ConvertRecordDeclType(const RecordDecl *RD) { // Force conversion of non-virtual base classes recursively. if (const CXXRecordDecl *CRD = dyn_cast(RD)) { - for (CXXRecordDecl::base_class_const_iterator i = CRD->bases_begin(), - e = CRD->bases_end(); i != e; ++i) { - if (i->isVirtual()) continue; + for (const auto &I : CRD->bases()) { + if (I.isVirtual()) continue; - ConvertRecordDeclType(i->getType()->getAs()->getDecl()); + ConvertRecordDeclType(I.getType()->getAs()->getDecl()); } } diff --git a/lib/CodeGen/MicrosoftCXXABI.cpp b/lib/CodeGen/MicrosoftCXXABI.cpp index 22a7cafd25..66774e52ca 100644 --- a/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/lib/CodeGen/MicrosoftCXXABI.cpp @@ -634,9 +634,8 @@ llvm::Value *MicrosoftCXXABI::adjustThisArgumentForVirtualCall( AvoidVirtualOffset = true; } else { // Let's see if we try to call a destructor of a non-virtual base. - for (CXXRecordDecl::base_class_const_iterator I = CurRD->bases_begin(), - E = CurRD->bases_end(); I != E; ++I) { - if (I->getType()->getAsCXXRecordDecl() != MD->getParent()) + for (const auto &I : CurRD->bases()) { + if (I.getType()->getAsCXXRecordDecl() != MD->getParent()) continue; // If we call a base destructor for a non-virtual base, we statically // know where it expects the vfptr and "this" to be. diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index b0eccd7a17..f013fcfb21 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/lib/CodeGen/TargetInfo.cpp @@ -209,9 +209,8 @@ static bool isEmptyRecord(ASTContext &Context, QualType T, bool AllowArrays) { // If this is a C++ record, check the bases first. if (const CXXRecordDecl *CXXRD = dyn_cast(RD)) - for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(), - e = CXXRD->bases_end(); i != e; ++i) - if (!isEmptyRecord(Context, i->getType(), true)) + for (const auto &I : CXXRD->bases()) + if (!isEmptyRecord(Context, I.getType(), true)) return false; for (const auto *I : RD->fields()) @@ -241,10 +240,9 @@ static const Type *isSingleElementStruct(QualType T, ASTContext &Context) { // If this is a C++ record, check the bases first. if (const CXXRecordDecl *CXXRD = dyn_cast(RD)) { - for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(), - e = CXXRD->bases_end(); i != e; ++i) { + for (const auto &I : CXXRD->bases()) { // Ignore empty records. - if (isEmptyRecord(Context, i->getType(), true)) + if (isEmptyRecord(Context, I.getType(), true)) continue; // If we already found an element then this isn't a single-element struct. @@ -253,7 +251,7 @@ static const Type *isSingleElementStruct(QualType T, ASTContext &Context) { // If this is non-empty and not a single element struct, the composite // cannot be a single element struct. - Found = isSingleElementStruct(i->getType(), Context); + Found = isSingleElementStruct(I.getType(), Context); if (!Found) return 0; } @@ -782,9 +780,8 @@ static bool isRecordWithSSEVectorType(ASTContext &Context, QualType Ty) { // If this is a C++ record, check the bases first. if (const CXXRecordDecl *CXXRD = dyn_cast(RD)) - for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(), - e = CXXRD->bases_end(); i != e; ++i) - if (!isRecordWithSSEVectorType(Context, i->getType())) + for (const auto &I : CXXRD->bases()) + if (!isRecordWithSSEVectorType(Context, I.getType())) return false; for (const auto *i : RD->fields()) { @@ -1739,12 +1736,11 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase, // If this is a C++ record, classify the bases first. if (const CXXRecordDecl *CXXRD = dyn_cast(RD)) { - for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(), - e = CXXRD->bases_end(); i != e; ++i) { - assert(!i->isVirtual() && !i->getType()->isDependentType() && + for (const auto &I : CXXRD->bases()) { + assert(!I.isVirtual() && !I.getType()->isDependentType() && "Unexpected base class!"); const CXXRecordDecl *Base = - cast(i->getType()->getAs()->getDecl()); + cast(I.getType()->getAs()->getDecl()); // Classify this field. // @@ -1754,7 +1750,7 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase, Class FieldLo, FieldHi; uint64_t Offset = OffsetBase + getContext().toBits(Layout.getBaseClassOffset(Base)); - classify(i->getType(), Offset, FieldLo, FieldHi, isNamedArg); + classify(I.getType(), Offset, FieldLo, FieldHi, isNamedArg); Lo = merge(Lo, FieldLo); Hi = merge(Hi, FieldHi); if (Lo == Memory || Hi == Memory) @@ -1984,19 +1980,18 @@ static bool BitsContainNoUserData(QualType Ty, unsigned StartBit, // If this is a C++ record, check the bases first. if (const CXXRecordDecl *CXXRD = dyn_cast(RD)) { - for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(), - e = CXXRD->bases_end(); i != e; ++i) { - assert(!i->isVirtual() && !i->getType()->isDependentType() && + for (const auto &I : CXXRD->bases()) { + assert(!I.isVirtual() && !I.getType()->isDependentType() && "Unexpected base class!"); const CXXRecordDecl *Base = - cast(i->getType()->getAs()->getDecl()); + cast(I.getType()->getAs()->getDecl()); // If the base is after the span we care about, ignore it. unsigned BaseOffset = Context.toBits(Layout.getBaseClassOffset(Base)); if (BaseOffset >= EndBit) continue; unsigned BaseStart = BaseOffset < StartBit ? StartBit-BaseOffset :0; - if (!BitsContainNoUserData(i->getType(), BaseStart, + if (!BitsContainNoUserData(I.getType(), BaseStart, EndBit-BaseOffset, Context)) return false; } @@ -4582,9 +4577,8 @@ bool SystemZABIInfo::isFPArgumentType(QualType Ty) const { // If this is a C++ record, check the bases first. if (const CXXRecordDecl *CXXRD = dyn_cast(RD)) - for (CXXRecordDecl::base_class_const_iterator I = CXXRD->bases_begin(), - E = CXXRD->bases_end(); I != E; ++I) { - QualType Base = I->getType(); + for (const auto &I : CXXRD->bases()) { + QualType Base = I.getType(); // Empty bases don't affect things either way. if (isEmptyRecord(getContext(), Base, true)) diff --git a/lib/Sema/SemaAccess.cpp b/lib/Sema/SemaAccess.cpp index 60c3e726e6..541b7f9275 100644 --- a/lib/Sema/SemaAccess.cpp +++ b/lib/Sema/SemaAccess.cpp @@ -288,12 +288,10 @@ static AccessResult IsDerivedFromInclusive(const CXXRecordDecl *Derived, if (Derived->isDependentContext() && !Derived->hasDefinition()) return AR_dependent; - for (CXXRecordDecl::base_class_const_iterator - I = Derived->bases_begin(), E = Derived->bases_end(); I != E; ++I) { - + for (const auto &I : Derived->bases()) { const CXXRecordDecl *RD; - QualType T = I->getType(); + QualType T = I.getType(); if (const RecordType *RT = T->getAs()) { RD = cast(RT->getDecl()); } else if (const InjectedClassNameType *IT @@ -646,18 +644,16 @@ struct ProtectedFriendContext { EverDependent = true; // Recurse into the base classes. - for (CXXRecordDecl::base_class_const_iterator - I = Cur->bases_begin(), E = Cur->bases_end(); I != E; ++I) { - + for (const auto &I : Cur->bases()) { // If this is private inheritance, then a public member of the // base will not have any access in classes derived from Cur. unsigned BasePrivateDepth = PrivateDepth; - if (I->getAccessSpecifier() == AS_private) + if (I.getAccessSpecifier() == AS_private) BasePrivateDepth = CurPath.size() - 1; const CXXRecordDecl *RD; - QualType T = I->getType(); + QualType T = I.getType(); if (const RecordType *RT = T->getAs()) { RD = cast(RT->getDecl()); } else if (const InjectedClassNameType *IT diff --git a/lib/Sema/SemaCodeComplete.cpp b/lib/Sema/SemaCodeComplete.cpp index f981592bd3..bdb203782f 100644 --- a/lib/Sema/SemaCodeComplete.cpp +++ b/lib/Sema/SemaCodeComplete.cpp @@ -4243,21 +4243,19 @@ void Sema::CodeCompleteConstructorInitializer( Results.getCodeCompletionTUInfo()); bool SawLastInitializer = Initializers.empty(); CXXRecordDecl *ClassDecl = Constructor->getParent(); - for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), - BaseEnd = ClassDecl->bases_end(); - Base != BaseEnd; ++Base) { - if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) { + for (const auto &Base : ClassDecl->bases()) { + if (!InitializedBases.insert(Context.getCanonicalType(Base.getType()))) { SawLastInitializer = !Initializers.empty() && Initializers.back()->isBaseInitializer() && - Context.hasSameUnqualifiedType(Base->getType(), + Context.hasSameUnqualifiedType(Base.getType(), QualType(Initializers.back()->getBaseClass(), 0)); continue; } Builder.AddTypedTextChunk( Results.getAllocator().CopyString( - Base->getType().getAsString(Policy))); + Base.getType().getAsString(Policy))); Builder.AddChunk(CodeCompletionString::CK_LeftParen); Builder.AddPlaceholderChunk("args"); Builder.AddChunk(CodeCompletionString::CK_RightParen); diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index ec06285278..258914343c 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -386,9 +386,8 @@ bool Sema::isMicrosoftMissingTypename(const CXXScopeSpec *SS, Scope *S) { const Type *Ty = SS->getScopeRep()->getAsType(); CXXRecordDecl *RD = cast(CurContext); - for (CXXRecordDecl::base_class_const_iterator Base = RD->bases_begin(), - BaseEnd = RD->bases_end(); Base != BaseEnd; ++Base) - if (Context.hasSameUnqualifiedType(QualType(Ty, 1), Base->getType())) + for (const auto &Base : RD->bases()) + if (Context.hasSameUnqualifiedType(QualType(Ty, 1), Base.getType())) return true; return S->isFunctionPrototypeScope(); } diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index c75bac5e8c..cc5397be90 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -1271,10 +1271,8 @@ static bool findCircularInheritance(const CXXRecordDecl *Class, Class = Class->getCanonicalDecl(); while (true) { - for (CXXRecordDecl::base_class_const_iterator I = Current->bases_begin(), - E = Current->bases_end(); - I != E; ++I) { - CXXRecordDecl *Base = I->getType()->getAsCXXRecordDecl(); + for (const auto &I : Current->bases()) { + CXXRecordDecl *Base = I.getType()->getAsCXXRecordDecl(); if (!Base) continue; @@ -2413,13 +2411,11 @@ static bool FindBaseInitializer(Sema &SemaRef, const CXXBaseSpecifier *&VirtualBaseSpec) { // First, check for a direct base class. DirectBaseSpec = 0; - for (CXXRecordDecl::base_class_const_iterator Base - = ClassDecl->bases_begin(); - Base != ClassDecl->bases_end(); ++Base) { - if (SemaRef.Context.hasSameUnqualifiedType(BaseType, Base->getType())) { + for (const auto &Base : ClassDecl->bases()) { + if (SemaRef.Context.hasSameUnqualifiedType(BaseType, Base.getType())) { // We found a direct base of this type. That's what we're // initializing. - DirectBaseSpec = &*Base; + DirectBaseSpec = &Base; break; } } @@ -3575,10 +3571,9 @@ bool Sema::SetCtorInitializers(CXXConstructorDecl *Constructor, bool AnyErrors, // Keep track of the direct virtual bases. llvm::SmallPtrSet DirectVBases; - for (CXXRecordDecl::base_class_iterator I = ClassDecl->bases_begin(), - E = ClassDecl->bases_end(); I != E; ++I) { - if (I->isVirtual()) - DirectVBases.insert(I); + for (auto &I : ClassDecl->bases()) { + if (I.isVirtual()) + DirectVBases.insert(&I); } // Push virtual bases before others. @@ -3619,19 +3614,18 @@ bool Sema::SetCtorInitializers(CXXConstructorDecl *Constructor, bool AnyErrors, } // Non-virtual bases. - for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), - E = ClassDecl->bases_end(); Base != E; ++Base) { + for (auto &Base : ClassDecl->bases()) { // Virtuals are in the virtual base list and already constructed. - if (Base->isVirtual()) + if (Base.isVirtual()) continue; if (CXXCtorInitializer *Value - = Info.AllBaseFields.lookup(Base->getType()->getAs())) { + = Info.AllBaseFields.lookup(Base.getType()->getAs())) { Info.AllToInit.push_back(Value); } else if (!AnyErrors) { CXXCtorInitializer *CXXBaseInit; if (BuildImplicitBaseInitializer(*this, Constructor, Info.IIK, - Base, /*IsInheritedVirtualBase=*/false, + &Base, /*IsInheritedVirtualBase=*/false, CXXBaseInit)) { HadError = true; continue; @@ -3758,11 +3752,10 @@ static void DiagnoseBaseOrMemInitializerOrder( IdealInitKeys.push_back(GetKeyForBase(SemaRef.Context, VBase->getType())); // 2. Non-virtual bases. - for (CXXRecordDecl::base_class_const_iterator Base = ClassDecl->bases_begin(), - E = ClassDecl->bases_end(); Base != E; ++Base) { - if (Base->isVirtual()) + for (const auto &Base : ClassDecl->bases()) { + if (Base.isVirtual()) continue; - IdealInitKeys.push_back(GetKeyForBase(SemaRef.Context, Base->getType())); + IdealInitKeys.push_back(GetKeyForBase(SemaRef.Context, Base.getType())); } // 3. Direct fields. @@ -4003,13 +3996,12 @@ Sema::MarkBaseAndMemberDestructorsReferenced(SourceLocation Location, llvm::SmallPtrSet DirectVirtualBases; // Bases. - for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), - E = ClassDecl->bases_end(); Base != E; ++Base) { + for (const auto &Base : ClassDecl->bases()) { // Bases are always records in a well-formed non-dependent class. - const RecordType *RT = Base->getType()->getAs(); + const RecordType *RT = Base.getType()->getAs(); // Remember direct virtual bases. - if (Base->isVirtual()) + if (Base.isVirtual()) DirectVirtualBases.insert(RT); CXXRecordDecl *BaseClassDecl = cast(RT->getDecl()); @@ -4023,10 +4015,10 @@ Sema::MarkBaseAndMemberDestructorsReferenced(SourceLocation Location, assert(Dtor && "No dtor found for BaseClassDecl!"); // FIXME: caret should be on the start of the class name - CheckDestructorAccess(Base->getLocStart(), Dtor, + CheckDestructorAccess(Base.getLocStart(), Dtor, PDiag(diag::err_access_dtor_base) - << Base->getType() - << Base->getSourceRange(), + << Base.getType() + << Base.getSourceRange(), Context.getTypeDeclType(ClassDecl)); MarkFunctionReferenced(Location, Dtor); @@ -4633,10 +4625,8 @@ static bool defaultedSpecialMemberIsConstexpr(Sema &S, CXXRecordDecl *ClassDecl, // sub-objects shall be a constexpr constructor; // -- the assignment operator selected to copy/move each direct base // class is a constexpr function, and - for (CXXRecordDecl::base_class_iterator B = ClassDecl->bases_begin(), - BEnd = ClassDecl->bases_end(); - B != BEnd; ++B) { - const RecordType *BaseType = B->getType()->getAs(); + for (const auto &B : ClassDecl->bases()) { + const RecordType *BaseType = B.getType()->getAs(); if (!BaseType) continue; CXXRecordDecl *BaseClassDecl = cast(BaseType->getDecl()); @@ -5357,10 +5347,9 @@ bool Sema::ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMember CSM, SpecialMemberDeletionInfo SMI(*this, MD, CSM, Diagnose); - for (CXXRecordDecl::base_class_iterator BI = RD->bases_begin(), - BE = RD->bases_end(); BI != BE; ++BI) - if (!BI->isVirtual() && - SMI.shouldDeleteForBase(BI)) + for (auto &BI : RD->bases()) + if (!BI.isVirtual() && + SMI.shouldDeleteForBase(&BI)) return true; // Per DR1611, do not consider virtual bases of constructors of abstract @@ -5726,9 +5715,8 @@ bool Sema::SpecialMemberIsTrivial(CXXMethodDecl *MD, CXXSpecialMember CSM, // A [default constructor or destructor] is trivial if // -- all the direct base classes have trivial [default constructors or // destructors] - for (CXXRecordDecl::base_class_iterator BI = RD->bases_begin(), - BE = RD->bases_end(); BI != BE; ++BI) - if (!checkTrivialSubobjectCall(*this, BI->getLocStart(), BI->getType(), + for (const auto &BI : RD->bases()) + if (!checkTrivialSubobjectCall(*this, BI.getLocStart(), BI.getType(), ConstArg, CSM, TSK_BaseClass, Diagnose)) return false; @@ -8002,19 +7990,17 @@ Sema::ComputeDefaultedDefaultCtorExceptionSpec(SourceLocation Loc, return ExceptSpec; // Direct base-class constructors. - for (CXXRecordDecl::base_class_iterator B = ClassDecl->bases_begin(), - BEnd = ClassDecl->bases_end(); - B != BEnd; ++B) { - if (B->isVirtual()) // Handled below. + for (const auto &B : ClassDecl->bases()) { + if (B.isVirtual()) // Handled below. continue; - if (const RecordType *BaseType = B->getType()->getAs()) { + if (const RecordType *BaseType = B.getType()->getAs()) { CXXRecordDecl *BaseClassDecl = cast(BaseType->getDecl()); CXXConstructorDecl *Constructor = LookupDefaultConstructor(BaseClassDecl); // If this is a deleted function, add it anyway. This might be conformant // with the standard. This might not. I'm not sure. It might not matter. if (Constructor) - ExceptSpec.CalledDecl(B->getLocStart(), Constructor); + ExceptSpec.CalledDecl(B.getLocStart(), Constructor); } } @@ -8089,19 +8075,17 @@ Sema::ComputeInheritingCtorExceptionSpec(CXXConstructorDecl *CD) { ExceptSpec.CalledDecl(CD->getLocStart(), InheritedCD); // Direct base-class constructors. - for (CXXRecordDecl::base_class_iterator B = ClassDecl->bases_begin(), - BEnd = ClassDecl->bases_end(); - B != BEnd; ++B) { - if (B->isVirtual()) // Handled below. + for (const auto &B : ClassDecl->bases()) { + if (B.isVirtual()) // Handled below. continue; - if (const RecordType *BaseType = B->getType()->getAs()) { + if (const RecordType *BaseType = B.getType()->getAs()) { CXXRecordDecl *BaseClassDecl = cast(BaseType->getDecl()); if (BaseClassDecl == InheritedDecl) continue; CXXConstructorDecl *Constructor = LookupDefaultConstructor(BaseClassDecl); if (Constructor) - ExceptSpec.CalledDecl(B->getLocStart(), Constructor); + ExceptSpec.CalledDecl(B.getLocStart(), Constructor); } } @@ -8550,11 +8534,9 @@ void Sema::DeclareInheritingConstructors(CXXRecordDecl *ClassDecl) { // Find base classes from which we might inherit constructors. SmallVector InheritedBases; - for (CXXRecordDecl::base_class_iterator BaseIt = ClassDecl->bases_begin(), - BaseE = ClassDecl->bases_end(); - BaseIt != BaseE; ++BaseIt) - if (BaseIt->getInheritConstructors()) - InheritedBases.push_back(BaseIt->getType()->getAsCXXRecordDecl()); + for (const auto &BaseIt : ClassDecl->bases()) + if (BaseIt.getInheritConstructors()) + InheritedBases.push_back(BaseIt.getType()->getAsCXXRecordDecl()); // Go no further if we're not inheriting any constructors. if (InheritedBases.empty()) @@ -8607,14 +8589,12 @@ Sema::ComputeDefaultedDtorExceptionSpec(CXXMethodDecl *MD) { return ExceptSpec; // Direct base-class destructors. - for (CXXRecordDecl::base_class_iterator B = ClassDecl->bases_begin(), - BEnd = ClassDecl->bases_end(); - B != BEnd; ++B) { - if (B->isVirtual()) // Handled below. + for (const auto &B : ClassDecl->bases()) { + if (B.isVirtual()) // Handled below. continue; - if (const RecordType *BaseType = B->getType()->getAs()) - ExceptSpec.CalledDecl(B->getLocStart(), + if (const RecordType *BaseType = B.getType()->getAs()) + ExceptSpec.CalledDecl(B.getLocStart(), LookupDestructor(cast(BaseType->getDecl()))); } @@ -9213,17 +9193,15 @@ Sema::ComputeDefaultedCopyAssignmentExceptionSpec(CXXMethodDecl *MD) { // Based on a similar decision made for constness in C++0x, we're erring on // the side of assuming such calls to be made regardless of whether they // actually happen. - for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), - BaseEnd = ClassDecl->bases_end(); - Base != BaseEnd; ++Base) { - if (Base->isVirtual()) + for (const auto &Base : ClassDecl->bases()) { + if (Base.isVirtual()) continue; CXXRecordDecl *BaseClassDecl - = cast(Base->getType()->getAs()->getDecl()); + = cast(Base.getType()->getAs()->getDecl()); if (CXXMethodDecl *CopyAssign = LookupCopyingAssignment(BaseClassDecl, ArgQuals, false, 0)) - ExceptSpec.CalledDecl(Base->getLocStart(), CopyAssign); + ExceptSpec.CalledDecl(Base.getLocStart(), CopyAssign); } for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(), @@ -9429,18 +9407,17 @@ void Sema::DefineImplicitCopyAssignment(SourceLocation CurrentLocation, // Assign base classes. bool Invalid = false; - for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), - E = ClassDecl->bases_end(); Base != E; ++Base) { + for (auto &Base : ClassDecl->bases()) { // Form the assignment: // static_cast(this)->Base::operator=(static_cast(other)); - QualType BaseType = Base->getType().getUnqualifiedType(); + QualType BaseType = Base.getType().getUnqualifiedType(); if (!BaseType->isRecordType()) { Invalid = true; continue; } CXXCastPath BasePath; - BasePath.push_back(Base); + BasePath.push_back(&Base); // Construct the "from" expression, which is an implicit cast to the // appropriately-qualified base type. @@ -9598,17 +9575,15 @@ Sema::ComputeDefaultedMoveAssignmentExceptionSpec(CXXMethodDecl *MD) { // actually happen. // Note that a move constructor is not implicitly declared when there are // virtual bases, but it can still be user-declared and explicitly defaulted. - for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), - BaseEnd = ClassDecl->bases_end(); - Base != BaseEnd; ++Base) { - if (Base->isVirtual()) + for (const auto &Base : ClassDecl->bases()) { + if (Base.isVirtual()) continue; CXXRecordDecl *BaseClassDecl - = cast(Base->getType()->getAs()->getDecl()); + = cast(Base.getType()->getAs()->getDecl()); if (CXXMethodDecl *MoveAssign = LookupMovingAssignment(BaseClassDecl, 0, false, 0)) - ExceptSpec.CalledDecl(Base->getLocStart(), MoveAssign); + ExceptSpec.CalledDecl(Base.getLocStart(), MoveAssign); } for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(), @@ -9719,10 +9694,8 @@ static void checkMoveAssignmentForRepeatedMove(Sema &S, CXXRecordDecl *Class, typedef llvm::DenseMap VBaseMap; VBaseMap VBases; - for (CXXRecordDecl::base_class_iterator BI = Class->bases_begin(), - BE = Class->bases_end(); - BI != BE; ++BI) { - Worklist.push_back(&*BI); + for (auto &BI : Class->bases()) { + Worklist.push_back(&BI); while (!Worklist.empty()) { CXXBaseSpecifier *BaseSpec = Worklist.pop_back_val(); CXXRecordDecl *Base = BaseSpec->getType()->getAsCXXRecordDecl(); @@ -9754,19 +9727,19 @@ static void checkMoveAssignmentForRepeatedMove(Sema &S, CXXRecordDecl *Class, // only happens in one base, we'll diagnose it when synthesizing // that base class's move assignment operator.) CXXBaseSpecifier *&Existing = - VBases.insert(std::make_pair(Base->getCanonicalDecl(), BI)) + VBases.insert(std::make_pair(Base->getCanonicalDecl(), &BI)) .first->second; - if (Existing && Existing != BI) { + if (Existing && Existing != &BI) { S.Diag(CurrentLocation, diag::warn_vbase_moved_multiple_times) << Class << Base; S.Diag(Existing->getLocStart(), diag::note_vbase_moved_here) << (Base->getCanonicalDecl() == Existing->getType()->getAsCXXRecordDecl()->getCanonicalDecl()) << Base << Existing->getType() << Existing->getSourceRange(); - S.Diag(BI->getLocStart(), diag::note_vbase_moved_here) + S.Diag(BI.getLocStart(), diag::note_vbase_moved_here) << (Base->getCanonicalDecl() == - BI->getType()->getAsCXXRecordDecl()->getCanonicalDecl()) - << Base << BI->getType() << BaseSpec->getSourceRange(); + BI.getType()->getAsCXXRecordDecl()->getCanonicalDecl()) + << Base << BI.getType() << BaseSpec->getSourceRange(); // Only diagnose each vbase once. Existing = 0; @@ -9779,10 +9752,8 @@ static void checkMoveAssignmentForRepeatedMove(Sema &S, CXXRecordDecl *Class, continue; // We're going to move the base classes of Base. Add them to the list. - for (CXXRecordDecl::base_class_iterator BI = Base->bases_begin(), - BE = Base->bases_end(); - BI != BE; ++BI) - Worklist.push_back(&*BI); + for (auto &BI : Base->bases()) + Worklist.push_back(&BI); } } } @@ -9844,8 +9815,7 @@ void Sema::DefineImplicitMoveAssignment(SourceLocation CurrentLocation, // Assign base classes. bool Invalid = false; - for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), - E = ClassDecl->bases_end(); Base != E; ++Base) { + for (auto &Base : ClassDecl->bases()) { // C++11 [class.copy]p28: // It is unspecified whether subobjects representing virtual base classes // are assigned more than once by the implicitly-defined copy assignment @@ -9856,14 +9826,14 @@ void Sema::DefineImplicitMoveAssignment(SourceLocation CurrentLocation, // Form the assignment: // static_cast(this)->Base::operator=(static_cast(other)); - QualType BaseType = Base->getType().getUnqualifiedType(); + QualType BaseType = Base.getType().getUnqualifiedType(); if (!BaseType->isRecordType()) { Invalid = true; continue; } CXXCastPath BasePath; - BasePath.push_back(Base); + BasePath.push_back(&Base); // Construct the "from" expression, which is an implicit cast to the // appropriately-qualified base type. @@ -10020,19 +9990,16 @@ Sema::ComputeDefaultedCopyCtorExceptionSpec(CXXMethodDecl *MD) { // C++ [except.spec]p14: // An implicitly declared special member function (Clause 12) shall have an // exception-specification. [...] - for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(), - BaseEnd = ClassDecl->bases_end(); - Base != BaseEnd; - ++Base) { + for (const auto &Base : ClassDecl->bases()) { // Virtual bases are handled below. - if (Base->isVirtual()) + if (Base.isVirtual()) continue; CXXRecordDecl *BaseClassDecl - = cast(Base->getType()->getAs()->getDecl()); + = cast(Base.getType()->getAs()->getDecl()); if (CXXConstructorDecl *CopyConstructor = LookupCopyingConstructor(BaseClassDecl, Quals)) - ExceptSpec.CalledDecl(Base->getLocStart(), CopyConstructor); + ExceptSpec.CalledDecl(Base.getLocStart(), CopyConstructor); } for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(), BaseEnd = ClassDecl->vbases_end(); @@ -10177,20 +10144,18 @@ Sema::ComputeDefaultedMoveCtorExceptionSpec(CXXMethodDecl *MD) { return ExceptSpec; // Direct base-class constructors. - for (CXXRecordDecl::base_class_iterator B = ClassDecl->bases_begin(), - BEnd = ClassDecl->bases_end(); - B != BEnd; ++B) { - if (B->isVirtual()) // Handled below. + for (const auto &B : ClassDecl->bases()) { + if (B.isVirtual()) // Handled below. continue; - if (const RecordType *BaseType = B->getType()->getAs()) { + if (const RecordType *BaseType = B.getType()->getAs()) { CXXRecordDecl *BaseClassDecl = cast(BaseType->getDecl()); CXXConstructorDecl *Constructor = LookupMovingConstructor(BaseClassDecl, 0); // If this is a deleted function, add it anyway. This might be conformant // with the standard. This might not. I'm not sure. It might not matter. if (Constructor) - ExceptSpec.CalledDecl(B->getLocStart(), Constructor); + ExceptSpec.CalledDecl(B.getLocStart(), Constructor); } } @@ -12436,10 +12401,9 @@ void Sema::MarkVirtualMembersReferenced(SourceLocation Loc, if (RD->getNumVBases() == 0) return; - for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(), - e = RD->bases_end(); i != e; ++i) { + for (const auto &I : RD->bases()) { const CXXRecordDecl *Base = - cast(i->getType()->getAs()->getDecl()); + cast(I.getType()->getAs()->getDecl()); if (Base->getNumVBases() == 0) continue; MarkVirtualMembersReferenced(Loc, Base); diff --git a/lib/Sema/SemaExprMember.cpp b/lib/Sema/SemaExprMember.cpp index 7d2426be87..9c6877e0e1 100644 --- a/lib/Sema/SemaExprMember.cpp +++ b/lib/Sema/SemaExprMember.cpp @@ -559,11 +559,9 @@ class RecordMemberExprValidatorCCC : public CorrectionCandidateCallback { if (const CXXRecordDecl *RD = dyn_cast(Record)) { // Accept candidates that occur in any of the current class' base classes. - for (CXXRecordDecl::base_class_const_iterator BS = RD->bases_begin(), - BSEnd = RD->bases_end(); - BS != BSEnd; ++BS) { + for (const auto &BS : RD->bases()) { if (const RecordType *BSTy = dyn_cast_or_null( - BS->getType().getTypePtrOrNull())) { + BS.getType().getTypePtrOrNull())) { if (BSTy->getDecl()->containsDecl(ND)) return true; } diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index b8f5583f25..382901667e 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -6263,10 +6263,8 @@ static bool DiagnoseUninitializedReference(Sema &S, SourceLocation Loc, } } - for (CXXRecordDecl::base_class_iterator BI = RD->bases_begin(), - BE = RD->bases_end(); - BI != BE; ++BI) { - if (DiagnoseUninitializedReference(S, BI->getLocStart(), BI->getType())) { + for (const auto &BI : RD->bases()) { + if (DiagnoseUninitializedReference(S, BI.getLocStart(), BI.getType())) { S.Diag(Loc, diag::note_value_initialization_here) << RD; return true; } diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp index 2ace8c2769..0e31606aaf 100644 --- a/lib/Sema/SemaLookup.cpp +++ b/lib/Sema/SemaLookup.cpp @@ -2069,10 +2069,8 @@ addAssociatedClassesAndNamespaces(AssociatedLookup &Result, Class = Bases.pop_back_val(); // Visit the base classes. - for (CXXRecordDecl::base_class_iterator Base = Class->bases_begin(), - BaseEnd = Class->bases_end(); - Base != BaseEnd; ++Base) { - const RecordType *BaseType = Base->getType()->getAs(); + for (const auto &Base : Class->bases()) { + const RecordType *BaseType = Base.getType()->getAs(); // In dependent contexts, we do ADL twice, and the first time around, // the base type might be a dependent TemplateSpecializationType, or a // TemplateTypeParmType. If that happens, simply ignore it. @@ -3094,10 +3092,8 @@ static void LookupVisibleDecls(DeclContext *Ctx, LookupResult &Result, if (!Record->hasDefinition()) return; - for (CXXRecordDecl::base_class_iterator B = Record->bases_begin(), - BEnd = Record->bases_end(); - B != BEnd; ++B) { - QualType BaseType = B->getType(); + for (const auto &B : Record->bases()) { + QualType BaseType = B.getType(); // Don't look into dependent bases, because name lookup can't look // there anyway. diff --git a/lib/Sema/SemaTemplateDeduction.cpp b/lib/Sema/SemaTemplateDeduction.cpp index ef325b04ed..8a0589a747 100644 --- a/lib/Sema/SemaTemplateDeduction.cpp +++ b/lib/Sema/SemaTemplateDeduction.cpp @@ -1472,12 +1472,10 @@ DeduceTemplateArgumentsByTypeMatch(Sema &S, // Visit base classes CXXRecordDecl *Next = cast(NextT->getDecl()); - for (CXXRecordDecl::base_class_iterator Base = Next->bases_begin(), - BaseEnd = Next->bases_end(); - Base != BaseEnd; ++Base) { - assert(Base->getType()->isRecordType() && + for (const auto &Base : Next->bases()) { + assert(Base.getType()->isRecordType() && "Base class that isn't a record?"); - ToVisit.push_back(Base->getType()->getAs()); + ToVisit.push_back(Base.getType()->getAs()); } } diff --git a/lib/Sema/SemaTemplateInstantiate.cpp b/lib/Sema/SemaTemplateInstantiate.cpp index 7faaecefa8..7b3fc77eb0 100644 --- a/lib/Sema/SemaTemplateInstantiate.cpp +++ b/lib/Sema/SemaTemplateInstantiate.cpp @@ -1818,31 +1818,29 @@ Sema::SubstBaseSpecifiers(CXXRecordDecl *Instantiation, const MultiLevelTemplateArgumentList &TemplateArgs) { bool Invalid = false; SmallVector InstantiatedBases; - for (ClassTemplateSpecializationDecl::base_class_iterator - Base = Pattern->bases_begin(), BaseEnd = Pattern->bases_end(); - Base != BaseEnd; ++Base) { - if (!Base->getType()->isDependentType()) { - if (const CXXRecordDecl *RD = Base->getType()->getAsCXXRecordDecl()) { + for (const auto Base : Pattern->bases()) { + if (!Base.getType()->isDependentType()) { + if (const CXXRecordDecl *RD = Base.getType()->getAsCXXRecordDecl()) { if (RD->isInvalidDecl()) Instantiation->setInvalidDecl(); } - InstantiatedBases.push_back(new (Context) CXXBaseSpecifier(*Base)); + InstantiatedBases.push_back(new (Context) CXXBaseSpecifier(Base)); continue; } SourceLocation EllipsisLoc; TypeSourceInfo *BaseTypeLoc; - if (Base->isPackExpansion()) { + if (Base.isPackExpansion()) { // This is a pack expansion. See whether we should expand it now, or // wait until later. SmallVector Unexpanded; - collectUnexpandedParameterPacks(Base->getTypeSourceInfo()->getTypeLoc(), + collectUnexpandedParameterPacks(Base.getTypeSourceInfo()->getTypeLoc(), Unexpanded); bool ShouldExpand = false; bool RetainExpansion = false; Optional NumExpansions; - if (CheckParameterPacksForExpansion(Base->getEllipsisLoc(), - Base->getSourceRange(), + if (CheckParameterPacksForExpansion(Base.getEllipsisLoc(), + Base.getSourceRange(), Unexpanded, TemplateArgs, ShouldExpand, RetainExpansion, @@ -1856,9 +1854,9 @@ Sema::SubstBaseSpecifiers(CXXRecordDecl *Instantiation, for (unsigned I = 0; I != *NumExpansions; ++I) { Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(*this, I); - TypeSourceInfo *BaseTypeLoc = SubstType(Base->getTypeSourceInfo(), + TypeSourceInfo *BaseTypeLoc = SubstType(Base.getTypeSourceInfo(), TemplateArgs, - Base->getSourceRange().getBegin(), + Base.getSourceRange().getBegin(), DeclarationName()); if (!BaseTypeLoc) { Invalid = true; @@ -1867,9 +1865,9 @@ Sema::SubstBaseSpecifiers(CXXRecordDecl *Instantiation, if (CXXBaseSpecifier *InstantiatedBase = CheckBaseSpecifier(Instantiation, - Base->getSourceRange(), - Base->isVirtual(), - Base->getAccessSpecifierAsWritten(), + Base.getSourceRange(), + Base.isVirtual(), + Base.getAccessSpecifierAsWritten(), BaseTypeLoc, SourceLocation())) InstantiatedBases.push_back(InstantiatedBase); @@ -1881,16 +1879,16 @@ Sema::SubstBaseSpecifiers(CXXRecordDecl *Instantiation, } // The resulting base specifier will (still) be a pack expansion. - EllipsisLoc = Base->getEllipsisLoc(); + EllipsisLoc = Base.getEllipsisLoc(); Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(*this, -1); - BaseTypeLoc = SubstType(Base->getTypeSourceInfo(), + BaseTypeLoc = SubstType(Base.getTypeSourceInfo(), TemplateArgs, - Base->getSourceRange().getBegin(), + Base.getSourceRange().getBegin(), DeclarationName()); } else { - BaseTypeLoc = SubstType(Base->getTypeSourceInfo(), + BaseTypeLoc = SubstType(Base.getTypeSourceInfo(), TemplateArgs, - Base->getSourceRange().getBegin(), + Base.getSourceRange().getBegin(), DeclarationName()); } @@ -1901,9 +1899,9 @@ Sema::SubstBaseSpecifiers(CXXRecordDecl *Instantiation, if (CXXBaseSpecifier *InstantiatedBase = CheckBaseSpecifier(Instantiation, - Base->getSourceRange(), - Base->isVirtual(), - Base->getAccessSpecifierAsWritten(), + Base.getSourceRange(), + Base.isVirtual(), + Base.getAccessSpecifierAsWritten(), BaseTypeLoc, EllipsisLoc)) InstantiatedBases.push_back(InstantiatedBase); diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index 1dadde8da0..f91778f828 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -5327,12 +5327,11 @@ bool Sema::RequireLiteralType(SourceLocation Loc, QualType T, !RD->hasTrivialDefaultConstructor()) { Diag(RD->getLocation(), diag::note_non_literal_no_constexpr_ctors) << RD; } else if (RD->hasNonLiteralTypeFieldsOrBases()) { - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - if (!I->getType()->isLiteralType(Context)) { - Diag(I->getLocStart(), + for (const auto &I : RD->bases()) { + if (!I.getType()->isLiteralType(Context)) { + Diag(I.getLocStart(), diag::note_non_literal_base_class) - << RD << I->getType() << I->getSourceRange(); + << RD << I.getType() << I.getSourceRange(); return true; } } diff --git a/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp b/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp index a805850158..0551c75feb 100644 --- a/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp @@ -201,9 +201,7 @@ static bool IsPartOfAST(const CXXRecordDecl *R) { if (IsClangStmt(R) || IsClangType(R) || IsClangDecl(R) || IsClangAttr(R)) return true; - for (CXXRecordDecl::base_class_const_iterator I = R->bases_begin(), - E = R->bases_end(); I!=E; ++I) { - CXXBaseSpecifier BS = *I; + for (const auto &BS : R->bases()) { QualType T = BS.getType(); if (const RecordType *baseT = T->getAs()) { CXXRecordDecl *baseD = cast(baseT->getDecl()); diff --git a/lib/StaticAnalyzer/Core/MemRegion.cpp b/lib/StaticAnalyzer/Core/MemRegion.cpp index c9b96e4a48..8f6c373138 100644 --- a/lib/StaticAnalyzer/Core/MemRegion.cpp +++ b/lib/StaticAnalyzer/Core/MemRegion.cpp @@ -975,10 +975,8 @@ static bool isValidBaseClass(const CXXRecordDecl *BaseClass, if (IsVirtual) return Class->isVirtuallyDerivedFrom(BaseClass); - for (CXXRecordDecl::base_class_const_iterator I = Class->bases_begin(), - E = Class->bases_end(); - I != E; ++I) { - if (I->getType()->getAsCXXRecordDecl()->getCanonicalDecl() == BaseClass) + for (const auto &I : Class->bases()) { + if (I.getType()->getAsCXXRecordDecl()->getCanonicalDecl() == BaseClass) return true; } @@ -1176,10 +1174,8 @@ static bool isImmediateBase(const CXXRecordDecl *Child, // Note that we do NOT canonicalize the base class here, because // ASTRecordLayout doesn't either. If that leads us down the wrong path, // so be it; at least we won't crash. - for (CXXRecordDecl::base_class_const_iterator I = Child->bases_begin(), - E = Child->bases_end(); - I != E; ++I) { - if (I->getType()->getAsCXXRecordDecl() == Base) + for (const auto &I : Child->bases()) { + if (I.getType()->getAsCXXRecordDecl() == Base) return true; } diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 642c1ac4a8..456bdcc553 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -1660,9 +1660,8 @@ bool CursorVisitor::VisitCXXRecordDecl(CXXRecordDecl *D) { return true; if (D->isCompleteDefinition()) { - for (CXXRecordDecl::base_class_iterator I = D->bases_begin(), - E = D->bases_end(); I != E; ++I) { - if (Visit(cxcursor::MakeCursorCXXBaseSpecifier(I, TU))) + for (const auto &I : D->bases()) { + if (Visit(cxcursor::MakeCursorCXXBaseSpecifier(&I, TU))) return true; } } diff --git a/tools/libclang/IndexingContext.cpp b/tools/libclang/IndexingContext.cpp index ef3921301c..1637843a1b 100644 --- a/tools/libclang/IndexingContext.cpp +++ b/tools/libclang/IndexingContext.cpp @@ -123,9 +123,7 @@ AttrListInfo::create(const Decl *D, IndexingContext &IdxCtx) { IndexingContext::CXXBasesListInfo::CXXBasesListInfo(const CXXRecordDecl *D, IndexingContext &IdxCtx, ScratchAlloc &SA) { - for (CXXRecordDecl::base_class_const_iterator - I = D->bases_begin(), E = D->bases_end(); I != E; ++I) { - const CXXBaseSpecifier &Base = *I; + for (const auto &Base : D->bases()) { BaseEntities.push_back(EntityInfo()); const NamedDecl *BaseD = 0; QualType T = Base.getType(); -- 2.40.0