[clang] [clang-tools-extra] Add ``ignoringParenImpCasts`` in arguments of hasArgument (PR #89553)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 24 07:11:00 PDT 2024
https://github.com/komalverma04 updated https://github.com/llvm/llvm-project/pull/89553
>From 4a56db71e8bf2b6414cd305515d9d4434be8efc0 Mon Sep 17 00:00:00 2001
From: komalverma04 <komal148btit21 at igdtuw.ac.in>
Date: Mon, 22 Apr 2024 02:37:25 +0530
Subject: [PATCH 1/4] remove IgnoreParenImpCasts() from hasArgument matcher
---
clang/include/clang/ASTMatchers/ASTMatchers.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h
index 8a2bbfff9e9e6b..f900ad42e3efb7 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchers.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -4560,7 +4560,7 @@ AST_POLYMORPHIC_MATCHER_P2(hasArgument,
const Expr *Arg = Node.getArg(N);
if (Finder->isTraversalIgnoringImplicitNodes() && isa<CXXDefaultArgExpr>(Arg))
return false;
- return InnerMatcher.matches(*Arg->IgnoreParenImpCasts(), Finder, Builder);
+ return InnerMatcher.matches(*Arg->ignoringParenImpCasts(), Finder, Builder);
}
/// Matches the operand that does not contain the parameter pack.
>From 78b028f3c780a964df90807e5eecf47fdaed7a36 Mon Sep 17 00:00:00 2001
From: komalverma04 <komal148btit21 at igdtuw.ac.in>
Date: Mon, 22 Apr 2024 03:39:35 +0530
Subject: [PATCH 2/4] remove IgnoreParenImpCasts
---
clang/include/clang/ASTMatchers/ASTMatchers.h | 427 +++++++-----------
1 file changed, 169 insertions(+), 258 deletions(-)
diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h
index f900ad42e3efb7..b315f894f9b236 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchers.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -112,8 +112,7 @@ class BoundNodes {
///
/// Returns NULL if there was no node bound to \c ID or if there is a node but
/// it cannot be converted to the specified type.
- template <typename T>
- const T *getNodeAs(StringRef ID) const {
+ template <typename T> const T *getNodeAs(StringRef ID) const {
return MyBoundNodes.getNodeAs<T>(ID);
}
@@ -123,9 +122,7 @@ class BoundNodes {
using IDToNodeMap = internal::BoundNodesMap::IDToNodeMap;
/// Retrieve mapping from binding identifiers to bound nodes.
- const IDToNodeMap &getMap() const {
- return MyBoundNodes.getMap();
- }
+ const IDToNodeMap &getMap() const { return MyBoundNodes.getMap(); }
private:
friend class internal::BoundNodesTreeBuilder;
@@ -318,13 +315,15 @@ AST_POLYMORPHIC_MATCHER_P(isExpandedFromMacro,
std::string, MacroName) {
// Verifies that the statement' beginning and ending are both expanded from
// the same instance of the given macro.
- auto& Context = Finder->getASTContext();
+ auto &Context = Finder->getASTContext();
std::optional<SourceLocation> B =
internal::getExpansionLocOfMacro(MacroName, Node.getBeginLoc(), Context);
- if (!B) return false;
+ if (!B)
+ return false;
std::optional<SourceLocation> E =
internal::getExpansionLocOfMacro(MacroName, Node.getEndLoc(), Context);
- if (!E) return false;
+ if (!E)
+ return false;
return *B == *E;
}
@@ -690,9 +689,7 @@ AST_POLYMORPHIC_MATCHER(isPrivate,
/// \endcode
/// fieldDecl(isBitField())
/// matches 'int a;' but not 'int b;'.
-AST_MATCHER(FieldDecl, isBitField) {
- return Node.isBitField();
-}
+AST_MATCHER(FieldDecl, isBitField) { return Node.isBitField(); }
/// Matches non-static data members that are bit-fields of the specified
/// bit width.
@@ -735,9 +732,7 @@ AST_MATCHER_P(FieldDecl, hasInClassInitializer, internal::Matcher<Expr>,
/// Determines whether the function is "main", which is the entry point
/// into an executable program.
-AST_MATCHER(FunctionDecl, isMain) {
- return Node.isMain();
-}
+AST_MATCHER(FunctionDecl, isMain) { return Node.isMain(); }
/// Matches the specialized template of a specialization declaration.
///
@@ -751,9 +746,8 @@ AST_MATCHER(FunctionDecl, isMain) {
/// declaration of 'A' at #1.
AST_MATCHER_P(ClassTemplateSpecializationDecl, hasSpecializedTemplate,
internal::Matcher<ClassTemplateDecl>, InnerMatcher) {
- const ClassTemplateDecl* Decl = Node.getSpecializedTemplate();
- return (Decl != nullptr &&
- InnerMatcher.matches(*Decl, Finder, Builder));
+ const ClassTemplateDecl *Decl = Node.getSpecializedTemplate();
+ return (Decl != nullptr && InnerMatcher.matches(*Decl, Finder, Builder));
}
/// Matches an entity that has been implicitly added by the compiler (e.g.
@@ -788,8 +782,7 @@ AST_POLYMORPHIC_MATCHER(isImplicit,
AST_POLYMORPHIC_MATCHER_P(
hasAnyTemplateArgument,
AST_POLYMORPHIC_SUPPORTED_TYPES(ClassTemplateSpecializationDecl,
- TemplateSpecializationType,
- FunctionDecl),
+ TemplateSpecializationType, FunctionDecl),
internal::Matcher<TemplateArgument>, InnerMatcher) {
ArrayRef<TemplateArgument> List =
internal::getTemplateSpecializationArgs(Node);
@@ -890,8 +883,7 @@ traverse(TraversalKind TK, const internal::MapAnyOfHelper<T...> &InnerMatcher) {
/// varDecl(hasInitializer(cxxConstructExpr()))
/// \endcode
/// only match the declarations for b and c.
-AST_MATCHER_P(Expr, ignoringImplicit, internal::Matcher<Expr>,
- InnerMatcher) {
+AST_MATCHER_P(Expr, ignoringImplicit, internal::Matcher<Expr>, InnerMatcher) {
return InnerMatcher.matches(*Node.IgnoreImplicit(), Finder, Builder);
}
@@ -920,8 +912,7 @@ AST_MATCHER_P(Expr, ignoringImplicit, internal::Matcher<Expr>,
/// varDecl(hasInitializer(declRefExpr()))
/// \endcode
/// only match the declarations for a.
-AST_MATCHER_P(Expr, ignoringImpCasts,
- internal::Matcher<Expr>, InnerMatcher) {
+AST_MATCHER_P(Expr, ignoringImpCasts, internal::Matcher<Expr>, InnerMatcher) {
return InnerMatcher.matches(*Node.IgnoreImpCasts(), Finder, Builder);
}
@@ -967,8 +958,8 @@ AST_MATCHER_P(Expr, ignoringParenCasts, internal::Matcher<Expr>, InnerMatcher) {
/// varDecl(hasInitializer(integerLiteral()))
/// varDecl(hasInitializer(declRefExpr()))
/// would only match the declaration for a.
-AST_MATCHER_P(Expr, ignoringParenImpCasts,
- internal::Matcher<Expr>, InnerMatcher) {
+AST_MATCHER_P(Expr, ignoringParenImpCasts, internal::Matcher<Expr>,
+ InnerMatcher) {
return InnerMatcher.matches(*Node.IgnoreParenImpCasts(), Finder, Builder);
}
@@ -1068,8 +1059,7 @@ AST_MATCHER(Expr, isValueDependent) { return Node.isValueDependent(); }
AST_POLYMORPHIC_MATCHER_P2(
hasTemplateArgument,
AST_POLYMORPHIC_SUPPORTED_TYPES(ClassTemplateSpecializationDecl,
- TemplateSpecializationType,
- FunctionDecl),
+ TemplateSpecializationType, FunctionDecl),
unsigned, N, internal::Matcher<TemplateArgument>, InnerMatcher) {
ArrayRef<TemplateArgument> List =
internal::getTemplateSpecializationArgs(Node);
@@ -1106,8 +1096,8 @@ AST_POLYMORPHIC_MATCHER_P(
/// classTemplateSpecializationDecl(hasAnyTemplateArgument(refersToType(
/// recordType(hasDeclaration(recordDecl(hasName("X")))))))
/// matches the specialization of \c struct A generated by \c A<X>.
-AST_MATCHER_P(TemplateArgument, refersToType,
- internal::Matcher<QualType>, InnerMatcher) {
+AST_MATCHER_P(TemplateArgument, refersToType, internal::Matcher<QualType>,
+ InnerMatcher) {
if (Node.getKind() != TemplateArgument::Type)
return false;
return InnerMatcher.matches(Node.getAsType(), Finder, Builder);
@@ -1144,8 +1134,8 @@ AST_MATCHER_P(TemplateArgument, refersToTemplate,
/// refersToDeclaration(fieldDecl(hasName("next")))))
/// matches the specialization \c A<&B::next> with \c fieldDecl(...) matching
/// \c B::next
-AST_MATCHER_P(TemplateArgument, refersToDeclaration,
- internal::Matcher<Decl>, InnerMatcher) {
+AST_MATCHER_P(TemplateArgument, refersToDeclaration, internal::Matcher<Decl>,
+ InnerMatcher) {
if (Node.getKind() == TemplateArgument::Declaration)
return InnerMatcher.matches(*Node.getAsDecl(), Finder, Builder);
return false;
@@ -1215,8 +1205,7 @@ AST_MATCHER_P(TemplateArgument, refersToIntegralType,
/// classTemplateSpecializationDecl(
/// hasAnyTemplateArgument(equalsIntegralValue("42")))
/// matches the implicit instantiation of C in C<42>.
-AST_MATCHER_P(TemplateArgument, equalsIntegralValue,
- std::string, Value) {
+AST_MATCHER_P(TemplateArgument, equalsIntegralValue, std::string, Value) {
if (Node.getKind() != TemplateArgument::Integral)
return false;
return toString(Node.getAsIntegral(), 10) == Value;
@@ -1233,7 +1222,8 @@ AST_MATCHER_P(TemplateArgument, equalsIntegralValue,
/// autoreleasePoolStmt(stmt()) matches the declaration of "x"
/// inside the autorelease pool.
extern const internal::VariadicDynCastAllOfMatcher<Stmt,
- ObjCAutoreleasePoolStmt> autoreleasePoolStmt;
+ ObjCAutoreleasePoolStmt>
+ autoreleasePoolStmt;
/// Matches any value declaration.
///
@@ -1611,8 +1601,7 @@ extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCMethodDecl>
/// printf("%d", p);
/// })
/// \endcode
-extern const internal::VariadicDynCastAllOfMatcher<Decl, BlockDecl>
- blockDecl;
+extern const internal::VariadicDynCastAllOfMatcher<Decl, BlockDecl> blockDecl;
/// Matches Objective-C instance variable declarations.
///
@@ -1701,8 +1690,8 @@ extern const internal::VariadicDynCastAllOfMatcher<Stmt, InitListExpr>
/// Matches the syntactic form of init list expressions
/// (if expression have it).
-AST_MATCHER_P(InitListExpr, hasSyntacticForm,
- internal::Matcher<Expr>, InnerMatcher) {
+AST_MATCHER_P(InitListExpr, hasSyntacticForm, internal::Matcher<Expr>,
+ InnerMatcher) {
const Expr *SyntForm = Node.getSyntacticForm();
return (SyntForm != nullptr &&
InnerMatcher.matches(*SyntForm, Finder, Builder));
@@ -1981,7 +1970,8 @@ extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDeleteExpr>
extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNoexceptExpr>
cxxNoexceptExpr;
-/// Matches a loop initializing the elements of an array in a number of contexts:
+/// Matches a loop initializing the elements of an array in a number of
+/// contexts:
/// * in the implicit copy/move constructor for a class with an array member
/// * when a lambda-expression captures an array by value
/// * when a decomposition declaration decomposes an array
@@ -1995,16 +1985,16 @@ extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNoexceptExpr>
/// };
/// }
/// \endcode
-/// arrayInitLoopExpr() matches the implicit loop that initializes each element of
-/// the implicit array field inside the lambda object, that represents the array `a`
-/// captured by value.
+/// arrayInitLoopExpr() matches the implicit loop that initializes each element
+/// of the implicit array field inside the lambda object, that represents the
+/// array `a` captured by value.
extern const internal::VariadicDynCastAllOfMatcher<Stmt, ArrayInitLoopExpr>
arrayInitLoopExpr;
/// The arrayInitIndexExpr consists of two subexpressions: a common expression
-/// (the source array) that is evaluated once up-front, and a per-element initializer
-/// that runs once for each array element. Within the per-element initializer,
-/// the current index may be obtained via an ArrayInitIndexExpr.
+/// (the source array) that is evaluated once up-front, and a per-element
+/// initializer that runs once for each array element. Within the per-element
+/// initializer, the current index may be obtained via an ArrayInitIndexExpr.
///
/// Given
/// \code
@@ -2160,8 +2150,7 @@ extern const internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt> forStmt;
/// \code
/// for (x; x < N; ++x) { }
/// \endcode
-AST_MATCHER_P(ForStmt, hasIncrement, internal::Matcher<Stmt>,
- InnerMatcher) {
+AST_MATCHER_P(ForStmt, hasIncrement, internal::Matcher<Stmt>, InnerMatcher) {
const Stmt *const Increment = Node.getInc();
return (Increment != nullptr &&
InnerMatcher.matches(*Increment, Finder, Builder));
@@ -2175,8 +2164,7 @@ AST_MATCHER_P(ForStmt, hasIncrement, internal::Matcher<Stmt>,
/// \code
/// for (int x = 0; x < N; ++x) { }
/// \endcode
-AST_MATCHER_P(ForStmt, hasLoopInit, internal::Matcher<Stmt>,
- InnerMatcher) {
+AST_MATCHER_P(ForStmt, hasLoopInit, internal::Matcher<Stmt>, InnerMatcher) {
const Stmt *const Init = Node.getInit();
return (Init != nullptr && InnerMatcher.matches(*Init, Finder, Builder));
}
@@ -2528,8 +2516,7 @@ extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNullPtrLiteralExpr>
cxxNullPtrLiteralExpr;
/// Matches GNU __builtin_choose_expr.
-extern const internal::VariadicDynCastAllOfMatcher<Stmt, ChooseExpr>
- chooseExpr;
+extern const internal::VariadicDynCastAllOfMatcher<Stmt, ChooseExpr> chooseExpr;
/// Matches builtin function __builtin_convertvector.
extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConvertVectorExpr>
@@ -3045,8 +3032,8 @@ AST_MATCHER_P(UnaryExprOrTypeTraitExpr, ofKind, UnaryExprOrTypeTrait, Kind) {
/// Same as unaryExprOrTypeTraitExpr, but only matching
/// alignof.
-inline internal::BindableMatcher<Stmt> alignOfExpr(
- const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
+inline internal::BindableMatcher<Stmt>
+alignOfExpr(const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
return stmt(unaryExprOrTypeTraitExpr(
allOf(anyOf(ofKind(UETT_AlignOf), ofKind(UETT_PreferredAlignOf)),
InnerMatcher)));
@@ -3054,10 +3041,10 @@ inline internal::BindableMatcher<Stmt> alignOfExpr(
/// Same as unaryExprOrTypeTraitExpr, but only matching
/// sizeof.
-inline internal::BindableMatcher<Stmt> sizeOfExpr(
- const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
- return stmt(unaryExprOrTypeTraitExpr(
- allOf(ofKind(UETT_SizeOf), InnerMatcher)));
+inline internal::BindableMatcher<Stmt>
+sizeOfExpr(const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
+ return stmt(
+ unaryExprOrTypeTraitExpr(allOf(ofKind(UETT_SizeOf), InnerMatcher)));
}
/// Matches NamedDecl nodes that have the specified name.
@@ -3265,10 +3252,10 @@ AST_MATCHER_P(CXXDependentScopeMemberExpr, memberHasSameNameAsBoundNode,
/// \endcode
///
/// Usable as: Matcher<CXXRecordDecl>, Matcher<ObjCInterfaceDecl>
-AST_POLYMORPHIC_MATCHER_P(
- isDerivedFrom,
- AST_POLYMORPHIC_SUPPORTED_TYPES(CXXRecordDecl, ObjCInterfaceDecl),
- internal::Matcher<NamedDecl>, Base) {
+AST_POLYMORPHIC_MATCHER_P(isDerivedFrom,
+ AST_POLYMORPHIC_SUPPORTED_TYPES(CXXRecordDecl,
+ ObjCInterfaceDecl),
+ internal::Matcher<NamedDecl>, Base) {
// Check if the node is a C++ struct/union/class.
if (const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
return Finder->classIsDerivedFrom(RD, Base, Builder, /*Directly=*/false);
@@ -3453,9 +3440,7 @@ AST_MATCHER_P(CXXRecordDecl, hasMethod, internal::Matcher<CXXMethodDecl>,
///
/// \c cxxRecordDecl(isLambda()) matches the implicit class declaration of
/// \c decltype(x)
-AST_MATCHER(CXXRecordDecl, isLambda) {
- return Node.isLambda();
-}
+AST_MATCHER(CXXRecordDecl, isLambda) { return Node.isLambda(); }
/// Matches AST nodes that have child AST nodes that match the
/// provided matcher.
@@ -3693,15 +3678,13 @@ AST_MATCHER_P(NamedDecl, hasUnderlyingDecl, internal::Matcher<NamedDecl>,
/// matches `(g()).m()`.
///
/// FIXME: Overload to allow directly matching types?
-AST_MATCHER_P(CXXMemberCallExpr, on, internal::Matcher<Expr>,
- InnerMatcher) {
- const Expr *ExprNode = Node.getImplicitObjectArgument()
- ->IgnoreParenImpCasts();
+AST_MATCHER_P(CXXMemberCallExpr, on, internal::Matcher<Expr>, InnerMatcher) {
+ const Expr *ExprNode =
+ Node.getImplicitObjectArgument()->IgnoreParenImpCasts();
return (ExprNode != nullptr &&
InnerMatcher.matches(*ExprNode, Finder, Builder));
}
-
/// Matches on the receiver of an ObjectiveC Message expression.
///
/// Example
@@ -3730,9 +3713,7 @@ AST_MATCHER_P(ObjCMessageExpr, hasReceiverType, internal::Matcher<QualType>,
/// \code
/// @interface I - (void)bar; @end
/// \endcode
-AST_MATCHER(ObjCMethodDecl, isClassMethod) {
- return Node.isClassMethod();
-}
+AST_MATCHER(ObjCMethodDecl, isClassMethod) { return Node.isClassMethod(); }
/// Returns true when the Objective-C method declaration is an instance method.
///
@@ -3763,9 +3744,7 @@ AST_MATCHER(ObjCMethodDecl, isInstanceMethod) {
/// NSString *x = @"hello";
/// [x containsString:@"h"];
/// \endcode
-AST_MATCHER(ObjCMessageExpr, isClassMessage) {
- return Node.isClassMessage();
-}
+AST_MATCHER(ObjCMessageExpr, isClassMessage) { return Node.isClassMessage(); }
/// Returns true when the Objective-C message is sent to an instance.
///
@@ -3825,9 +3804,8 @@ AST_MATCHER_P(ObjCMessageExpr, hasSelector, std::string, BaseName) {
/// [myObj methodB:argB];
/// \endcode
extern const internal::VariadicFunction<internal::Matcher<ObjCMessageExpr>,
- StringRef,
- internal::hasAnySelectorFunc>
- hasAnySelector;
+ StringRef, internal::hasAnySelectorFunc>
+ hasAnySelector;
/// Matches ObjC selectors whose name contains
/// a substring matched by the given RegExp.
@@ -4021,8 +3999,8 @@ AST_POLYMORPHIC_MATCHER_P_OVERLOAD(
/// \endcode
///
/// Example matches class Derived
-/// (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
-/// \code
+/// (matcher =
+/// cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) \code
/// class Base {};
/// class Derived : Base {};
/// \endcode
@@ -4110,9 +4088,7 @@ AST_MATCHER_P(QualType, asString, std::string, Name) {
/// class Y { public: void x(); };
/// void z() { Y *y; y->x(); }
/// \endcode
-AST_MATCHER_P(
- QualType, pointsTo, internal::Matcher<QualType>,
- InnerMatcher) {
+AST_MATCHER_P(QualType, pointsTo, internal::Matcher<QualType>, InnerMatcher) {
return (!Node.isNull() && Node->isAnyPointerType() &&
InnerMatcher.matches(Node->getPointeeType(), Finder, Builder));
}
@@ -4153,8 +4129,7 @@ AST_MATCHER_P(Type, hasUnqualifiedDesugaredType, internal::Matcher<Type>,
/// }
/// };
/// \endcode
-AST_MATCHER_P(QualType, references, internal::Matcher<QualType>,
- InnerMatcher) {
+AST_MATCHER_P(QualType, references, internal::Matcher<QualType>, InnerMatcher) {
return (!Node.isNull() && Node->isReferenceType() &&
InnerMatcher.matches(Node->getPointeeType(), Finder, Builder));
}
@@ -4228,7 +4203,7 @@ AST_MATCHER_P(CXXMemberCallExpr, onImplicitObjectArgument,
AST_MATCHER_P_OVERLOAD(CXXMemberCallExpr, thisPointerType,
internal::Matcher<QualType>, InnerMatcher, 0) {
return onImplicitObjectArgument(
- anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
+ anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
.matches(Node, Finder, Builder);
}
@@ -4236,7 +4211,7 @@ AST_MATCHER_P_OVERLOAD(CXXMemberCallExpr, thisPointerType,
AST_MATCHER_P_OVERLOAD(CXXMemberCallExpr, thisPointerType,
internal::Matcher<Decl>, InnerMatcher, 1) {
return onImplicitObjectArgument(
- anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
+ anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
.matches(Node, Finder, Builder);
}
@@ -4249,8 +4224,7 @@ AST_MATCHER_P_OVERLOAD(CXXMemberCallExpr, thisPointerType,
/// bool x;
/// if (x) {}
/// \endcode
-AST_MATCHER_P(DeclRefExpr, to, internal::Matcher<Decl>,
- InnerMatcher) {
+AST_MATCHER_P(DeclRefExpr, to, internal::Matcher<Decl>, InnerMatcher) {
const Decl *DeclNode = Node.getDecl();
return (DeclNode != nullptr &&
InnerMatcher.matches(*DeclNode, Finder, Builder));
@@ -4334,9 +4308,7 @@ AST_MATCHER_P(DeclStmt, hasSingleDecl, internal::Matcher<Decl>, InnerMatcher) {
/// bool y() { return true; }
/// bool x = y();
/// \endcode
-AST_MATCHER_P(
- VarDecl, hasInitializer, internal::Matcher<Expr>,
- InnerMatcher) {
+AST_MATCHER_P(VarDecl, hasInitializer, internal::Matcher<Expr>, InnerMatcher) {
const Expr *Initializer = Node.getAnyInitializer();
return (Initializer != nullptr &&
InnerMatcher.matches(*Initializer, Finder, Builder));
@@ -4391,9 +4363,7 @@ AST_MATCHER_P(LambdaExpr, forEachLambdaCapture,
/// }
/// static int z;
/// \endcode
-AST_MATCHER(VarDecl, isStaticLocal) {
- return Node.isStaticLocal();
-}
+AST_MATCHER(VarDecl, isStaticLocal) { return Node.isStaticLocal(); }
/// Matches a variable declaration that has function scope and is a
/// non-static local variable.
@@ -4406,9 +4376,7 @@ AST_MATCHER(VarDecl, isStaticLocal) {
/// }
/// int z;
/// \endcode
-AST_MATCHER(VarDecl, hasLocalStorage) {
- return Node.hasLocalStorage();
-}
+AST_MATCHER(VarDecl, hasLocalStorage) { return Node.hasLocalStorage(); }
/// Matches a variable declaration that does not have local storage.
///
@@ -4420,9 +4388,7 @@ AST_MATCHER(VarDecl, hasLocalStorage) {
/// }
/// int z;
/// \endcode
-AST_MATCHER(VarDecl, hasGlobalStorage) {
- return Node.hasGlobalStorage();
-}
+AST_MATCHER(VarDecl, hasGlobalStorage) { return Node.hasGlobalStorage(); }
/// Matches a variable declaration that has automatic storage duration.
///
@@ -4487,9 +4453,7 @@ AST_MATCHER(VarDecl, hasThreadStorageDuration) {
/// }
/// }
/// \endcode
-AST_MATCHER(VarDecl, isExceptionVariable) {
- return Node.isExceptionVariable();
-}
+AST_MATCHER(VarDecl, isExceptionVariable) { return Node.isExceptionVariable(); }
/// Checks that a call expression or a constructor call expression has
/// a specific number of arguments (including absent default arguments).
@@ -4560,7 +4524,7 @@ AST_POLYMORPHIC_MATCHER_P2(hasArgument,
const Expr *Arg = Node.getArg(N);
if (Finder->isTraversalIgnoringImplicitNodes() && isa<CXXDefaultArgExpr>(Arg))
return false;
- return InnerMatcher.matches(*Arg->ignoringParenImpCasts(), Finder, Builder);
+ return InnerMatcher.matches(*Arg, Finder, Builder);
}
/// Matches the operand that does not contain the parameter pack.
@@ -4686,7 +4650,7 @@ AST_MATCHER(CXXFoldExpr, isBinaryFold) { return Node.getInit() != nullptr; }
AST_MATCHER_P2(InitListExpr, hasInit, unsigned, N, internal::Matcher<Expr>,
InnerMatcher) {
return N < Node.getNumInits() &&
- InnerMatcher.matches(*Node.getInit(N), Finder, Builder);
+ InnerMatcher.matches(*Node.getInit(N), Finder, Builder);
}
/// Matches declaration statements that contain a specific number of
@@ -4785,11 +4749,11 @@ AST_MATCHER_P(CXXConstructorDecl, hasAnyConstructorInitializer,
/// forField(hasName("foo_"))))))
/// matches Foo
/// with forField matching foo_
-AST_MATCHER_P(CXXCtorInitializer, forField,
- internal::Matcher<FieldDecl>, InnerMatcher) {
+AST_MATCHER_P(CXXCtorInitializer, forField, internal::Matcher<FieldDecl>,
+ InnerMatcher) {
const FieldDecl *NodeAsDecl = Node.getAnyMember();
return (NodeAsDecl != nullptr &&
- InnerMatcher.matches(*NodeAsDecl, Finder, Builder));
+ InnerMatcher.matches(*NodeAsDecl, Finder, Builder));
}
/// Matches the initializer expression of a constructor initializer.
@@ -4805,11 +4769,11 @@ AST_MATCHER_P(CXXCtorInitializer, forField,
/// withInitializer(integerLiteral(equals(1)))))))
/// matches Foo
/// with withInitializer matching (1)
-AST_MATCHER_P(CXXCtorInitializer, withInitializer,
- internal::Matcher<Expr>, InnerMatcher) {
- const Expr* NodeAsExpr = Node.getInit();
+AST_MATCHER_P(CXXCtorInitializer, withInitializer, internal::Matcher<Expr>,
+ InnerMatcher) {
+ const Expr *NodeAsExpr = Node.getInit();
return (NodeAsExpr != nullptr &&
- InnerMatcher.matches(*NodeAsExpr, Finder, Builder));
+ InnerMatcher.matches(*NodeAsExpr, Finder, Builder));
}
/// Matches a constructor initializer if it is explicitly written in
@@ -4825,9 +4789,7 @@ AST_MATCHER_P(CXXCtorInitializer, withInitializer,
/// \endcode
/// cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
/// will match Foo(int), but not Foo()
-AST_MATCHER(CXXCtorInitializer, isWritten) {
- return Node.isWritten();
-}
+AST_MATCHER(CXXCtorInitializer, isWritten) { return Node.isWritten(); }
/// Matches a constructor initializer if it is initializing a base, as
/// opposed to a member.
@@ -5024,14 +4986,12 @@ AST_MATCHER(CXXConstructExpr, requiresZeroInitialization) {
/// the matcher objcMethodDecl(hasParameter(0, hasName("y")))
/// matches the declaration of method f with hasParameter
/// matching y.
-AST_POLYMORPHIC_MATCHER_P2(hasParameter,
- AST_POLYMORPHIC_SUPPORTED_TYPES(FunctionDecl,
- ObjCMethodDecl,
- BlockDecl),
- unsigned, N, internal::Matcher<ParmVarDecl>,
- InnerMatcher) {
- return (N < Node.parameters().size()
- && InnerMatcher.matches(*Node.parameters()[N], Finder, Builder));
+AST_POLYMORPHIC_MATCHER_P2(
+ hasParameter,
+ AST_POLYMORPHIC_SUPPORTED_TYPES(FunctionDecl, ObjCMethodDecl, BlockDecl),
+ unsigned, N, internal::Matcher<ParmVarDecl>, InnerMatcher) {
+ return (N < Node.parameters().size() &&
+ InnerMatcher.matches(*Node.parameters()[N], Finder, Builder));
}
/// Matches if the given method declaration declares a member function with an
@@ -5091,8 +5051,8 @@ AST_POLYMORPHIC_MATCHER_P2(forEachArgumentWithParam,
bool Matched = false;
for (; ArgIndex < Node.getNumArgs(); ++ArgIndex) {
BoundNodesTreeBuilder ArgMatches(*Builder);
- if (ArgMatcher.matches(*(Node.getArg(ArgIndex)->IgnoreParenCasts()),
- Finder, &ArgMatches)) {
+ if (ArgMatcher.matches(*(Node.getArg(ArgIndex)->IgnoreParenCasts()), Finder,
+ &ArgMatches)) {
BoundNodesTreeBuilder ParamMatches(ArgMatches);
if (expr(anyOf(cxxConstructExpr(hasDeclaration(cxxConstructorDecl(
hasParameter(ParamIndex, ParamMatcher)))),
@@ -5273,8 +5233,7 @@ AST_POLYMORPHIC_MATCHER_P(hasAnyParameter,
AST_POLYMORPHIC_SUPPORTED_TYPES(FunctionDecl,
ObjCMethodDecl,
BlockDecl),
- internal::Matcher<ParmVarDecl>,
- InnerMatcher) {
+ internal::Matcher<ParmVarDecl>, InnerMatcher) {
return matchesFirstInPointerRange(InnerMatcher, Node.param_begin(),
Node.param_end(), Finder,
Builder) != Node.param_end();
@@ -5371,8 +5330,8 @@ AST_MATCHER(FunctionDecl, isNoReturn) { return Node.isNoReturn(); }
/// \endcode
/// cxxMethodDecl(returns(asString("int")))
/// matches int f() { return 1; }
-AST_MATCHER_P(FunctionDecl, returns,
- internal::Matcher<QualType>, InnerMatcher) {
+AST_MATCHER_P(FunctionDecl, returns, internal::Matcher<QualType>,
+ InnerMatcher) {
return InnerMatcher.matches(Node.getReturnType(), Finder, Builder);
}
@@ -5425,9 +5384,7 @@ AST_POLYMORPHIC_MATCHER(isStaticStorageClass,
/// \endcode
/// functionDecl(isDeleted())
/// matches the declaration of DeletedFunc, but not Func.
-AST_MATCHER(FunctionDecl, isDeleted) {
- return Node.isDeleted();
-}
+AST_MATCHER(FunctionDecl, isDeleted) { return Node.isDeleted(); }
/// Matches defaulted function declarations.
///
@@ -5438,9 +5395,7 @@ AST_MATCHER(FunctionDecl, isDeleted) {
/// \endcode
/// functionDecl(isDefaulted())
/// matches the declaration of ~B, but not ~A.
-AST_MATCHER(FunctionDecl, isDefaulted) {
- return Node.isDefaulted();
-}
+AST_MATCHER(FunctionDecl, isDefaulted) { return Node.isDefaulted(); }
/// Matches weak function declarations.
///
@@ -5541,8 +5496,7 @@ AST_POLYMORPHIC_MATCHER(isConsteval,
/// ifStmt(isConstexpr())
/// matches the if statement in baz.
AST_POLYMORPHIC_MATCHER(isConstexpr,
- AST_POLYMORPHIC_SUPPORTED_TYPES(VarDecl,
- FunctionDecl,
+ AST_POLYMORPHIC_SUPPORTED_TYPES(VarDecl, FunctionDecl,
IfStmt)) {
return Node.isConstexpr();
}
@@ -5681,8 +5635,8 @@ AST_POLYMORPHIC_MATCHER_P(equalsBoundNode,
/// matches 'A* a = GetAPointer()'.
AST_MATCHER_P(IfStmt, hasConditionVariableStatement,
internal::Matcher<DeclStmt>, InnerMatcher) {
- const DeclStmt* const DeclarationStatement =
- Node.getConditionVariableDeclStmt();
+ const DeclStmt *const DeclarationStatement =
+ Node.getConditionVariableDeclStmt();
return DeclarationStatement != nullptr &&
InnerMatcher.matches(*DeclarationStatement, Finder, Builder);
}
@@ -5696,9 +5650,9 @@ AST_MATCHER_P(IfStmt, hasConditionVariableStatement,
/// \endcode
/// arraySubscriptExpression(hasIndex(integerLiteral()))
/// matches \c i[1] with the \c integerLiteral() matching \c 1
-AST_MATCHER_P(ArraySubscriptExpr, hasIndex,
- internal::Matcher<Expr>, InnerMatcher) {
- if (const Expr* Expression = Node.getIdx())
+AST_MATCHER_P(ArraySubscriptExpr, hasIndex, internal::Matcher<Expr>,
+ InnerMatcher) {
+ if (const Expr *Expression = Node.getIdx())
return InnerMatcher.matches(*Expression, Finder, Builder);
return false;
}
@@ -5713,9 +5667,9 @@ AST_MATCHER_P(ArraySubscriptExpr, hasIndex,
/// arraySubscriptExpression(hasBase(implicitCastExpr(
/// hasSourceExpression(declRefExpr()))))
/// matches \c i[1] with the \c declRefExpr() matching \c i
-AST_MATCHER_P(ArraySubscriptExpr, hasBase,
- internal::Matcher<Expr>, InnerMatcher) {
- if (const Expr* Expression = Node.getBase())
+AST_MATCHER_P(ArraySubscriptExpr, hasBase, internal::Matcher<Expr>,
+ InnerMatcher) {
+ if (const Expr *Expression = Node.getBase())
return InnerMatcher.matches(*Expression, Finder, Builder);
return false;
}
@@ -5772,14 +5726,12 @@ AST_POLYMORPHIC_MATCHER_P(
/// with compoundStmt()
/// matching '{}'
/// but does not match 'void g();'
-AST_MATCHER_P(FunctionDecl, hasAnyBody,
- internal::Matcher<Stmt>, InnerMatcher) {
+AST_MATCHER_P(FunctionDecl, hasAnyBody, internal::Matcher<Stmt>, InnerMatcher) {
const Stmt *const Statement = Node.getBody();
return (Statement != nullptr &&
InnerMatcher.matches(*Statement, Finder, Builder));
}
-
/// Matches compound statements where at least one substatement matches
/// a given matcher. Also matches StmtExprs that have CompoundStmt as children.
///
@@ -5849,32 +5801,31 @@ equals(const ValueT &Value) {
Value);
}
-AST_POLYMORPHIC_MATCHER_P_OVERLOAD(equals,
- AST_POLYMORPHIC_SUPPORTED_TYPES(CharacterLiteral,
- CXXBoolLiteralExpr,
- IntegerLiteral),
- bool, Value, 0) {
- return internal::ValueEqualsMatcher<NodeType, ParamT>(Value)
- .matchesNode(Node);
+AST_POLYMORPHIC_MATCHER_P_OVERLOAD(
+ equals,
+ AST_POLYMORPHIC_SUPPORTED_TYPES(CharacterLiteral, CXXBoolLiteralExpr,
+ IntegerLiteral),
+ bool, Value, 0) {
+ return internal::ValueEqualsMatcher<NodeType, ParamT>(Value).matchesNode(
+ Node);
}
-AST_POLYMORPHIC_MATCHER_P_OVERLOAD(equals,
- AST_POLYMORPHIC_SUPPORTED_TYPES(CharacterLiteral,
- CXXBoolLiteralExpr,
- IntegerLiteral),
- unsigned, Value, 1) {
- return internal::ValueEqualsMatcher<NodeType, ParamT>(Value)
- .matchesNode(Node);
+AST_POLYMORPHIC_MATCHER_P_OVERLOAD(
+ equals,
+ AST_POLYMORPHIC_SUPPORTED_TYPES(CharacterLiteral, CXXBoolLiteralExpr,
+ IntegerLiteral),
+ unsigned, Value, 1) {
+ return internal::ValueEqualsMatcher<NodeType, ParamT>(Value).matchesNode(
+ Node);
}
-AST_POLYMORPHIC_MATCHER_P_OVERLOAD(equals,
- AST_POLYMORPHIC_SUPPORTED_TYPES(CharacterLiteral,
- CXXBoolLiteralExpr,
- FloatingLiteral,
- IntegerLiteral),
- double, Value, 2) {
- return internal::ValueEqualsMatcher<NodeType, ParamT>(Value)
- .matchesNode(Node);
+AST_POLYMORPHIC_MATCHER_P_OVERLOAD(
+ equals,
+ AST_POLYMORPHIC_SUPPORTED_TYPES(CharacterLiteral, CXXBoolLiteralExpr,
+ FloatingLiteral, IntegerLiteral),
+ double, Value, 2) {
+ return internal::ValueEqualsMatcher<NodeType, ParamT>(Value).matchesNode(
+ Node);
}
/// Matches the operator Name of operator expressions and fold expressions
@@ -6088,8 +6039,8 @@ AST_MATCHER_P(CastExpr, hasCastKind, CastKind, Kind) {
///
/// (Note: Clang's AST refers to other conversions as "casts" too, and calls
/// actual casts "explicit" casts.)
-AST_MATCHER_P(ExplicitCastExpr, hasDestinationType,
- internal::Matcher<QualType>, InnerMatcher) {
+AST_MATCHER_P(ExplicitCastExpr, hasDestinationType, internal::Matcher<QualType>,
+ InnerMatcher) {
const QualType NodeType = Node.getTypeAsWritten();
return InnerMatcher.matches(NodeType, Finder, Builder);
}
@@ -6110,9 +6061,7 @@ AST_MATCHER_P(ImplicitCastExpr, hasImplicitDestinationType,
/// union U {};
/// enum E {};
/// \endcode
-AST_MATCHER(TagDecl, isStruct) {
- return Node.isStruct();
-}
+AST_MATCHER(TagDecl, isStruct) { return Node.isStruct(); }
/// Matches TagDecl object that are spelled with "union."
///
@@ -6123,9 +6072,7 @@ AST_MATCHER(TagDecl, isStruct) {
/// union U {};
/// enum E {};
/// \endcode
-AST_MATCHER(TagDecl, isUnion) {
- return Node.isUnion();
-}
+AST_MATCHER(TagDecl, isUnion) { return Node.isUnion(); }
/// Matches TagDecl object that are spelled with "class."
///
@@ -6136,9 +6083,7 @@ AST_MATCHER(TagDecl, isUnion) {
/// union U {};
/// enum E {};
/// \endcode
-AST_MATCHER(TagDecl, isClass) {
- return Node.isClass();
-}
+AST_MATCHER(TagDecl, isClass) { return Node.isClass(); }
/// Matches TagDecl object that are spelled with "enum."
///
@@ -6149,9 +6094,7 @@ AST_MATCHER(TagDecl, isClass) {
/// union U {};
/// enum E {};
/// \endcode
-AST_MATCHER(TagDecl, isEnum) {
- return Node.isEnum();
-}
+AST_MATCHER(TagDecl, isEnum) { return Node.isEnum(); }
/// Matches the true branch expression of a conditional operator.
///
@@ -6223,9 +6166,7 @@ AST_POLYMORPHIC_MATCHER(isDefinition,
/// template <typename... Ts> void h(Ts...);
/// void i();
/// \endcode
-AST_MATCHER(FunctionDecl, isVariadic) {
- return Node.isVariadic();
-}
+AST_MATCHER(FunctionDecl, isVariadic) { return Node.isVariadic(); }
/// Matches the class declaration that the given method declaration
/// belongs to.
@@ -6244,14 +6185,13 @@ AST_MATCHER(FunctionDecl, isVariadic) {
/// };
/// A a = A();
/// \endcode
-AST_MATCHER_P(CXXMethodDecl, ofClass,
- internal::Matcher<CXXRecordDecl>, InnerMatcher) {
+AST_MATCHER_P(CXXMethodDecl, ofClass, internal::Matcher<CXXRecordDecl>,
+ InnerMatcher) {
ASTChildrenNotSpelledInSourceScope RAII(Finder, false);
const CXXRecordDecl *Parent = Node.getParent();
- return (Parent != nullptr &&
- InnerMatcher.matches(*Parent, Finder, Builder));
+ return (Parent != nullptr && InnerMatcher.matches(*Parent, Finder, Builder));
}
/// Matches each method overridden by the given method. This matcher may
@@ -6386,9 +6326,7 @@ AST_MATCHER(CXXMethodDecl, isPure) { return Node.isPureVirtual(); }
/// \endcode
///
/// cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
-AST_MATCHER(CXXMethodDecl, isConst) {
- return Node.isConst();
-}
+AST_MATCHER(CXXMethodDecl, isConst) { return Node.isConst(); }
/// Matches if the given method declaration declares a copy assignment
/// operator.
@@ -6453,9 +6391,7 @@ AST_MATCHER(CXXMethodDecl, isOverride) {
/// };
/// \endcode
/// cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
-AST_MATCHER(CXXMethodDecl, isUserProvided) {
- return Node.isUserProvided();
-}
+AST_MATCHER(CXXMethodDecl, isUserProvided) { return Node.isUserProvided(); }
/// Matches member expressions that are called with '->' as opposed
/// to '.'.
@@ -6497,9 +6433,7 @@ AST_POLYMORPHIC_MATCHER(
/// \endcode
/// functionDecl(hasAnyParameter(hasType(isInteger())))
/// matches "a(int)", "b(long)", but not "c(double)".
-AST_MATCHER(QualType, isInteger) {
- return Node->isIntegerType();
-}
+AST_MATCHER(QualType, isInteger) { return Node->isIntegerType(); }
/// Matches QualType nodes that are of unsigned integer type.
///
@@ -6512,7 +6446,7 @@ AST_MATCHER(QualType, isInteger) {
/// functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
/// matches "b(unsigned long)", but not "a(int)" and "c(double)".
AST_MATCHER(QualType, isUnsignedInteger) {
- return Node->isUnsignedIntegerType();
+ return Node->isUnsignedIntegerType();
}
/// Matches QualType nodes that are of signed integer type.
@@ -6525,9 +6459,7 @@ AST_MATCHER(QualType, isUnsignedInteger) {
/// \endcode
/// functionDecl(hasAnyParameter(hasType(isSignedInteger())))
/// matches "a(int)", but not "b(unsigned long)" and "c(double)".
-AST_MATCHER(QualType, isSignedInteger) {
- return Node->isSignedIntegerType();
-}
+AST_MATCHER(QualType, isSignedInteger) { return Node->isSignedIntegerType(); }
/// Matches QualType nodes that are of character type.
///
@@ -6539,9 +6471,7 @@ AST_MATCHER(QualType, isSignedInteger) {
/// \endcode
/// functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
/// matches "a(char)", "b(wchar_t)", but not "c(double)".
-AST_MATCHER(QualType, isAnyCharacter) {
- return Node->isAnyCharacterType();
-}
+AST_MATCHER(QualType, isAnyCharacter) { return Node->isAnyCharacterType(); }
/// Matches QualType nodes that are of any pointer type; this includes
/// the Objective-C object pointer type, which is different despite being
@@ -6559,9 +6489,7 @@ AST_MATCHER(QualType, isAnyCharacter) {
/// \endcode
/// varDecl(hasType(isAnyPointer()))
/// matches "int *i" and "Foo *f", but not "int j".
-AST_MATCHER(QualType, isAnyPointer) {
- return Node->isAnyPointerType();
-}
+AST_MATCHER(QualType, isAnyPointer) { return Node->isAnyPointerType(); }
/// Matches QualType nodes that are const-qualified, i.e., that
/// include "top-level" const.
@@ -6578,9 +6506,7 @@ AST_MATCHER(QualType, isAnyPointer) {
/// matches "void b(int const)", "void c(const int)" and
/// "void e(int const) {}". It does not match d as there
/// is no top-level const on the parameter type "const int *".
-AST_MATCHER(QualType, isConstQualified) {
- return Node.isConstQualified();
-}
+AST_MATCHER(QualType, isConstQualified) { return Node.isConstQualified(); }
/// Matches QualType nodes that are volatile-qualified, i.e., that
/// include "top-level" volatile.
@@ -6614,9 +6540,7 @@ AST_MATCHER(QualType, isVolatileQualified) {
/// \endcode
/// \c varDecl(hasType(hasLocalQualifiers())) matches only \c j and \c k.
/// \c i is const-qualified but the qualifier is not local.
-AST_MATCHER(QualType, hasLocalQualifiers) {
- return Node.hasLocalQualifiers();
-}
+AST_MATCHER(QualType, hasLocalQualifiers) { return Node.hasLocalQualifiers(); }
/// Matches a member expression where the member is matched by a
/// given matcher.
@@ -6630,8 +6554,7 @@ AST_MATCHER(QualType, hasLocalQualifiers) {
/// memberExpr(member(hasName("first")))
/// matches second.first
/// but not first.second (because the member name there is "second").
-AST_MATCHER_P(MemberExpr, member,
- internal::Matcher<ValueDecl>, InnerMatcher) {
+AST_MATCHER_P(MemberExpr, member, internal::Matcher<ValueDecl>, InnerMatcher) {
return InnerMatcher.matches(*Node.getMemberDecl(), Finder, Builder);
}
@@ -6693,8 +6616,8 @@ AST_MATCHER_P(BaseUsingDecl, hasAnyUsingShadowDecl,
/// usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
/// matches \code using X::b \endcode
/// but not \code using X::a \endcode
-AST_MATCHER_P(UsingShadowDecl, hasTargetDecl,
- internal::Matcher<NamedDecl>, InnerMatcher) {
+AST_MATCHER_P(UsingShadowDecl, hasTargetDecl, internal::Matcher<NamedDecl>,
+ InnerMatcher) {
return InnerMatcher.matches(*Node.getTargetDecl(), Finder, Builder);
}
@@ -6987,9 +6910,7 @@ AST_MATCHER_P(ElaboratedTypeLoc, hasNamedTypeLoc, internal::Matcher<TypeLoc>,
/// \endcode
/// functionDecl(returns(booleanType()))
/// matches "bool func();"
-AST_MATCHER(Type, booleanType) {
- return Node.isBooleanType();
-}
+AST_MATCHER(Type, booleanType) { return Node.isBooleanType(); }
/// Matches type \c void.
///
@@ -6999,9 +6920,7 @@ AST_MATCHER(Type, booleanType) {
/// \endcode
/// functionDecl(returns(voidType()))
/// matches "void func();"
-AST_MATCHER(Type, voidType) {
- return Node.isVoidType();
-}
+AST_MATCHER(Type, voidType) { return Node.isVoidType(); }
template <typename NodeType>
using AstTypeMatcher = internal::VariadicDynCastAllOfMatcher<Type, NodeType>;
@@ -7051,9 +6970,7 @@ extern const AstTypeMatcher<ComplexType> complexType;
/// \endcode
/// realFloatingPointType()
/// matches "float f" but not "int i"
-AST_MATCHER(Type, realFloatingPointType) {
- return Node.isRealFloatingType();
-}
+AST_MATCHER(Type, realFloatingPointType) { return Node.isRealFloatingType(); }
/// Matches arrays and C99 complex types that have a specific element
/// type.
@@ -7175,8 +7092,8 @@ extern const AstTypeMatcher<VariableArrayType> variableArrayType;
/// variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
/// varDecl(hasName("b")))))))
/// matches "int a[b]"
-AST_MATCHER_P(VariableArrayType, hasSizeExpr,
- internal::Matcher<Expr>, InnerMatcher) {
+AST_MATCHER_P(VariableArrayType, hasSizeExpr, internal::Matcher<Expr>,
+ InnerMatcher) {
return InnerMatcher.matches(*Node.getSizeExpr(), Finder, Builder);
}
@@ -7664,7 +7581,8 @@ extern const AstTypeMatcher<InjectedClassNameType> injectedClassNameType;
/// Matches decayed type
/// Example matches i[] in declaration of f.
-/// (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
+/// (matcher =
+/// valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
/// Example matches i[1].
/// (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
/// \code
@@ -7696,7 +7614,8 @@ AST_MATCHER_P(DecayedType, hasDecayedType, internal::Matcher<QualType>,
/// declaration of \c class \c D.
AST_MATCHER_P(Decl, hasDeclContext, internal::Matcher<Decl>, InnerMatcher) {
const DeclContext *DC = Node.getDeclContext();
- if (!DC) return false;
+ if (!DC)
+ return false;
return InnerMatcher.matches(*Decl::castFromDeclContext(DC), Finder, Builder);
}
@@ -7742,8 +7661,8 @@ AST_MATCHER_FUNCTION_P_OVERLOAD(
/// hasDeclaration(cxxRecordDecl(hasName("A")))
/// ))
/// matches "A::"
-AST_MATCHER_P(NestedNameSpecifier, specifiesType,
- internal::Matcher<QualType>, InnerMatcher) {
+AST_MATCHER_P(NestedNameSpecifier, specifiesType, internal::Matcher<QualType>,
+ InnerMatcher) {
if (!Node.getAsType())
return false;
return InnerMatcher.matches(QualType(Node.getAsType(), 0), Finder, Builder);
@@ -7844,20 +7763,20 @@ extern const internal::VariadicAllOfMatcher<Attr> attr;
/// Matches if a node equals another node.
///
/// \c Decl has pointer identity in the AST.
-AST_MATCHER_P_OVERLOAD(Decl, equalsNode, const Decl*, Other, 0) {
+AST_MATCHER_P_OVERLOAD(Decl, equalsNode, const Decl *, Other, 0) {
return &Node == Other;
}
/// Matches if a node equals another node.
///
/// \c Stmt has pointer identity in the AST.
-AST_MATCHER_P_OVERLOAD(Stmt, equalsNode, const Stmt*, Other, 1) {
+AST_MATCHER_P_OVERLOAD(Stmt, equalsNode, const Stmt *, Other, 1) {
return &Node == Other;
}
/// Matches if a node equals another node.
///
/// \c Type has pointer identity in the AST.
-AST_MATCHER_P_OVERLOAD(Type, equalsNode, const Type*, Other, 2) {
- return &Node == Other;
+AST_MATCHER_P_OVERLOAD(Type, equalsNode, const Type *, Other, 2) {
+ return &Node == Other;
}
/// @}
@@ -8029,9 +7948,11 @@ AST_POLYMORPHIC_MATCHER(isExplicit, AST_POLYMORPHIC_SUPPORTED_TYPES(
/// S(int) -> S<true> // #5
/// explicit S(double) -> S<false> // #6
/// \endcode
-/// cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
-/// cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
-/// cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
+/// cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8
+/// and #9, but not #1 or #2.
+/// cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or
+/// #4. cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not
+/// match #5 or #6.
AST_MATCHER_P(FunctionDecl, hasExplicitSpecifier, internal::Matcher<Expr>,
InnerMatcher) {
ExplicitSpecifier ES = ExplicitSpecifier::getFromDecl(&Node);
@@ -8081,9 +8002,7 @@ AST_POLYMORPHIC_MATCHER(isInline, AST_POLYMORPHIC_SUPPORTED_TYPES(NamespaceDecl,
/// }
/// \endcode
/// namespaceDecl(isAnonymous()) will match #1 but not ::n.
-AST_MATCHER(NamespaceDecl, isAnonymous) {
- return Node.isAnonymousNamespace();
-}
+AST_MATCHER(NamespaceDecl, isAnonymous) { return Node.isAnonymousNamespace(); }
/// Matches declarations in the namespace `std`, but not in nested namespaces.
///
@@ -8431,9 +8350,7 @@ AST_MATCHER(NamedDecl, hasExternalFormalLinkage) {
/// A matcher such as
/// parmVarDecl(hasInitializer(anything()))
/// is equivalent to parmVarDecl(hasDefaultArgument()).
-AST_MATCHER(ParmVarDecl, hasDefaultArgument) {
- return Node.hasDefaultArg();
-}
+AST_MATCHER(ParmVarDecl, hasDefaultArgument) { return Node.hasDefaultArg(); }
/// Matches array new expressions.
///
@@ -8443,9 +8360,7 @@ AST_MATCHER(ParmVarDecl, hasDefaultArgument) {
/// \endcode
/// cxxNewExpr(isArray())
/// matches the expression 'new MyClass[10]'.
-AST_MATCHER(CXXNewExpr, isArray) {
- return Node.isArray();
-}
+AST_MATCHER(CXXNewExpr, isArray) { return Node.isArray(); }
/// Matches placement new expression arguments.
///
@@ -8496,9 +8411,7 @@ AST_MATCHER_P(CXXNewExpr, hasArraySize, internal::Matcher<Expr>, InnerMatcher) {
/// class x {};
/// class y;
/// \endcode
-AST_MATCHER(CXXRecordDecl, hasDefinition) {
- return Node.hasDefinition();
-}
+AST_MATCHER(CXXRecordDecl, hasDefinition) { return Node.hasDefinition(); }
/// Matches C++11 scoped enum declaration.
///
@@ -8507,9 +8420,7 @@ AST_MATCHER(CXXRecordDecl, hasDefinition) {
/// enum X {};
/// enum class Y {};
/// \endcode
-AST_MATCHER(EnumDecl, isScoped) {
- return Node.isScoped();
-}
+AST_MATCHER(EnumDecl, isScoped) { return Node.isScoped(); }
/// Matches a function declared with a trailing return type.
///
>From bb23ada06c574125765544115919898cb8595434 Mon Sep 17 00:00:00 2001
From: komalverma04 <komal148btit21 at igdtuw.ac.in>
Date: Wed, 24 Apr 2024 02:07:48 +0530
Subject: [PATCH 3/4] fix signalhandler check
---
.../bugprone/SignalHandlerCheck.cpp | 398 +++++++++---------
1 file changed, 200 insertions(+), 198 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/bugprone/SignalHandlerCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/SignalHandlerCheck.cpp
index 902490f4d33c13..0af886f6025419 100644
--- a/clang-tools-extra/clang-tidy/bugprone/SignalHandlerCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/SignalHandlerCheck.cpp
@@ -22,200 +22,200 @@ constexpr llvm::StringLiteral MinimalConformingFunctions[] = {
// mentioned POSIX specification was not updated after 'quick_exit' appeared
// in the C11 standard.
// Also, we want to keep the "minimal set" a subset of the "POSIX set".
-// The list is repeated in bugprone-signal-handler.rst and should be kept up to date.
-constexpr llvm::StringLiteral POSIXConformingFunctions[] = {
- "_Exit",
- "_exit",
- "abort",
- "accept",
- "access",
- "aio_error",
- "aio_return",
- "aio_suspend",
- "alarm",
- "bind",
- "cfgetispeed",
- "cfgetospeed",
- "cfsetispeed",
- "cfsetospeed",
- "chdir",
- "chmod",
- "chown",
- "clock_gettime",
- "close",
- "connect",
- "creat",
- "dup",
- "dup2",
- "execl",
- "execle",
- "execv",
- "execve",
- "faccessat",
- "fchdir",
- "fchmod",
- "fchmodat",
- "fchown",
- "fchownat",
- "fcntl",
- "fdatasync",
- "fexecve",
- "ffs",
- "fork",
- "fstat",
- "fstatat",
- "fsync",
- "ftruncate",
- "futimens",
- "getegid",
- "geteuid",
- "getgid",
- "getgroups",
- "getpeername",
- "getpgrp",
- "getpid",
- "getppid",
- "getsockname",
- "getsockopt",
- "getuid",
- "htonl",
- "htons",
- "kill",
- "link",
- "linkat",
- "listen",
- "longjmp",
- "lseek",
- "lstat",
- "memccpy",
- "memchr",
- "memcmp",
- "memcpy",
- "memmove",
- "memset",
- "mkdir",
- "mkdirat",
- "mkfifo",
- "mkfifoat",
- "mknod",
- "mknodat",
- "ntohl",
- "ntohs",
- "open",
- "openat",
- "pause",
- "pipe",
- "poll",
- "posix_trace_event",
- "pselect",
- "pthread_kill",
- "pthread_self",
- "pthread_sigmask",
- "quick_exit",
- "raise",
- "read",
- "readlink",
- "readlinkat",
- "recv",
- "recvfrom",
- "recvmsg",
- "rename",
- "renameat",
- "rmdir",
- "select",
- "sem_post",
- "send",
- "sendmsg",
- "sendto",
- "setgid",
- "setpgid",
- "setsid",
- "setsockopt",
- "setuid",
- "shutdown",
- "sigaction",
- "sigaddset",
- "sigdelset",
- "sigemptyset",
- "sigfillset",
- "sigismember",
- "siglongjmp",
- "signal",
- "sigpause",
- "sigpending",
- "sigprocmask",
- "sigqueue",
- "sigset",
- "sigsuspend",
- "sleep",
- "sockatmark",
- "socket",
- "socketpair",
- "stat",
- "stpcpy",
- "stpncpy",
- "strcat",
- "strchr",
- "strcmp",
- "strcpy",
- "strcspn",
- "strlen",
- "strncat",
- "strncmp",
- "strncpy",
- "strnlen",
- "strpbrk",
- "strrchr",
- "strspn",
- "strstr",
- "strtok_r",
- "symlink",
- "symlinkat",
- "tcdrain",
- "tcflow",
- "tcflush",
- "tcgetattr",
- "tcgetpgrp",
- "tcsendbreak",
- "tcsetattr",
- "tcsetpgrp",
- "time",
- "timer_getoverrun",
- "timer_gettime",
- "timer_settime",
- "times",
- "umask",
- "uname",
- "unlink",
- "unlinkat",
- "utime",
- "utimensat",
- "utimes",
- "wait",
- "waitpid",
- "wcpcpy",
- "wcpncpy",
- "wcscat",
- "wcschr",
- "wcscmp",
- "wcscpy",
- "wcscspn",
- "wcslen",
- "wcsncat",
- "wcsncmp",
- "wcsncpy",
- "wcsnlen",
- "wcspbrk",
- "wcsrchr",
- "wcsspn",
- "wcsstr",
- "wcstok",
- "wmemchr",
- "wmemcmp",
- "wmemcpy",
- "wmemmove",
- "wmemset",
- "write"};
+// The list is repeated in bugprone-signal-handler.rst and should be kept up to
+// date.
+constexpr llvm::StringLiteral POSIXConformingFunctions[] = {"_Exit",
+ "_exit",
+ "abort",
+ "accept",
+ "access",
+ "aio_error",
+ "aio_return",
+ "aio_suspend",
+ "alarm",
+ "bind",
+ "cfgetispeed",
+ "cfgetospeed",
+ "cfsetispeed",
+ "cfsetospeed",
+ "chdir",
+ "chmod",
+ "chown",
+ "clock_gettime",
+ "close",
+ "connect",
+ "creat",
+ "dup",
+ "dup2",
+ "execl",
+ "execle",
+ "execv",
+ "execve",
+ "faccessat",
+ "fchdir",
+ "fchmod",
+ "fchmodat",
+ "fchown",
+ "fchownat",
+ "fcntl",
+ "fdatasync",
+ "fexecve",
+ "ffs",
+ "fork",
+ "fstat",
+ "fstatat",
+ "fsync",
+ "ftruncate",
+ "futimens",
+ "getegid",
+ "geteuid",
+ "getgid",
+ "getgroups",
+ "getpeername",
+ "getpgrp",
+ "getpid",
+ "getppid",
+ "getsockname",
+ "getsockopt",
+ "getuid",
+ "htonl",
+ "htons",
+ "kill",
+ "link",
+ "linkat",
+ "listen",
+ "longjmp",
+ "lseek",
+ "lstat",
+ "memccpy",
+ "memchr",
+ "memcmp",
+ "memcpy",
+ "memmove",
+ "memset",
+ "mkdir",
+ "mkdirat",
+ "mkfifo",
+ "mkfifoat",
+ "mknod",
+ "mknodat",
+ "ntohl",
+ "ntohs",
+ "open",
+ "openat",
+ "pause",
+ "pipe",
+ "poll",
+ "posix_trace_event",
+ "pselect",
+ "pthread_kill",
+ "pthread_self",
+ "pthread_sigmask",
+ "quick_exit",
+ "raise",
+ "read",
+ "readlink",
+ "readlinkat",
+ "recv",
+ "recvfrom",
+ "recvmsg",
+ "rename",
+ "renameat",
+ "rmdir",
+ "select",
+ "sem_post",
+ "send",
+ "sendmsg",
+ "sendto",
+ "setgid",
+ "setpgid",
+ "setsid",
+ "setsockopt",
+ "setuid",
+ "shutdown",
+ "sigaction",
+ "sigaddset",
+ "sigdelset",
+ "sigemptyset",
+ "sigfillset",
+ "sigismember",
+ "siglongjmp",
+ "signal",
+ "sigpause",
+ "sigpending",
+ "sigprocmask",
+ "sigqueue",
+ "sigset",
+ "sigsuspend",
+ "sleep",
+ "sockatmark",
+ "socket",
+ "socketpair",
+ "stat",
+ "stpcpy",
+ "stpncpy",
+ "strcat",
+ "strchr",
+ "strcmp",
+ "strcpy",
+ "strcspn",
+ "strlen",
+ "strncat",
+ "strncmp",
+ "strncpy",
+ "strnlen",
+ "strpbrk",
+ "strrchr",
+ "strspn",
+ "strstr",
+ "strtok_r",
+ "symlink",
+ "symlinkat",
+ "tcdrain",
+ "tcflow",
+ "tcflush",
+ "tcgetattr",
+ "tcgetpgrp",
+ "tcsendbreak",
+ "tcsetattr",
+ "tcsetpgrp",
+ "time",
+ "timer_getoverrun",
+ "timer_gettime",
+ "timer_settime",
+ "times",
+ "umask",
+ "uname",
+ "unlink",
+ "unlinkat",
+ "utime",
+ "utimensat",
+ "utimes",
+ "wait",
+ "waitpid",
+ "wcpcpy",
+ "wcpncpy",
+ "wcscat",
+ "wcschr",
+ "wcscmp",
+ "wcscpy",
+ "wcscspn",
+ "wcslen",
+ "wcsncat",
+ "wcsncmp",
+ "wcsncpy",
+ "wcsnlen",
+ "wcspbrk",
+ "wcsrchr",
+ "wcsspn",
+ "wcsstr",
+ "wcstok",
+ "wmemchr",
+ "wmemcmp",
+ "wmemcpy",
+ "wmemmove",
+ "wmemset",
+ "write"};
using namespace clang::ast_matchers;
@@ -361,10 +361,12 @@ void SignalHandlerCheck::registerMatchers(MatchFinder *Finder) {
.bind("handler_expr");
auto HandlerLambda = cxxMemberCallExpr(
on(expr(ignoringParenImpCasts(lambdaExpr().bind("handler_lambda")))));
- Finder->addMatcher(callExpr(callee(SignalFunction),
- hasArgument(1, anyOf(HandlerExpr, HandlerLambda)))
- .bind("register_call"),
- this);
+ Finder->addMatcher(
+ callExpr(callee(SignalFunction),
+ hasArgument(1, anyOf(ignoringParenImpCasts(HandlerExpr),
+ ignoringParenImpCasts(HandlerLambda))))
+ .bind("register_call"),
+ this);
}
void SignalHandlerCheck::check(const MatchFinder::MatchResult &Result) {
>From b65467c2bfef22cbae042b567f21242550c1bcba Mon Sep 17 00:00:00 2001
From: komalverma04 <komal148btit21 at igdtuw.ac.in>
Date: Wed, 24 Apr 2024 19:37:35 +0530
Subject: [PATCH 4/4] fix tests
---
.../abseil/RedundantStrcatCallsCheck.cpp | 42 ++++++++++---------
.../abseil/StringFindStartswithCheck.cpp | 6 +--
.../bugprone/DanglingHandleCheck.cpp | 9 ++--
.../bugprone/SignedCharMisuseCheck.cpp | 2 +-
.../bugprone/StringIntegerAssignmentCheck.cpp | 2 +-
.../UndefinedMemoryManipulationCheck.cpp | 16 +++----
.../clang-tidy/bugprone/UseAfterMoveCheck.cpp | 13 +++---
.../clang-tidy/cert/CommandProcessorCheck.cpp | 6 +--
.../NonTrivialTypesLibcMemoryCallsCheck.cpp | 6 ++-
.../ProBoundsConstantArrayIndexCheck.cpp | 2 +-
.../RvalueReferenceParamNotMovedCheck.cpp | 4 +-
.../cppcoreguidelines/SlicingCheck.cpp | 14 +++----
.../PreferIsaOrDynCastInConditionalsCheck.cpp | 4 +-
.../modernize/MakeSmartPtrCheck.cpp | 4 +-
14 files changed, 70 insertions(+), 60 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/abseil/RedundantStrcatCallsCheck.cpp b/clang-tools-extra/clang-tidy/abseil/RedundantStrcatCallsCheck.cpp
index fafb029e7de1b4..1e1100dc0bdb5e 100644
--- a/clang-tools-extra/clang-tidy/abseil/RedundantStrcatCallsCheck.cpp
+++ b/clang-tools-extra/clang-tidy/abseil/RedundantStrcatCallsCheck.cpp
@@ -22,7 +22,7 @@ namespace clang::tidy::abseil {
// - Make it work in macros if the outer and inner StrCats are both in the
// argument.
-void RedundantStrcatCallsCheck::registerMatchers(MatchFinder* Finder) {
+void RedundantStrcatCallsCheck::registerMatchers(MatchFinder *Finder) {
const auto CallToStrcat =
callExpr(callee(functionDecl(hasName("::absl::StrCat"))));
const auto CallToStrappend =
@@ -61,15 +61,17 @@ const clang::CallExpr *processArgument(const Expr *Arg,
const MatchFinder::MatchResult &Result,
StrCatCheckResult *CheckResult) {
const auto IsAlphanum = hasDeclaration(cxxMethodDecl(hasName("AlphaNum")));
- static const auto* const Strcat = new auto(hasName("::absl::StrCat"));
+ static const auto *const Strcat = new auto(hasName("::absl::StrCat"));
const auto IsStrcat = cxxBindTemporaryExpr(
has(callExpr(callee(functionDecl(*Strcat))).bind("StrCat")));
if (const auto *SubStrcatCall = selectFirst<const CallExpr>(
"StrCat",
- match(stmt(traverse(TK_AsIs,
- anyOf(cxxConstructExpr(IsAlphanum,
- hasArgument(0, IsStrcat)),
- IsStrcat))),
+ match(stmt(traverse(
+ TK_AsIs,
+ anyOf(cxxConstructExpr(
+ IsAlphanum,
+ hasArgument(0, ignoringParenImpCasts(IsStrcat))),
+ IsStrcat))),
*Arg->IgnoreParenImpCasts(), *Result.Context))) {
removeCallLeaveArgs(SubStrcatCall, CheckResult);
return SubStrcatCall;
@@ -80,18 +82,18 @@ const clang::CallExpr *processArgument(const Expr *Arg,
StrCatCheckResult processCall(const CallExpr *RootCall, bool IsAppend,
const MatchFinder::MatchResult &Result) {
StrCatCheckResult CheckResult;
- std::deque<const CallExpr*> CallsToProcess = {RootCall};
+ std::deque<const CallExpr *> CallsToProcess = {RootCall};
while (!CallsToProcess.empty()) {
++CheckResult.NumCalls;
- const CallExpr* CallExpr = CallsToProcess.front();
+ const CallExpr *CallExpr = CallsToProcess.front();
CallsToProcess.pop_front();
int StartArg = CallExpr == RootCall && IsAppend;
for (const auto *Arg : CallExpr->arguments()) {
- if (StartArg-- > 0)
- continue;
+ if (StartArg-- > 0)
+ continue;
if (const clang::CallExpr *Sub =
processArgument(Arg, Result, &CheckResult)) {
CallsToProcess.push_back(Sub);
@@ -100,18 +102,18 @@ StrCatCheckResult processCall(const CallExpr *RootCall, bool IsAppend,
}
return CheckResult;
}
-} // namespace
+} // namespace
-void RedundantStrcatCallsCheck::check(const MatchFinder::MatchResult& Result) {
+void RedundantStrcatCallsCheck::check(const MatchFinder::MatchResult &Result) {
bool IsAppend = false;
const CallExpr *RootCall = nullptr;
- if ((RootCall = Result.Nodes.getNodeAs<CallExpr>("StrCat")))
- IsAppend = false;
- else if ((RootCall = Result.Nodes.getNodeAs<CallExpr>("StrAppend")))
- IsAppend = true;
- else
- return;
+ if ((RootCall = Result.Nodes.getNodeAs<CallExpr>("StrCat")))
+ IsAppend = false;
+ else if ((RootCall = Result.Nodes.getNodeAs<CallExpr>("StrAppend")))
+ IsAppend = true;
+ else
+ return;
if (RootCall->getBeginLoc().isMacroID()) {
// Ignore calls within macros.
@@ -127,8 +129,8 @@ void RedundantStrcatCallsCheck::check(const MatchFinder::MatchResult& Result) {
return;
}
- diag(RootCall->getBeginLoc(),
- "multiple calls to 'absl::StrCat' can be flattened into a single call")
+ diag(RootCall->getBeginLoc(),
+ "multiple calls to 'absl::StrCat' can be flattened into a single call")
<< CheckResult.Hints;
}
diff --git a/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp b/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp
index 221e924c10f621..124d17aaaefb65 100644
--- a/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp
+++ b/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp
@@ -44,7 +44,7 @@ void StringFindStartswithCheck::registerMatchers(MatchFinder *Finder) {
callee(cxxMethodDecl(hasName("find")).bind("findfun")),
on(hasType(StringType)),
// ... with some search expression ...
- hasArgument(0, expr().bind("needle")),
+ hasArgument(0, expr().ignoringParenImpCasts().bind("needle")),
// ... and either "0" as second argument or the default argument (also 0).
anyOf(hasArgument(1, ZeroLiteral), hasArgument(1, cxxDefaultArgExpr())));
@@ -62,9 +62,9 @@ void StringFindStartswithCheck::registerMatchers(MatchFinder *Finder) {
callee(cxxMethodDecl(hasName("rfind")).bind("findfun")),
on(hasType(StringType)),
// ... with some search expression ...
- hasArgument(0, expr().bind("needle")),
+ hasArgument(0, expr().ignoringParenImpCasts().bind("needle")),
// ... and "0" as second argument.
- hasArgument(1, ZeroLiteral));
+ hasArgument(1, ignoringParenImpCasts(ZeroLiteral)));
Finder->addMatcher(
// Match [=!]= with either a zero or npos on one side and a string.rfind
diff --git a/clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp
index d55df3a6d7b741..72517cbbcbd716 100644
--- a/clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp
@@ -24,7 +24,7 @@ handleFrom(const ast_matchers::internal::Matcher<RecordDecl> &IsAHandle,
const ast_matchers::internal::Matcher<Expr> &Arg) {
return expr(
anyOf(cxxConstructExpr(hasDeclaration(cxxMethodDecl(ofClass(IsAHandle))),
- hasArgument(0, Arg)),
+ hasArgument(0, ignoringParenImpCasts(Arg))),
cxxMemberCallExpr(hasType(hasUnqualifiedDesugaredType(recordType(
hasDeclaration(cxxRecordDecl(IsAHandle))))),
callee(memberExpr(member(cxxConversionDecl()))),
@@ -123,9 +123,10 @@ void DanglingHandleCheck::registerMatchersForVariables(MatchFinder *Finder) {
// Find 'foo = ReturnsAValue(); // foo is Handle'
Finder->addMatcher(
traverse(TK_AsIs,
- cxxOperatorCallExpr(callee(cxxMethodDecl(ofClass(IsAHandle))),
- hasOverloadedOperatorName("="),
- hasArgument(1, ConvertedHandle))
+ cxxOperatorCallExpr(
+ callee(cxxMethodDecl(ofClass(IsAHandle))),
+ hasOverloadedOperatorName("="),
+ hasArgument(1, ignoringParenImpCasts(ConvertedHandle)))
.bind("bad_stmt")),
this);
diff --git a/clang-tools-extra/clang-tidy/bugprone/SignedCharMisuseCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/SignedCharMisuseCheck.cpp
index ea3b8b8e9df4fe..33ee876a388e7a 100644
--- a/clang-tools-extra/clang-tidy/bugprone/SignedCharMisuseCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/SignedCharMisuseCheck.cpp
@@ -113,7 +113,7 @@ void SignedCharMisuseCheck::registerMatchers(MatchFinder *Finder) {
cxxOperatorCallExpr(
hasOverloadedOperatorName("[]"),
hasArgument(0, hasType(cxxRecordDecl(hasName("::std::array")))),
- hasArgument(1, SignedCharCastExpr))
+ hasArgument(1, ignoringParenImpCasts(SignedCharCastExpr)))
.bind("arraySubscript");
Finder->addMatcher(STDArraySubscript, this);
diff --git a/clang-tools-extra/clang-tidy/bugprone/StringIntegerAssignmentCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/StringIntegerAssignmentCheck.cpp
index 4f93b3ef779f5b..e379a4d4131f90 100644
--- a/clang-tools-extra/clang-tidy/bugprone/StringIntegerAssignmentCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/StringIntegerAssignmentCheck.cpp
@@ -25,7 +25,7 @@ void StringIntegerAssignmentCheck::registerMatchers(MatchFinder *Finder) {
qualType().bind("type")))))))),
hasArgument(
1,
- ignoringImpCasts(
+ ignoringParenImpCasts(
expr(hasType(isInteger()), unless(hasType(isAnyCharacter())),
// Ignore calls to tolower/toupper (see PR27723).
unless(callExpr(callee(functionDecl(
diff --git a/clang-tools-extra/clang-tidy/bugprone/UndefinedMemoryManipulationCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/UndefinedMemoryManipulationCheck.cpp
index 4f6bc18151789d..2f00c56f8aa173 100644
--- a/clang-tools-extra/clang-tidy/bugprone/UndefinedMemoryManipulationCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/UndefinedMemoryManipulationCheck.cpp
@@ -33,17 +33,19 @@ void UndefinedMemoryManipulationCheck::registerMatchers(MatchFinder *Finder) {
// Check whether destination object is not TriviallyCopyable.
// Applicable to all three memory manipulation functions.
- Finder->addMatcher(callExpr(callee(functionDecl(hasAnyName(
- "::memset", "::memcpy", "::memmove"))),
- hasArgument(0, NotTriviallyCopyableObject))
- .bind("dest"),
- this);
+ Finder->addMatcher(
+ callExpr(
+ callee(functionDecl(hasAnyName("::memset", "::memcpy", "::memmove"))),
+ hasArgument(0, ignoringParenImpCasts(NotTriviallyCopyableObject)))
+ .bind("dest"),
+ this);
// Check whether source object is not TriviallyCopyable.
// Only applicable to memcpy() and memmove().
Finder->addMatcher(
- callExpr(callee(functionDecl(hasAnyName("::memcpy", "::memmove"))),
- hasArgument(1, NotTriviallyCopyableObject))
+ callExpr(
+ callee(functionDecl(hasAnyName("::memcpy", "::memmove"))),
+ hasArgument(1, ignoringParenImpCasts(NotTriviallyCopyableObject)))
.bind("src"),
this);
}
diff --git a/clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp
index b91ad0f1822955..7cc45ddb660289 100644
--- a/clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp
@@ -265,11 +265,12 @@ void UseAfterMoveFinder::getDeclRefs(
AddDeclRefs(match(traverse(TK_AsIs, findAll(DeclRefMatcher)), *S->getStmt(),
*Context));
- AddDeclRefs(match(findAll(cxxOperatorCallExpr(
- hasAnyOverloadedOperatorName("*", "->", "[]"),
- hasArgument(0, DeclRefMatcher))
- .bind("operator")),
- *S->getStmt(), *Context));
+ AddDeclRefs(
+ match(findAll(cxxOperatorCallExpr(
+ hasAnyOverloadedOperatorName("*", "->", "[]"),
+ hasArgument(0, ignoringParenImpCasts(DeclRefMatcher)))
+ .bind("operator")),
+ *S->getStmt(), *Context));
}
}
@@ -414,7 +415,7 @@ void UseAfterMoveCheck::registerMatchers(MatchFinder *Finder) {
callExpr(argumentCountIs(1),
callee(functionDecl(hasAnyName("::std::move", "::std::forward"))
.bind("move-decl")),
- hasArgument(0, declRefExpr().bind("arg")),
+ hasArgument(0, ignoringParenImpCasts(declRefExpr().bind("arg"))),
unless(inDecltypeOrTemplateArg()),
unless(hasParent(TryEmplaceMatcher)), expr().bind("call-move"),
anyOf(hasAncestor(compoundStmt(
diff --git a/clang-tools-extra/clang-tidy/cert/CommandProcessorCheck.cpp b/clang-tools-extra/clang-tidy/cert/CommandProcessorCheck.cpp
index 1c57a8fa8e5095..7f40c9f5ec9621 100644
--- a/clang-tools-extra/clang-tidy/cert/CommandProcessorCheck.cpp
+++ b/clang-tools-extra/clang-tidy/cert/CommandProcessorCheck.cpp
@@ -22,9 +22,9 @@ void CommandProcessorCheck::registerMatchers(MatchFinder *Finder) {
// Do not diagnose when the call expression passes a null pointer
// constant to system(); that only checks for the presence of a
// command processor, which is not a security risk by itself.
- unless(callExpr(callee(functionDecl(hasName("::system"))),
- argumentCountIs(1),
- hasArgument(0, nullPointerConstant()))))
+ unless(callExpr(
+ callee(functionDecl(hasName("::system"))), argumentCountIs(1),
+ hasArgument(0, ignoringParenImpCasts(nullPointerConstant())))))
.bind("expr"),
this);
}
diff --git a/clang-tools-extra/clang-tidy/cert/NonTrivialTypesLibcMemoryCallsCheck.cpp b/clang-tools-extra/clang-tidy/cert/NonTrivialTypesLibcMemoryCallsCheck.cpp
index 1e52884a806b25..51ed92d885e2e6 100644
--- a/clang-tools-extra/clang-tidy/cert/NonTrivialTypesLibcMemoryCallsCheck.cpp
+++ b/clang-tools-extra/clang-tidy/cert/NonTrivialTypesLibcMemoryCallsCheck.cpp
@@ -80,8 +80,10 @@ void NonTrivialTypesLibcMemoryCallsCheck::registerMatchers(
auto ArgChecker = [&](Matcher<CXXRecordDecl> RecordConstraint,
BindableMatcher<Stmt> SecondArg = expr()) {
return allOf(argumentCountIs(3),
- hasArgument(0, IsStructPointer(RecordConstraint, true)),
- hasArgument(1, SecondArg), hasArgument(2, IsRecordSizeOf));
+ hasArgument(0, ignoringParenImpCasts(
+ IsStructPointer(RecordConstraint, true))),
+ hasArgument(1, ignoringParenImpCasts(SecondArg)),
+ hasArgument(2, ignoringParenImpCasts(IsRecordSizeOf)));
};
Finder->addMatcher(
diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp
index 20f9a2e549fe2f..d3fc91277e169e 100644
--- a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp
+++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp
@@ -50,7 +50,7 @@ void ProBoundsConstantArrayIndexCheck::registerMatchers(MatchFinder *Finder) {
hasOverloadedOperatorName("[]"),
callee(cxxMethodDecl(
ofClass(cxxRecordDecl(hasName("::std::array")).bind("type")))),
- hasArgument(1, expr().bind("index")))
+ hasArgument(1, ignoringParenImpCasts(expr().bind("index"))))
.bind("expr"),
this);
}
diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/RvalueReferenceParamNotMovedCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/RvalueReferenceParamNotMovedCheck.cpp
index 7db9e29e8fd0e6..e191cce1ad5dd9 100644
--- a/clang-tools-extra/clang-tidy/cppcoreguidelines/RvalueReferenceParamNotMovedCheck.cpp
+++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/RvalueReferenceParamNotMovedCheck.cpp
@@ -46,9 +46,9 @@ void RvalueReferenceParamNotMovedCheck::registerMatchers(MatchFinder *Finder) {
callee(unresolvedLookupExpr(hasAnyDeclaration(
namedDecl(hasUnderlyingDecl(hasName("::std::move"))))))),
hasArgument(
- 0, argumentOf(
+ 0, ignoringParenImpCasts(argumentOf(
AllowPartialMove,
- declRefExpr(to(equalsBoundNode("param"))).bind("ref"))),
+ declRefExpr(to(equalsBoundNode("param"))).bind("ref")))),
unless(hasAncestor(
lambdaExpr(valueCapturesVar(equalsBoundNode("param"))))),
unless(anyOf(hasAncestor(typeLoc()),
diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/SlicingCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/SlicingCheck.cpp
index 76754394de760c..9678455f7ae7dd 100644
--- a/clang-tools-extra/clang-tidy/cppcoreguidelines/SlicingCheck.cpp
+++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/SlicingCheck.cpp
@@ -46,12 +46,12 @@ void SlicingCheck::registerMatchers(MatchFinder *Finder) {
isBaseInitializer(), withInitializer(equalsBoundNode("Call"))))));
// Assignment slicing: "a = b;" and "a = std::move(b);" variants.
- const auto SlicesObjectInAssignment =
- callExpr(expr().bind("Call"),
- callee(cxxMethodDecl(anyOf(isCopyAssignmentOperator(),
- isMoveAssignmentOperator()),
- OfBaseClass)),
- hasArgument(1, HasTypeDerivedFromBaseDecl));
+ const auto SlicesObjectInAssignment = callExpr(
+ expr().bind("Call"),
+ callee(cxxMethodDecl(
+ anyOf(isCopyAssignmentOperator(), isMoveAssignmentOperator()),
+ OfBaseClass)),
+ hasArgument(1, ignoringParenImpCasts(HasTypeDerivedFromBaseDecl)));
// Construction slicing: "A a{b};" and "f(b);" variants. Note that in case of
// slicing the letter will create a temporary and therefore call a ctor.
@@ -59,7 +59,7 @@ void SlicingCheck::registerMatchers(MatchFinder *Finder) {
expr().bind("Call"),
hasDeclaration(cxxConstructorDecl(
anyOf(isCopyConstructor(), isMoveConstructor()), OfBaseClass)),
- hasArgument(0, HasTypeDerivedFromBaseDecl),
+ hasArgument(0, ignoringParenImpCasts(HasTypeDerivedFromBaseDecl)),
// We need to disable matching on the call to the base copy/move
// constructor in DerivedDecl's constructors.
unless(IsCallToBaseClass));
diff --git a/clang-tools-extra/clang-tidy/llvm/PreferIsaOrDynCastInConditionalsCheck.cpp b/clang-tools-extra/clang-tidy/llvm/PreferIsaOrDynCastInConditionalsCheck.cpp
index 93333377777054..12b391e8df22e9 100644
--- a/clang-tools-extra/clang-tidy/llvm/PreferIsaOrDynCastInConditionalsCheck.cpp
+++ b/clang-tools-extra/clang-tidy/llvm/PreferIsaOrDynCastInConditionalsCheck.cpp
@@ -44,7 +44,9 @@ void PreferIsaOrDynCastInConditionalsCheck::registerMatchers(
callee(namedDecl(hasAnyName("isa", "cast", "cast_or_null", "dyn_cast",
"dyn_cast_or_null"))
.bind("func")),
- hasArgument(0, mapAnyOf(declRefExpr, cxxMemberCallExpr).bind("arg")))
+ hasArgument(
+ 0, ignoringParenImpCasts(
+ mapAnyOf(declRefExpr, cxxMemberCallExpr).bind("arg"))))
.bind("rhs");
Finder->addMatcher(
diff --git a/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp b/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp
index d1d7e9dcfa9c0d..2a9726f32feed5 100644
--- a/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp
@@ -87,9 +87,9 @@ void MakeSmartPtrCheck::registerMatchers(ast_matchers::MatchFinder *Finder) {
cxxConstructExpr(
hasType(getSmartPointerTypeMatcher()), argumentCountIs(1),
hasArgument(
- 0, cxxNewExpr(hasType(pointsTo(qualType(hasCanonicalType(
+ 0, ignoringParenImpCasts(cxxNewExpr(hasType(pointsTo(qualType(hasCanonicalType(
equalsBoundNode(PointerType))))),
- CanCallCtor, unless(IsPlacement))
+ CanCallCtor, unless(IsPlacement)))
.bind(NewExpression)),
unless(isInTemplateInstantiation()))
.bind(ConstructorCall))))),
More information about the cfe-commits
mailing list