[clang] 8a93119 - Handle invalid types in the nullPointerConstant AST matcher
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 23 04:15:29 PDT 2020
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) {
More information about the cfe-commits
mailing list