diff --git a/clang-tools-extra/clang-tidy/readability/SimplifySubscriptExprCheck.cpp b/clang-tools-extra/clang-tidy/readability/SimplifySubscriptExprCheck.cpp index 6091e162cd4c..4b039170ed56 100644 --- a/clang-tools-extra/clang-tidy/readability/SimplifySubscriptExprCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/SimplifySubscriptExprCheck.cpp @@ -15,30 +15,27 @@ using namespace clang::ast_matchers; namespace clang::tidy::readability { -static constexpr char KDefaultTypes[] = +static constexpr char DefaultTypes[] = "::std::basic_string;::std::basic_string_view;::std::vector;::std::array;::" "std::span"; SimplifySubscriptExprCheck::SimplifySubscriptExprCheck( StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), Types(utils::options::parseStringList( - Options.get("Types", KDefaultTypes))) { -} + Options.get("Types", DefaultTypes))) {} void SimplifySubscriptExprCheck::registerMatchers(MatchFinder *Finder) { const auto TypesMatcher = hasUnqualifiedDesugaredType( recordType(hasDeclaration(cxxRecordDecl(hasAnyName(Types))))); Finder->addMatcher( - arraySubscriptExpr(hasBase( - cxxMemberCallExpr( - has(memberExpr().bind("member")), - on(hasType(qualType( - unless(anyOf(substTemplateTypeParmType(), - hasDescendant(substTemplateTypeParmType()))), - anyOf(TypesMatcher, pointerType(pointee(TypesMatcher)))))), - callee(namedDecl(hasName("data")))) - .bind("call"))), + arraySubscriptExpr( + hasBase(cxxMemberCallExpr( + has(memberExpr().bind("member")), + on(hasType(qualType(anyOf( + TypesMatcher, pointerType(pointee(TypesMatcher)))))), + callee(namedDecl(hasName("data")))) + .bind("call"))), this); } diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index f50f6a2c1bc3..505df0c06da4 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -335,6 +335,12 @@ Changes in existing checks ` check to provide valid fix suggestions for C23 and later by not using ``static_cast``. +- Improved :doc:`readability-simplify-subscript-expr + ` check by fixing + missing warnings when subscripting an object held inside a generic + container (e.g. subscripting a ``std::string`` held inside a + ``std::vector``). + - Improved :doc:`readability-suspicious-call-argument ` check by avoiding a crash from invalid ``Abbreviations`` option. diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/simplify-subscript-expr.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/simplify-subscript-expr.cpp index ca4a999367cc..f099b572491b 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/simplify-subscript-expr.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/simplify-subscript-expr.cpp @@ -74,3 +74,22 @@ void f(int i) { char c10 = Foo{}.bar(i); } + +template +struct Wrapper { + T value; +}; + +void g() { + // This used to be a false negative. + Wrapper().value.data()[10]; + // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: accessing an element + // CHECK-FIXES: Wrapper().value[10]; +} + +template +void dependent() { + T().data()[10]; +} + +template void dependent();