[clang][ASTMatchers] Add functionTypeLoc matcher (#173668)

To be used in #173340.
This commit is contained in:
Victor Chernyakin 2026-01-13 12:07:12 -07:00 committed by GitHub
parent dedf1684b3
commit aaa0d5da73
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 49 additions and 0 deletions

View File

@ -2461,6 +2461,18 @@ arrayTypeLoc()
</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.

View File

@ -195,6 +195,7 @@ Fixed Point Support in Clang
AST Matchers
------------
- Add ``functionTypeLoc`` matcher for matching ``FunctionTypeLoc``.
clang-format
------------

View File

@ -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

View File

@ -815,6 +815,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;

View File

@ -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);

View File

@ -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("auto f = (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()) {