brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.9 KiB · a262f9b Raw
50 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "IntegerDivisionCheck.h"10#include "clang/ASTMatchers/ASTMatchFinder.h"11 12using namespace clang::ast_matchers;13 14namespace clang::tidy::bugprone {15 16void IntegerDivisionCheck::registerMatchers(MatchFinder *Finder) {17  const auto IntType = hasType(isInteger());18 19  const auto BinaryOperators = binaryOperator(20      hasAnyOperatorName("%", "<<", ">>", "<<", "^", "|", "&", "||", "&&", "<",21                         ">", "<=", ">=", "==", "!="));22 23  const auto UnaryOperators = unaryOperator(hasAnyOperatorName("~", "!"));24 25  const auto Exceptions =26      anyOf(BinaryOperators, conditionalOperator(), binaryConditionalOperator(),27            callExpr(IntType), explicitCastExpr(IntType), UnaryOperators);28 29  Finder->addMatcher(30      traverse(TK_AsIs,31               binaryOperator(32                   hasOperatorName("/"), hasLHS(expr(IntType)),33                   hasRHS(expr(IntType)),34                   hasAncestor(castExpr(hasCastKind(CK_IntegralToFloating))35                                   .bind("FloatCast")),36                   unless(hasAncestor(expr(37                       Exceptions,38                       hasAncestor(castExpr(equalsBoundNode("FloatCast")))))))39                   .bind("IntDiv")),40      this);41}42 43void IntegerDivisionCheck::check(const MatchFinder::MatchResult &Result) {44  const auto *IntDiv = Result.Nodes.getNodeAs<BinaryOperator>("IntDiv");45  diag(IntDiv->getBeginLoc(), "result of integer division used in a floating "46                              "point context; possible loss of precision");47}48 49} // namespace clang::tidy::bugprone50