forked from OSchip/llvm-project
59 lines
2.2 KiB
C++
59 lines
2.2 KiB
C++
//===--- DurationDivisionCheck.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 "DurationDivisionCheck.h"
|
|
#include "clang/AST/ASTContext.h"
|
|
#include "clang/ASTMatchers/ASTMatchFinder.h"
|
|
|
|
namespace clang {
|
|
namespace tidy {
|
|
namespace abseil {
|
|
|
|
using namespace clang::ast_matchers;
|
|
|
|
void DurationDivisionCheck::registerMatchers(MatchFinder *finder) {
|
|
if (!getLangOpts().CPlusPlus)
|
|
return;
|
|
|
|
const auto DurationExpr =
|
|
expr(hasType(cxxRecordDecl(hasName("::absl::Duration"))));
|
|
finder->addMatcher(
|
|
implicitCastExpr(
|
|
hasSourceExpression(ignoringParenCasts(
|
|
cxxOperatorCallExpr(hasOverloadedOperatorName("/"),
|
|
hasArgument(0, DurationExpr),
|
|
hasArgument(1, DurationExpr))
|
|
.bind("OpCall"))),
|
|
hasImplicitDestinationType(qualType(unless(isInteger()))),
|
|
unless(hasParent(cxxStaticCastExpr())),
|
|
unless(hasParent(cStyleCastExpr())),
|
|
unless(isInTemplateInstantiation())),
|
|
this);
|
|
}
|
|
|
|
void DurationDivisionCheck::check(const MatchFinder::MatchResult &result) {
|
|
const auto *OpCall = result.Nodes.getNodeAs<CXXOperatorCallExpr>("OpCall");
|
|
diag(OpCall->getOperatorLoc(),
|
|
"operator/ on absl::Duration objects performs integer division; "
|
|
"did you mean to use FDivDuration()?")
|
|
<< FixItHint::CreateInsertion(OpCall->getBeginLoc(),
|
|
"absl::FDivDuration(")
|
|
<< FixItHint::CreateReplacement(
|
|
SourceRange(OpCall->getOperatorLoc(), OpCall->getOperatorLoc()),
|
|
", ")
|
|
<< FixItHint::CreateInsertion(
|
|
Lexer::getLocForEndOfToken(
|
|
result.SourceManager->getSpellingLoc(OpCall->getEndLoc()), 0,
|
|
*result.SourceManager, result.Context->getLangOpts()),
|
|
")");
|
|
}
|
|
|
|
} // namespace abseil
|
|
} // namespace tidy
|
|
} // namespace clang
|