10 #include "../utils/Matchers.h" 12 #include "clang/AST/ASTContext.h" 13 #include "clang/ASTMatchers/ASTMatchFinder.h" 14 #include "clang/Lex/Lexer.h" 23 AST_MATCHER(BinaryOperator, isRHSATempFailureRetryArg) {
24 if (!Node.getLocStart().isMacroID())
27 const SourceManager &SM = Finder->getASTContext().getSourceManager();
28 if (!SM.isMacroArgExpansion(Node.getRHS()->IgnoreParenCasts()->getLocStart()))
31 const LangOptions &Opts = Finder->getASTContext().getLangOpts();
32 SourceLocation LocStart = Node.getLocStart();
33 while (LocStart.isMacroID()) {
34 SourceLocation Invocation = SM.getImmediateMacroCallerLoc(LocStart);
36 if (!Lexer::getRawToken(SM.getSpellingLoc(Invocation), Tok, SM, Opts,
38 if (Tok.getKind() == tok::raw_identifier &&
39 Tok.getRawIdentifier() ==
"TEMP_FAILURE_RETRY")
43 LocStart = Invocation;
49 void ComparisonInTempFailureRetryCheck::registerMatchers(MatchFinder *Finder) {
67 hasRHS(ignoringParenCasts(
68 binaryOperator(matchers::isComparisonOperator()).bind(
"binop"))),
69 isRHSATempFailureRetryArg()),
73 void ComparisonInTempFailureRetryCheck::check(
74 const MatchFinder::MatchResult &Result) {
75 const auto &BinOp = *Result.Nodes.getNodeAs<BinaryOperator>(
"binop");
76 diag(BinOp.getOperatorLoc(),
"top-level comparison in TEMP_FAILURE_RETRY");
AST_MATCHER(BinaryOperator, isAssignmentOperator)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//