Handle invalid types in the nullPointerConstant AST matcher
authorAaron Ballman <aaron@aaronballman.com>
Tue, 23 Jun 2020 11:14:33 +0000 (07:14 -0400)
committerAaron Ballman <aaron@aaronballman.com>
Tue, 23 Jun 2020 11:14:33 +0000 (07:14 -0400)
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.

clang/lib/AST/Expr.cpp
clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp

index 5cbd66f..ebb1134 100644 (file)
@@ -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;
index 0070c22..fa7f75b 100644 (file)
@@ -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) {