Author: dingfei Date: 2023-08-16T18:03:16+08:00 New Revision: ec483c29a95cbaef460e3c8523af91ee1cc43e55
URL: https://github.com/llvm/llvm-project/commit/ec483c29a95cbaef460e3c8523af91ee1cc43e55 DIFF: https://github.com/llvm/llvm-project/commit/ec483c29a95cbaef460e3c8523af91ee1cc43e55.diff LOG: [clang][ASTMatcher] Add matcher for 'MacroQualifiedType' Add matcher for 'MacroQualifiedType' Reviewed By: aaron.ballman Differential Revision: https://reviews.llvm.org/D157777 Added: Modified: clang/docs/LibASTMatchersReference.html clang/docs/ReleaseNotes.rst clang/include/clang/ASTMatchers/ASTMatchers.h clang/lib/ASTMatchers/ASTMatchersInternal.cpp clang/lib/ASTMatchers/Dynamic/Registry.cpp clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp Removed: ################################################################################ diff --git a/clang/docs/LibASTMatchersReference.html b/clang/docs/LibASTMatchersReference.html index 4b87f157a9c2ce..a526751f0116f5 100644 --- a/clang/docs/LibASTMatchersReference.html +++ b/clang/docs/LibASTMatchersReference.html @@ -2648,6 +2648,18 @@ <h2 id="decl-matchers">Node Matchers</h2> </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('macroQualifiedType0')"><a name="macroQualifiedType0Anchor">macroQualifiedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MacroQualifiedType.html">MacroQualifiedType</a>>...</td></tr> +<tr><td colspan="4" class="doc" id="macroQualifiedType0"><pre>Matches qualified types when the qualifier is applied via a macro. + +Given + #define CDECL __attribute__((cdecl)) + typedef void (CDECL *X)(); + typedef void (__attribute__((cdecl)) *Y)(); +macroQualifiedType() + matches the type of the typedef declaration of X but not Y. +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>...</td></tr> <tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. Given diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 56eef72c8a2835..2c4131ad7b4c89 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -252,6 +252,7 @@ AST Matchers ------------ - Add ``convertVectorExpr``. - Add ``dependentSizedExtVectorType``. +- Add ``macroQualifiedType``. clang-format ------------ diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h index 620f0cb7872f1f..bdc9a5624ce3af 100644 --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -7258,6 +7258,18 @@ AST_TYPELOC_TRAVERSE_MATCHER_DECL( /// matches "typedef int X" extern const AstTypeMatcher<TypedefType> typedefType; +/// Matches qualified types when the qualifier is applied via a macro. +/// +/// Given +/// \code +/// #define CDECL __attribute__((cdecl)) +/// typedef void (CDECL *X)(); +/// typedef void (__attribute__((cdecl)) *Y)(); +/// \endcode +/// macroQualifiedType() +/// matches the type of the typedef declaration of \c X but not \c Y. +extern const AstTypeMatcher<MacroQualifiedType> macroQualifiedType; + /// Matches enum types. /// /// Given diff --git a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp index 6a2c85ef2b5176..40688107215f28 100644 --- a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp +++ b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp @@ -1058,6 +1058,7 @@ const AstTypeMatcher<FunctionType> functionType; const AstTypeMatcher<FunctionProtoType> functionProtoType; const AstTypeMatcher<ParenType> parenType; const AstTypeMatcher<BlockPointerType> blockPointerType; +const AstTypeMatcher<MacroQualifiedType> macroQualifiedType; const AstTypeMatcher<MemberPointerType> memberPointerType; const AstTypeMatcher<PointerType> pointerType; const AstTypeMatcher<ObjCObjectPointerType> objcObjectPointerType; diff --git a/clang/lib/ASTMatchers/Dynamic/Registry.cpp b/clang/lib/ASTMatchers/Dynamic/Registry.cpp index 0cd65d4c95cbcd..2e43dec331b75f 100644 --- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -485,6 +485,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(lambdaCapture); REGISTER_MATCHER(lambdaExpr); REGISTER_MATCHER(linkageSpecDecl); + REGISTER_MATCHER(macroQualifiedType); REGISTER_MATCHER(materializeTemporaryExpr); REGISTER_MATCHER(member); REGISTER_MATCHER(memberExpr); diff --git a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp index bb7d8cc771a349..7a6d6ef0a95554 100644 --- a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp @@ -1838,6 +1838,20 @@ TEST_P(ASTMatchersTest, TypedefType) { namesType(typedefType())))))); } +TEST_P(ASTMatchersTest, MacroQualifiedType) { + EXPECT_TRUE(matches( + R"( + #define CDECL __attribute__((cdecl)) + typedef void (CDECL *X)(); + )", + typedefDecl(hasType(pointerType(pointee(macroQualifiedType())))))); + EXPECT_TRUE(notMatches( + R"( + typedef void (__attribute__((cdecl)) *Y)(); + )", + typedefDecl(hasType(pointerType(pointee(macroQualifiedType())))))); +} + TEST_P(ASTMatchersTest, TemplateSpecializationType) { if (!GetParam().isCXX()) { return; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits