SilensAngelusNex updated this revision to Diff 343219. SilensAngelusNex marked 2 inline comments as done. SilensAngelusNex added a comment.
Regenerate docs and replace `is_one_of` with `TypeListContainsSuperOf`. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D101572/new/ https://reviews.llvm.org/D101572 Files: clang/docs/LibASTMatchersReference.html clang/include/clang/ASTMatchers/ASTMatchers.h clang/include/clang/ASTMatchers/ASTMatchersInternal.h clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
Index: clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp =================================================================== --- clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp +++ clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp @@ -11,6 +11,7 @@ #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/ASTMatchers/ASTMatchers.h" #include "clang/Tooling/Tooling.h" +#include "llvm/ADT/StringRef.h" #include "llvm/ADT/Triple.h" #include "llvm/Support/Host.h" #include "gtest/gtest.h" @@ -375,15 +376,104 @@ typedefNameDecl(hasType(asString("foo")), hasName("bar")))); } -TEST(HasTypeLoc, MatchesDeclaratorDecls) { +TEST(HasTypeLoc, MatchesBlockDecl) { + EXPECT_TRUE(matchesConditionally( + "auto x = ^int (int a, int b) { return a + b; };", + blockDecl(hasTypeLoc(loc(asString("int (int, int)")))), true, + {"-fblocks"})); +} + +TEST(HasTypeLoc, MatchesCXXBaseSpecifierAndCtorInitializer) { + llvm::StringRef code = R"cpp( + class Foo {}; + class Bar : public Foo { + Bar() : Foo() {} + }; + )cpp"; + + EXPECT_TRUE(matches( + code, cxxRecordDecl(hasAnyBase(hasTypeLoc(loc(asString("class Foo"))))))); + EXPECT_TRUE(matches( + code, cxxCtorInitializer(hasTypeLoc(loc(asString("class Foo")))))); +} + +TEST(HasTypeLoc, MatchesCXXFunctionalCastExpr) { + EXPECT_TRUE(matches("auto x = int(3);", + cxxFunctionalCastExpr(hasTypeLoc(loc(asString("int")))))); +} + +TEST(HasTypeLoc, MatchesCXXNewExpr) { + EXPECT_TRUE(matches("auto* x = new int(3);", + cxxNewExpr(hasTypeLoc(loc(asString("int")))))); + EXPECT_TRUE(matches("class Foo{}; auto* x = new Foo();", + cxxNewExpr(hasTypeLoc(loc(asString("class Foo")))))); +} + +TEST(HasTypeLoc, MatchesCXXTemporaryObjectExpr) { + EXPECT_TRUE( + matches("struct Foo { Foo(int, int); }; auto x = Foo(1, 2);", + cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("struct Foo")))))); +} + +TEST(HasTypeLoc, MatchesCXXUnresolvedConstructExpr) { + EXPECT_TRUE( + matches("template <typename T> T make() { return T(); }", + cxxUnresolvedConstructExpr(hasTypeLoc(loc(asString("T")))))); +} + +TEST(HasTypeLoc, MatchesClassTemplateSpecializationDecl) { + EXPECT_TRUE(matches( + "template <typename T> class Foo; template <> class Foo<int> {};", + classTemplateSpecializationDecl(hasTypeLoc(loc(asString("Foo<int>")))))); +} + +TEST(HasTypeLoc, MatchesCompoundLiteralExpr) { + EXPECT_TRUE( + matches("int* x = (int [2]) { 0, 1 };", + compoundLiteralExpr(hasTypeLoc(loc(asString("int [2]")))))); +} + +TEST(HasTypeLoc, MatchesDeclaratorDecl) { EXPECT_TRUE(matches("int x;", varDecl(hasName("x"), hasTypeLoc(loc(asString("int")))))); + EXPECT_TRUE(matches("int x(3);", + varDecl(hasName("x"), hasTypeLoc(loc(asString("int")))))); + EXPECT_TRUE( + matches("struct Foo { Foo(int, int); }; Foo x(1, 2);", + varDecl(hasName("x"), hasTypeLoc(loc(asString("struct Foo")))))); // Make sure we don't crash on implicit constructors. EXPECT_TRUE(notMatches("class X {}; X x;", declaratorDecl(hasTypeLoc(loc(asString("int")))))); } +TEST(HasTypeLoc, MatchesExplicitCastExpr) { + EXPECT_TRUE(matches("auto x = (int) 3;", + explicitCastExpr(hasTypeLoc(loc(asString("int")))))); + EXPECT_TRUE(matches("auto x = static_cast<int>(3);", + explicitCastExpr(hasTypeLoc(loc(asString("int")))))); +} + +TEST(HasTypeLoc, MatchesObjCPropertyDecl) { + EXPECT_TRUE(matchesObjC(R"objc( + @interface Foo + @property int enabled; + @end + )objc", + objcPropertyDecl(hasTypeLoc(loc(asString("int")))))); +} + +TEST(HasTypeLoc, MatchesTemplateArgumentLoc) { + EXPECT_TRUE(matches("template <typename T> class Foo {}; Foo<int> x;", + templateArgumentLoc(hasTypeLoc(loc(asString("int")))))); +} + +TEST(HasTypeLoc, MatchesTypedefNameDecl) { + EXPECT_TRUE(matches("typedef int X;", + typedefNameDecl(hasTypeLoc(loc(asString("int")))))); + EXPECT_TRUE(matches("using X = int;", + typedefNameDecl(hasTypeLoc(loc(asString("int")))))); +} TEST(Callee, MatchesDeclarations) { StatementMatcher CallMethodX = callExpr(callee(cxxMethodDecl(hasName("x")))); Index: clang/include/clang/ASTMatchers/ASTMatchersInternal.h =================================================================== --- clang/include/clang/ASTMatchers/ASTMatchersInternal.h +++ clang/include/clang/ASTMatchers/ASTMatchersInternal.h @@ -83,6 +83,37 @@ namespace internal { +/// A type-list implementation. +/// +/// A "linked list" of types, accessible by using the ::head and ::tail +/// typedefs. +template <typename... Ts> struct TypeList {}; // Empty sentinel type list. + +template <typename T1, typename... Ts> struct TypeList<T1, Ts...> { + /// The first type on the list. + using head = T1; + + /// A sublist with the tail. ie everything but the head. + /// + /// This type is used to do recursion. TypeList<>/EmptyTypeList indicates the + /// end of the list. + using tail = TypeList<Ts...>; +}; + +/// The empty type list. +using EmptyTypeList = TypeList<>; + +/// Helper meta-function to determine if some type \c T is present or +/// a parent type in the list. +template <typename AnyTypeList, typename T> struct TypeListContainsSuperOf { + static const bool value = + std::is_base_of<typename AnyTypeList::head, T>::value || + TypeListContainsSuperOf<typename AnyTypeList::tail, T>::value; +}; +template <typename T> struct TypeListContainsSuperOf<EmptyTypeList, T> { + static const bool value = false; +}; + /// Variadic function object. /// /// Most of the functions below that use VariadicFunction could be implemented @@ -135,6 +166,35 @@ return Node.getType(); } +/// Unifies obtaining a `TypeSourceInfo` from different node types. +template <typename T, + std::enable_if_t<TypeListContainsSuperOf< + TypeList<CXXBaseSpecifier, CXXCtorInitializer, + CXXTemporaryObjectExpr, CXXUnresolvedConstructExpr, + CompoundLiteralExpr, DeclaratorDecl, ObjCPropertyDecl, + TemplateArgumentLoc, TypedefNameDecl>, + T>::value> * = nullptr> +inline TypeSourceInfo *GetTypeSourceInfo(const T &Node) { + return Node.getTypeSourceInfo(); +} +template <typename T, + std::enable_if_t<TypeListContainsSuperOf< + TypeList<CXXFunctionalCastExpr, ExplicitCastExpr>, T>::value> * = + nullptr> +inline TypeSourceInfo *GetTypeSourceInfo(const T &Node) { + return Node.getTypeInfoAsWritten(); +} +inline TypeSourceInfo *GetTypeSourceInfo(const BlockDecl &Node) { + return Node.getSignatureAsWritten(); +} +inline TypeSourceInfo *GetTypeSourceInfo(const CXXNewExpr &Node) { + return Node.getAllocatedTypeSourceInfo(); +} +inline TypeSourceInfo * +GetTypeSourceInfo(const ClassTemplateSpecializationDecl &Node) { + return Node.getTypeAsWritten(); +} + /// Unifies obtaining the FunctionProtoType pointer from both /// FunctionProtoType and FunctionDecl nodes.. inline const FunctionProtoType * @@ -1120,39 +1180,6 @@ template <typename T> const bool IsBaseType<T>::value; -/// A type-list implementation. -/// -/// A "linked list" of types, accessible by using the ::head and ::tail -/// typedefs. -template <typename... Ts> struct TypeList {}; // Empty sentinel type list. - -template <typename T1, typename... Ts> struct TypeList<T1, Ts...> { - /// The first type on the list. - using head = T1; - - /// A sublist with the tail. ie everything but the head. - /// - /// This type is used to do recursion. TypeList<>/EmptyTypeList indicates the - /// end of the list. - using tail = TypeList<Ts...>; -}; - -/// The empty type list. -using EmptyTypeList = TypeList<>; - -/// Helper meta-function to determine if some type \c T is present or -/// a parent type in the list. -template <typename AnyTypeList, typename T> -struct TypeListContainsSuperOf { - static const bool value = - std::is_base_of<typename AnyTypeList::head, T>::value || - TypeListContainsSuperOf<typename AnyTypeList::tail, T>::value; -}; -template <typename T> -struct TypeListContainsSuperOf<EmptyTypeList, T> { - static const bool value = false; -}; - /// A "type list" that contains all types. /// /// Useful for matchers like \c anything and \c unless. Index: clang/include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- clang/include/clang/ASTMatchers/ASTMatchers.h +++ clang/include/clang/ASTMatchers/ASTMatchers.h @@ -3896,20 +3896,51 @@ return false; } -/// Matches if the type location of the declarator decl's type matches -/// the inner matcher. +/// Matches if the type location of a node matches the inner matcher. /// -/// Given +/// Examples: /// \code /// int x; /// \endcode /// declaratorDecl(hasTypeLoc(loc(asString("int")))) /// matches int x -AST_MATCHER_P(DeclaratorDecl, hasTypeLoc, internal::Matcher<TypeLoc>, Inner) { - if (!Node.getTypeSourceInfo()) +/// +/// \code +/// auto x = int(3); +/// \code +/// cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) +/// matches int(3) +/// +/// \code +/// struct Foo { Foo(int, int); }; +/// auto x = Foo(1, 2); +/// \code +/// cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) +/// matches Foo(1, 2) +/// +/// Usable as: Matcher<BlockDecl>, Matcher<CXXBaseSpecifier>, +/// Matcher<CXXCtorInitializer>, Matcher<CXXFunctionalCastExpr>, +/// Matcher<CXXNewExpr>, Matcher<CXXTemporaryObjectExpr>, +/// Matcher<CXXUnresolvedConstructExpr>, +/// Matcher<ClassTemplateSpecializationDecl>, Matcher<CompoundLiteralExpr>, +/// Matcher<DeclaratorDecl>, Matcher<ExplicitCastExpr>, +/// Matcher<ObjCPropertyDecl>, Matcher<TemplateArgumentLoc>, +/// Matcher<TypedefNameDecl> +AST_POLYMORPHIC_MATCHER_P( + hasTypeLoc, + AST_POLYMORPHIC_SUPPORTED_TYPES( + BlockDecl, CXXBaseSpecifier, CXXCtorInitializer, CXXFunctionalCastExpr, + CXXNewExpr, CXXTemporaryObjectExpr, CXXUnresolvedConstructExpr, + ClassTemplateSpecializationDecl, CompoundLiteralExpr, DeclaratorDecl, + ExplicitCastExpr, ObjCPropertyDecl, TemplateArgumentLoc, + TypedefNameDecl), + internal::Matcher<TypeLoc>, Inner) { + TypeSourceInfo *source = internal::GetTypeSourceInfo(Node); + if (source == nullptr) { // This happens for example for implicit destructors. return false; - return Inner.matches(Node.getTypeSourceInfo()->getTypeLoc(), Finder, Builder); + } + return Inner.matches(source->getTypeLoc(), Finder, Builder); } /// Matches if the matched type is represented by the given string. Index: clang/docs/LibASTMatchersReference.html =================================================================== --- clang/docs/LibASTMatchersReference.html +++ clang/docs/LibASTMatchersReference.html @@ -6137,6 +6137,34 @@ </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html";>BlockDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc0')"><a name="hasTypeLoc0Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>> Inner</td></tr> +<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher. + +Examples: + int x; +declaratorDecl(hasTypeLoc(loc(asString("int")))) + matches int x + +auto x = int(3); +cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) + matches int(3) + +struct Foo { Foo(int, int); }; +auto x = Foo(1, 2); +cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) + matches Foo(1, 2) + +Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html";>BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html";>CXXBaseSpecifier</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html";>CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html";>CXXFunctionalCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html";>CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html";>CXXTemporaryObjectExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html";>CXXUnresolvedConstructExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html";>ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html";>CompoundLiteralExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html";>DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html";>ExplicitCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html";>ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html";>TemplateArgumentLoc</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html";>TypedefNameDecl</a>> +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html";>BlockPointerType</a>></td><td class="name" onclick="toggle('pointee0')"><a name="pointee0Anchor">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html";>Type</a>></td></tr> <tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the pointee matches a given matcher. @@ -6153,6 +6181,34 @@ </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html";>CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasTypeLoc1')"><a name="hasTypeLoc1Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>> Inner</td></tr> +<tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher. + +Examples: + int x; +declaratorDecl(hasTypeLoc(loc(asString("int")))) + matches int x + +auto x = int(3); +cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) + matches int(3) + +struct Foo { Foo(int, int); }; +auto x = Foo(1, 2); +cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) + matches Foo(1, 2) + +Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html";>BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html";>CXXBaseSpecifier</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html";>CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html";>CXXFunctionalCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html";>CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html";>CXXTemporaryObjectExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html";>CXXUnresolvedConstructExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html";>ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html";>CompoundLiteralExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html";>DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html";>ExplicitCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html";>ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html";>TemplateArgumentLoc</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html";>TypedefNameDecl</a>> +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html";>CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasType8')"><a name="hasType8Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html";>Decl</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value declaration's type. @@ -6353,6 +6409,34 @@ </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html";>CXXCtorInitializer</a>></td><td class="name" onclick="toggle('hasTypeLoc2')"><a name="hasTypeLoc2Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>> Inner</td></tr> +<tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher. + +Examples: + int x; +declaratorDecl(hasTypeLoc(loc(asString("int")))) + matches int x + +auto x = int(3); +cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) + matches int(3) + +struct Foo { Foo(int, int); }; +auto x = Foo(1, 2); +cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) + matches Foo(1, 2) + +Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html";>BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html";>CXXBaseSpecifier</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html";>CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html";>CXXFunctionalCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html";>CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html";>CXXTemporaryObjectExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html";>CXXUnresolvedConstructExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html";>ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html";>CompoundLiteralExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html";>DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html";>ExplicitCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html";>ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html";>TemplateArgumentLoc</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html";>TypedefNameDecl</a>> +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html";>CXXCtorInitializer</a>></td><td class="name" onclick="toggle('withInitializer0')"><a name="withInitializer0Anchor">withInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html";>Expr</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. @@ -6433,6 +6517,34 @@ </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html";>CXXFunctionalCastExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc3')"><a name="hasTypeLoc3Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>> Inner</td></tr> +<tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher. + +Examples: + int x; +declaratorDecl(hasTypeLoc(loc(asString("int")))) + matches int x + +auto x = int(3); +cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) + matches int(3) + +struct Foo { Foo(int, int); }; +auto x = Foo(1, 2); +cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) + matches Foo(1, 2) + +Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html";>BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html";>CXXBaseSpecifier</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html";>CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html";>CXXFunctionalCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html";>CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html";>CXXTemporaryObjectExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html";>CXXUnresolvedConstructExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html";>ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html";>CompoundLiteralExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html";>DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html";>ExplicitCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html";>ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html";>TemplateArgumentLoc</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html";>TypedefNameDecl</a>> +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html";>CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('onImplicitObjectArgument0')"><a name="onImplicitObjectArgument0Anchor">onImplicitObjectArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html";>Expr</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike `on`, matches the argument directly without stripping away anything. @@ -6602,6 +6714,34 @@ </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html";>CXXNewExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc4')"><a name="hasTypeLoc4Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>> Inner</td></tr> +<tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher. + +Examples: + int x; +declaratorDecl(hasTypeLoc(loc(asString("int")))) + matches int x + +auto x = int(3); +cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) + matches int(3) + +struct Foo { Foo(int, int); }; +auto x = Foo(1, 2); +cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) + matches Foo(1, 2) + +Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html";>BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html";>CXXBaseSpecifier</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html";>CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html";>CXXFunctionalCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html";>CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html";>CXXTemporaryObjectExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html";>CXXUnresolvedConstructExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html";>ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html";>CompoundLiteralExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html";>DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html";>ExplicitCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html";>ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html";>TemplateArgumentLoc</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html";>TypedefNameDecl</a>> +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html";>CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasEitherOperand1')"><a name="hasEitherOperand1Anchor">hasEitherOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html";>Expr</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a binary operator matches. @@ -6776,6 +6916,34 @@ </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html";>CXXTemporaryObjectExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc5')"><a name="hasTypeLoc5Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>> Inner</td></tr> +<tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher. + +Examples: + int x; +declaratorDecl(hasTypeLoc(loc(asString("int")))) + matches int x + +auto x = int(3); +cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) + matches int(3) + +struct Foo { Foo(int, int); }; +auto x = Foo(1, 2); +cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) + matches Foo(1, 2) + +Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html";>BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html";>CXXBaseSpecifier</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html";>CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html";>CXXFunctionalCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html";>CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html";>CXXTemporaryObjectExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html";>CXXUnresolvedConstructExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html";>ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html";>CompoundLiteralExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html";>DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html";>ExplicitCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html";>ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html";>TemplateArgumentLoc</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html";>TypedefNameDecl</a>> +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html";>CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument2')"><a name="hasAnyArgument2Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html";>Expr</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call expression, or an ObjC-message-send expression. @@ -6805,6 +6973,34 @@ </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html";>CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc6')"><a name="hasTypeLoc6Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>> Inner</td></tr> +<tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher. + +Examples: + int x; +declaratorDecl(hasTypeLoc(loc(asString("int")))) + matches int x + +auto x = int(3); +cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) + matches int(3) + +struct Foo { Foo(int, int); }; +auto x = Foo(1, 2); +cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) + matches Foo(1, 2) + +Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html";>BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html";>CXXBaseSpecifier</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html";>CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html";>CXXFunctionalCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html";>CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html";>CXXTemporaryObjectExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html";>CXXUnresolvedConstructExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html";>ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html";>CompoundLiteralExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html";>DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html";>ExplicitCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html";>ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html";>TemplateArgumentLoc</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html";>TypedefNameDecl</a>> +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html";>CallExpr</a>></td><td class="name" onclick="toggle('callee1')"><a name="callee1Anchor">callee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html";>Decl</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the given matcher. @@ -7024,6 +7220,34 @@ </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html";>ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc7')"><a name="hasTypeLoc7Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>> Inner</td></tr> +<tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher. + +Examples: + int x; +declaratorDecl(hasTypeLoc(loc(asString("int")))) + matches int x + +auto x = int(3); +cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) + matches int(3) + +struct Foo { Foo(int, int); }; +auto x = Foo(1, 2); +cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) + matches Foo(1, 2) + +Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html";>BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html";>CXXBaseSpecifier</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html";>CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html";>CXXFunctionalCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html";>CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html";>CXXTemporaryObjectExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html";>CXXUnresolvedConstructExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html";>ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html";>CompoundLiteralExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html";>DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html";>ExplicitCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html";>ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html";>TemplateArgumentLoc</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html";>TypedefNameDecl</a>> +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html";>ComplexType</a>></td><td class="name" onclick="toggle('hasElementType1')"><a name="hasElementType1Anchor">hasElementType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html";>Type</a>></td></tr> <tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element type. @@ -7039,6 +7263,34 @@ </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html";>CompoundLiteralExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc8')"><a name="hasTypeLoc8Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>> Inner</td></tr> +<tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher. + +Examples: + int x; +declaratorDecl(hasTypeLoc(loc(asString("int")))) + matches int x + +auto x = int(3); +cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) + matches int(3) + +struct Foo { Foo(int, int); }; +auto x = Foo(1, 2); +cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) + matches Foo(1, 2) + +Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html";>BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html";>CXXBaseSpecifier</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html";>CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html";>CXXFunctionalCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html";>CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html";>CXXTemporaryObjectExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html";>CXXUnresolvedConstructExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html";>ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html";>CompoundLiteralExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html";>DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html";>ExplicitCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html";>ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html";>TemplateArgumentLoc</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html";>TypedefNameDecl</a>> +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html";>CompoundStmt</a>></td><td class="name" onclick="toggle('hasAnySubstatement0')"><a name="hasAnySubstatement0Anchor">hasAnySubstatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html";>Stmt</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches a given matcher. Also matches StmtExprs that have CompoundStmt as children. @@ -7148,14 +7400,31 @@ </pre></td></tr> -<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html";>DeclaratorDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc0')"><a name="hasTypeLoc0Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>> Inner</td></tr> -<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches -the inner matcher. +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html";>DeclaratorDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc9')"><a name="hasTypeLoc9Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>> Inner</td></tr> +<tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher. -Given +Examples: int x; declaratorDecl(hasTypeLoc(loc(asString("int")))) matches int x + +auto x = int(3); +cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) + matches int(3) + +struct Foo { Foo(int, int); }; +auto x = Foo(1, 2); +cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) + matches Foo(1, 2) + +Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html";>BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html";>CXXBaseSpecifier</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html";>CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html";>CXXFunctionalCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html";>CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html";>CXXTemporaryObjectExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html";>CXXUnresolvedConstructExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html";>ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html";>CompoundLiteralExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html";>DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html";>ExplicitCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html";>ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html";>TemplateArgumentLoc</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html";>TypedefNameDecl</a>> </pre></td></tr> @@ -7312,6 +7581,34 @@ </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html";>ExplicitCastExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc10')"><a name="hasTypeLoc10Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>> Inner</td></tr> +<tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher. + +Examples: + int x; +declaratorDecl(hasTypeLoc(loc(asString("int")))) + matches int x + +auto x = int(3); +cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) + matches int(3) + +struct Foo { Foo(int, int); }; +auto x = Foo(1, 2); +cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) + matches Foo(1, 2) + +Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html";>BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html";>CXXBaseSpecifier</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html";>CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html";>CXXFunctionalCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html";>CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html";>CXXTemporaryObjectExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html";>CXXUnresolvedConstructExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html";>ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html";>CompoundLiteralExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html";>DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html";>ExplicitCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html";>ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html";>TemplateArgumentLoc</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html";>TypedefNameDecl</a>> +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html";>Expr</a>></td><td class="name" onclick="toggle('hasType5')"><a name="hasType5Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html";>Decl</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value declaration's type. @@ -8250,6 +8547,34 @@ </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html";>ObjCPropertyDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc11')"><a name="hasTypeLoc11Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>> Inner</td></tr> +<tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher. + +Examples: + int x; +declaratorDecl(hasTypeLoc(loc(asString("int")))) + matches int x + +auto x = int(3); +cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) + matches int(3) + +struct Foo { Foo(int, int); }; +auto x = Foo(1, 2); +cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) + matches Foo(1, 2) + +Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html";>BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html";>CXXBaseSpecifier</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html";>CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html";>CXXFunctionalCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html";>CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html";>CXXTemporaryObjectExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html";>CXXUnresolvedConstructExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html";>ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html";>CompoundLiteralExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html";>DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html";>ExplicitCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html";>ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html";>TemplateArgumentLoc</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html";>TypedefNameDecl</a>> +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html";>OpaqueValueExpr</a>></td><td class="name" onclick="toggle('hasSourceExpression1')"><a name="hasSourceExpression1Anchor">hasSourceExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html";>Expr</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression or opaque value's source expression matches the given matcher. @@ -8601,6 +8926,34 @@ </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html";>TemplateArgumentLoc</a>></td><td class="name" onclick="toggle('hasTypeLoc12')"><a name="hasTypeLoc12Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>> Inner</td></tr> +<tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher. + +Examples: + int x; +declaratorDecl(hasTypeLoc(loc(asString("int")))) + matches int x + +auto x = int(3); +cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) + matches int(3) + +struct Foo { Foo(int, int); }; +auto x = Foo(1, 2); +cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) + matches Foo(1, 2) + +Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html";>BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html";>CXXBaseSpecifier</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html";>CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html";>CXXFunctionalCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html";>CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html";>CXXTemporaryObjectExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html";>CXXUnresolvedConstructExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html";>ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html";>CompoundLiteralExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html";>DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html";>ExplicitCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html";>ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html";>TemplateArgumentLoc</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html";>TypedefNameDecl</a>> +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html";>TemplateArgument</a>></td><td class="name" onclick="toggle('isExpr0')"><a name="isExpr0Anchor">isExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html";>Expr</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. @@ -8784,6 +9137,34 @@ </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html";>TypedefNameDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc13')"><a name="hasTypeLoc13Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html";>TypeLoc</a>> Inner</td></tr> +<tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher. + +Examples: + int x; +declaratorDecl(hasTypeLoc(loc(asString("int")))) + matches int x + +auto x = int(3); +cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) + matches int(3) + +struct Foo { Foo(int, int); }; +auto x = Foo(1, 2); +cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) + matches Foo(1, 2) + +Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html";>BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html";>CXXBaseSpecifier</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html";>CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html";>CXXFunctionalCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html";>CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html";>CXXTemporaryObjectExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html";>CXXUnresolvedConstructExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html";>ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html";>CompoundLiteralExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html";>DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html";>ExplicitCastExpr</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html";>ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html";>TemplateArgumentLoc</a>>, + Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html";>TypedefNameDecl</a>> +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html";>TypedefNameDecl</a>></td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html";>QualType</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type matcher.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits