-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[clang][ASTMatcher] Handle variable templates in isInstantiated and isInTemplateInstantiation matchers
#110666
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[clang][ASTMatcher] Handle variable templates in isInstantiated and isInTemplateInstantiation matchers
#110666
Conversation
|
@llvm/pr-subscribers-clang Author: Fred Tingaud (frederic-tingaud-sonarsource) ChangesFix Full diff: https://github.com/llvm/llvm-project/pull/110666.diff 2 Files Affected:
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;
|
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
…tion matchers Fix isInstantiated and isInTemplateInstantiation matchers, so they return true for instantiations of variable templates, and any declaration in statements contained in such instantiations.
d30b8c9 to
be911d8
Compare
isInstantiated and isInTemplateInstantiation matchersisInstantiated and isInTemplateInstantiation matchers
isInstantiated and isInTemplateInstantiation matchersisInstantiated and isInTemplateInstantiation matchers
|
@AaronBallman, I think you are the maintainer for this part of the code. Could you help me find somebody who could review the PR? |
AaronBallman
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM! Sorry for the delayed review while I was out. No need to re-run the documentation macro because the public interfaces nor doc comments changed, and I think the existing doc comments are sufficient.
Do you need me to land the changes on your behalf?
|
Thanks @AaronBallman! |
… `isInTemplateInstantiation` matchers (llvm#110666) Fix `isInstantiated` and `isInTemplateInstantiation` matchers, so they return true for instantiations of variable templates, and any declaration in statements contained in such instantiations.
… `isInTemplateInstantiation` matchers (llvm#110666) Fix `isInstantiated` and `isInTemplateInstantiation` matchers, so they return true for instantiations of variable templates, and any declaration in statements contained in such instantiations.
Fix
isInstantiatedandisInTemplateInstantiationmatchers, so they return true for instantiations of variable templates, and any declaration in statements contained in such instantiations.