================ @@ -1505,23 +1741,51 @@ class DataInvocationGadget : public WarningGadget { const ExplicitCastExpr *Op; public: - DataInvocationGadget(const MatchFinder::MatchResult &Result) + DataInvocationGadget(const MatchResult &Result) : WarningGadget(Kind::DataInvocation), - Op(Result.Nodes.getNodeAs<ExplicitCastExpr>(OpTag)) {} + Op(Result.getNodeAs<ExplicitCastExpr>(OpTag)) {} static bool classof(const Gadget *G) { return G->getKind() == Kind::DataInvocation; } - static Matcher matcher() { + static bool checkCallExpr(const CXXMemberCallExpr *call) { + if (!call) + return false; + auto *callee = call->getDirectCallee(); + if (!callee || !isa<CXXMethodDecl>(callee)) + return false; + auto *method = cast<CXXMethodDecl>(callee); + if (method->getNameAsString() == "data" && + (method->getParent()->getQualifiedNameAsString() == "std::span" || + method->getParent()->getQualifiedNameAsString() == "std::array" || + method->getParent()->getQualifiedNameAsString() == "std::vector")) + return true; + return false; + } - Matcher callExpr = cxxMemberCallExpr(callee( - cxxMethodDecl(hasName("data"), - ofClass(anyOf(hasName("std::span"), hasName("std::array"), - hasName("std::vector")))))); - return stmt( - explicitCastExpr(anyOf(has(callExpr), has(parenExpr(has(callExpr))))) - .bind(OpTag)); + static bool matches(const Stmt *S, const ASTContext &Ctx, + MatchResult &Result) { + auto *CE = dyn_cast<ExplicitCastExpr>(S); + if (!CE) + return false; + for (auto *child : CE->children()) { ---------------- ilya-biryukov wrote:
NIT: Use `Child` per LLVM's naming. https://github.com/llvm/llvm-project/pull/125492 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits