[llvm-branch-commits] [clang] f22c0f4 - [ASTMatchers] Omit methods from explicit template instantations
Stephen Kelly via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Jan 5 09:47:50 PST 2021
Author: Stephen Kelly
Date: 2021-01-05T17:42:33Z
New Revision: f22c0f40b5d657c0293fc9332274c18d3c4f836c
URL: https://github.com/llvm/llvm-project/commit/f22c0f40b5d657c0293fc9332274c18d3c4f836c
DIFF: https://github.com/llvm/llvm-project/commit/f22c0f40b5d657c0293fc9332274c18d3c4f836c.diff
LOG: [ASTMatchers] Omit methods from explicit template instantations
Differential Revision: https://reviews.llvm.org/D94032
Added:
Modified:
clang/lib/ASTMatchers/ASTMatchFinder.cpp
clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/ASTMatchers/ASTMatchFinder.cpp b/clang/lib/ASTMatchers/ASTMatchFinder.cpp
index 54dc874470dd..99d95838af61 100644
--- a/clang/lib/ASTMatchers/ASTMatchFinder.cpp
+++ b/clang/lib/ASTMatchers/ASTMatchFinder.cpp
@@ -1158,6 +1158,8 @@ bool MatchASTVisitor::TraverseDecl(Decl *DeclNode) {
} else if (const auto *FD = dyn_cast<FunctionDecl>(DeclNode)) {
if (FD->isDefaulted())
ScopedChildren = true;
+ if (FD->isTemplateInstantiation())
+ ScopedTraversal = true;
}
ASTNodeNotSpelledInSourceScope RAII1(this, ScopedTraversal);
diff --git a/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
index cde3e460eeb0..e706ea4b2a54 100644
--- a/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
+++ b/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
@@ -2201,10 +2201,18 @@ struct TemplStruct {
TemplStruct() {}
~TemplStruct() {}
+ void outOfLine(T);
+
private:
T m_t;
};
+template<typename T>
+void TemplStruct<T>::outOfLine(T)
+{
+
+}
+
template<typename T>
T timesTwo(T input)
{
@@ -2277,7 +2285,7 @@ template<> bool timesTwo<bool>(bool){
hasTemplateArgument(0, refersToType(asString("float"))));
EXPECT_TRUE(matches(Code, traverse(TK_AsIs, MTempl)));
// TODO: If we could match on explicit instantiations of function templates,
- // this would be EXPECT_TRUE.
+ // this would be EXPECT_TRUE. See Sema::ActOnExplicitInstantiation.
EXPECT_FALSE(
matches(Code, traverse(TK_IgnoreUnlessSpelledInSource, MTempl)));
}
@@ -2324,6 +2332,14 @@ template<> bool timesTwo<bool>(bool){
EXPECT_TRUE(matches(Code, traverse(TK_AsIs, M)));
EXPECT_FALSE(matches(Code, traverse(TK_IgnoreUnlessSpelledInSource, M)));
}
+ {
+ // Instantiated, out-of-line methods are not matchable.
+ auto M =
+ cxxMethodDecl(hasName("outOfLine"), isDefinition(),
+ hasParameter(0, parmVarDecl(hasType(asString("float")))));
+ EXPECT_TRUE(matches(Code, traverse(TK_AsIs, M)));
+ EXPECT_FALSE(matches(Code, traverse(TK_IgnoreUnlessSpelledInSource, M)));
+ }
{
// Explicit specialization is written in source and it matches:
auto M = classTemplateSpecializationDecl(
More information about the llvm-branch-commits
mailing list