[clang] Fix false match on nullPointerConstant for array indices (PR #201893)
Kay Hicketts via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 24 08:28:36 PDT 2026
https://github.com/KHicketts updated https://github.com/llvm/llvm-project/pull/201893
>From f238457992ea5315c63430927c39c1d1c8d494dd Mon Sep 17 00:00:00 2001
From: khickett <khicketts at bloomberg.net>
Date: Fri, 5 Jun 2026 18:03:02 +0100
Subject: [PATCH 1/3] Fix false match on nullPointerConstant for array indices
---
clang/include/clang/ASTMatchers/ASTMatchers.h | 2 +-
clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h
index bc0f35898a2c9..24d9eea98df9b 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchers.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -8369,7 +8369,7 @@ extern const internal::VariadicDynCastAllOfMatcher<Stmt, CUDAKernelCallExpr>
AST_MATCHER_FUNCTION(internal::Matcher<Expr>, nullPointerConstant) {
return anyOf(
gnuNullExpr(), cxxNullPtrLiteralExpr(),
- integerLiteral(equals(0), hasParent(expr(hasType(pointerType())))));
+ integerLiteral(equals(0), hasParent(castExpr(hasCastKind(CK_NullToPointer)))));
}
/// Matches the DecompositionDecl the binding belongs to.
diff --git a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
index d9647c201fc30..d51f70b867ac9 100644
--- a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
+++ b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
@@ -4049,6 +4049,7 @@ TEST_P(ASTMatchersTest, NullPointerConstant) {
EXPECT_TRUE(matches("char *cp = (char *)0;", expr(nullPointerConstant())));
EXPECT_TRUE(matches("int *ip = 0;", expr(nullPointerConstant())));
EXPECT_FALSE(matches("int i = 0;", expr(nullPointerConstant())));
+ EXPECT_FALSE(matches("int *p[1]; (void)p[0];", expr(nullPointerConstant())));
}
TEST_P(ASTMatchersTest, NullPointerConstant_GNUNull) {
>From 22f22c2dd231d97f1fa95712c809e93287896a07 Mon Sep 17 00:00:00 2001
From: khickett <khicketts at bloomberg.net>
Date: Thu, 18 Jun 2026 15:32:40 +0100
Subject: [PATCH 2/3] add release note
---
clang/docs/ReleaseNotes.rst | 2 ++
1 file changed, 2 insertions(+)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 8a6eb2003e5f0..be1a889019b0d 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -980,6 +980,8 @@ AST Matchers
------------
- Add ``functionTypeLoc`` matcher for matching ``FunctionTypeLoc``.
- Add missing support for ``TraversalKind`` in some ``addMatcher()`` overloads.
+- Fixed ``nullPointerConstant`` matcher falsely matching integer literal ``0``
+ when used as an array subscript index.
clang-format
------------
>From a0a0813e92e0ade4900e5be671cac9039c1cd1a8 Mon Sep 17 00:00:00 2001
From: khickett <khicketts at bloomberg.net>
Date: Wed, 24 Jun 2026 16:27:50 +0100
Subject: [PATCH 3/3] clang format
---
clang/include/clang/ASTMatchers/ASTMatchers.h | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h
index 24d9eea98df9b..8108ee559acea 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchers.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -8367,9 +8367,9 @@ extern const internal::VariadicDynCastAllOfMatcher<Stmt, CUDAKernelCallExpr>
/// 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(castExpr(hasCastKind(CK_NullToPointer)))));
+ return anyOf(gnuNullExpr(), cxxNullPtrLiteralExpr(),
+ integerLiteral(equals(0), hasParent(castExpr(
+ hasCastKind(CK_NullToPointer)))));
}
/// Matches the DecompositionDecl the binding belongs to.
More information about the cfe-commits
mailing list