11 #include "clang/AST/ASTContext.h" 12 #include "clang/ASTMatchers/ASTMatchFinder.h" 18 namespace cppcoreguidelines {
21 void NarrowingConversionsCheck::registerMatchers(MatchFinder *Finder) {
24 const auto IsCeilFloorCall = callExpr(callee(functionDecl(
25 hasAnyName(
"::ceil",
"::std::ceil",
"::floor",
"::std::floor"))));
27 const auto IsFloatExpr =
28 expr(hasType(realFloatingPointType()), unless(IsCeilFloorCall));
33 Finder->addMatcher(implicitCastExpr(hasImplicitDestinationType(isInteger()),
34 hasSourceExpression(IsFloatExpr),
35 unless(hasParent(castExpr())),
36 unless(isInTemplateInstantiation()))
43 binaryOperator(isAssignmentOperator(),
46 unless(hasOperatorName(
"=")),
47 hasLHS(hasType(isInteger())), hasRHS(IsFloatExpr),
48 unless(isInTemplateInstantiation()))
53 void NarrowingConversionsCheck::check(
const MatchFinder::MatchResult &Result) {
54 if (
const auto *Op = Result.Nodes.getNodeAs<BinaryOperator>(
"op")) {
55 if (Op->getLocStart().isMacroID())
57 diag(Op->getOperatorLoc(),
"narrowing conversion from %0 to %1")
58 << Op->getRHS()->getType() << Op->getLHS()->getType();
61 const auto *Cast = Result.Nodes.getNodeAs<ImplicitCastExpr>(
"cast");
62 if (Cast->getLocStart().isMacroID())
64 diag(Cast->getExprLoc(),
"narrowing conversion from %0 to %1")
65 << Cast->getSubExpr()->getType() << Cast->getType();
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//