Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -3673,15 +3673,22 @@ return Node->isAnyCharacterType(); } -//// \brief Matches QualType nodes that are of any pointer type. +/// \brief Matches QualType nodes that are of any pointer type; this includes +/// the Objective-C object pointer type, which is different despite being +/// syntactically similar. /// /// Given /// \code /// int *i = nullptr; +/// +/// @interface Foo +/// @end +/// Foo *f; +/// /// int j; /// \endcode /// varDecl(hasType(isAnyPointer())) -/// matches "int *i", but not "int j". +/// matches "int *i" and "Foo *f", but not "int j". AST_MATCHER(QualType, isAnyPointer) { return Node->isAnyPointerType(); } Index: unittests/ASTMatchers/ASTMatchersTest.cpp =================================================================== --- unittests/ASTMatchers/ASTMatchersTest.cpp +++ unittests/ASTMatchers/ASTMatchersTest.cpp @@ -1483,6 +1483,11 @@ EXPECT_TRUE(matches("int* i = nullptr;", varDecl(hasType(isAnyPointer())))); } +TEST(IsAnyPointer, MatchesObjcPointer) { + EXPECT_TRUE(matchesObjC("@interface Foo @end Foo *f;", + varDecl(hasType(isAnyPointer())))); +} + TEST(IsAnyPointer, ReportsNoFalsePositives) { EXPECT_TRUE(notMatches("int i = 0;", varDecl(hasType(isAnyPointer())))); }