diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -34,7 +34,6 @@ #include "clang/AST/LambdaCapture.h" #include "clang/AST/NestedNameSpecifier.h" #include "clang/AST/OperationKinds.h" -#include "clang/AST/ParentMapContext.h" #include "clang/AST/Stmt.h" #include "clang/AST/StmtCXX.h" #include "clang/AST/StmtObjC.h" @@ -3237,16 +3236,19 @@ return false; } -// Returns true if the statement S has a parent declaration that has a -// DeclContext that is inside (or equal to) DC. In a specific use case if DC is -// a FunctionDecl, check if statement S resides in the body of the function. +// Check if there is a declaration that has 'DC' as parent context and is +// referenced from statement 'S' or one of its children. The search is done in +// BFS order through children of 'S'. static bool isAncestorDeclContextOf(const DeclContext *DC, const Stmt *S) { - ParentMapContext &ParentC = DC->getParentASTContext().getParentMapContext(); - DynTypedNodeList Parents = ParentC.getParents(*S); - while (!Parents.empty()) { - if (const Decl *PD = Parents.begin()->get()) - return isAncestorDeclContextOf(DC, PD); - Parents = ParentC.getParents(*Parents.begin()); + SmallVector ToProcess; + ToProcess.push_back(S); + while (!ToProcess.empty()) { + const Stmt *CurrentS = ToProcess.pop_back_val(); + ToProcess.append(CurrentS->child_begin(), CurrentS->child_end()); + if (const auto *DeclRef = dyn_cast(CurrentS)) + if (const Decl *D = DeclRef->getDecl()) + if (isAncestorDeclContextOf(DC, D)) + return true; } return false; }