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

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Thu Aug 22 11:25:51 PDT 2019


On Thu, Aug 22, 2019 at 1:13 PM Aaron Ballman <aaron at aaronballman.com> wrote:
>
> On Thu, Aug 22, 2019 at 12:58 PM Richard Smith <richard at metafoo.co.uk> wrote:
> >
> > (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.
>
> No reason that I can recall, I'll make the switch. Thank you for the feedback!

I've corrected this in r369683, thank you!

~Aaron

>
> ~Aaron
>
> >
> >>
> >> +}
> >>  } // 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


More information about the cfe-commits mailing list