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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits