[clang-tools-extra] cd40245 - [clang-tidy] Fix false positive on ArrayInitIndexExpr inside ProBoundsConstantArrayIndexCheck
via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 30 11:28:00 PDT 2022
Author: isuckatcs
Date: 2022-08-30T20:27:38+02:00
New Revision: cd40245f549b8bd7a5b6571c2eb6a882ce59acc9
URL: https://github.com/llvm/llvm-project/commit/cd40245f549b8bd7a5b6571c2eb6a882ce59acc9
DIFF: https://github.com/llvm/llvm-project/commit/cd40245f549b8bd7a5b6571c2eb6a882ce59acc9.diff
LOG: [clang-tidy] Fix false positive on ArrayInitIndexExpr inside ProBoundsConstantArrayIndexCheck
Sometimes in the AST we can have an ArraySubscriptExpr,
where the index is an ArrayInitIndexExpr.
ArrayInitIndexExpr is not a constant, so
ProBoundsConstantArrayIndexCheck reports a warning when
it sees such expression. This expression can only be
implicitly generated, and always appears inside an
ArrayInitLoopExpr, so we shouldn't report a warning.
Differential Revision: https://reviews.llvm.org/D132654
Added:
Modified:
clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp
clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/pro-bounds-constant-array-index.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp
index 8c3457d9c5580..c80be3df1ce62 100644
--- a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp
+++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp
@@ -61,6 +61,12 @@ void ProBoundsConstantArrayIndexCheck::check(
const auto *Matched = Result.Nodes.getNodeAs<Expr>("expr");
const auto *IndexExpr = Result.Nodes.getNodeAs<Expr>("index");
+ // This expression can only appear inside ArrayInitLoopExpr, which
+ // is always implicitly generated. ArrayInitIndexExpr is not a
+ // constant, but we shouldn't report a warning for it.
+ if (isa<ArrayInitIndexExpr>(IndexExpr))
+ return;
+
if (IndexExpr->isValueDependent())
return; // We check in the specialization.
diff --git a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/pro-bounds-constant-array-index.cpp b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/pro-bounds-constant-array-index.cpp
index 7d5390ddecfb9..91c7fc1e3db59 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/pro-bounds-constant-array-index.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/pro-bounds-constant-array-index.cpp
@@ -75,13 +75,34 @@ void customOperator() {
s[i] = 3; // OK, custom operator
}
+namespace ArrayInitIndexExpr {
struct A {
// The compiler-generated copy constructor uses an ArraySubscriptExpr. Don't warn.
int x[3];
};
-void use_A() {
+void implicitCopyMoveCtor() {
// Force the compiler to generate a copy constructor.
A a;
A a2(a);
+
+ // Force the compiler to generate a move constructor.
+ A a3 = (A&&) a;
+}
+
+void lambdaCapture() {
+ int arr[3];
+
+ // Capturing an array by value uses an ArraySubscriptExpr. Don't warn.
+ [arr](){};
+}
+
+#if __cplusplus >= 201703L
+void structuredBindings() {
+ int arr[3];
+
+ // Creating structured bindings by value uses an ArraySubscriptExpr. Don't warn.
+ auto [a,b,c] = arr;
}
+#endif
+} // namespace ArrayInitIndexExpr
More information about the cfe-commits
mailing list