diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2017-12-17 23:52:45 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2017-12-17 23:52:45 +0000 |
commit | acfa339e15855e90b748fdb1c5081c8a6a49cdbb (patch) | |
tree | 06eb95bc52bb23a0d8b310099556e5c293e70a2b /clang/lib/AST/CXXInheritance.cpp | |
parent | 3603de2fa22288e5d9237277ead132ca07e3c0a6 (diff) | |
download | llvm-acfa339e15855e90b748fdb1c5081c8a6a49cdbb.zip llvm-acfa339e15855e90b748fdb1c5081c8a6a49cdbb.tar.gz llvm-acfa339e15855e90b748fdb1c5081c8a6a49cdbb.tar.bz2 |
Refactor overridden methods iteration to avoid double lookups.
Convert most uses to range-for loops. No functionality change intended.
llvm-svn: 320954
Diffstat (limited to 'clang/lib/AST/CXXInheritance.cpp')
-rw-r--r-- | clang/lib/AST/CXXInheritance.cpp | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/clang/lib/AST/CXXInheritance.cpp b/clang/lib/AST/CXXInheritance.cpp index 4f9f1da..24e96ba 100644 --- a/clang/lib/AST/CXXInheritance.cpp +++ b/clang/lib/AST/CXXInheritance.cpp @@ -650,9 +650,11 @@ void FinalOverriderCollector::Collect(const CXXRecordDecl *RD, continue; CXXMethodDecl *CanonM = cast<CXXMethodDecl>(M->getCanonicalDecl()); + using OverriddenMethodsRange = + llvm::iterator_range<CXXMethodDecl::method_iterator>; + OverriddenMethodsRange OverriddenMethods = CanonM->overridden_methods(); - if (CanonM->begin_overridden_methods() - == CanonM->end_overridden_methods()) { + if (OverriddenMethods.begin() == OverriddenMethods.end()) { // This is a new virtual function that does not override any // other virtual function. Add it to the map of virtual // functions for which we are tracking overridders. @@ -671,11 +673,7 @@ void FinalOverriderCollector::Collect(const CXXRecordDecl *RD, // overrider. To do so, we dig down to the original virtual // functions using data recursion and update all of the methods it // overrides. - using OverriddenMethods = - llvm::iterator_range<CXXMethodDecl::method_iterator>; - SmallVector<OverriddenMethods, 4> Stack; - Stack.push_back(llvm::make_range(CanonM->begin_overridden_methods(), - CanonM->end_overridden_methods())); + SmallVector<OverriddenMethodsRange, 4> Stack(1, OverriddenMethods); while (!Stack.empty()) { for (const CXXMethodDecl *OM : Stack.pop_back_val()) { const CXXMethodDecl *CanonOM = OM->getCanonicalDecl(); @@ -693,14 +691,13 @@ void FinalOverriderCollector::Collect(const CXXRecordDecl *RD, UniqueVirtualMethod(CanonM, SubobjectNumber, InVirtualSubobject)); - if (CanonOM->begin_overridden_methods() - == CanonOM->end_overridden_methods()) + auto OverriddenMethods = CanonOM->overridden_methods(); + if (OverriddenMethods.begin() == OverriddenMethods.end()) continue; // Continue recursion to the methods that this virtual method // overrides. - Stack.push_back(llvm::make_range(CanonOM->begin_overridden_methods(), - CanonOM->end_overridden_methods())); + Stack.push_back(OverriddenMethods); } } |