Author: Aaron Ballman Date: 2020-06-23T07:14:33-04:00 New Revision: 8a9311940a26372dab6706edfd07288667394cfe
URL: https://github.com/llvm/llvm-project/commit/8a9311940a26372dab6706edfd07288667394cfe DIFF: https://github.com/llvm/llvm-project/commit/8a9311940a26372dab6706edfd07288667394cfe.diff LOG: Handle invalid types in the nullPointerConstant AST matcher Currently, using the nullPointerConstant AST matcher can lead to assertions in situations where a node to be matched does not have a valid type associated with it, such as a ParenListExpr. This patch addresses that by saying such nodes cannot be a null pointer constant. This addresses PR46353. Added: Modified: clang/lib/AST/Expr.cpp clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 5cbd66f11601..ebb11346a003 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -3812,6 +3812,11 @@ Expr::isNullPointerConstant(ASTContext &Ctx, return Source->isNullPointerConstant(Ctx, NPC); } + // If the expression has no type information, it cannot be a null pointer + // constant. + if (getType().isNull()) + return NPCK_NotNull; + // C++11 nullptr_t is always a null pointer constant. if (getType()->isNullPtrType()) return NPCK_CXX11_nullptr; diff --git a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp index 0070c22164a6..fa7f75b58b4e 100644 --- a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp @@ -2608,6 +2608,14 @@ TEST(NullPointerConstants, Basic) { EXPECT_TRUE(matches("char *cp = (char *)0;", expr(nullPointerConstant()))); EXPECT_TRUE(matches("int *ip = 0;", expr(nullPointerConstant()))); EXPECT_TRUE(matches("int i = 0;", expr(nullPointerConstant()))); + const char kTest[] = R"( + template <typename T> + struct MyTemplate { + MyTemplate() : field_(__null) {} + T* field_; + }; + )"; + EXPECT_TRUE(matches(kTest, expr(nullPointerConstant()))); } TEST(HasExternalFormalLinkage, Basic) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits