diff --git a/include/clang/AST/DeclCXX.h b/include/clang/AST/DeclCXX.h index 994f5a455620539d5424de365dac5956f4f77283..db751b227586b49f4997b8e5be5aee1191a697a4 100644 --- a/include/clang/AST/DeclCXX.h +++ b/include/clang/AST/DeclCXX.h @@ -730,6 +730,10 @@ public: /// Iterator access to constructor members. typedef specific_decl_iterator<CXXConstructorDecl> ctor_iterator; + typedef llvm::iterator_range<specific_decl_iterator<CXXConstructorDecl>> + ctor_range; + + ctor_range ctors() const { return ctor_range(ctor_begin(), ctor_end()); } ctor_iterator ctor_begin() const { return ctor_iterator(decls_begin()); diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 5b85d1d23522031f36000918fec8b304122ae813..21b49e7826c7d69452ccbcb99f7c0c90d6c62219 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -5284,10 +5284,9 @@ bool Sema::ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMember CSM, if (!Diagnose) return true; // Find any user-declared move constructor. - for (CXXRecordDecl::ctor_iterator I = RD->ctor_begin(), - E = RD->ctor_end(); I != E; ++I) { + for (auto *I : RD->ctors()) { if (I->isMoveConstructor()) { - UserDeclaredMove = *I; + UserDeclaredMove = I; break; } } @@ -5393,11 +5392,10 @@ static bool findTrivialSpecialMember(Sema &S, CXXRecordDecl *RD, CXXConstructorDecl *DefCtor = 0; if (RD->needsImplicitDefaultConstructor()) S.DeclareImplicitDefaultConstructor(RD); - for (CXXRecordDecl::ctor_iterator CI = RD->ctor_begin(), - CE = RD->ctor_end(); CI != CE; ++CI) { + for (auto *CI : RD->ctors()) { if (!CI->isDefaultConstructor()) continue; - DefCtor = *CI; + DefCtor = CI; if (!DefCtor->isUserProvided()) break; } @@ -5486,10 +5484,9 @@ static bool findTrivialSpecialMember(Sema &S, CXXRecordDecl *RD, } static CXXConstructorDecl *findUserDeclaredCtor(CXXRecordDecl *RD) { - for (CXXRecordDecl::ctor_iterator CI = RD->ctor_begin(), CE = RD->ctor_end(); - CI != CE; ++CI) + for (auto *CI : RD->ctors()) if (!CI->isImplicit()) - return *CI; + return CI; // Look for constructor templates. typedef CXXRecordDecl::specific_decl_iterator<FunctionTemplateDecl> tmpl_iter; @@ -8296,10 +8293,8 @@ private: /// Process all constructors for a class. void visitAll(const CXXRecordDecl *RD, VisitFn Callback) { - for (CXXRecordDecl::ctor_iterator CtorIt = RD->ctor_begin(), - CtorE = RD->ctor_end(); - CtorIt != CtorE; ++CtorIt) - (this->*Callback)(*CtorIt); + for (const auto *Ctor : RD->ctors()) + (this->*Callback)(Ctor); for (CXXRecordDecl::specific_decl_iterator<FunctionTemplateDecl> I(RD->decls_begin()), E(RD->decls_end()); I != E; ++I) { @@ -9290,10 +9285,9 @@ static void diagnoseDeprecatedCopyOperation(Sema &S, CXXMethodDecl *CopyOp, RD->hasUserDeclaredCopyConstructor() && !S.getLangOpts().MSVCCompat) { // Find any user-declared copy constructor. - for (CXXRecordDecl::ctor_iterator I = RD->ctor_begin(), - E = RD->ctor_end(); I != E; ++I) { + for (auto *I : RD->ctors()) { if (I->isCopyConstructor()) { - UserDeclaredOperation = *I; + UserDeclaredOperation = I; break; } } diff --git a/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp b/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp index 800d7c439c8c2dec479e54c6706d43f558474212..9b5c8529df4012f4ac740d8c911ce432e55f118c 100644 --- a/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp @@ -216,8 +216,7 @@ public: WalkAST walker(this, BR, mgr.getAnalysisDeclContext(RD)); // Check the constructors. - for (CXXRecordDecl::ctor_iterator I = RD->ctor_begin(), E = RD->ctor_end(); - I != E; ++I) { + for (const auto *I : RD->ctors()) { if (!I->isCopyOrMoveConstructor()) if (Stmt *Body = I->getBody()) { walker.Visit(Body);