[clang] Handle variable templates in `isInstantiated` and `isInTemplateInstantiation` matchers (PR #110666)
Fred Tingaud via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 1 06:25:23 PDT 2024
https://github.com/frederic-tingaud-sonarsource created https://github.com/llvm/llvm-project/pull/110666
Fix `isInstantiated` and `isInTemplateInstantiation` matchers, so they return true for instantiations of variable templates, and any declaration in statements contained in such instantiations.
>From d30b8c9893479482eec7e1cd43bf8ebc5196d042 Mon Sep 17 00:00:00 2001
From: Tomasz Kaminski <tomasz.kaminski at sonarsource.com>
Date: Fri, 27 Sep 2024 15:11:14 +0200
Subject: [PATCH] Handle variable templates in `isInstantiated` and
`isInTemplateInstantiation` matchers
Fix `isInstantiated` and `isInTemplateInstantiation` matchers,
so they return true for instantitions of the variable template,
and any declaration in statement contained in such instantiation.
---
clang/include/clang/ASTMatchers/ASTMatchers.h | 6 ++-
.../ASTMatchers/ASTMatchersNarrowingTest.cpp | 41 +++++++++++++++++++
2 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h
index f1c72efc238784..2ba3542ec1ae51 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchers.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -6750,7 +6750,8 @@ AST_POLYMORPHIC_MATCHER(isTemplateInstantiation,
/// matches 'A(int) {...};' and 'A(unsigned) {...}'.
AST_MATCHER_FUNCTION(internal::Matcher<Decl>, isInstantiated) {
auto IsInstantiation = decl(anyOf(cxxRecordDecl(isTemplateInstantiation()),
- functionDecl(isTemplateInstantiation())));
+ functionDecl(isTemplateInstantiation()),
+ varDecl(isTemplateInstantiation())));
return decl(anyOf(IsInstantiation, hasAncestor(IsInstantiation)));
}
@@ -6771,7 +6772,8 @@ AST_MATCHER_FUNCTION(internal::Matcher<Decl>, isInstantiated) {
AST_MATCHER_FUNCTION(internal::Matcher<Stmt>, isInTemplateInstantiation) {
return stmt(
hasAncestor(decl(anyOf(cxxRecordDecl(isTemplateInstantiation()),
- functionDecl(isTemplateInstantiation())))));
+ functionDecl(isTemplateInstantiation()),
+ varDecl(isTemplateInstantiation())))));
}
/// Matches explicit template specializations of function, class, or
diff --git a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
index 611e1f9ba5327c..6147dbd37d3b73 100644
--- a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
+++ b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
@@ -3313,6 +3313,47 @@ TEST_P(ASTMatchersTest,
declStmt(isInTemplateInstantiation())));
}
+
+TEST_P(ASTMatchersTest, IsInstantiated_MatchesVariableInstantiation) {
+ if (!GetParam().isCXX14OrLater()) {
+ return;
+ }
+
+ EXPECT_TRUE(
+ matches("template<typename T> int V = 10; void x() { V<int>; }",
+ varDecl(isInstantiated())));
+}
+
+TEST_P(ASTMatchersTest, IsInstantiated_NotMatchesVariableDefinition) {
+ if (!GetParam().isCXX14OrLater()) {
+ return;
+ }
+
+ EXPECT_TRUE(notMatches("template<typename T> int V = 10;",
+ varDecl(isInstantiated())));
+}
+
+TEST_P(ASTMatchersTest,
+ IsInTemplateInstantiation_MatchesVariableInstantiationStmt) {
+ if (!GetParam().isCXX14OrLater()) {
+ return;
+ }
+
+ EXPECT_TRUE(
+ matches("template<typename T> auto V = []() { T i; }; void x() { V<int>(); }",
+ declStmt(isInTemplateInstantiation())));
+}
+
+TEST_P(ASTMatchersTest,
+ IsInTemplateInstantiation_NotMatchesVariableDefinitionStmt) {
+ if (!GetParam().isCXX14OrLater()) {
+ return;
+ }
+
+ EXPECT_TRUE(notMatches("template<typename T> auto V = []() { T i; };",
+ declStmt(isInTemplateInstantiation())));
+}
+
TEST_P(ASTMatchersTest, IsInTemplateInstantiation_Sharing) {
if (!GetParam().isCXX()) {
return;
More information about the cfe-commits
mailing list