forked from OSchip/llvm-project
Add a nullPointerConstant() AST matcher to handle variations of null pointer constants in one matcher.
llvm-svn: 261008
This commit is contained in:
parent
ecef1d9cbc
commit
232e63d00b
|
@ -2176,6 +2176,23 @@ fieldDecl(isPublic())
|
|||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></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<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue