diff options
| author | Clement Courbet <courbet@google.com> | 2016-07-12 06:36:00 +0000 |
|---|---|---|
| committer | Clement Courbet <courbet@google.com> | 2016-07-12 06:36:00 +0000 |
| commit | 425175934e893756c8538cc7d759d5ef13bfa648 (patch) | |
| tree | 316f0ad7ef3c39e1b737ef6a93609f910f93a67a | |
| parent | 204dc533c59e1dc55a162d6b853b68606ee51089 (diff) | |
| download | bcm5719-llvm-425175934e893756c8538cc7d759d5ef13bfa648.tar.gz bcm5719-llvm-425175934e893756c8538cc7d759d5ef13bfa648.zip | |
[ASTMatchers] isSignedInteger() and isUnsignedInteger()
Complementary to isInteger(), these match signed and unsigned integers
respectively.
Review: http://reviews.llvm.org/D21989
llvm-svn: 275157
| -rw-r--r-- | clang/docs/LibASTMatchersReference.html | 38 | ||||
| -rw-r--r-- | clang/include/clang/ASTMatchers/ASTMatchers.h | 28 | ||||
| -rw-r--r-- | clang/lib/ASTMatchers/Dynamic/Registry.cpp | 2 | ||||
| -rw-r--r-- | clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp | 12 |
4 files changed, 76 insertions, 4 deletions
diff --git a/clang/docs/LibASTMatchersReference.html b/clang/docs/LibASTMatchersReference.html index a8a47d5b54b..70c83ea5cca 100644 --- a/clang/docs/LibASTMatchersReference.html +++ b/clang/docs/LibASTMatchersReference.html @@ -2968,6 +2968,30 @@ matches "a(int)", "b(long)", but not "c(double)". </pre></td></tr> +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></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<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></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<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></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 diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h index 28449eaacd6..aef4b4eafd9 100644 --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -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 diff --git a/clang/lib/ASTMatchers/Dynamic/Registry.cpp b/clang/lib/ASTMatchers/Dynamic/Registry.cpp index d8ddf55733f..a8d4b88d858 100644 --- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -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); diff --git a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp index 28b462e746f..82c5139a78f 100644 --- a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp @@ -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())))); } |

