diff options
3 files changed, 23 insertions, 2 deletions
diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp index 514289de787..75093a0de7a 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp @@ -28,6 +28,22 @@ AST_MATCHER(Stmt, isInsideOfRangeBeginEndStmt) {        .matches(Node, Finder, Builder);  } +AST_MATCHER_P(Expr, hasParentIgnoringImpCasts, +              ast_matchers::internal::Matcher<Expr>, InnerMatcher) { +  const Expr *E = &Node; +  do { +    ASTContext::DynTypedNodeList Parents = +        Finder->getASTContext().getParents(*E); +    if (Parents.size() != 1) +      return false; +    E = Parents[0].get<Expr>(); +    if (!E) +      return false; +  } while (isa<ImplicitCastExpr>(E)); + +  return InnerMatcher.matches(*E, Finder, Builder); +} +  void ProBoundsArrayToPointerDecayCheck::registerMatchers(MatchFinder *Finder) {    if (!getLangOpts().CPlusPlus)      return; @@ -38,7 +54,7 @@ void ProBoundsArrayToPointerDecayCheck::registerMatchers(MatchFinder *Finder) {    // 3) if it converts a string literal to a pointer    Finder->addMatcher(        implicitCastExpr(unless(hasParent(arraySubscriptExpr())), -                       unless(hasParent(explicitCastExpr())), +                       unless(hasParentIgnoringImpCasts(explicitCastExpr())),                         unless(isInsideOfRangeBeginEndStmt()),                         unless(hasSourceExpression(stringLiteral())))            .bind("cast"), diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.h b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.h index 21a95727d65..ec6979a5069 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.h +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.h @@ -31,4 +31,3 @@ public:  } // namespace clang  #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CPPCOREGUIDELINES_PRO_BOUNDS_ARRAY_TO_POINTER_DECAY_H - diff --git a/clang-tools-extra/test/clang-tidy/cppcoreguidelines-pro-bounds-array-to-pointer-decay.cpp b/clang-tools-extra/test/clang-tidy/cppcoreguidelines-pro-bounds-array-to-pointer-decay.cpp index 13fd8a22142..ce192805dda 100644 --- a/clang-tools-extra/test/clang-tidy/cppcoreguidelines-pro-bounds-array-to-pointer-decay.cpp +++ b/clang-tools-extra/test/clang-tidy/cppcoreguidelines-pro-bounds-array-to-pointer-decay.cpp @@ -39,3 +39,9 @@ void f() {  const char *g() {    return "clang"; // OK, decay string literal to pointer  } + +void f2(void *const *); +void bug25362() { +  void *a[2]; +  f2(static_cast<void *const*>(a)); // OK, explicit cast +}  | 

