Mercurial > hg > CbC > CbC_llvm
view clang-tools-extra/clang-tidy/abseil/DurationDivisionCheck.cpp @ 204:e348f3e5c8b2
ReadFromString worked.
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 05 Jun 2021 15:35:13 +0900 |
parents | 0572611fdcc8 |
children | 2e18cbf3894f |
line wrap: on
line source
//===--- 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) { const auto DurationExpr = expr(hasType(cxxRecordDecl(hasName("::absl::Duration")))); finder->addMatcher( traverse(ast_type_traits::TK_AsIs, 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