From 1cf851b9bb57f99150440865b2506772b1cf3870 Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Thu, 13 Mar 2014 17:34:31 +0000 Subject: [PATCH] [C++11] Replacing CXXRecordDecl iterators init_begin() and init_end() with iterator_range inits(). Updating all of the usages of the iterators with range-based for loops. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203819 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DataRecursiveASTVisitor.h | 6 ++---- include/clang/AST/DeclCXX.h | 8 ++++++++ include/clang/AST/RecursiveASTVisitor.h | 6 ++---- include/clang/ASTMatchers/ASTMatchers.h | 6 ++---- lib/AST/DeclPrinter.cpp | 5 +---- lib/AST/ExprConstant.cpp | 21 ++++++++++----------- lib/Analysis/AnalysisDeclContext.cpp | 6 ++---- lib/Sema/SemaDeclCXX.cpp | 18 ++++++------------ lib/Sema/SemaTemplateInstantiateDecl.cpp | 6 +----- tools/libclang/CIndex.cpp | 8 +++----- tools/libclang/IndexDecl.cpp | 5 +---- 11 files changed, 38 insertions(+), 57 deletions(-) diff --git a/include/clang/AST/DataRecursiveASTVisitor.h b/include/clang/AST/DataRecursiveASTVisitor.h index 0d249d126b..a2c37b53ac 100644 --- a/include/clang/AST/DataRecursiveASTVisitor.h +++ b/include/clang/AST/DataRecursiveASTVisitor.h @@ -1776,10 +1776,8 @@ bool DataRecursiveASTVisitor::TraverseFunctionHelper(FunctionDecl *D) { if (CXXConstructorDecl *Ctor = dyn_cast(D)) { // Constructor initializers. - for (CXXConstructorDecl::init_iterator I = Ctor->init_begin(), - E = Ctor->init_end(); - I != E; ++I) { - TRY_TO(TraverseConstructorInitializer(*I)); + for (auto *I : Ctor->inits()) { + TRY_TO(TraverseConstructorInitializer(I)); } } diff --git a/include/clang/AST/DeclCXX.h b/include/clang/AST/DeclCXX.h index 3a41012307..3f1f7ae991 100644 --- a/include/clang/AST/DeclCXX.h +++ b/include/clang/AST/DeclCXX.h @@ -2135,6 +2135,14 @@ public: /// \brief Iterates through the member/base initializer list. typedef CXXCtorInitializer * const * init_const_iterator; + typedef llvm::iterator_range init_range; + typedef llvm::iterator_range init_const_range; + + init_range inits() { return init_range(init_begin(), init_end()); } + init_const_range inits() const { + return init_const_range(init_begin(), init_end()); + } + /// \brief Retrieve an iterator to the first initializer. init_iterator init_begin() { return CtorInitializers; } /// \brief Retrieve an iterator to the first initializer. diff --git a/include/clang/AST/RecursiveASTVisitor.h b/include/clang/AST/RecursiveASTVisitor.h index e370db92c2..d24efbf501 100644 --- a/include/clang/AST/RecursiveASTVisitor.h +++ b/include/clang/AST/RecursiveASTVisitor.h @@ -1827,10 +1827,8 @@ bool RecursiveASTVisitor::TraverseFunctionHelper(FunctionDecl *D) { if (CXXConstructorDecl *Ctor = dyn_cast(D)) { // Constructor initializers. - for (CXXConstructorDecl::init_iterator I = Ctor->init_begin(), - E = Ctor->init_end(); - I != E; ++I) { - TRY_TO(TraverseConstructorInitializer(*I)); + for (auto *I : Ctor->inits()) { + TRY_TO(TraverseConstructorInitializer(I)); } } diff --git a/include/clang/ASTMatchers/ASTMatchers.h b/include/clang/ASTMatchers/ASTMatchers.h index 3f00ec1954..13d0ba2d0e 100644 --- a/include/clang/ASTMatchers/ASTMatchers.h +++ b/include/clang/ASTMatchers/ASTMatchers.h @@ -3511,11 +3511,9 @@ AST_MATCHER_P(CXXConstructorDecl, forEachConstructorInitializer, internal::Matcher, InnerMatcher) { BoundNodesTreeBuilder Result; bool Matched = false; - for (CXXConstructorDecl::init_const_iterator I = Node.init_begin(), - E = Node.init_end(); - I != E; ++I) { + for (const auto *I : Node.inits()) { BoundNodesTreeBuilder InitBuilder(*Builder); - if (InnerMatcher.matches(**I, Finder, &InitBuilder)) { + if (InnerMatcher.matches(*I, Finder, &InitBuilder)) { Matched = true; Result.addMatch(InitBuilder); } diff --git a/lib/AST/DeclPrinter.cpp b/lib/AST/DeclPrinter.cpp index ac75ae245e..bdece950cb 100644 --- a/lib/AST/DeclPrinter.cpp +++ b/lib/AST/DeclPrinter.cpp @@ -490,10 +490,7 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) { if (CDecl) { bool HasInitializerList = false; - for (CXXConstructorDecl::init_const_iterator B = CDecl->init_begin(), - E = CDecl->init_end(); - B != E; ++B) { - CXXCtorInitializer *BMInitializer = (*B); + for (const auto *BMInitializer : CDecl->inits()) { if (BMInitializer->isInClassMemberInitializer()) continue; diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index 98c946af0b..ecbce91fe3 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -3686,15 +3686,14 @@ static bool HandleConstructorCall(SourceLocation CallLoc, const LValue &This, #ifndef NDEBUG CXXRecordDecl::base_class_const_iterator BaseIt = RD->bases_begin(); #endif - for (CXXConstructorDecl::init_const_iterator I = Definition->init_begin(), - E = Definition->init_end(); I != E; ++I) { + for (const auto *I : Definition->inits()) { LValue Subobject = This; APValue *Value = &Result; // Determine the subobject to initialize. FieldDecl *FD = 0; - if ((*I)->isBaseInitializer()) { - QualType BaseType((*I)->getBaseClass(), 0); + if (I->isBaseInitializer()) { + QualType BaseType(I->getBaseClass(), 0); #ifndef NDEBUG // Non-virtual base classes are initialized in the order in the class // definition. We have already checked for virtual base classes. @@ -3703,12 +3702,12 @@ static bool HandleConstructorCall(SourceLocation CallLoc, const LValue &This, "base class initializers not in expected order"); ++BaseIt; #endif - if (!HandleLValueDirectBase(Info, (*I)->getInit(), Subobject, RD, + if (!HandleLValueDirectBase(Info, I->getInit(), Subobject, RD, BaseType->getAsCXXRecordDecl(), &Layout)) return false; Value = &Result.getStructBase(BasesSeen++); - } else if ((FD = (*I)->getMember())) { - if (!HandleLValueMember(Info, (*I)->getInit(), Subobject, FD, &Layout)) + } else if ((FD = I->getMember())) { + if (!HandleLValueMember(Info, I->getInit(), Subobject, FD, &Layout)) return false; if (RD->isUnion()) { Result = APValue(FD); @@ -3716,7 +3715,7 @@ static bool HandleConstructorCall(SourceLocation CallLoc, const LValue &This, } else { Value = &Result.getStructField(FD->getFieldIndex()); } - } else if (IndirectFieldDecl *IFD = (*I)->getIndirectMember()) { + } else if (IndirectFieldDecl *IFD = I->getIndirectMember()) { // Walk the indirect field decl's chain to find the object to initialize, // and make sure we've initialized every step along it. for (auto *C : IFD->chain()) { @@ -3735,7 +3734,7 @@ static bool HandleConstructorCall(SourceLocation CallLoc, const LValue &This, *Value = APValue(APValue::UninitStruct(), CD->getNumBases(), std::distance(CD->field_begin(), CD->field_end())); } - if (!HandleLValueMember(Info, (*I)->getInit(), Subobject, FD)) + if (!HandleLValueMember(Info, I->getInit(), Subobject, FD)) return false; if (CD->isUnion()) Value = &Value->getUnionValue(); @@ -3747,8 +3746,8 @@ static bool HandleConstructorCall(SourceLocation CallLoc, const LValue &This, } FullExpressionRAII InitScope(Info); - if (!EvaluateInPlace(*Value, Info, Subobject, (*I)->getInit()) || - (FD && FD->isBitField() && !truncateBitfieldValue(Info, (*I)->getInit(), + if (!EvaluateInPlace(*Value, Info, Subobject, I->getInit()) || + (FD && FD->isBitField() && !truncateBitfieldValue(Info, I->getInit(), *Value, FD))) { // If we're checking for a potential constant expression, evaluate all // initializers even if some of them fail. diff --git a/lib/Analysis/AnalysisDeclContext.cpp b/lib/Analysis/AnalysisDeclContext.cpp index baac6c18fa..1cc87d1a69 100644 --- a/lib/Analysis/AnalysisDeclContext.cpp +++ b/lib/Analysis/AnalysisDeclContext.cpp @@ -242,10 +242,8 @@ ParentMap &AnalysisDeclContext::getParentMap() { if (!PM) { PM.reset(new ParentMap(getBody())); if (const CXXConstructorDecl *C = dyn_cast(getDecl())) { - for (CXXConstructorDecl::init_const_iterator I = C->init_begin(), - E = C->init_end(); - I != E; ++I) { - PM->addStmt((*I)->getInit()); + for (const auto *I : C->inits()) { + PM->addStmt(I->getInit()); } } if (builtCFG) diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 21b49e7826..da1664319b 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -1155,12 +1155,10 @@ bool Sema::CheckConstexprFunctionBody(const FunctionDecl *Dcl, Stmt *Body) { // always initialized so do not need to be checked. Dependent bases // might not have initializers in the member initializer list. llvm::SmallSet Inits; - for (CXXConstructorDecl::init_const_iterator - I = Constructor->init_begin(), E = Constructor->init_end(); - I != E; ++I) { - if (FieldDecl *FD = (*I)->getMember()) + for (const auto *I: Constructor->inits()) { + if (FieldDecl *FD = I->getMember()) Inits.insert(FD); - else if (IndirectFieldDecl *ID = (*I)->getIndirectMember()) + else if (IndirectFieldDecl *ID = I->getIndirectMember()) Inits.insert(ID->chain_begin(), ID->chain_end()); } @@ -2322,17 +2320,13 @@ namespace { } } - for (CXXConstructorDecl::init_const_iterator FieldInit = - Constructor->init_begin(), - FieldInitEnd = Constructor->init_end(); - FieldInit != FieldInitEnd; ++FieldInit) { - - Expr *InitExpr = (*FieldInit)->getInit(); + for (const auto *FieldInit : Constructor->inits()) { + Expr *InitExpr = FieldInit->getInit(); CheckInitExprContainsUninitializedFields( SemaRef, InitExpr, UninitializedFields, Constructor); - if (FieldDecl *Field = (*FieldInit)->getAnyMember()) + if (FieldDecl *Field = FieldInit->getAnyMember()) UninitializedFields.erase(Field); } } diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index 4f78ae7636..d33613301d 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -4005,11 +4005,7 @@ Sema::InstantiateMemInitializers(CXXConstructorDecl *New, bool AnyErrors = Tmpl->isInvalidDecl(); // Instantiate all the initializers. - for (CXXConstructorDecl::init_const_iterator Inits = Tmpl->init_begin(), - InitsEnd = Tmpl->init_end(); - Inits != InitsEnd; ++Inits) { - CXXCtorInitializer *Init = *Inits; - + for (const auto *Init : Tmpl->inits()) { // Only instantiate written initializers, let Sema re-construct implicit // ones. if (!Init->isWritten()) diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 456bdcc553..67bcff963f 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -812,13 +812,11 @@ bool CursorVisitor::VisitFunctionDecl(FunctionDecl *ND) { if (CXXConstructorDecl *Constructor = dyn_cast(ND)) { // Find the initializers that were written in the source. SmallVector WrittenInits; - for (CXXConstructorDecl::init_iterator I = Constructor->init_begin(), - IEnd = Constructor->init_end(); - I != IEnd; ++I) { - if (!(*I)->isWritten()) + for (auto *I : Constructor->inits()) { + if (!I->isWritten()) continue; - WrittenInits.push_back(*I); + WrittenInits.push_back(I); } // Sort the initializers in source order diff --git a/tools/libclang/IndexDecl.cpp b/tools/libclang/IndexDecl.cpp index fbcd2d07a9..a8911f1414 100644 --- a/tools/libclang/IndexDecl.cpp +++ b/tools/libclang/IndexDecl.cpp @@ -71,10 +71,7 @@ public: if (const CXXConstructorDecl *Ctor = dyn_cast(D)) { // Constructor initializers. - for (CXXConstructorDecl::init_const_iterator I = Ctor->init_begin(), - E = Ctor->init_end(); - I != E; ++I) { - CXXCtorInitializer *Init = *I; + for (const auto *Init : Ctor->inits()) { if (Init->isWritten()) { IndexCtx.indexTypeSourceInfo(Init->getTypeSourceInfo(), D); if (const FieldDecl *Member = Init->getAnyMember()) -- 2.40.0