11 #include "clang/ASTMatchers/ASTMatchFinder.h"
12 #include "clang/ASTMatchers/ASTMatchers.h"
13 #include "clang/Lex/Lexer.h"
18 using namespace ast_matchers;
21 const Stmt &Statement) {
22 return selectFirst<const FunctionDecl>(
23 "function",
match(stmt(hasAncestor(functionDecl().bind(
"function"))),
28 const Expr *EBase =
E->IgnoreImpCasts();
29 if (isa<BinaryOperator>(EBase) || isa<ConditionalOperator>(EBase)) {
33 if (
const auto *Operator = dyn_cast<CXXOperatorCallExpr>(EBase)) {
34 return Operator->isInfixBinaryOp();
44 if (isa<IntegerLiteral>(
Flags)) {
45 if (!SM.isMacroBodyExpansion(
Flags->getBeginLoc()) &&
46 !SM.isMacroArgExpansion(
Flags->getBeginLoc()))
51 CharSourceRange::getTokenRange(
Flags->getSourceRange()), SM,
LangOpts);
53 return MacroName == FlagName;
56 if (
const auto *BO = dyn_cast<BinaryOperator>(
Flags))
57 if (BO->getOpcode() == BinaryOperatorKind::BO_Or)
68 const SourceManager *SM) {
70 SourceLocation MacroArgExpansionStartForRangeBegin;
71 SourceLocation MacroArgExpansionStartForRangeEnd;
72 bool RangeIsEntirelyWithinMacroArgument =
74 SM->isMacroArgExpansion(
Range.getBegin(),
75 &MacroArgExpansionStartForRangeBegin) &&
76 SM->isMacroArgExpansion(
Range.getEnd(),
77 &MacroArgExpansionStartForRangeEnd) &&
78 MacroArgExpansionStartForRangeBegin == MacroArgExpansionStartForRangeEnd;
80 return RangeIsEntirelyWithinMacroArgument;
85 Range.getBegin().isMacroID() ||
Range.getEnd().isMacroID();