[ASTMatchers] isSignedInteger() and isUnsignedInteger()

Complementary to isInteger(), these match signed and unsigned integers
respectively.

Review: http://reviews.llvm.org/D21989
llvm-svn: 275157
This commit is contained in:
Clement Courbet
2016-07-12 06:36:00 +00:00
parent 204dc533c5
commit 425175934e
4 changed files with 76 additions and 4 deletions

View File

@@ -2968,6 +2968,30 @@ matches "a(int)", "b(long)", but not "c(double)".
</pre></td></tr>
<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr>
<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>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)".
</pre></td></tr>
<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr>
<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>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)".
</pre></td></tr>
<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr>
<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
include "top-level" volatile.
@@ -3849,8 +3873,11 @@ Given
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 @@ Given
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

View File

@@ -4067,6 +4067,34 @@ AST_MATCHER(QualType, isInteger) {
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

View File

@@ -321,9 +321,11 @@ RegistryMaps::RegistryMaps() {
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);

View File

@@ -723,6 +723,18 @@ TEST(IsInteger, ReportsNoFalsePositives) {
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()))));
}