<div dir="ltr"><div>(Sorry for the very late review!)</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, 16 Feb 2016 at 13:06, Aaron Ballman via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: aaronballman<br>
Date: Tue Feb 16 15:02:23 2016<br>
New Revision: 261008<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=261008&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=261008&view=rev</a><br>
Log:<br>
Add a nullPointerConstant() AST matcher to handle variations of null pointer constants in one matcher.<br>
<br>
Modified:<br>
    cfe/trunk/docs/LibASTMatchersReference.html<br>
    cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h<br>
    cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp<br>
    cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp<br>
<br>
Modified: cfe/trunk/docs/LibASTMatchersReference.html<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LibASTMatchersReference.html?rev=261008&r1=261007&r2=261008&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LibASTMatchersReference.html?rev=261008&r1=261007&r2=261008&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/docs/LibASTMatchersReference.html (original)<br>
+++ cfe/trunk/docs/LibASTMatchersReference.html Tue Feb 16 15:02:23 2016<br>
@@ -2176,6 +2176,23 @@ fieldDecl(isPublic())<br>
 </pre></td></tr><br>
<br>
<br>
+<tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1Expr.html</a>">Expr</a>&gt;</td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr><br>
+<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as<br>
+GNU's __null, C++11's nullptr, or C's NULL macro.<br>
+<br>
+Given:<br>
+  void *v1 = NULL;<br>
+  void *v2 = nullptr;<br>
+  void *v3 = __null; GNU extension<br>
+  char *cp = (char *)0;<br>
+  int *ip = 0;<br>
+  int i = 0;<br>
+expr(nullPointerConstant())<br>
+  matches the initializer for v1, v2, v3, cp, and ip. Does not match the<br>
+  initializer for i.<br>
+</pre></td></tr><br>
+<br>
+<br>
 <tr><td>Matcher&lt;<a href="<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html" rel="noreferrer" target="_blank">http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html</a>">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>ValueT  Value</td></tr><br>
 <tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.<br>
<br>
<br>
Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h?rev=261008&r1=261007&r2=261008&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h?rev=261008&r1=261007&r2=261008&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h (original)<br>
+++ cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h Tue Feb 16 15:02:23 2016<br>
@@ -4816,6 +4816,27 @@ const internal::VariadicDynCastAllOfMatc<br>
   Stmt,<br>
   CUDAKernelCallExpr> cudaKernelCallExpr;<br>
<br>
+<br>
+/// \brief Matches expressions that resolve to a null pointer constant, such as<br>
+/// GNU's __null, C++11's nullptr, or C's NULL macro.<br>
+///<br>
+/// Given:<br>
+/// \code<br>
+///   void *v1 = NULL;<br>
+///   void *v2 = nullptr;<br>
+///   void *v3 = __null; // GNU extension<br>
+///   char *cp = (char *)0;<br>
+///   int *ip = 0;<br>
+///   int i = 0;<br>
+/// \endcode<br>
+/// expr(nullPointerConstant())<br>
+///   matches the initializer for v1, v2, v3, cp, and ip. Does not match the<br>
+///   initializer for i.<br>
+AST_MATCHER_FUNCTION(internal::Matcher<Expr>, nullPointerConstant) {<br>
+  return anyOf(<br>
+      gnuNullExpr(), cxxNullPtrLiteralExpr(),<br>
+      integerLiteral(equals(0), hasParent(expr(hasType(pointerType())))));<br></blockquote><div><br></div><div>Is there a reason this logic was reinvented rather than using Expr::isNullPointerConstant()? This is not correct in C or in Clang's interpretation of DRs against C++98.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+}<br>
 } // end namespace ast_matchers<br>
 } // end namespace clang<br>
<br>
<br>
Modified: cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp?rev=261008&r1=261007&r2=261008&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp?rev=261008&r1=261007&r2=261008&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp (original)<br>
+++ cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp Tue Feb 16 15:02:23 2016<br>
@@ -326,6 +326,7 @@ RegistryMaps::RegistryMaps() {<br>
   REGISTER_MATCHER(namesType);<br>
   REGISTER_MATCHER(nestedNameSpecifier);<br>
   REGISTER_MATCHER(nestedNameSpecifierLoc);<br>
+  REGISTER_MATCHER(nullPointerConstant);<br>
   REGISTER_MATCHER(nullStmt);<br>
   REGISTER_MATCHER(numSelectorArgs);<br>
   REGISTER_MATCHER(ofClass);<br>
<br>
Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp?rev=261008&r1=261007&r2=261008&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp?rev=261008&r1=261007&r2=261008&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp (original)<br>
+++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp Tue Feb 16 15:02:23 2016<br>
@@ -5348,5 +5348,15 @@ TEST(ObjCMessageExprMatcher, SimpleExprs<br>
                       )));<br>
 }<br>
<br>
+TEST(NullPointerConstants, Basic) {<br>
+  EXPECT_TRUE(matches("#define NULL ((void *)0)\n"<br>
+                      "void *v1 = NULL;", expr(nullPointerConstant())));<br>
+  EXPECT_TRUE(matches("void *v2 = nullptr;", expr(nullPointerConstant())));<br>
+  EXPECT_TRUE(matches("void *v3 = __null;", expr(nullPointerConstant())));<br>
+  EXPECT_TRUE(matches("char *cp = (char *)0;", expr(nullPointerConstant())));<br>
+  EXPECT_TRUE(matches("int *ip = 0;", expr(nullPointerConstant())));<br>
+  EXPECT_TRUE(notMatches("int i = 0", expr(nullPointerConstant())));<br>
+}<br>
+<br>
 } // end namespace ast_matchers<br>
 } // end namespace clang<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div></div>