[clang-tools-extra] d734ead - [clang-tidy] Fix false positive in cert-ctr56-cpp (PointerArithmeticOnPolymorphicObjectCheck) (#187452)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 23 18:12:40 PDT 2026
Author: LeeYoungJoon
Date: 2026-03-24T10:12:35+09:00
New Revision: d734ead1328675bf644620cc524c8dab10344815
URL: https://github.com/llvm/llvm-project/commit/d734ead1328675bf644620cc524c8dab10344815
DIFF: https://github.com/llvm/llvm-project/commit/d734ead1328675bf644620cc524c8dab10344815.diff
LOG: [clang-tidy] Fix false positive in cert-ctr56-cpp (PointerArithmeticOnPolymorphicObjectCheck) (#187452)
## Summary
This change adds `unless(isInstantiationDependent())` to the
`ArraySubscript` matcher.
## Motivation
In template code, some array subscript expressions are not fully
resolved yet.
Because of this, the matcher may treat them incorrectly and produce
false positives.
## Change
This patch skips instantiation-dependent expressions in templates.
It helps the matcher work only on resolved expressions.
Closes https://github.com/llvm/llvm-project/issues/187009.
Added:
Modified:
clang-tools-extra/clang-tidy/bugprone/PointerArithmeticOnPolymorphicObjectCheck.cpp
clang-tools-extra/docs/ReleaseNotes.rst
clang-tools-extra/test/clang-tidy/checkers/bugprone/pointer-arithmetic-on-polymorphic-object-all.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clang-tidy/bugprone/PointerArithmeticOnPolymorphicObjectCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/PointerArithmeticOnPolymorphicObjectCheck.cpp
index c21abad947912..ef5fee9f3d2c3 100644
--- a/clang-tools-extra/clang-tidy/bugprone/PointerArithmeticOnPolymorphicObjectCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/PointerArithmeticOnPolymorphicObjectCheck.cpp
@@ -53,7 +53,9 @@ void PointerArithmeticOnPolymorphicObjectCheck::registerMatchers(
? PointerExprWithVirtualMethod
: PolymorphicPointerExpr;
- const auto ArraySubscript = arraySubscriptExpr(hasBase(SelectedPointerExpr));
+ const auto ArraySubscript =
+ expr(arraySubscriptExpr(hasBase(SelectedPointerExpr)),
+ unless(isInstantiationDependent()));
const auto BinaryOperators =
binaryOperator(hasAnyOperatorName("+", "-", "+=", "-="),
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index a346fee4ea33c..343f216ff13b3 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -223,6 +223,10 @@ Changes in existing checks
<clang-tidy/checks/bugprone/macro-parentheses>` check by printing the macro
definition in the warning message if the macro is defined on command line.
+- Improved :doc:`bugprone-pointer-arithmetic-on-polymorphic-object
+ <clang-tidy/checks/bugprone/pointer-arithmetic-on-polymorphic-object>` check
+ by fixing a false positive when ``operator[]`` is used in a dependent context.
+
- Improved :doc:`bugprone-std-namespace-modification
<clang-tidy/checks/bugprone/std-namespace-modification>` check by fixing
false positives when extending the standard library with a specialization of
diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/pointer-arithmetic-on-polymorphic-object-all.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/pointer-arithmetic-on-polymorphic-object-all.cpp
index caf24f79ad2d8..f8163a2fd3fb8 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/pointer-arithmetic-on-polymorphic-object-all.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/pointer-arithmetic-on-polymorphic-object-all.cpp
@@ -1,5 +1,7 @@
// RUN: %check_clang_tidy %s bugprone-pointer-arithmetic-on-polymorphic-object %t --
+#include <map>
+
class Base {
public:
virtual ~Base() {}
@@ -138,3 +140,13 @@ void typeAliases(BaseAlias *b, DerivedAlias *d, FinalDerivedAlias *fd,
fdp += 1;
// no-warning
}
+
+template <typename T>
+struct TemplateHolder : Base {
+ std::map<Base *, T> _map;
+ void test() {
+ auto &x = _map[this];
+ // no-warning
+ (void)x;
+ }
+};
More information about the cfe-commits
mailing list