Add a nullPointerConstant() AST matcher to handle variations of null pointer constants in one matcher.

llvm-svn: 261008
This commit is contained in:
Aaron Ballman 2016-02-16 21:02:23 +00:00
parent ecef1d9cbc
commit 232e63d00b
4 changed files with 49 additions and 0 deletions

View File

@ -2176,6 +2176,23 @@ fieldDecl(isPublic())
</pre></td></tr>
<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr>
<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
GNU's __null, C++11's nullptr, or C's NULL macro.
Given:
void *v1 = NULL;
void *v2 = nullptr;
void *v3 = __null; GNU extension
char *cp = (char *)0;
int *ip = 0;
int i = 0;
expr(nullPointerConstant())
matches the initializer for v1, v2, v3, cp, and ip. Does not match the
initializer for i.
</pre></td></tr>
<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>ValueT Value</td></tr>
<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.

View File

@ -4816,6 +4816,27 @@ const internal::VariadicDynCastAllOfMatcher<
Stmt,
CUDAKernelCallExpr> cudaKernelCallExpr;
/// \brief Matches expressions that resolve to a null pointer constant, such as
/// GNU's __null, C++11's nullptr, or C's NULL macro.
///
/// Given:
/// \code
/// void *v1 = NULL;
/// void *v2 = nullptr;
/// void *v3 = __null; // GNU extension
/// char *cp = (char *)0;
/// int *ip = 0;
/// int i = 0;
/// \endcode
/// expr(nullPointerConstant())
/// matches the initializer for v1, v2, v3, cp, and ip. Does not match the
/// initializer for i.
AST_MATCHER_FUNCTION(internal::Matcher<Expr>, nullPointerConstant) {
return anyOf(
gnuNullExpr(), cxxNullPtrLiteralExpr(),
integerLiteral(equals(0), hasParent(expr(hasType(pointerType())))));
}
} // end namespace ast_matchers
} // end namespace clang

View File

@ -326,6 +326,7 @@ RegistryMaps::RegistryMaps() {
REGISTER_MATCHER(namesType);
REGISTER_MATCHER(nestedNameSpecifier);
REGISTER_MATCHER(nestedNameSpecifierLoc);
REGISTER_MATCHER(nullPointerConstant);
REGISTER_MATCHER(nullStmt);
REGISTER_MATCHER(numSelectorArgs);
REGISTER_MATCHER(ofClass);

View File

@ -5348,5 +5348,15 @@ TEST(ObjCMessageExprMatcher, SimpleExprs) {
)));
}
TEST(NullPointerConstants, Basic) {
EXPECT_TRUE(matches("#define NULL ((void *)0)\n"
"void *v1 = NULL;", expr(nullPointerConstant())));
EXPECT_TRUE(matches("void *v2 = nullptr;", expr(nullPointerConstant())));
EXPECT_TRUE(matches("void *v3 = __null;", expr(nullPointerConstant())));
EXPECT_TRUE(matches("char *cp = (char *)0;", expr(nullPointerConstant())));
EXPECT_TRUE(matches("int *ip = 0;", expr(nullPointerConstant())));
EXPECT_TRUE(notMatches("int i = 0", expr(nullPointerConstant())));
}
} // end namespace ast_matchers
} // end namespace clang