https://github.com/localspook updated 
https://github.com/llvm/llvm-project/pull/173668

>From 7ca0b4bf0016e36c5314979e3c042804142ba490 Mon Sep 17 00:00:00 2001
From: Victor Chernyakin <[email protected]>
Date: Fri, 26 Dec 2025 08:25:57 -0700
Subject: [PATCH] [clang][ASTMatchers] Add `functionTypeLoc` matcher

---
 clang/docs/LibASTMatchersReference.html       | 12 +++++++++++
 clang/docs/ReleaseNotes.rst                   |  1 +
 clang/include/clang/ASTMatchers/ASTMatchers.h | 13 ++++++++++++
 clang/lib/ASTMatchers/ASTMatchersInternal.cpp |  2 ++
 clang/lib/ASTMatchers/Dynamic/Registry.cpp    |  1 +
 .../ASTMatchers/ASTMatchersNodeTest.cpp       | 20 +++++++++++++++++++
 6 files changed, 49 insertions(+)

diff --git a/clang/docs/LibASTMatchersReference.html 
b/clang/docs/LibASTMatchersReference.html
index e34ac30b8f5a4..9f9d4223bb50a 100644
--- a/clang/docs/LibASTMatchersReference.html
+++ b/clang/docs/LibASTMatchersReference.html
@@ -2461,6 +2461,18 @@ <h2 id="decl-matchers">Node Matchers</h2>
 </pre></td></tr>
 
 
+<tr><td>Matcher&lt;<a 
href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>&gt;</td><td
 class="name" onclick="toggle('functionTypeLoc0')"><a 
name="functionTypeLoc0Anchor">functionTypeLoc</a></td><td>Matcher&lt;<a 
href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTypeLoc.html";>FunctionTypeLoc</a>&gt;...</td></tr>
+<tr><td colspan="4" class="doc" id="functionTypeLoc0"><pre>Matches 
`FunctionTypeLoc`s.
+
+Given
+  void f(int);
+  using g = double (char, float);
+  char (*fn_ptr)();
+functionTypeLoc()
+  matches "void (int)", "double (char, float)", and "char ()".
+</pre></td></tr>
+
+
 <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>
 <tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer 
`TypeLoc`s.
 
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 2319ff13f7864..050999cbb7c0d 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -773,6 +773,7 @@ AST Matchers
 - Added ``hasExplicitParameters`` for ``LambdaExpr`` as an output attribute to
   AST JSON dumps.
 - Add ``arrayTypeLoc`` matcher for matching ``ArrayTypeLoc``.
+- Add ``functionTypeLoc`` matcher for matching ``FunctionTypeLoc``.
 
 clang-format
 ------------
diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h 
b/clang/include/clang/ASTMatchers/ASTMatchers.h
index e3ec26207d2bc..2347647ec7cc2 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchers.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -7016,6 +7016,19 @@ AST_MATCHER_P(ReferenceTypeLoc, hasReferentLoc, 
internal::Matcher<TypeLoc>,
 extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, ArrayTypeLoc>
     arrayTypeLoc;
 
+/// Matches `FunctionTypeLoc`s.
+///
+/// Given
+/// \code
+///   void f(int);
+///   using g = double (char, float);
+///   char (*fn_ptr)();
+/// \endcode
+/// functionTypeLoc()
+///   matches "void (int)", "double (char, float)", and "char ()".
+extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, FunctionTypeLoc>
+    functionTypeLoc;
+
 /// Matches template specialization `TypeLoc`s.
 ///
 /// Given
diff --git a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp 
b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp
index a556ffca96903..2c55c78d614b4 100644
--- a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp
+++ b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp
@@ -808,6 +808,8 @@ const internal::VariadicDynCastAllOfMatcher<TypeLoc, 
PointerTypeLoc>
 const internal::VariadicDynCastAllOfMatcher<TypeLoc, ReferenceTypeLoc>
     referenceTypeLoc;
 const internal::VariadicDynCastAllOfMatcher<TypeLoc, ArrayTypeLoc> 
arrayTypeLoc;
+const internal::VariadicDynCastAllOfMatcher<TypeLoc, FunctionTypeLoc>
+    functionTypeLoc;
 const internal::VariadicDynCastAllOfMatcher<TypeLoc,
                                             TemplateSpecializationTypeLoc>
     templateSpecializationTypeLoc;
diff --git a/clang/lib/ASTMatchers/Dynamic/Registry.cpp 
b/clang/lib/ASTMatchers/Dynamic/Registry.cpp
index d1b19659905ca..906872b81f78b 100644
--- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp
+++ b/clang/lib/ASTMatchers/Dynamic/Registry.cpp
@@ -269,6 +269,7 @@ RegistryMaps::RegistryMaps() {
   REGISTER_MATCHER(functionProtoType);
   REGISTER_MATCHER(functionTemplateDecl);
   REGISTER_MATCHER(functionType);
+  REGISTER_MATCHER(functionTypeLoc);
   REGISTER_MATCHER(genericSelectionExpr);
   REGISTER_MATCHER(gnuNullExpr);
   REGISTER_MATCHER(gotoStmt);
diff --git a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp 
b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp
index 108b32e5d91b9..e8ba4d1f4a873 100644
--- a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp
+++ b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp
@@ -2373,6 +2373,26 @@ TEST_P(ASTMatchersTest, 
ArrayTypeLocTest_DoesNotBindToNonArrayTypeLoc) {
   EXPECT_TRUE(notMatches("void* x;", matcher));
 }
 
+TEST_P(ASTMatchersTest, FunctionTypeLocTest_BindsToAnyFunctionTypeLoc) {
+  auto matcher = functionTypeLoc();
+  EXPECT_TRUE(matches("void f();", matcher));
+  EXPECT_TRUE(matches("void f(void);", matcher));
+  EXPECT_TRUE(matches("void f(int);", matcher));
+  EXPECT_TRUE(matches("typedef double g(char, float);", matcher));
+  EXPECT_TRUE(matches("char (*fn_ptr)();", matcher));
+  if (!GetParam().isCXX11OrLater()) {
+    return;
+  }
+  EXPECT_TRUE(matches("(void (*)())0;", matcher));
+}
+
+TEST_P(ASTMatchersTest, FunctionTypeLocTest_DoesNotBindToNonFunctionTypeLoc) {
+  auto matcher = functionTypeLoc();
+  EXPECT_TRUE(notMatches("int x;", matcher));
+  EXPECT_TRUE(notMatches("void* x;", matcher));
+  EXPECT_TRUE(notMatches("int x[10];", matcher));
+}
+
 TEST_P(ASTMatchersTest,
        TemplateSpecializationTypeLocTest_BindsToVarDeclTemplateSpecialization) 
{
   if (!GetParam().isCXX()) {

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to