Skip to content

Commit 53082b0

Browse files
yuhaouykcloudy0717
authored andcommitted
[clang][ASTMatchers] Add arrayTypeLoc ast matcher for ArrayTypeLoc (llvm#168990)
There's `arrayType` matcher for matching `ArrayType`, but no matcher for `ArrayTypeLoc`. This change complements it. Note that there's already `hasElementTypeLoc` matcher, which was declared together with the `hasElementType` matcher.
1 parent 16c789e commit 53082b0

File tree

6 files changed

+48
-0
lines changed

6 files changed

+48
-0
lines changed

clang/docs/LibASTMatchersReference.html

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2449,6 +2449,18 @@ <h2 id="decl-matchers">Node Matchers</h2>
24492449
</pre></td></tr>
24502450

24512451

2452+
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('arrayTypeLoc0')"><a name="arrayTypeLoc0Anchor">arrayTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayTypeLoc.html">ArrayTypeLoc</a>&gt;...</td></tr>
2453+
<tr><td colspan="4" class="doc" id="arrayTypeLoc0"><pre>Matches `ArrayTypeLoc`s.
2454+
2455+
Given
2456+
int a[] = {1, 2};
2457+
int b[3];
2458+
void f() { int c[a[0]]; }
2459+
arrayTypeLoc()
2460+
matches "int a[]", "int b[3]" and "int c[a[0]]".
2461+
</pre></td></tr>
2462+
2463+
24522464
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointerTypeLoc0')"><a name="pointerTypeLoc0Anchor">pointerTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>&gt;...</td></tr>
24532465
<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer `TypeLoc`s.
24542466

clang/docs/ReleaseNotes.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,7 @@ AST Matchers
689689
- Fixed detection of explicit parameter lists in ``LambdaExpr``. (#GH168452)
690690
- Added ``hasExplicitParameters`` for ``LambdaExpr`` as an output attribute to
691691
AST JSON dumps.
692+
- Add ``arrayTypeLoc`` matcher for matching ``ArrayTypeLoc``.
692693

693694
clang-format
694695
------------

clang/include/clang/ASTMatchers/ASTMatchers.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7003,6 +7003,19 @@ AST_MATCHER_P(ReferenceTypeLoc, hasReferentLoc, internal::Matcher<TypeLoc>,
70037003
return ReferentMatcher.matches(Node.getPointeeLoc(), Finder, Builder);
70047004
}
70057005

7006+
/// Matches `ArrayTypeLoc`s.
7007+
///
7008+
/// Given
7009+
/// \code
7010+
/// int a[] = {1, 2};
7011+
/// int b[3];
7012+
/// void f() { int c[a[0]]; }
7013+
/// \endcode
7014+
/// arrayTypeLoc()
7015+
/// matches "int a[]", "int b[3]" and "int c[a[0]]".
7016+
extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, ArrayTypeLoc>
7017+
arrayTypeLoc;
7018+
70067019
/// Matches template specialization `TypeLoc`s.
70077020
///
70087021
/// Given

clang/lib/ASTMatchers/ASTMatchersInternal.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -807,6 +807,7 @@ const internal::VariadicDynCastAllOfMatcher<TypeLoc, PointerTypeLoc>
807807
pointerTypeLoc;
808808
const internal::VariadicDynCastAllOfMatcher<TypeLoc, ReferenceTypeLoc>
809809
referenceTypeLoc;
810+
const internal::VariadicDynCastAllOfMatcher<TypeLoc, ArrayTypeLoc> arrayTypeLoc;
810811
const internal::VariadicDynCastAllOfMatcher<TypeLoc,
811812
TemplateSpecializationTypeLoc>
812813
templateSpecializationTypeLoc;

clang/lib/ASTMatchers/Dynamic/Registry.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ RegistryMaps::RegistryMaps() {
138138
REGISTER_MATCHER(argumentCountAtLeast);
139139
REGISTER_MATCHER(arraySubscriptExpr);
140140
REGISTER_MATCHER(arrayType);
141+
REGISTER_MATCHER(arrayTypeLoc);
141142
REGISTER_MATCHER(asString);
142143
REGISTER_MATCHER(asmStmt);
143144
REGISTER_MATCHER(atomicExpr);

clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2353,6 +2353,26 @@ TEST_P(ASTMatchersTest, ReferenceTypeLocTest_BindsToAnyRvalueReferenceTypeLoc) {
23532353
EXPECT_TRUE(matches("float&& r = 3.0;", matcher));
23542354
}
23552355

2356+
TEST_P(ASTMatchersTest, ArrayTypeLocTest_BindsToAnyArrayTypeLoc) {
2357+
auto matcher = varDecl(hasName("x"), hasTypeLoc(arrayTypeLoc()));
2358+
EXPECT_TRUE(matches("int x[3];", matcher));
2359+
EXPECT_TRUE(matches("float x[3];", matcher));
2360+
EXPECT_TRUE(matches("char x[3];", matcher));
2361+
EXPECT_TRUE(matches("void* x[3];", matcher));
2362+
EXPECT_TRUE(matches("const int x[3] = {1, 2, 3};", matcher));
2363+
EXPECT_TRUE(matches("int x[3][4];", matcher));
2364+
EXPECT_TRUE(matches("void foo(int x[]);", matcher));
2365+
EXPECT_TRUE(matches("int a[] = {1, 2}; void foo() {int x[a[0]];}", matcher));
2366+
}
2367+
2368+
TEST_P(ASTMatchersTest, ArrayTypeLocTest_DoesNotBindToNonArrayTypeLoc) {
2369+
auto matcher = varDecl(hasName("x"), hasTypeLoc(arrayTypeLoc()));
2370+
EXPECT_TRUE(notMatches("int x;", matcher));
2371+
EXPECT_TRUE(notMatches("float x;", matcher));
2372+
EXPECT_TRUE(notMatches("char x;", matcher));
2373+
EXPECT_TRUE(notMatches("void* x;", matcher));
2374+
}
2375+
23562376
TEST_P(ASTMatchersTest,
23572377
TemplateSpecializationTypeLocTest_BindsToVarDeclTemplateSpecialization) {
23582378
if (!GetParam().isCXX()) {

0 commit comments

Comments
 (0)