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

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Thu Aug 22 09:57:44 PDT 2019


(Sorry for the very late review!)

On Tue, 16 Feb 2016 at 13:06, Aaron Ballman via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: aaronballman
> Date: Tue Feb 16 15:02:23 2016
> New Revision: 261008
>
> URL: http://llvm.org/viewvc/llvm-project?rev=261008&view=rev
> Log:
> Add a nullPointerConstant() AST matcher to handle variations of null
> pointer constants in one matcher.
>
> Modified:
>     cfe/trunk/docs/LibASTMatchersReference.html
>     cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h
>     cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp
>     cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp
>
> Modified: cfe/trunk/docs/LibASTMatchersReference.html
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LibASTMatchersReference.html?rev=261008&r1=261007&r2=261008&view=diff
>
> ==============================================================================
> --- cfe/trunk/docs/LibASTMatchersReference.html (original)
> +++ cfe/trunk/docs/LibASTMatchersReference.html Tue Feb 16 15:02:23 2016
> @@ -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.
>
>
> Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h?rev=261008&r1=261007&r2=261008&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h (original)
> +++ cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h Tue Feb 16 15:02:23
> 2016
> @@ -4816,6 +4816,27 @@ const internal::VariadicDynCastAllOfMatc
>    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())))));
>

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.


> +}
>  } // end namespace ast_matchers
>  } // end namespace clang
>
>
> Modified: cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp?rev=261008&r1=261007&r2=261008&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp (original)
> +++ cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp Tue Feb 16 15:02:23 2016
> @@ -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);
>
> Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp?rev=261008&r1=261007&r2=261008&view=diff
>
> ==============================================================================
> --- cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp (original)
> +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp Tue Feb 16
> 15:02:23 2016
> @@ -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
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190822/d206be1d/attachment-0001.html>


More information about the cfe-commits mailing list