Index: docs/LibASTMatchersReference.html =================================================================== --- docs/LibASTMatchersReference.html +++ docs/LibASTMatchersReference.html @@ -2968,6 +2968,30 @@ +
Matches QualType nodes that are of signed integer type. + +Given + void a(int); + void b(unsigned long); + void c(double); +functionDecl(hasAnyParameter(hasType(isInteger()))) +matches "a(int)", but not "b(unsigned long)" and "c(double)". +
Matches QualType nodes that are of unsigned integer type. + +Given + void a(int); + void b(unsigned long); + void c(double); +functionDecl(hasAnyParameter(hasType(isInteger()))) +matches "b(unsigned long)", but not "a(int)" and "c(double)". +
Matches QualType nodes that are volatile-qualified, i.e., that include "top-level" volatile. @@ -3849,8 +3873,11 @@ void f(int i); int y; f(y); -callExpr(declRefExpr(to(varDecl(hasName("y")))), -parmVarDecl(hasType(isInteger()))) +callExpr( + forEachArgumentWithParam( + declRefExpr(to(varDecl(hasName("y")))), + parmVarDecl(hasType(isInteger())) +)) matches f(y); with declRefExpr(...) matching int y @@ -4139,8 +4166,11 @@ void f(int i); int y; f(y); -callExpr(declRefExpr(to(varDecl(hasName("y")))), -parmVarDecl(hasType(isInteger()))) +callExpr( + forEachArgumentWithParam( + declRefExpr(to(varDecl(hasName("y")))), + parmVarDecl(hasType(isInteger())) +)) matches f(y); with declRefExpr(...) matching int y Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -4067,6 +4067,34 @@ return Node->isIntegerType(); } +/// \brief Matches QualType nodes that are of unsigned integer type. +/// +/// Given +/// \code +/// void a(int); +/// void b(unsigned long); +/// void c(double); +/// \endcode +/// functionDecl(hasAnyParameter(hasType(isInteger()))) +/// matches "b(unsigned long)", but not "a(int)" and "c(double)". +AST_MATCHER(QualType, isUnsignedInteger) { + return Node->isUnsignedIntegerType(); +} + +/// \brief Matches QualType nodes that are of signed integer type. +/// +/// Given +/// \code +/// void a(int); +/// void b(unsigned long); +/// void c(double); +/// \endcode +/// functionDecl(hasAnyParameter(hasType(isInteger()))) +/// matches "a(int)", but not "b(unsigned long)" and "c(double)". +AST_MATCHER(QualType, isSignedInteger) { + return Node->isSignedIntegerType(); +} + /// \brief Matches QualType nodes that are of character type. /// /// Given Index: lib/ASTMatchers/Dynamic/Registry.cpp =================================================================== --- lib/ASTMatchers/Dynamic/Registry.cpp +++ lib/ASTMatchers/Dynamic/Registry.cpp @@ -321,9 +321,11 @@ REGISTER_MATCHER(isProtected); REGISTER_MATCHER(isPublic); REGISTER_MATCHER(isPure); + REGISTER_MATCHER(isSignedInteger); REGISTER_MATCHER(isStruct); REGISTER_MATCHER(isTemplateInstantiation); REGISTER_MATCHER(isUnion); + REGISTER_MATCHER(isUnsignedInteger); REGISTER_MATCHER(isVariadic); REGISTER_MATCHER(isVirtual); REGISTER_MATCHER(isVirtualAsWritten); Index: unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp =================================================================== --- unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp +++ unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp @@ -723,6 +723,18 @@ to(varDecl(hasType(isInteger())))))))); } +TEST(IsSignedInteger, MatchesSignedIntegers) { + EXPECT_TRUE(matches("int i = 0;", varDecl(hasType(isSignedInteger())))); + EXPECT_TRUE(notMatches("unsigned i = 0;", + varDecl(hasType(isSignedInteger())))); +} + +TEST(IsUnsignedInteger, MatchesUnsignedIntegers) { + EXPECT_TRUE(notMatches("int i = 0;", varDecl(hasType(isUnsignedInteger())))); + EXPECT_TRUE(matches("unsigned i = 0;", + varDecl(hasType(isUnsignedInteger())))); +} + TEST(IsAnyPointer, MatchesPointers) { EXPECT_TRUE(matches("int* i = nullptr;", varDecl(hasType(isAnyPointer())))); }