================ @@ -0,0 +1,137 @@ +//===--- UseStdMinMaxCheck.cpp - clang-tidy -------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "UseStdMinMaxCheck.h" +#include "../utils/ASTUtils.h" +#include "clang/AST/ASTContext.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include "clang/Lex/Preprocessor.h" + +using namespace clang::ast_matchers; + +namespace clang::tidy::readability { + +static const llvm::StringRef AlgorithmHeader("<algorithm>"); + +UseStdMinMaxCheck::UseStdMinMaxCheck(StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context), + IncludeInserter(Options.getLocalOrGlobal("IncludeStyle", + utils::IncludeSorter::IS_LLVM), + areDiagsSelfContained()) {} + +void UseStdMinMaxCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "IncludeStyle", IncludeInserter.getStyle()); +} + +void UseStdMinMaxCheck::registerMatchers(MatchFinder *Finder) { + Finder->addMatcher( + ifStmt( + stmt().bind("if"), + hasCondition(binaryOperator(hasAnyOperatorName("<", ">", "<=", ">="), + hasLHS(expr().bind("CondLhs")), + hasRHS(expr().bind("CondRhs")))), + hasThen(anyOf(stmt(binaryOperator(hasOperatorName("="), + hasLHS(expr().bind("AssignLhs")), + hasRHS(expr().bind("AssignRhs")))), + compoundStmt(statementCountIs(1), + has(binaryOperator( + hasOperatorName("="), + hasLHS(expr().bind("AssignLhs")), + hasRHS(expr().bind("AssignRhs"))))))), + hasParent(stmt(unless(ifStmt(hasElse( + equalsBoundNode("if"))))))), // Ensure `if` has no `else if` + this); +} + +void UseStdMinMaxCheck::registerPPCallbacks(const SourceManager &SM, + Preprocessor *PP, + Preprocessor *ModuleExpanderPP) { + IncludeInserter.registerPreprocessor(PP); +} + +void UseStdMinMaxCheck::check(const MatchFinder::MatchResult &Result) { + const auto *CondLhs = Result.Nodes.getNodeAs<Expr>("CondLhs"); + const auto *CondRhs = Result.Nodes.getNodeAs<Expr>("CondRhs"); + const auto *AssignLhs = Result.Nodes.getNodeAs<Expr>("AssignLhs"); + const auto *AssignRhs = Result.Nodes.getNodeAs<Expr>("AssignRhs"); + const auto *If = Result.Nodes.getNodeAs<IfStmt>("if"); + const auto &Context = *Result.Context; + const auto &LO = Context.getLangOpts(); + const SourceManager &Source = Context.getSourceManager(); + + const auto *BinaryOp = dyn_cast<BinaryOperator>(If->getCond()); ---------------- PiotrZSL wrote:
Betetr would be to bind that binary operator to some name, otherwise if some implicit cast is in getCond, then this cast may fail and then we going to crash at line 98 https://github.com/llvm/llvm-project/pull/77816 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits