Skip to content

Commit

Permalink
[clang-tidy] Accessing checks not done for aliases of std::array
Browse files Browse the repository at this point in the history
Index accessing checks are not performed for aliases
of `std::array`, as only `std::array` itself seems to be checked.

This patch aims to extend it for aliases such as:
 `using MyArray = std::array<int, 10>;`

Reviewed By: PiotrZSL

Differential Revision: https://reviews.llvm.org/D154297
  • Loading branch information
sousajo-cc authored and PiotrZSL committed Jul 3, 2023
1 parent 2806cf4 commit ce2d44b
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ void ProBoundsConstantArrayIndexCheck::registerMatchers(MatchFinder *Finder) {
cxxOperatorCallExpr(
hasOverloadedOperatorName("[]"),
hasArgument(
0, hasType(cxxRecordDecl(hasName("::std::array")).bind("type"))),
0, hasType(hasUnqualifiedDesugaredType(recordType(hasDeclaration(
cxxRecordDecl(hasName("::std::array")).bind("type")))))),
hasArgument(1, expr().bind("index")))
.bind("expr"),
this);
Expand Down
4 changes: 4 additions & 0 deletions clang-tools-extra/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,10 @@ Changes in existing checks
:doc:`cppcoreguidelines-use-default-member-init
<clang-tidy/checks/cppcoreguidelines/use-default-member-init>` instead.

- Improved :doc:`cppcoreguidelines-pro-bounds-constant-array-index
<clang-tidy/checks/cppcoreguidelines/pro-bounds-constant-array-index>` check
to cover type aliases of ``std::array``.

- Fixed a false positive in :doc:`cppcoreguidelines-slicing
<clang-tidy/checks/cppcoreguidelines/slicing>` check when warning would be
emitted in constructor for virtual base class initialization.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,28 @@ void f(std::array<int, 10> a, int pos) {
a[1] = 3; // OK, constant index and inside bounds
a[9] = 3; // OK, constant index and inside bounds
a[const_index(6)] = 3; // OK, constant index and inside bounds

using MyArray = std::array<int, 10>;
MyArray m{};
m [ pos / 2 /*comment*/] = 1;
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use array subscript when the index is not an integer constant expression [cppcoreguidelines-pro-bounds-constant-array-index]
int jj = m[pos - 1];
// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: do not use array subscript when the index is not an integer constant expression

m.at(pos-1) = 2; // OK, at() instead of []
gsl::at(m, pos-1) = 2; // OK, gsl::at() instead of []
m[-1] = 3;
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: std::array<> index -1 is negative [cppcoreguidelines-pro-bounds-constant-array-index]
m[10] = 4;
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: std::array<> index 10 is past the end of the array (which contains 10 elements) [cppcoreguidelines-pro-bounds-constant-array-index]

m[const_index(7)] = 3;
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: std::array<> index 10 is past the end of the array (which contains 10 elements)

m[0] = 3; // OK, constant index and inside bounds
m[1] = 3; // OK, constant index and inside bounds
m[9] = 3; // OK, constant index and inside bounds
m[const_index(6)] = 3; // OK, constant index and inside bounds
}

void g() {
Expand Down

0 comments on commit ce2d44b

Please sign in to comment.