1 <!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01//EN"
2 "http://www.w3.org/TR/html4/strict.dtd">
5 <title>AST Matcher Reference
</title>
6 <link type=
"text/css" rel=
"stylesheet" href=
"../menu.css" />
7 <link type=
"text/css" rel=
"stylesheet" href=
"../content.css" />
8 <style type=
"text/css">
14 border-bottom: 1px solid black
;
20 span
.mono
{ font-family: monospace
; }
22 .traverse_compare, .traverse_compare td, .traverse_compare th {
23 border: 1px solid black
;
24 border-collapse: collapse
;
27 <script type=
"text/javascript">
30 row
= document
.getElementById(id
);
31 if (row
.style
.display
!= 'table-cell')
32 row
.style
.display
= 'table-cell';
34 row
.style
.display
= 'none';
38 <body onLoad=
"toggle(location.hash.substring(1, location.hash.length - 6))">
40 <!--#include virtual="../menu.html.incl"-->
44 <h1>AST Matcher Reference
</h1>
46 <p>This document shows all currently implemented matchers. The matchers are grouped
47 by category and node type they match. You can click on matcher names to show the
48 matcher's source documentation.
</p>
50 <p>There are three different basic categories of matchers:
52 <li><a href=
"#decl-matchers">Node Matchers:
</a> Matchers that match a specific type of AST node.
</li>
53 <li><a href=
"#narrowing-matchers">Narrowing Matchers:
</a> Matchers that match attributes on AST nodes.
</li>
54 <li><a href=
"#traversal-matchers">Traversal Matchers:
</a> Matchers that allow traversal between AST nodes.
</li>
58 <p>Within each category the matchers are ordered by node type they match on.
59 Note that if a matcher can match multiple node types, it will appear
60 multiple times. This means that by searching for Matcher
<Stmt
> you can
61 find all matchers that can be used to match on Stmt nodes.
</p>
63 <p>The exception to that rule are matchers that can match on any node. Those
64 are marked with a * and are listed in the beginning of each category.
</p>
66 <p>Note that the categorization of matchers is a great help when you combine
67 them into matcher expressions. You will usually want to form matcher expressions
68 that read like english sentences by alternating between node matchers and
69 narrowing or traversal matchers, like this:
71 recordDecl(hasDescendant(
72 ifStmt(hasTrueExpression(
78 <!-- ======================================================================= -->
79 <h2 id=
"traverse-mode">Traverse Mode
</h2>
80 <!-- ======================================================================= -->
82 <p>The default mode of operation of AST Matchers visits all nodes in the AST,
83 even if they are not spelled in the source. This is
84 <span class=
"mono">AsIs
</span> mode. This mode requires writing AST matchers
85 that explicitly traverse or ignore implicit nodes, such as parentheses
86 surrounding an expression or expressions with cleanups. These implicit
87 nodes are not always obvious from the syntax of the source code, and so this
88 mode requires careful consideration and testing to get the desired behavior
92 <p>In addition, because template instantiations are matched in the default mode,
93 transformations can be accidentally made to template declarations. Finally,
94 because implicit nodes are matched by default, transformations can be made on
95 entirely incorrect places in the code.
</p>
97 <p>For these reasons, it is possible to ignore AST nodes which are not spelled
98 in the source using the
<span class=
"mono">IgnoreUnlessSpelledInSource
</span>
99 mode. This is likely to be far less error-prone for users who are not already
100 very familiar with where implicit nodes appear in the AST. It is also likely
101 to be less error-prone for experienced AST users, as difficult cases do not
102 need to be encountered and matcher expressions adjusted for these cases.
</p>
104 <p>In clang-query, the mode can be changed with
106 set traversal IgnoreUnlessSpelledInSource
109 This affects both matchers and AST dump output in results.
111 <p>When using the C++ API such as in clang-tidy checks, the
112 <span class=
"mono">traverse()
</span> matcher is used to set the mode:
114 Finder-
>addMatcher(traverse(TK_IgnoreUnlessSpelledInSource,
115 returnStmt(hasReturnValue(integerLiteral(equals(
0))))
119 <p>The following table compares the
<span class=
"mono">AsIs
</span> mode with
120 the
<span class=
"mono">IgnoreUnlessSpelledInSource
</span> mode:
</p>
122 <table class=
"traverse_compare">
125 <th><span class=
"mono">AsIs
</span></th>
126 <th><span class=
"mono">IgnoreUnlessSpelledInSource
</span></th>
129 <td>AST dump of
<span class=
"mono">func1
</span>:
135 B func1() { return
42; }
147 `-MaterializeTemporaryExpr
151 `-IntegerLiteral 'int'
42
153 C++
11, C++
14 dialect:
160 `-MaterializeTemporaryExpr
163 `-IntegerLiteral 'int'
42
165 C++
17, C++
20 dialect:
172 `-IntegerLiteral 'int'
42
181 `-IntegerLiteral 'int'
42
186 <td>Matcher for returned
<span class=
"mono">42</span>:
192 B func1() { return
42; }
199 returnStmt(hasReturnValue(
201 ignoringElidableConstructorCall(
203 cxxConstructExpr(hasArgument(
0,
205 integerLiteral().bind(
"returnVal")
216 returnStmt(hasReturnValue(
217 integerLiteral().bind(
"returnVal")
223 <pre>implicitCastExpr()
</pre>
230 B func1() { return
42; }
240 <td>Match result for:
244 ).bind(
"prepend_explicit")
256 Match found. Insertion produces incorrect output:
259 struct explicit Copyable {
266 No match found. Incorrect replacement not possible.
270 <td>Replacement of
<span class=
"mono">begin()
</span>
271 with
<span class=
"mono">cbegin()
</span>:
274 on(ConstContainerExpr),
275 callee(cxxMethodDecl(hasName(
"begin")))
276 ).bind(
"replace_with_cbegin")
290 2 matches found. Replacement produces incorrect output:
296 for (auto i :.cbegin() c) {
302 1 match found. Replacement produces correct output:
315 <td>Replacement of
<span class=
"mono">int
</span> member
316 with
<span class=
"mono">safe_int
</span>:
319 hasType(asString(
"int"))
320 ).bind(
"use_safe_int")
328 template
<typename T
> struct TemplStruct {
336 void instantiate() { TemplStruct
<int
> ti; }
340 2 matches found. Replacement produces incorrect output:
346 template
<typename T
> struct TemplStruct {
354 void instantiate() { TemplStruct
<int
> ti; }
358 1 match found. Replacement produces correct output:
364 template
<typename T
> struct TemplStruct {
372 void instantiate() { TemplStruct
<int
> ti; }
377 <td>Add prefix to member initializer
380 forField(fieldDecl())
396 2 matches found. Replacement produces incorrect output:
401 m_Record() : m_i(
42) {}
409 1 match found. Replacement produces correct output:
414 Record() : m_i(
42) {}
423 <td>Ignored default arguments
427 hasName(
"hasDefaultArg")
434 void hasDefaultArg(int i, int j =
0) {}
435 void callDefaultArg() { hasDefaultArg(
42); }
449 hasType(asString(
"int"))
462 auto l = [a, b = c](int d) { int e = d; };
468 2 matches found. Replacement produces incorrect output:
478 auto l = [safe_a, safe_b = c](int d) { int e = d; };
484 1 match found. Replacement produces correct output:
494 auto l = [a, b = c](int d) { int e = d; };
507 <td>Rewritten binary operators
510 hasOperatorName(
"<"),
511 hasRHS(hasDescendant(integerLiteral(equals(
0))))
516 #include
<compare
>
521 bool operator==(const HasSpaceship&) const = default;
522 std::strong_ordering operator<=
>(const HasSpaceship&) const = default;
525 bool isLess(const HasSpaceship& a, const HasSpaceship& b) {
545 <!-- ======================================================================= -->
546 <h2 id=
"decl-matchers">Node Matchers
</h2>
547 <!-- ======================================================================= -->
549 <p>Node matchers are at the core of matcher expressions - they specify the type
550 of node that is expected. Every match expression starts with a node matcher,
551 which can then be further refined with a narrowing or traversal matcher. All
552 traversal matchers take node matchers as their arguments.
</p>
554 <p>For convenience, all node matchers take an arbitrary number of arguments
555 and implicitly act as allOf matchers.
</p>
557 <p>Node matchers are the only matchers that support the bind(
"id") call to
558 bind the matched node to the given string, to be later retrieved from the
561 <p>It is important to remember that the arguments to node matchers are
562 predicates on the same node, just with additional information about the type.
563 This is often useful to make matcher expression more readable by inlining bind
564 calls into redundant node matchers inside another node matcher:
566 // This binds the CXXRecordDecl to
"id", as the decl() matcher will stay on
568 recordDecl(decl().bind(
"id"), hasName(
"::MyClass"))
573 <tr style=
"text-align:left"><th>Return type
</th><th>Name
</th><th>Parameters
</th></tr>
574 <!-- START_DECL_MATCHERS -->
576 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr
</a>></td><td class=
"name" onclick=
"toggle('attr0')"><a name=
"attr0Anchor">attr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr
</a>>...
</td></tr>
577 <tr><td colspan=
"4" class=
"doc" id=
"attr0"><pre>Matches attributes.
578 Attributes may be attached with a variety of different syntaxes (including
579 keywords, C++
11 attributes, GNU ``__attribute``` and MSVC `__declspec``,
580 and ``#pragma``s). They may also be implicit.
583 struct [[nodiscard]] Foo{};
584 void bar(int * __attribute__((nonnull)) );
585 __declspec(noinline) void baz();
587 #pragma omp declare simd
590 matches
"nodiscard",
"nonnull",
"noinline", and the whole
"#pragma" line.
594 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier
</a>></td><td class=
"name" onclick=
"toggle('cxxBaseSpecifier0')"><a name=
"cxxBaseSpecifier0Anchor">cxxBaseSpecifier
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier
</a>>...
</td></tr>
595 <tr><td colspan=
"4" class=
"doc" id=
"cxxBaseSpecifier0"><pre>Matches class bases.
597 Examples matches public virtual B.
599 class C : public virtual B {};
603 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer
</a>></td><td class=
"name" onclick=
"toggle('cxxCtorInitializer0')"><a name=
"cxxCtorInitializer0Anchor">cxxCtorInitializer
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer
</a>>...
</td></tr>
604 <tr><td colspan=
"4" class=
"doc" id=
"cxxCtorInitializer0"><pre>Matches constructor initializers.
606 Examples matches i(
42).
614 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('accessSpecDecl0')"><a name=
"accessSpecDecl0Anchor">accessSpecDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl
</a>>...
</td></tr>
615 <tr><td colspan=
"4" class=
"doc" id=
"accessSpecDecl0"><pre>Matches C++ access specifier declarations.
627 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('bindingDecl0')"><a name=
"bindingDecl0Anchor">bindingDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl
</a>>...
</td></tr>
628 <tr><td colspan=
"4" class=
"doc" id=
"bindingDecl0"><pre>Matches binding declarations
629 Example matches foo and bar
630 (matcher = bindingDecl()
632 auto [foo, bar] = std::make_pair{
42,
42};
636 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('blockDecl0')"><a name=
"blockDecl0Anchor">blockDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl
</a>>...
</td></tr>
637 <tr><td colspan=
"4" class=
"doc" id=
"blockDecl0"><pre>Matches block declarations.
639 Example matches the declaration of the nameless block printing an input
648 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('classTemplateDecl0')"><a name=
"classTemplateDecl0Anchor">classTemplateDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl
</a>>...
</td></tr>
649 <tr><td colspan=
"4" class=
"doc" id=
"classTemplateDecl0"><pre>Matches C++ class template declarations.
652 template
<class T
> class Z {};
656 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('classTemplatePartialSpecializationDecl0')"><a name=
"classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl
</a>>...
</td></tr>
657 <tr><td colspan=
"4" class=
"doc" id=
"classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
660 template
<class T1, class T2, int I
>
663 template
<class T, int I
>
664 class A
<T, T*, I
> {};
667 class A
<int, int,
1> {};
668 classTemplatePartialSpecializationDecl()
669 matches the specialization A
<T,T*,I
> but not A
<int,int,
1>
673 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('classTemplateSpecializationDecl0')"><a name=
"classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl
</a>>...
</td></tr>
674 <tr><td colspan=
"4" class=
"doc" id=
"classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
677 template
<typename T
> class A {};
678 template
<> class A
<double
> {};
680 classTemplateSpecializationDecl()
681 matches the specializations A
<int
> and A
<double
>
685 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('conceptDecl0')"><a name=
"conceptDecl0Anchor">conceptDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ConceptDecl.html">ConceptDecl
</a>>...
</td></tr>
686 <tr><td colspan=
"4" class=
"doc" id=
"conceptDecl0"><pre>Matches concept declarations.
688 Example matches integral
689 template
<typename T
>
690 concept integral = std::is_integral_v
<T
>;
694 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('cxxConstructorDecl0')"><a name=
"cxxConstructorDecl0Anchor">cxxConstructorDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl
</a>>...
</td></tr>
695 <tr><td colspan=
"4" class=
"doc" id=
"cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
697 Example matches Foo::Foo() and Foo::Foo(int)
707 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('cxxConversionDecl0')"><a name=
"cxxConversionDecl0Anchor">cxxConversionDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl
</a>>...
</td></tr>
708 <tr><td colspan=
"4" class=
"doc" id=
"cxxConversionDecl0"><pre>Matches conversion operator declarations.
710 Example matches the operator.
711 class X { operator int() const; };
715 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('cxxDeductionGuideDecl0')"><a name=
"cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl
</a>>...
</td></tr>
716 <tr><td colspan=
"4" class=
"doc" id=
"cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
718 Example matches the deduction guide.
719 template
<typename T
>
721 X(int) -
> X
<int
>;
725 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('cxxDestructorDecl0')"><a name=
"cxxDestructorDecl0Anchor">cxxDestructorDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl
</a>>...
</td></tr>
726 <tr><td colspan=
"4" class=
"doc" id=
"cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
728 Example matches Foo::~Foo()
736 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('cxxMethodDecl0')"><a name=
"cxxMethodDecl0Anchor">cxxMethodDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl
</a>>...
</td></tr>
737 <tr><td colspan=
"4" class=
"doc" id=
"cxxMethodDecl0"><pre>Matches method declarations.
740 class X { void y(); };
744 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('cxxRecordDecl0')"><a name=
"cxxRecordDecl0Anchor">cxxRecordDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>>...
</td></tr>
745 <tr><td colspan=
"4" class=
"doc" id=
"cxxRecordDecl0"><pre>Matches C++ class declarations.
749 template
<class T
> class Z {};
753 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('decl0')"><a name=
"decl0Anchor">decl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>>...
</td></tr>
754 <tr><td colspan=
"4" class=
"doc" id=
"decl0"><pre>Matches declarations.
756 Examples matches X, C, and the friend declaration inside C;
764 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('declaratorDecl0')"><a name=
"declaratorDecl0Anchor">declaratorDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl
</a>>...
</td></tr>
765 <tr><td colspan=
"4" class=
"doc" id=
"declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
766 and non-type template parameter declarations).
775 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('decompositionDecl0')"><a name=
"decompositionDecl0Anchor">decompositionDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl
</a>>...
</td></tr>
776 <tr><td colspan=
"4" class=
"doc" id=
"decompositionDecl0"><pre>Matches decomposition-declarations.
778 Examples matches the declaration node with foo and bar, but not
780 (matcher = declStmt(has(decompositionDecl())))
783 auto [foo, bar] = std::make_pair{
42,
42};
787 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('enumConstantDecl0')"><a name=
"enumConstantDecl0Anchor">enumConstantDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl
</a>>...
</td></tr>
788 <tr><td colspan=
"4" class=
"doc" id=
"enumConstantDecl0"><pre>Matches enum constants.
790 Example matches A, B, C
797 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('enumDecl0')"><a name=
"enumDecl0Anchor">enumDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl
</a>>...
</td></tr>
798 <tr><td colspan=
"4" class=
"doc" id=
"enumDecl0"><pre>Matches enum declarations.
807 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('fieldDecl0')"><a name=
"fieldDecl0Anchor">fieldDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl
</a>>...
</td></tr>
808 <tr><td colspan=
"4" class=
"doc" id=
"fieldDecl0"><pre>Matches field declarations.
817 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('friendDecl0')"><a name=
"friendDecl0Anchor">friendDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl
</a>>...
</td></tr>
818 <tr><td colspan=
"4" class=
"doc" id=
"friendDecl0"><pre>Matches friend declarations.
821 class X { friend void foo(); };
823 matches 'friend void foo()'.
827 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('functionDecl0')"><a name=
"functionDecl0Anchor">functionDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>>...
</td></tr>
828 <tr><td colspan=
"4" class=
"doc" id=
"functionDecl0"><pre>Matches function declarations.
835 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('functionTemplateDecl0')"><a name=
"functionTemplateDecl0Anchor">functionTemplateDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl
</a>>...
</td></tr>
836 <tr><td colspan=
"4" class=
"doc" id=
"functionTemplateDecl0"><pre>Matches C++ function template declarations.
839 template
<class T
> void f(T t) {}
843 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('indirectFieldDecl0')"><a name=
"indirectFieldDecl0Anchor">indirectFieldDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl
</a>>...
</td></tr>
844 <tr><td colspan=
"4" class=
"doc" id=
"indirectFieldDecl0"><pre>Matches indirect field declarations.
847 struct X { struct { int a; }; };
853 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('labelDecl0')"><a name=
"labelDecl0Anchor">labelDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl
</a>>...
</td></tr>
854 <tr><td colspan=
"4" class=
"doc" id=
"labelDecl0"><pre>Matches a declaration of label.
864 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('linkageSpecDecl0')"><a name=
"linkageSpecDecl0Anchor">linkageSpecDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl
</a>>...
</td></tr>
865 <tr><td colspan=
"4" class=
"doc" id=
"linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
870 matches
"extern "C
" {}"
874 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('namedDecl0')"><a name=
"namedDecl0Anchor">namedDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl
</a>>...
</td></tr>
875 <tr><td colspan=
"4" class=
"doc" id=
"namedDecl0"><pre>Matches a declaration of anything that could have a name.
877 Example matches X, S, the anonymous union type, i, and U;
887 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('namespaceAliasDecl0')"><a name=
"namespaceAliasDecl0Anchor">namespaceAliasDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl
</a>>...
</td></tr>
888 <tr><td colspan=
"4" class=
"doc" id=
"namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
892 namespace alias = ::test;
894 matches
"namespace alias" but not
"namespace test"
898 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('namespaceDecl0')"><a name=
"namespaceDecl0Anchor">namespaceDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl
</a>>...
</td></tr>
899 <tr><td colspan=
"4" class=
"doc" id=
"namespaceDecl0"><pre>Matches a declaration of a namespace.
905 matches
"namespace {}" and
"namespace test {}"
909 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('nonTypeTemplateParmDecl0')"><a name=
"nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl
</a>>...
</td></tr>
910 <tr><td colspan=
"4" class=
"doc" id=
"nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
913 template
<typename T, int N
> struct C {};
914 nonTypeTemplateParmDecl()
915 matches 'N', but not 'T'.
919 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('objcCategoryDecl0')"><a name=
"objcCategoryDecl0Anchor">objcCategoryDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl
</a>>...
</td></tr>
920 <tr><td colspan=
"4" class=
"doc" id=
"objcCategoryDecl0"><pre>Matches Objective-C category declarations.
922 Example matches Foo (Additions)
923 @interface Foo (Additions)
928 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('objcCategoryImplDecl0')"><a name=
"objcCategoryImplDecl0Anchor">objcCategoryImplDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl
</a>>...
</td></tr>
929 <tr><td colspan=
"4" class=
"doc" id=
"objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
931 Example matches Foo (Additions)
932 @implementation Foo (Additions)
937 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('objcImplementationDecl0')"><a name=
"objcImplementationDecl0Anchor">objcImplementationDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl
</a>>...
</td></tr>
938 <tr><td colspan=
"4" class=
"doc" id=
"objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
946 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('objcInterfaceDecl0')"><a name=
"objcInterfaceDecl0Anchor">objcInterfaceDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl
</a>>...
</td></tr>
947 <tr><td colspan=
"4" class=
"doc" id=
"objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
955 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('objcIvarDecl0')"><a name=
"objcIvarDecl0Anchor">objcIvarDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl
</a>>...
</td></tr>
956 <tr><td colspan=
"4" class=
"doc" id=
"objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
958 Example matches _enabled
959 @implementation Foo {
966 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('objcMethodDecl0')"><a name=
"objcMethodDecl0Anchor">objcMethodDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl
</a>>...
</td></tr>
967 <tr><td colspan=
"4" class=
"doc" id=
"objcMethodDecl0"><pre>Matches Objective-C method declarations.
969 Example matches both declaration and definition of -[Foo method]
980 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('objcPropertyDecl0')"><a name=
"objcPropertyDecl0Anchor">objcPropertyDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl
</a>>...
</td></tr>
981 <tr><td colspan=
"4" class=
"doc" id=
"objcPropertyDecl0"><pre>Matches Objective-C property declarations.
983 Example matches enabled
985 @property BOOL enabled;
990 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('objcProtocolDecl0')"><a name=
"objcProtocolDecl0Anchor">objcProtocolDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl
</a>>...
</td></tr>
991 <tr><td colspan=
"4" class=
"doc" id=
"objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
993 Example matches FooDelegate
994 @protocol FooDelegate
999 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('parmVarDecl0')"><a name=
"parmVarDecl0Anchor">parmVarDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl
</a>>...
</td></tr>
1000 <tr><td colspan=
"4" class=
"doc" id=
"parmVarDecl0"><pre>Matches parameter variable declarations.
1009 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('recordDecl0')"><a name=
"recordDecl0Anchor">recordDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl
</a>>...
</td></tr>
1010 <tr><td colspan=
"4" class=
"doc" id=
"recordDecl0"><pre>Matches class, struct, and union declarations.
1012 Example matches X, Z, U, and S
1014 template
<class T
> class Z {};
1020 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('staticAssertDecl0')"><a name=
"staticAssertDecl0Anchor">staticAssertDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl
</a>>...
</td></tr>
1021 <tr><td colspan=
"4" class=
"doc" id=
"staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
1026 static_assert(sizeof(S) == sizeof(int))
1031 static_assert(sizeof(S) == sizeof(int));
1035 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('tagDecl0')"><a name=
"tagDecl0Anchor">tagDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl
</a>>...
</td></tr>
1036 <tr><td colspan=
"4" class=
"doc" id=
"tagDecl0"><pre>Matches tag declarations.
1038 Example matches X, Z, U, S, E
1040 template
<class T
> class Z {};
1049 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('templateTemplateParmDecl0')"><a name=
"templateTemplateParmDecl0Anchor">templateTemplateParmDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl
</a>>...
</td></tr>
1050 <tr><td colspan=
"4" class=
"doc" id=
"templateTemplateParmDecl0"><pre>Matches template template parameter declarations.
1053 template
<template
<typename
> class Z, int N
> struct C {};
1054 templateTypeParmDecl()
1055 matches 'Z', but not 'N'.
1059 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('templateTypeParmDecl0')"><a name=
"templateTypeParmDecl0Anchor">templateTypeParmDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl
</a>>...
</td></tr>
1060 <tr><td colspan=
"4" class=
"doc" id=
"templateTypeParmDecl0"><pre>Matches template type parameter declarations.
1063 template
<typename T, int N
> struct C {};
1064 templateTypeParmDecl()
1065 matches 'T', but not 'N'.
1069 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('translationUnitDecl0')"><a name=
"translationUnitDecl0Anchor">translationUnitDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl
</a>>...
</td></tr>
1070 <tr><td colspan=
"4" class=
"doc" id=
"translationUnitDecl0"><pre>Matches the top declaration context.
1077 decl(hasDeclContext(translationUnitDecl()))
1078 matches
"int X", but not
"int Y".
1082 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('typeAliasDecl0')"><a name=
"typeAliasDecl0Anchor">typeAliasDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl
</a>>...
</td></tr>
1083 <tr><td colspan=
"4" class=
"doc" id=
"typeAliasDecl0"><pre>Matches type alias declarations.
1089 matches
"using Y = int", but not
"typedef int X"
1093 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('typeAliasTemplateDecl0')"><a name=
"typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl
</a>>...
</td></tr>
1094 <tr><td colspan=
"4" class=
"doc" id=
"typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
1096 typeAliasTemplateDecl() matches
1097 template
<typename T
>
1098 using Y = X
<T
>;
1102 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('typedefDecl0')"><a name=
"typedefDecl0Anchor">typedefDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl
</a>>...
</td></tr>
1103 <tr><td colspan=
"4" class=
"doc" id=
"typedefDecl0"><pre>Matches typedef declarations.
1109 matches
"typedef int X", but not
"using Y = int"
1113 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('typedefNameDecl0')"><a name=
"typedefNameDecl0Anchor">typedefNameDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl
</a>>...
</td></tr>
1114 <tr><td colspan=
"4" class=
"doc" id=
"typedefNameDecl0"><pre>Matches typedef name declarations.
1120 matches
"typedef int X" and
"using Y = int"
1124 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('unresolvedUsingTypenameDecl0')"><a name=
"unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl
</a>>...
</td></tr>
1125 <tr><td colspan=
"4" class=
"doc" id=
"unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
1129 template
<typename T
>
1130 struct Base { typedef T Foo; };
1132 template
<typename T
>
1133 struct S : private Base
<T
> {
1134 using typename Base
<T
>::Foo;
1136 unresolvedUsingTypenameDecl()
1137 matches using Base
<T
>::Foo
</pre></td></tr>
1140 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('unresolvedUsingValueDecl0')"><a name=
"unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl
</a>>...
</td></tr>
1141 <tr><td colspan=
"4" class=
"doc" id=
"unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
1144 template
<typename X
>
1145 class C : private X {
1148 unresolvedUsingValueDecl()
1149 matches using X::x
</pre></td></tr>
1152 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('usingDecl0')"><a name=
"usingDecl0Anchor">usingDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl
</a>>...
</td></tr>
1153 <tr><td colspan=
"4" class=
"doc" id=
"usingDecl0"><pre>Matches using declarations.
1156 namespace X { int x; }
1159 matches using X::x
</pre></td></tr>
1162 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('usingDirectiveDecl0')"><a name=
"usingDirectiveDecl0Anchor">usingDirectiveDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl
</a>>...
</td></tr>
1163 <tr><td colspan=
"4" class=
"doc" id=
"usingDirectiveDecl0"><pre>Matches using namespace declarations.
1166 namespace X { int x; }
1168 usingDirectiveDecl()
1169 matches using namespace X
</pre></td></tr>
1172 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('usingEnumDecl0')"><a name=
"usingEnumDecl0Anchor">usingEnumDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1UsingEnumDecl.html">UsingEnumDecl
</a>>...
</td></tr>
1173 <tr><td colspan=
"4" class=
"doc" id=
"usingEnumDecl0"><pre>Matches using-enum declarations.
1176 namespace X { enum x {...}; }
1179 matches using enum X::x
</pre></td></tr>
1182 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('valueDecl0')"><a name=
"valueDecl0Anchor">valueDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl
</a>>...
</td></tr>
1183 <tr><td colspan=
"4" class=
"doc" id=
"valueDecl0"><pre>Matches any value declaration.
1185 Example matches A, B, C and F
1191 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('varDecl0')"><a name=
"varDecl0Anchor">varDecl
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl
</a>>...
</td></tr>
1192 <tr><td colspan=
"4" class=
"doc" id=
"varDecl0"><pre>Matches variable declarations.
1194 Note: this does not match declarations of member variables, which are
1195 "field" declarations in Clang parlance.
1202 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture
</a>></td><td class=
"name" onclick=
"toggle('lambdaCapture0')"><a name=
"lambdaCapture0Anchor">lambdaCapture
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture
</a>>...
</td></tr>
1203 <tr><td colspan=
"4" class=
"doc" id=
"lambdaCapture0"><pre>Matches lambda captures.
1209 auto g = [x =
1](){};
1211 In the matcher `lambdaExpr(hasAnyCapture(lambdaCapture()))`,
1212 `lambdaCapture()` matches `x` and `x=
1`.
1216 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc
</a>></td><td class=
"name" onclick=
"toggle('nestedNameSpecifierLoc0')"><a name=
"nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc
</a>>...
</td></tr>
1217 <tr><td colspan=
"4" class=
"doc" id=
"nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
1221 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier
</a>></td><td class=
"name" onclick=
"toggle('nestedNameSpecifier0')"><a name=
"nestedNameSpecifier0Anchor">nestedNameSpecifier
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier
</a>>...
</td></tr>
1222 <tr><td colspan=
"4" class=
"doc" id=
"nestedNameSpecifier0"><pre>Matches nested name specifiers.
1226 struct A { static void f(); };
1228 void g() { A::f(); }
1231 nestedNameSpecifier()
1232 matches
"ns::" and both
"A::"
1236 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause
</a>></td><td class=
"name" onclick=
"toggle('ompDefaultClause0')"><a name=
"ompDefaultClause0Anchor">ompDefaultClause
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause
</a>>...
</td></tr>
1237 <tr><td colspan=
"4" class=
"doc" id=
"ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
1241 #pragma omp parallel default(none)
1242 #pragma omp parallel default(shared)
1243 #pragma omp parallel default(private)
1244 #pragma omp parallel default(firstprivate)
1245 #pragma omp parallel
1247 ``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``,
1248 `` default(private)`` and ``default(firstprivate)``
1252 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType
</a>></td><td class=
"name" onclick=
"toggle('qualType0')"><a name=
"qualType0Anchor">qualType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType
</a>>...
</td></tr>
1253 <tr><td colspan=
"4" class=
"doc" id=
"qualType0"><pre>Matches QualTypes in the clang AST.
1257 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('addrLabelExpr0')"><a name=
"addrLabelExpr0Anchor">addrLabelExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr
</a>>...
</td></tr>
1258 <tr><td colspan=
"4" class=
"doc" id=
"addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
1262 void *ptr =
&&FOO;
1265 matches '
&&FOO'
1269 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('arrayInitIndexExpr0')"><a name=
"arrayInitIndexExpr0Anchor">arrayInitIndexExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ArrayInitIndexExpr.html">ArrayInitIndexExpr
</a>>...
</td></tr>
1270 <tr><td colspan=
"4" class=
"doc" id=
"arrayInitIndexExpr0"><pre>The arrayInitIndexExpr consists of two subexpressions: a common expression
1271 (the source array) that is evaluated once up-front, and a per-element initializer
1272 that runs once for each array element. Within the per-element initializer,
1273 the current index may be obtained via an ArrayInitIndexExpr.
1276 void testStructBinding() {
1280 arrayInitIndexExpr() matches the array index that implicitly iterates
1281 over the array `a` to copy each element to the anonymous array
1282 that backs the structured binding `[x, y]` elements of which are
1283 referred to by their aliases `x` and `y`.
1287 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('arrayInitLoopExpr0')"><a name=
"arrayInitLoopExpr0Anchor">arrayInitLoopExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ArrayInitLoopExpr.html">ArrayInitLoopExpr
</a>>...
</td></tr>
1288 <tr><td colspan=
"4" class=
"doc" id=
"arrayInitLoopExpr0"><pre>Matches a loop initializing the elements of an array in a number of contexts:
1289 * in the implicit copy/move constructor for a class with an array member
1290 * when a lambda-expression captures an array by value
1291 * when a decomposition declaration decomposes an array
1294 void testLambdaCapture() {
1300 arrayInitLoopExpr() matches the implicit loop that initializes each element of
1301 the implicit array field inside the lambda object, that represents the array `a`
1306 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('arraySubscriptExpr0')"><a name=
"arraySubscriptExpr0Anchor">arraySubscriptExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr
</a>>...
</td></tr>
1307 <tr><td colspan=
"4" class=
"doc" id=
"arraySubscriptExpr0"><pre>Matches array subscript expressions.
1311 arraySubscriptExpr()
1316 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('asmStmt0')"><a name=
"asmStmt0Anchor">asmStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt
</a>>...
</td></tr>
1317 <tr><td colspan=
"4" class=
"doc" id=
"asmStmt0"><pre>Matches asm statements.
1322 matches '__asm(
"mov al, 2")'
1326 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('atomicExpr0')"><a name=
"atomicExpr0Anchor">atomicExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr
</a>>...
</td></tr>
1327 <tr><td colspan=
"4" class=
"doc" id=
"atomicExpr0"><pre>Matches atomic builtins.
1328 Example matches __atomic_load_n(ptr,
1)
1329 void foo() { int *ptr; __atomic_load_n(ptr,
1); }
1333 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('autoreleasePoolStmt0')"><a name=
"autoreleasePoolStmt0Anchor">autoreleasePoolStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt
</a>>...
</td></tr>
1334 <tr><td colspan=
"4" class=
"doc" id=
"autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
1340 autoreleasePoolStmt(stmt()) matches the declaration of
"x"
1341 inside the autorelease pool.
1345 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('binaryConditionalOperator0')"><a name=
"binaryConditionalOperator0Anchor">binaryConditionalOperator
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator
</a>>...
</td></tr>
1346 <tr><td colspan=
"4" class=
"doc" id=
"binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
1348 Example matches a ?: b
1353 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('binaryOperator0')"><a name=
"binaryOperator0Anchor">binaryOperator
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator
</a>>...
</td></tr>
1354 <tr><td colspan=
"4" class=
"doc" id=
"binaryOperator0"><pre>Matches binary operator expressions.
1356 Example matches a || b
1358 See also the binaryOperation() matcher for more-general matching.
1362 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('blockExpr0')"><a name=
"blockExpr0Anchor">blockExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr
</a>>...
</td></tr>
1363 <tr><td colspan=
"4" class=
"doc" id=
"blockExpr0"><pre>Matches a reference to a block.
1365 Example: matches
"^{}":
1370 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('breakStmt0')"><a name=
"breakStmt0Anchor">breakStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt
</a>>...
</td></tr>
1371 <tr><td colspan=
"4" class=
"doc" id=
"breakStmt0"><pre>Matches break statements.
1374 while (true) { break; }
1380 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cStyleCastExpr0')"><a name=
"cStyleCastExpr0Anchor">cStyleCastExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr
</a>>...
</td></tr>
1381 <tr><td colspan=
"4" class=
"doc" id=
"cStyleCastExpr0"><pre>Matches a C-style cast expression.
1383 Example: Matches (int)
2.2f in
1388 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('callExpr0')"><a name=
"callExpr0Anchor">callExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr
</a>>...
</td></tr>
1389 <tr><td colspan=
"4" class=
"doc" id=
"callExpr0"><pre>Matches call expressions.
1391 Example matches x.y() and y()
1398 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('caseStmt0')"><a name=
"caseStmt0Anchor">caseStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt
</a>>...
</td></tr>
1399 <tr><td colspan=
"4" class=
"doc" id=
"caseStmt0"><pre>Matches case statements inside switch statements.
1402 switch(a) { case
42: break; default: break; }
1408 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('castExpr0')"><a name=
"castExpr0Anchor">castExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr
</a>>...
</td></tr>
1409 <tr><td colspan=
"4" class=
"doc" id=
"castExpr0"><pre>Matches any cast nodes of Clang's AST.
1411 Example: castExpr() matches each of the following:
1413 const_cast
<Expr *
>(SubExpr);
1421 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('characterLiteral0')"><a name=
"characterLiteral0Anchor">characterLiteral
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral
</a>>...
</td></tr>
1422 <tr><td colspan=
"4" class=
"doc" id=
"characterLiteral0"><pre>Matches character literals (also matches wchar_t).
1424 Not matching Hex-encoded chars (e.g.
0x1234, which is a IntegerLiteral),
1427 Example matches 'a', L'a'
1433 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('chooseExpr0')"><a name=
"chooseExpr0Anchor">chooseExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr
</a>>...
</td></tr>
1434 <tr><td colspan=
"4" class=
"doc" id=
"chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
1438 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('coawaitExpr0')"><a name=
"coawaitExpr0Anchor">coawaitExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CoawaitExpr.html">CoawaitExpr
</a>>...
</td></tr>
1439 <tr><td colspan=
"4" class=
"doc" id=
"coawaitExpr0"><pre>Matches co_await expressions.
1444 matches 'co_await
1'
1448 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('compoundLiteralExpr0')"><a name=
"compoundLiteralExpr0Anchor">compoundLiteralExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr
</a>>...
</td></tr>
1449 <tr><td colspan=
"4" class=
"doc" id=
"compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
1451 Example match: {
1}, (
1,
2)
1453 vector int myvec = (vector int)(
1,
2);
1457 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('compoundStmt0')"><a name=
"compoundStmt0Anchor">compoundStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt
</a>>...
</td></tr>
1458 <tr><td colspan=
"4" class=
"doc" id=
"compoundStmt0"><pre>Matches compound statements.
1460 Example matches '{}' and '{{}}' in 'for (;;) {{}}'
1465 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('conditionalOperator0')"><a name=
"conditionalOperator0Anchor">conditionalOperator
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator
</a>>...
</td></tr>
1466 <tr><td colspan=
"4" class=
"doc" id=
"conditionalOperator0"><pre>Matches conditional operator expressions.
1468 Example matches a ? b : c
1473 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('constantExpr0')"><a name=
"constantExpr0Anchor">constantExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr
</a>>...
</td></tr>
1474 <tr><td colspan=
"4" class=
"doc" id=
"constantExpr0"><pre>Matches a constant expression wrapper.
1476 Example matches the constant in the case statement:
1477 (matcher = constantExpr())
1484 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('continueStmt0')"><a name=
"continueStmt0Anchor">continueStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt
</a>>...
</td></tr>
1485 <tr><td colspan=
"4" class=
"doc" id=
"continueStmt0"><pre>Matches continue statements.
1488 while (true) { continue; }
1494 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('convertVectorExpr0')"><a name=
"convertVectorExpr0Anchor">convertVectorExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ConvertVectorExpr.html">ConvertVectorExpr
</a>>...
</td></tr>
1495 <tr><td colspan=
"4" class=
"doc" id=
"convertVectorExpr0"><pre>Matches builtin function __builtin_convertvector.
1499 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('coreturnStmt0')"><a name=
"coreturnStmt0Anchor">coreturnStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CoreturnStmt.html">CoreturnStmt
</a>>...
</td></tr>
1500 <tr><td colspan=
"4" class=
"doc" id=
"coreturnStmt0"><pre>Matches co_return statements.
1503 while (true) { co_return; }
1509 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('coroutineBodyStmt0')"><a name=
"coroutineBodyStmt0Anchor">coroutineBodyStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CoroutineBodyStmt.html">CoroutineBodyStmt
</a>>...
</td></tr>
1510 <tr><td colspan=
"4" class=
"doc" id=
"coroutineBodyStmt0"><pre>Matches coroutine body statements.
1512 coroutineBodyStmt() matches the coroutine below
1513 generator
<int
> gen() {
1519 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('coyieldExpr0')"><a name=
"coyieldExpr0Anchor">coyieldExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CoyieldExpr.html">CoyieldExpr
</a>>...
</td></tr>
1520 <tr><td colspan=
"4" class=
"doc" id=
"coyieldExpr0"><pre>Matches co_yield expressions.
1525 matches 'co_yield
1'
1529 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cudaKernelCallExpr0')"><a name=
"cudaKernelCallExpr0Anchor">cudaKernelCallExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr
</a>>...
</td></tr>
1530 <tr><td colspan=
"4" class=
"doc" id=
"cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
1533 kernel
<<<i,j
>>>();
1537 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxBindTemporaryExpr0')"><a name=
"cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr
</a>>...
</td></tr>
1538 <tr><td colspan=
"4" class=
"doc" id=
"cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
1540 Example matches FunctionTakesString(GetStringByValue())
1541 (matcher = cxxBindTemporaryExpr())
1542 FunctionTakesString(GetStringByValue());
1543 FunctionTakesStringByPointer(GetStringPointer());
1547 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxBoolLiteral0')"><a name=
"cxxBoolLiteral0Anchor">cxxBoolLiteral
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr
</a>>...
</td></tr>
1548 <tr><td colspan=
"4" class=
"doc" id=
"cxxBoolLiteral0"><pre>Matches bool literals.
1550 Example matches true
1555 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxCatchStmt0')"><a name=
"cxxCatchStmt0Anchor">cxxCatchStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt
</a>>...
</td></tr>
1556 <tr><td colspan=
"4" class=
"doc" id=
"cxxCatchStmt0"><pre>Matches catch statements.
1558 try {} catch(int i) {}
1560 matches 'catch(int i)'
1564 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxConstCastExpr0')"><a name=
"cxxConstCastExpr0Anchor">cxxConstCastExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr
</a>>...
</td></tr>
1565 <tr><td colspan=
"4" class=
"doc" id=
"cxxConstCastExpr0"><pre>Matches a const_cast expression.
1567 Example: Matches const_cast
<int*
>(
&r) in
1569 const int
&r(n);
1570 int* p = const_cast
<int*
>(
&r);
1574 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxConstructExpr0')"><a name=
"cxxConstructExpr0Anchor">cxxConstructExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr
</a>>...
</td></tr>
1575 <tr><td colspan=
"4" class=
"doc" id=
"cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
1577 Example matches string(ptr, n) and ptr within arguments of f
1578 (matcher = cxxConstructExpr())
1579 void f(const string
&a, const string
&b);
1582 f(string(ptr, n), ptr);
1586 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxDefaultArgExpr0')"><a name=
"cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr
</a>>...
</td></tr>
1587 <tr><td colspan=
"4" class=
"doc" id=
"cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
1589 Example matches the CXXDefaultArgExpr placeholder inserted for the
1590 default value of the second parameter in the call expression f(
42)
1591 (matcher = cxxDefaultArgExpr())
1592 void f(int x, int y =
0);
1597 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxDeleteExpr0')"><a name=
"cxxDeleteExpr0Anchor">cxxDeleteExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr
</a>>...
</td></tr>
1598 <tr><td colspan=
"4" class=
"doc" id=
"cxxDeleteExpr0"><pre>Matches delete expressions.
1607 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxDependentScopeMemberExpr0')"><a name=
"cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr
</a>>...
</td></tr>
1608 <tr><td colspan=
"4" class=
"doc" id=
"cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
1609 resolved because the base expression or the member name was dependent.
1612 template
<class T
> void f() { T t; t.g(); }
1613 cxxDependentScopeMemberExpr()
1618 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxDynamicCastExpr0')"><a name=
"cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr
</a>>...
</td></tr>
1619 <tr><td colspan=
"4" class=
"doc" id=
"cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
1622 cxxDynamicCastExpr()
1624 dynamic_cast
<D*
>(
&b);
1626 struct B { virtual ~B() {} }; struct D : B {};
1628 D* p = dynamic_cast
<D*
>(
&b);
1632 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxFoldExpr0')"><a name=
"cxxFoldExpr0Anchor">cxxFoldExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>>...
</td></tr>
1633 <tr><td colspan=
"4" class=
"doc" id=
"cxxFoldExpr0"><pre>Matches C++
17 fold expressions.
1635 Example matches `(
0 + ... + args)`:
1636 template
<typename... Args
>
1637 auto sum(Args... args) {
1638 return (
0 + ... + args);
1643 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxForRangeStmt0')"><a name=
"cxxForRangeStmt0Anchor">cxxForRangeStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt
</a>>...
</td></tr>
1644 <tr><td colspan=
"4" class=
"doc" id=
"cxxForRangeStmt0"><pre>Matches range-based for statements.
1646 cxxForRangeStmt() matches 'for (auto a : i)'
1647 int i[] = {
1,
2,
3}; for (auto a : i);
1648 for(int j =
0; j
< 5; ++j);
1652 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxFunctionalCastExpr0')"><a name=
"cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr
</a>>...
</td></tr>
1653 <tr><td colspan=
"4" class=
"doc" id=
"cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
1655 Example: Matches Foo(bar);
1662 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxMemberCallExpr0')"><a name=
"cxxMemberCallExpr0Anchor">cxxMemberCallExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr
</a>>...
</td></tr>
1663 <tr><td colspan=
"4" class=
"doc" id=
"cxxMemberCallExpr0"><pre>Matches member call expressions.
1665 Example matches x.y()
1671 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxNewExpr0')"><a name=
"cxxNewExpr0Anchor">cxxNewExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr
</a>>...
</td></tr>
1672 <tr><td colspan=
"4" class=
"doc" id=
"cxxNewExpr0"><pre>Matches new expressions.
1681 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxNoexceptExpr0')"><a name=
"cxxNoexceptExpr0Anchor">cxxNoexceptExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr
</a>>...
</td></tr>
1682 <tr><td colspan=
"4" class=
"doc" id=
"cxxNoexceptExpr0"><pre>Matches noexcept expressions.
1686 bool b() noexcept(true);
1687 bool c() noexcept(false);
1688 bool d() noexcept(noexcept(a()));
1689 bool e = noexcept(b()) || noexcept(c());
1691 matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`.
1692 doesn't match the noexcept specifier in the declarations a, b, c or d.
1696 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxNullPtrLiteralExpr0')"><a name=
"cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr
</a>>...
</td></tr>
1697 <tr><td colspan=
"4" class=
"doc" id=
"cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
1701 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxOperatorCallExpr0')"><a name=
"cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr
</a>>...
</td></tr>
1702 <tr><td colspan=
"4" class=
"doc" id=
"cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
1704 Note that if an operator isn't overloaded, it won't match. Instead, use
1705 binaryOperator matcher.
1706 Currently it does not match operators such as new delete.
1707 FIXME: figure out why these do not match?
1709 Example matches both operator
<<((o
<< b), c) and operator
<<(o, b)
1710 (matcher = cxxOperatorCallExpr())
1711 ostream
&operator
<< (ostream
&out, int i) { };
1712 ostream
&o; int b =
1, c =
1;
1713 o
<< b
<< c;
1714 See also the binaryOperation() matcher for more-general matching of binary
1715 uses of this AST node.
1719 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxReinterpretCastExpr0')"><a name=
"cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr
</a>>...
</td></tr>
1720 <tr><td colspan=
"4" class=
"doc" id=
"cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
1722 Either the source expression or the destination type can be matched
1723 using has(), but hasDestinationType() is more specific and can be
1726 Example matches reinterpret_cast
<char*
>(
&p) in
1727 void* p = reinterpret_cast
<char*
>(
&p);
1731 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxRewrittenBinaryOperator0')"><a name=
"cxxRewrittenBinaryOperator0Anchor">cxxRewrittenBinaryOperator
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator
</a>>...
</td></tr>
1732 <tr><td colspan=
"4" class=
"doc" id=
"cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators
1734 Example matches use of
"<":
1735 #include
<compare
>
1736 struct HasSpaceshipMem {
1738 constexpr auto operator
<=
>(const HasSpaceshipMem
&) const = default;
1741 HasSpaceshipMem hs1, hs2;
1745 See also the binaryOperation() matcher for more-general matching
1750 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxStaticCastExpr0')"><a name=
"cxxStaticCastExpr0Anchor">cxxStaticCastExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr
</a>>...
</td></tr>
1751 <tr><td colspan=
"4" class=
"doc" id=
"cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
1753 See also: hasDestinationType
1754 See also: reinterpretCast
1759 static_cast
<long
>(
8)
1761 long eight(static_cast
<long
>(
8));
1765 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxStdInitializerListExpr0')"><a name=
"cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr
</a>>...
</td></tr>
1766 <tr><td colspan=
"4" class=
"doc" id=
"cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
1769 std::vector
<int
> a({
1,
2,
3 });
1770 std::vector
<int
> b = {
4,
5 };
1772 std::pair
<int, int
> d = {
8,
9 };
1773 cxxStdInitializerListExpr()
1774 matches
"{ 1, 2, 3 }" and
"{ 4, 5 }"
1778 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxTemporaryObjectExpr0')"><a name=
"cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr
</a>>...
</td></tr>
1779 <tr><td colspan=
"4" class=
"doc" id=
"cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N !=
1 arguments
1781 Example: Matches Foo(bar, bar)
1782 Foo h = Foo(bar, bar);
1786 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxThisExpr0')"><a name=
"cxxThisExpr0Anchor">cxxThisExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr
</a>>...
</td></tr>
1787 <tr><td colspan=
"4" class=
"doc" id=
"cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
1789 Example matches the implicit this expression in
"return i".
1790 (matcher = cxxThisExpr())
1793 int f() { return i; }
1798 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxThrowExpr0')"><a name=
"cxxThrowExpr0Anchor">cxxThrowExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr
</a>>...
</td></tr>
1799 <tr><td colspan=
"4" class=
"doc" id=
"cxxThrowExpr0"><pre>Matches throw expressions.
1801 try { throw
5; } catch(int i) {}
1807 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxTryStmt0')"><a name=
"cxxTryStmt0Anchor">cxxTryStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt
</a>>...
</td></tr>
1808 <tr><td colspan=
"4" class=
"doc" id=
"cxxTryStmt0"><pre>Matches try statements.
1810 try {} catch(int i) {}
1816 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('cxxUnresolvedConstructExpr0')"><a name=
"cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr
</a>>...
</td></tr>
1817 <tr><td colspan=
"4" class=
"doc" id=
"cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1819 Example matches T(t) in return statement of f
1820 (matcher = cxxUnresolvedConstructExpr())
1821 template
<typename T
>
1822 void f(const T
& t) { return T(t); }
1826 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('declRefExpr0')"><a name=
"declRefExpr0Anchor">declRefExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr
</a>>...
</td></tr>
1827 <tr><td colspan=
"4" class=
"doc" id=
"declRefExpr0"><pre>Matches expressions that refer to declarations.
1829 Example matches x in if (x)
1835 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('declStmt0')"><a name=
"declStmt0Anchor">declStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt
</a>>...
</td></tr>
1836 <tr><td colspan=
"4" class=
"doc" id=
"declStmt0"><pre>Matches declaration statements.
1845 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('defaultStmt0')"><a name=
"defaultStmt0Anchor">defaultStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt
</a>>...
</td></tr>
1846 <tr><td colspan=
"4" class=
"doc" id=
"defaultStmt0"><pre>Matches default statements inside switch statements.
1849 switch(a) { case
42: break; default: break; }
1855 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('dependentCoawaitExpr0')"><a name=
"dependentCoawaitExpr0Anchor">dependentCoawaitExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DependentCoawaitExpr.html">DependentCoawaitExpr
</a>>...
</td></tr>
1856 <tr><td colspan=
"4" class=
"doc" id=
"dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent
1860 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('designatedInitExpr0')"><a name=
"designatedInitExpr0Anchor">designatedInitExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr
</a>>...
</td></tr>
1861 <tr><td colspan=
"4" class=
"doc" id=
"designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99
6.7.8].
1863 Example: Matches { [
2].y =
1.0, [
0].x =
1.0 }
1864 point ptarray[
10] = { [
2].y =
1.0, [
0].x =
1.0 };
1868 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('doStmt0')"><a name=
"doStmt0Anchor">doStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt
</a>>...
</td></tr>
1869 <tr><td colspan=
"4" class=
"doc" id=
"doStmt0"><pre>Matches do statements.
1874 matches 'do {} while(true)'
1878 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('explicitCastExpr0')"><a name=
"explicitCastExpr0Anchor">explicitCastExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr
</a>>...
</td></tr>
1879 <tr><td colspan=
"4" class=
"doc" id=
"explicitCastExpr0"><pre>Matches explicit cast expressions.
1881 Matches any cast expression written in user code, whether it be a
1882 C-style cast, a functional-style cast, or a keyword cast.
1884 Does not match implicit conversions.
1886 Note: the name
"explicitCast" is chosen to match Clang's terminology, as
1887 Clang uses the term
"cast" to apply to implicit conversions as well as to
1888 actual cast expressions.
1890 See also: hasDestinationType.
1892 Example: matches all five of the casts in
1893 int((int)(reinterpret_cast
<int
>(static_cast
<int
>(const_cast
<int
>(
42)))))
1894 but does not match the implicit conversion in
1899 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('expr0')"><a name=
"expr0Anchor">expr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>>...
</td></tr>
1900 <tr><td colspan=
"4" class=
"doc" id=
"expr0"><pre>Matches expressions.
1907 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('exprWithCleanups0')"><a name=
"exprWithCleanups0Anchor">exprWithCleanups
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups
</a>>...
</td></tr>
1908 <tr><td colspan=
"4" class=
"doc" id=
"exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1909 of the sub-expression's evaluation.
1911 Example matches std::string()
1912 const std::string str = std::string();
1916 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('fixedPointLiteral0')"><a name=
"fixedPointLiteral0Anchor">fixedPointLiteral
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FixedPointLiteral.html">FixedPointLiteral
</a>>...
</td></tr>
1917 <tr><td colspan=
"4" class=
"doc" id=
"fixedPointLiteral0"><pre>Matches fixed point literals
1921 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('floatLiteral0')"><a name=
"floatLiteral0Anchor">floatLiteral
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral
</a>>...
</td></tr>
1922 <tr><td colspan=
"4" class=
"doc" id=
"floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
1923 1.0,
1.0f,
1.0L and
1e10.
1925 Does not match implicit conversions such as
1930 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('forStmt0')"><a name=
"forStmt0Anchor">forStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt
</a>>...
</td></tr>
1931 <tr><td colspan=
"4" class=
"doc" id=
"forStmt0"><pre>Matches for statements.
1933 Example matches 'for (;;) {}'
1935 int i[] = {
1,
2,
3}; for (auto a : i);
1939 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('genericSelectionExpr0')"><a name=
"genericSelectionExpr0Anchor">genericSelectionExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1GenericSelectionExpr.html">GenericSelectionExpr
</a>>...
</td></tr>
1940 <tr><td colspan=
"4" class=
"doc" id=
"genericSelectionExpr0"><pre>Matches C11 _Generic expression.
1944 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('gnuNullExpr0')"><a name=
"gnuNullExpr0Anchor">gnuNullExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr
</a>>...
</td></tr>
1945 <tr><td colspan=
"4" class=
"doc" id=
"gnuNullExpr0"><pre>Matches GNU __null expression.
1949 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('gotoStmt0')"><a name=
"gotoStmt0Anchor">gotoStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt
</a>>...
</td></tr>
1950 <tr><td colspan=
"4" class=
"doc" id=
"gotoStmt0"><pre>Matches goto statements.
1960 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('ifStmt0')"><a name=
"ifStmt0Anchor">ifStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt
</a>>...
</td></tr>
1961 <tr><td colspan=
"4" class=
"doc" id=
"ifStmt0"><pre>Matches if statements.
1963 Example matches 'if (x) {}'
1968 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('imaginaryLiteral0')"><a name=
"imaginaryLiteral0Anchor">imaginaryLiteral
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral
</a>>...
</td></tr>
1969 <tr><td colspan=
"4" class=
"doc" id=
"imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
1970 point literals e.g.:
1i,
1.0i
1974 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('implicitCastExpr0')"><a name=
"implicitCastExpr0Anchor">implicitCastExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr
</a>>...
</td></tr>
1975 <tr><td colspan=
"4" class=
"doc" id=
"implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1977 This matches many different places, including function call return value
1978 eliding, as well as any type conversions.
1982 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('implicitValueInitExpr0')"><a name=
"implicitValueInitExpr0Anchor">implicitValueInitExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr
</a>>...
</td></tr>
1983 <tr><td colspan=
"4" class=
"doc" id=
"implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1986 point ptarray[
10] = { [
2].y =
1.0, [
2].x =
2.0, [
0].x =
1.0 };
1987 implicitValueInitExpr()
1988 matches
"[0].y" (implicitly)
1992 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('initListExpr0')"><a name=
"initListExpr0Anchor">initListExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr
</a>>...
</td></tr>
1993 <tr><td colspan=
"4" class=
"doc" id=
"initListExpr0"><pre>Matches init list expressions.
1997 struct B { int x, y; };
2000 matches
"{ 1, 2 }" and
"{ 5, 6 }"
2004 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('integerLiteral0')"><a name=
"integerLiteral0Anchor">integerLiteral
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral
</a>>...
</td></tr>
2005 <tr><td colspan=
"4" class=
"doc" id=
"integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
2008 Does not match character-encoded integers such as L'a'.
2012 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('labelStmt0')"><a name=
"labelStmt0Anchor">labelStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt
</a>>...
</td></tr>
2013 <tr><td colspan=
"4" class=
"doc" id=
"labelStmt0"><pre>Matches label statements.
2023 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('lambdaExpr0')"><a name=
"lambdaExpr0Anchor">lambdaExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr
</a>>...
</td></tr>
2024 <tr><td colspan=
"4" class=
"doc" id=
"lambdaExpr0"><pre>Matches lambda expressions.
2026 Example matches [
&](){return
5;}
2027 [
&](){return
5;}
2031 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('materializeTemporaryExpr0')"><a name=
"materializeTemporaryExpr0Anchor">materializeTemporaryExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr
</a>>...
</td></tr>
2032 <tr><td colspan=
"4" class=
"doc" id=
"materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
2035 struct T {void func();};
2038 materializeTemporaryExpr() matches 'f()' in these statements
2047 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('memberExpr0')"><a name=
"memberExpr0Anchor">memberExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr
</a>>...
</td></tr>
2048 <tr><td colspan=
"4" class=
"doc" id=
"memberExpr0"><pre>Matches member expressions.
2052 void x() { this-
>x(); x(); Y y; y.x(); a; this-
>b; Y::b; }
2053 int a; static int b;
2056 matches this-
>x, x, y.x, a, this-
>b
2060 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('nullStmt0')"><a name=
"nullStmt0Anchor">nullStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt
</a>>...
</td></tr>
2061 <tr><td colspan=
"4" class=
"doc" id=
"nullStmt0"><pre>Matches null statements.
2065 matches the second ';'
2069 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('objcCatchStmt0')"><a name=
"objcCatchStmt0Anchor">objcCatchStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt
</a>>...
</td></tr>
2070 <tr><td colspan=
"4" class=
"doc" id=
"objcCatchStmt0"><pre>Matches Objective-C @catch statements.
2072 Example matches @catch
2078 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('objcFinallyStmt0')"><a name=
"objcFinallyStmt0Anchor">objcFinallyStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt
</a>>...
</td></tr>
2079 <tr><td colspan=
"4" class=
"doc" id=
"objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
2081 Example matches @finally
2087 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('objcIvarRefExpr0')"><a name=
"objcIvarRefExpr0Anchor">objcIvarRefExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr
</a>>...
</td></tr>
2088 <tr><td colspan=
"4" class=
"doc" id=
"objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
2090 Example: matches
"a" in
"init" method:
2100 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('objcMessageExpr0')"><a name=
"objcMessageExpr0Anchor">objcMessageExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr
</a>>...
</td></tr>
2101 <tr><td colspan=
"4" class=
"doc" id=
"objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
2103 The innermost message send invokes the
"alloc" class method on the
2104 NSString class, while the outermost message send invokes the
2105 "initWithString" instance method on the object returned from
2106 NSString's
"alloc". This matcher should match both message sends.
2107 [[NSString alloc] initWithString:@
"Hello"]
2111 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('objcStringLiteral0')"><a name=
"objcStringLiteral0Anchor">objcStringLiteral
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCStringLiteral.html">ObjCStringLiteral
</a>>...
</td></tr>
2112 <tr><td colspan=
"4" class=
"doc" id=
"objcStringLiteral0"><pre>Matches ObjectiveC String literal expressions.
2114 Example matches @
"abcd"
2115 NSString *s = @
"abcd";
2119 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('objcThrowStmt0')"><a name=
"objcThrowStmt0Anchor">objcThrowStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt
</a>>...
</td></tr>
2120 <tr><td colspan=
"4" class=
"doc" id=
"objcThrowStmt0"><pre>Matches Objective-C statements.
2122 Example matches @throw obj;
2126 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('objcTryStmt0')"><a name=
"objcTryStmt0Anchor">objcTryStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt
</a>>...
</td></tr>
2127 <tr><td colspan=
"4" class=
"doc" id=
"objcTryStmt0"><pre>Matches Objective-C @try statements.
2129 Example matches @try
2135 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('ompExecutableDirective0')"><a name=
"ompExecutableDirective0Anchor">ompExecutableDirective
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective
</a>>...
</td></tr>
2136 <tr><td colspan=
"4" class=
"doc" id=
"ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
2140 #pragma omp parallel
2141 #pragma omp parallel default(none)
2142 #pragma omp taskyield
2144 ``ompExecutableDirective()`` matches ``omp parallel``,
2145 ``omp parallel default(none)`` and ``omp taskyield``.
2149 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('opaqueValueExpr0')"><a name=
"opaqueValueExpr0Anchor">opaqueValueExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr
</a>>...
</td></tr>
2150 <tr><td colspan=
"4" class=
"doc" id=
"opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
2151 to reference another expressions and can be met
2152 in BinaryConditionalOperators, for example.
2159 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('parenExpr0')"><a name=
"parenExpr0Anchor">parenExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr
</a>>...
</td></tr>
2160 <tr><td colspan=
"4" class=
"doc" id=
"parenExpr0"><pre>Matches parentheses used in expressions.
2162 Example matches (foo() +
1)
2163 int foo() { return
1; }
2164 int a = (foo() +
1);
2168 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('parenListExpr0')"><a name=
"parenListExpr0Anchor">parenListExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr
</a>>...
</td></tr>
2169 <tr><td colspan=
"4" class=
"doc" id=
"parenListExpr0"><pre>Matches paren list expressions.
2170 ParenListExprs don't have a predefined type and are used for late parsing.
2171 In the final AST, they can be met in template declarations.
2174 template
<typename T
> class X {
2177 int a =
0, b =
1; int i = (a, b);
2180 parenListExpr() matches
"*this" but NOT matches (a, b) because (a, b)
2181 has a predefined type and is a ParenExpr, not a ParenListExpr.
2185 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('predefinedExpr0')"><a name=
"predefinedExpr0Anchor">predefinedExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr
</a>>...
</td></tr>
2186 <tr><td colspan=
"4" class=
"doc" id=
"predefinedExpr0"><pre>Matches predefined identifier expressions [C99
6.4.2.2].
2188 Example: Matches __func__
2189 printf(
"%s", __func__);
2193 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('returnStmt0')"><a name=
"returnStmt0Anchor">returnStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt
</a>>...
</td></tr>
2194 <tr><td colspan=
"4" class=
"doc" id=
"returnStmt0"><pre>Matches return statements.
2203 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('stmt0')"><a name=
"stmt0Anchor">stmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>>...
</td></tr>
2204 <tr><td colspan=
"4" class=
"doc" id=
"stmt0"><pre>Matches statements.
2209 matches both the compound statement '{ ++a; }' and '++a'.
2213 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('stmtExpr0')"><a name=
"stmtExpr0Anchor">stmtExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr
</a>>...
</td></tr>
2214 <tr><td colspan=
"4" class=
"doc" id=
"stmtExpr0"><pre>Matches statement expression (GNU extension).
2216 Example match: ({ int X =
4; X; })
2217 int C = ({ int X =
4; X; });
2221 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('stringLiteral0')"><a name=
"stringLiteral0Anchor">stringLiteral
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral
</a>>...
</td></tr>
2222 <tr><td colspan=
"4" class=
"doc" id=
"stringLiteral0"><pre>Matches string literals (also matches wide string literals).
2224 Example matches
"abcd", L
"abcd"
2226 wchar_t *ws = L
"abcd";
2230 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('substNonTypeTemplateParmExpr0')"><a name=
"substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr
</a>>...
</td></tr>
2231 <tr><td colspan=
"4" class=
"doc" id=
"substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
2234 template
<int N
>
2235 struct A { static const int n = N; };
2236 struct B : public A
<42> {};
2237 substNonTypeTemplateParmExpr()
2238 matches
"N" in the right-hand side of
"static const int n = N;"
2242 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('switchCase0')"><a name=
"switchCase0Anchor">switchCase
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase
</a>>...
</td></tr>
2243 <tr><td colspan=
"4" class=
"doc" id=
"switchCase0"><pre>Matches case and default statements inside switch statements.
2246 switch(a) { case
42: break; default: break; }
2248 matches 'case
42:' and 'default:'.
2252 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('switchStmt0')"><a name=
"switchStmt0Anchor">switchStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt
</a>>...
</td></tr>
2253 <tr><td colspan=
"4" class=
"doc" id=
"switchStmt0"><pre>Matches switch statements.
2256 switch(a) { case
42: break; default: break; }
2258 matches 'switch(a)'.
2262 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('unaryExprOrTypeTraitExpr0')"><a name=
"unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr
</a>>...
</td></tr>
2263 <tr><td colspan=
"4" class=
"doc" id=
"unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++
11) and vec_step (OpenCL)
2267 int y = sizeof(x) + alignof(x);
2268 unaryExprOrTypeTraitExpr()
2269 matches sizeof(x) and alignof(x)
2273 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('unaryOperator0')"><a name=
"unaryOperator0Anchor">unaryOperator
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator
</a>>...
</td></tr>
2274 <tr><td colspan=
"4" class=
"doc" id=
"unaryOperator0"><pre>Matches unary operator expressions.
2281 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('unresolvedLookupExpr0')"><a name=
"unresolvedLookupExpr0Anchor">unresolvedLookupExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr
</a>>...
</td></tr>
2282 <tr><td colspan=
"4" class=
"doc" id=
"unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
2283 but could not be resolved to a specific declaration.
2286 template
<typename T
>
2287 T foo() { T a; return a; }
2288 template
<typename T
>
2292 unresolvedLookupExpr()
2293 matches foo
<T
>()
</pre></td></tr>
2296 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('unresolvedMemberExpr0')"><a name=
"unresolvedMemberExpr0Anchor">unresolvedMemberExpr
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr
</a>>...
</td></tr>
2297 <tr><td colspan=
"4" class=
"doc" id=
"unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
2301 template
<class T
> void f();
2304 template
<class T
> void h() { X x; x.f
<T
>(); x.g(); }
2305 unresolvedMemberExpr()
2306 matches x.f
<T
>
2310 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('userDefinedLiteral0')"><a name=
"userDefinedLiteral0Anchor">userDefinedLiteral
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral
</a>>...
</td></tr>
2311 <tr><td colspan=
"4" class=
"doc" id=
"userDefinedLiteral0"><pre>Matches user defined literal operator call.
2313 Example match:
"foo"_suffix
2317 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>></td><td class=
"name" onclick=
"toggle('whileStmt0')"><a name=
"whileStmt0Anchor">whileStmt
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt
</a>>...
</td></tr>
2318 <tr><td colspan=
"4" class=
"doc" id=
"whileStmt0"><pre>Matches while statements.
2323 matches 'while (true) {}'.
2327 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc
</a>></td><td class=
"name" onclick=
"toggle('templateArgumentLoc0')"><a name=
"templateArgumentLoc0Anchor">templateArgumentLoc
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc
</a>>...
</td></tr>
2328 <tr><td colspan=
"4" class=
"doc" id=
"templateArgumentLoc0"><pre>Matches template arguments (with location info).
2331 template
<typename T
> struct C {};
2333 templateArgumentLoc()
2334 matches 'int' in C
<int
>.
2338 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument
</a>></td><td class=
"name" onclick=
"toggle('templateArgument0')"><a name=
"templateArgument0Anchor">templateArgument
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument
</a>>...
</td></tr>
2339 <tr><td colspan=
"4" class=
"doc" id=
"templateArgument0"><pre>Matches template arguments.
2342 template
<typename T
> struct C {};
2345 matches 'int' in C
<int
>.
2349 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName
</a>></td><td class=
"name" onclick=
"toggle('templateName0')"><a name=
"templateName0Anchor">templateName
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName
</a>>...
</td></tr>
2350 <tr><td colspan=
"4" class=
"doc" id=
"templateName0"><pre>Matches template name.
2353 template
<typename T
> class X { };
2356 matches 'X' in X
<int
>.
2360 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc
</a>></td><td class=
"name" onclick=
"toggle('elaboratedTypeLoc0')"><a name=
"elaboratedTypeLoc0Anchor">elaboratedTypeLoc
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html">ElaboratedTypeLoc
</a>>...
</td></tr>
2361 <tr><td colspan=
"4" class=
"doc" id=
"elaboratedTypeLoc0"><pre>Matches C or C++ elaborated `TypeLoc`s.
2367 matches the `TypeLoc` of the variable declaration of `ss`.
2371 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc
</a>></td><td class=
"name" onclick=
"toggle('pointerTypeLoc0')"><a name=
"pointerTypeLoc0Anchor">pointerTypeLoc
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc
</a>>...
</td></tr>
2372 <tr><td colspan=
"4" class=
"doc" id=
"pointerTypeLoc0"><pre>Matches pointer `TypeLoc`s.
2381 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc
</a>></td><td class=
"name" onclick=
"toggle('qualifiedTypeLoc0')"><a name=
"qualifiedTypeLoc0Anchor">qualifiedTypeLoc
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1QualifiedTypeLoc.html">QualifiedTypeLoc
</a>>...
</td></tr>
2382 <tr><td colspan=
"4" class=
"doc" id=
"qualifiedTypeLoc0"><pre>Matches `QualifiedTypeLoc`s in the clang AST.
2387 matches `const int`.
2391 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc
</a>></td><td class=
"name" onclick=
"toggle('referenceTypeLoc0')"><a name=
"referenceTypeLoc0Anchor">referenceTypeLoc
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc
</a>>...
</td></tr>
2392 <tr><td colspan=
"4" class=
"doc" id=
"referenceTypeLoc0"><pre>Matches reference `TypeLoc`s.
2397 int
&& r =
3;
2399 matches `int
&` and `int
&&`.
2403 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc
</a>></td><td class=
"name" onclick=
"toggle('templateSpecializationTypeLoc0')"><a name=
"templateSpecializationTypeLoc0Anchor">templateSpecializationTypeLoc
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc
</a>>...
</td></tr>
2404 <tr><td colspan=
"4" class=
"doc" id=
"templateSpecializationTypeLoc0"><pre>Matches template specialization `TypeLoc`s.
2407 template
<typename T
> class C {};
2409 varDecl(hasTypeLoc(templateSpecializationTypeLoc(typeLoc())))
2410 matches `C
<char
> var`.
2414 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc
</a>></td><td class=
"name" onclick=
"toggle('typeLoc0')"><a name=
"typeLoc0Anchor">typeLoc
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc
</a>>...
</td></tr>
2415 <tr><td colspan=
"4" class=
"doc" id=
"typeLoc0"><pre>Matches TypeLocs in the clang AST.
2419 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('arrayType0')"><a name=
"arrayType0Anchor">arrayType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType
</a>>...
</td></tr>
2420 <tr><td colspan=
"4" class=
"doc" id=
"arrayType0"><pre>Matches all kinds of arrays.
2425 void f() { int c[a[
0]]; }
2427 matches
"int a[]",
"int b[4]" and
"int c[a[0]]";
2431 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('atomicType0')"><a name=
"atomicType0Anchor">atomicType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType
</a>>...
</td></tr>
2432 <tr><td colspan=
"4" class=
"doc" id=
"atomicType0"><pre>Matches atomic types.
2437 matches
"_Atomic(int) i"
2441 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('autoType0')"><a name=
"autoType0Anchor">autoType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType
</a>>...
</td></tr>
2442 <tr><td colspan=
"4" class=
"doc" id=
"autoType0"><pre>Matches types nodes representing C++
11 auto types.
2447 for (auto i : v) { }
2449 matches
"auto n" and
"auto i"
2453 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('blockPointerType0')"><a name=
"blockPointerType0Anchor">blockPointerType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType
</a>>...
</td></tr>
2454 <tr><td colspan=
"4" class=
"doc" id=
"blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
2457 The pointee is always required to be a FunctionType.
2461 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('builtinType0')"><a name=
"builtinType0Anchor">builtinType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType
</a>>...
</td></tr>
2462 <tr><td colspan=
"4" class=
"doc" id=
"builtinType0"><pre>Matches builtin Types.
2471 matches
"int b",
"float c" and
"bool d"
2475 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('complexType0')"><a name=
"complexType0Anchor">complexType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType
</a>>...
</td></tr>
2476 <tr><td colspan=
"4" class=
"doc" id=
"complexType0"><pre>Matches C99 complex types.
2481 matches
"_Complex float f"
2485 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('constantArrayType0')"><a name=
"constantArrayType0Anchor">constantArrayType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType
</a>>...
</td></tr>
2486 <tr><td colspan=
"4" class=
"doc" id=
"constantArrayType0"><pre>Matches C arrays with a specified constant size.
2499 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('decayedType0')"><a name=
"decayedType0Anchor">decayedType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType
</a>>...
</td></tr>
2500 <tr><td colspan=
"4" class=
"doc" id=
"decayedType0"><pre>Matches decayed type
2501 Example matches i[] in declaration of f.
2502 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
2503 Example matches i[
1].
2504 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
2511 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('decltypeType0')"><a name=
"decltypeType0Anchor">decltypeType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType
</a>>...
</td></tr>
2512 <tr><td colspan=
"4" class=
"doc" id=
"decltypeType0"><pre>Matches types nodes representing C++
11 decltype(
<expr
>) types.
2517 decltype(i + j) result = i + j;
2519 matches
"decltype(i + j)"
2523 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('deducedTemplateSpecializationType0')"><a name=
"deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType
</a>>...
</td></tr>
2524 <tr><td colspan=
"4" class=
"doc" id=
"deducedTemplateSpecializationType0"><pre>Matches C++
17 deduced template specialization types, e.g. deduced class
2528 template
<typename T
>
2529 class C { public: C(T); };
2532 deducedTemplateSpecializationType() matches the type in the declaration
2537 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('dependentSizedArrayType0')"><a name=
"dependentSizedArrayType0Anchor">dependentSizedArrayType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType
</a>>...
</td></tr>
2538 <tr><td colspan=
"4" class=
"doc" id=
"dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
2541 template
<typename T, int Size
>
2545 dependentSizedArrayType()
2546 matches
"T data[Size]"
2550 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('dependentSizedExtVectorType0')"><a name=
"dependentSizedExtVectorType0Anchor">dependentSizedExtVectorType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DependentSizedExtVectorType.html">DependentSizedExtVectorType
</a>>...
</td></tr>
2551 <tr><td colspan=
"4" class=
"doc" id=
"dependentSizedExtVectorType0"><pre>Matches C++ extended vector type where either the type or size is
2555 template
<typename T, int Size
>
2557 typedef T __attribute__((ext_vector_type(Size))) type;
2559 dependentSizedExtVectorType()
2560 matches
"T __attribute__((ext_vector_type(Size)))"
2564 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('elaboratedType0')"><a name=
"elaboratedType0Anchor">elaboratedType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType
</a>>...
</td></tr>
2565 <tr><td colspan=
"4" class=
"doc" id=
"elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
2579 elaboratedType() matches the type of the variable declarations of both
2584 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('enumType0')"><a name=
"enumType0Anchor">enumType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType
</a>>...
</td></tr>
2585 <tr><td colspan=
"4" class=
"doc" id=
"enumType0"><pre>Matches enum types.
2589 enum class S { Red };
2594 enumType() matches the type of the variable declarations of both c and
2599 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('functionProtoType0')"><a name=
"functionProtoType0Anchor">functionProtoType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType
</a>>...
</td></tr>
2600 <tr><td colspan=
"4" class=
"doc" id=
"functionProtoType0"><pre>Matches FunctionProtoType nodes.
2606 matches
"int (*f)(int)" and the type of
"g" in C++ mode.
2607 In C mode,
"g" is not matched because it does not contain a prototype.
2611 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('functionType0')"><a name=
"functionType0Anchor">functionType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType
</a>>...
</td></tr>
2612 <tr><td colspan=
"4" class=
"doc" id=
"functionType0"><pre>Matches FunctionType nodes.
2618 matches
"int (*f)(int)" and the type of
"g".
2622 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('incompleteArrayType0')"><a name=
"incompleteArrayType0Anchor">incompleteArrayType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType
</a>>...
</td></tr>
2623 <tr><td colspan=
"4" class=
"doc" id=
"incompleteArrayType0"><pre>Matches C arrays with unspecified size.
2628 void f(int c[]) { int d[a[
0]]; };
2629 incompleteArrayType()
2630 matches
"int a[]" and
"int c[]"
2634 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('injectedClassNameType0')"><a name=
"injectedClassNameType0Anchor">injectedClassNameType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType
</a>>...
</td></tr>
2635 <tr><td colspan=
"4" class=
"doc" id=
"injectedClassNameType0"><pre>Matches injected class name types.
2637 Example matches S s, but not S
<T
> s.
2638 (matcher = parmVarDecl(hasType(injectedClassNameType())))
2639 template
<typename T
> struct S {
2641 void g(S
<T
> s);
2646 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('lValueReferenceType0')"><a name=
"lValueReferenceType0Anchor">lValueReferenceType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType
</a>>...
</td></tr>
2647 <tr><td colspan=
"4" class=
"doc" id=
"lValueReferenceType0"><pre>Matches lvalue reference types.
2652 int
&&c =
1;
2654 auto
&&e = c;
2655 auto
&&f =
2;
2658 lValueReferenceType() matches the types of b, d, and e. e is
2659 matched since the type is deduced as int
& by reference collapsing rules.
2663 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('macroQualifiedType0')"><a name=
"macroQualifiedType0Anchor">macroQualifiedType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1MacroQualifiedType.html">MacroQualifiedType
</a>>...
</td></tr>
2664 <tr><td colspan=
"4" class=
"doc" id=
"macroQualifiedType0"><pre>Matches qualified types when the qualifier is applied via a macro.
2667 #define CDECL __attribute__((cdecl))
2668 typedef void (CDECL *X)();
2669 typedef void (__attribute__((cdecl)) *Y)();
2670 macroQualifiedType()
2671 matches the type of the typedef declaration of X but not Y.
2675 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('memberPointerType0')"><a name=
"memberPointerType0Anchor">memberPointerType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType
</a>>...
</td></tr>
2676 <tr><td colspan=
"4" class=
"doc" id=
"memberPointerType0"><pre>Matches member pointer types.
2685 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('objcObjectPointerType0')"><a name=
"objcObjectPointerType0Anchor">objcObjectPointerType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType
</a>>...
</td></tr>
2686 <tr><td colspan=
"4" class=
"doc" id=
"objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
2687 a pointer type, despite being syntactically similar.
2696 matches
"Foo *f", but does not match
"int *a".
2700 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('parenType0')"><a name=
"parenType0Anchor">parenType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType
</a>>...
</td></tr>
2701 <tr><td colspan=
"4" class=
"doc" id=
"parenType0"><pre>Matches ParenType nodes.
2704 int (*ptr_to_array)[
4];
2705 int *array_of_ptrs[
4];
2707 varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
2712 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('pointerType0')"><a name=
"pointerType0Anchor">pointerType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType
</a>>...
</td></tr>
2713 <tr><td colspan=
"4" class=
"doc" id=
"pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
2725 matches
"int *a", but does not match
"Foo *f".
2729 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('rValueReferenceType0')"><a name=
"rValueReferenceType0Anchor">rValueReferenceType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType
</a>>...
</td></tr>
2730 <tr><td colspan=
"4" class=
"doc" id=
"rValueReferenceType0"><pre>Matches rvalue reference types.
2735 int
&&c =
1;
2737 auto
&&e = c;
2738 auto
&&f =
2;
2741 rValueReferenceType() matches the types of c and f. e is not
2742 matched as it is deduced to int
& by reference collapsing rules.
2746 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('recordType0')"><a name=
"recordType0Anchor">recordType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType
</a>>...
</td></tr>
2747 <tr><td colspan=
"4" class=
"doc" id=
"recordType0"><pre>Matches record types (e.g. structs, classes).
2756 recordType() matches the type of the variable declarations of both c
2761 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('referenceType0')"><a name=
"referenceType0Anchor">referenceType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType
</a>>...
</td></tr>
2762 <tr><td colspan=
"4" class=
"doc" id=
"referenceType0"><pre>Matches both lvalue and rvalue reference types.
2767 int
&&c =
1;
2769 auto
&&e = c;
2770 auto
&&f =
2;
2773 referenceType() matches the types of b, c, d, e, and f.
2777 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('substTemplateTypeParmType0')"><a name=
"substTemplateTypeParmType0Anchor">substTemplateTypeParmType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType
</a>>...
</td></tr>
2778 <tr><td colspan=
"4" class=
"doc" id=
"substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
2779 template type parameter.
2782 template
<typename T
>
2787 substTemplateTypeParmType() matches the type of 't' but not '
1'
2791 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('tagType0')"><a name=
"tagType0Anchor">tagType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType
</a>>...
</td></tr>
2792 <tr><td colspan=
"4" class=
"doc" id=
"tagType0"><pre>Matches tag types (record and enum types).
2801 tagType() matches the type of the variable declarations of both e
2806 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('templateSpecializationType0')"><a name=
"templateSpecializationType0Anchor">templateSpecializationType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType
</a>>...
</td></tr>
2807 <tr><td colspan=
"4" class=
"doc" id=
"templateSpecializationType0"><pre>Matches template specialization types.
2810 template
<typename T
>
2813 template class C
<int
>; // A
2814 C
<char
> var; // B
2816 templateSpecializationType() matches the type of the explicit
2817 instantiation in A and the type of the variable declaration in B.
2821 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('templateTypeParmType0')"><a name=
"templateTypeParmType0Anchor">templateTypeParmType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType
</a>>...
</td></tr>
2822 <tr><td colspan=
"4" class=
"doc" id=
"templateTypeParmType0"><pre>Matches template type parameter types.
2824 Example matches T, but not int.
2825 (matcher = templateTypeParmType())
2826 template
<typename T
> void f(int i);
2830 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('type0')"><a name=
"type0Anchor">type
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>>...
</td></tr>
2831 <tr><td colspan=
"4" class=
"doc" id=
"type0"><pre>Matches Types in the clang AST.
2835 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('typedefType0')"><a name=
"typedefType0Anchor">typedefType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType
</a>>...
</td></tr>
2836 <tr><td colspan=
"4" class=
"doc" id=
"typedefType0"><pre>Matches typedef types.
2841 matches
"typedef int X"
2845 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('unaryTransformType0')"><a name=
"unaryTransformType0Anchor">unaryTransformType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType
</a>>...
</td></tr>
2846 <tr><td colspan=
"4" class=
"doc" id=
"unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
2849 typedef __underlying_type(T) type;
2850 unaryTransformType()
2851 matches
"__underlying_type(T)"
2855 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('usingType0')"><a name=
"usingType0Anchor">usingType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType
</a>>...
</td></tr>
2856 <tr><td colspan=
"4" class=
"doc" id=
"usingType0"><pre>Matches types specified through a using declaration.
2859 namespace a { struct S {}; }
2863 usingType() matches the type of the variable declaration of s.
2867 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type
</a>></td><td class=
"name" onclick=
"toggle('variableArrayType0')"><a name=
"variableArrayType0Anchor">variableArrayType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType
</a>>...
</td></tr>
2868 <tr><td colspan=
"4" class=
"doc" id=
"variableArrayType0"><pre>Matches C arrays with a specified size that is not an
2869 integer-constant-expression.
2878 matches
"int c[a[0]]"
2881 <!--END_DECL_MATCHERS -->
2884 <!-- ======================================================================= -->
2885 <h2 id=
"narrowing-matchers">Narrowing Matchers
</h2>
2886 <!-- ======================================================================= -->
2888 <p>Narrowing matchers match certain attributes on the current node, thus
2889 narrowing down the set of nodes of the current type to match on.
</p>
2891 <p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
2892 which allow users to create more powerful match expressions.
</p>
2895 <tr style=
"text-align:left"><th>Return type
</th><th>Name
</th><th>Parameters
</th></tr>
2896 <!-- START_NARROWING_MATCHERS -->
2898 <tr><td>Matcher
<*
></td><td class=
"name" onclick=
"toggle('allOf0')"><a name=
"allOf0Anchor">allOf
</a></td><td>Matcher
<*
>, ..., Matcher
<*
></td></tr>
2899 <tr><td colspan=
"4" class=
"doc" id=
"allOf0"><pre>Matches if all given matchers match.
2901 Usable as: Any Matcher
2905 <tr><td>Matcher
<*
></td><td class=
"name" onclick=
"toggle('anyOf0')"><a name=
"anyOf0Anchor">anyOf
</a></td><td>Matcher
<*
>, ..., Matcher
<*
></td></tr>
2906 <tr><td colspan=
"4" class=
"doc" id=
"anyOf0"><pre>Matches if any of the given matchers matches.
2908 Usable as: Any Matcher
2912 <tr><td>Matcher
<*
></td><td class=
"name" onclick=
"toggle('anything0')"><a name=
"anything0Anchor">anything
</a></td><td></td></tr>
2913 <tr><td colspan=
"4" class=
"doc" id=
"anything0"><pre>Matches any node.
2915 Useful when another matcher requires a child matcher, but there's no
2916 additional constraint. This will often be used with an explicit conversion
2917 to an internal::Matcher
<> type such as TypeMatcher.
2919 Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
2920 "int* p" and
"void f()" in
2924 Usable as: Any Matcher
2928 <tr><td><em>unspecified
</em></td><td class=
"name" onclick=
"toggle('mapAnyOf0')"><a name=
"mapAnyOf0Anchor">mapAnyOf
</a></td><td>nodeMatcherFunction...
</td></tr>
2929 <tr><td colspan=
"4" class=
"doc" id=
"mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within
2935 mapAnyOf(ifStmt, forStmt).with(
2936 hasCondition(cxxBoolLiteralExpr(equals(true)))
2938 matches the if and the for. It is equivalent to:
2939 auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true)));
2941 ifStmt(trueCond).bind(
"trueCond"),
2942 forStmt(trueCond).bind(
"trueCond")
2945 The with() chain-call accepts zero or more matchers which are combined
2946 as-if with allOf() in each of the node matchers.
2947 Usable as: Any Matcher
2951 <tr><td>Matcher
<*
></td><td class=
"name" onclick=
"toggle('unless0')"><a name=
"unless0Anchor">unless
</a></td><td>Matcher
<*
></td></tr>
2952 <tr><td colspan=
"4" class=
"doc" id=
"unless0"><pre>Matches if the provided matcher does not match.
2954 Example matches Y (matcher = cxxRecordDecl(unless(hasName(
"X"))))
2958 Usable as: Any Matcher
2962 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr
</a>></td><td class=
"name" onclick=
"toggle('isImplicit1')"><a name=
"isImplicit1Anchor">isImplicit
</a></td><td></td></tr>
2963 <tr><td colspan=
"4" class=
"doc" id=
"isImplicit1"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
2964 implicit default/copy constructors).
2968 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator
</a>></td><td class=
"name" onclick=
"toggle('hasAnyOperatorName0')"><a name=
"hasAnyOperatorName0Anchor">hasAnyOperatorName
</a></td><td>StringRef, ..., StringRef
</td></tr>
2969 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the
2972 hasAnyOperatorName(
"+",
"-")
2974 anyOf(hasOperatorName(
"+"), hasOperatorName(
"-"))
2978 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator
</a>></td><td class=
"name" onclick=
"toggle('hasOperatorName0')"><a name=
"hasOperatorName0Anchor">hasOperatorName
</a></td><td>std::string Name
</td></tr>
2979 <tr><td colspan=
"4" class=
"doc" id=
"hasOperatorName0"><pre>Matches the operator Name of operator expressions and fold expressions
2982 Example matches a || b (matcher = binaryOperator(hasOperatorName(
"||")))
2985 Example matches `(
0 + ... + args)`
2986 (matcher = cxxFoldExpr(hasOperatorName(
"+")))
2987 template
<typename... Args
>
2988 auto sum(Args... args) {
2989 return (
0 + ... + args);
2994 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator
</a>></td><td class=
"name" onclick=
"toggle('isAssignmentOperator0')"><a name=
"isAssignmentOperator0Anchor">isAssignmentOperator
</a></td><td></td></tr>
2995 <tr><td colspan=
"4" class=
"doc" id=
"isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
2997 Example
1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3001 Example
2: matches s1 = s2
3002 (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3003 struct S { S
& operator=(const S
&); };
3004 void x() { S s1, s2; s1 = s2; }
3008 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator
</a>></td><td class=
"name" onclick=
"toggle('isComparisonOperator0')"><a name=
"isComparisonOperator0Anchor">isComparisonOperator
</a></td><td></td></tr>
3009 <tr><td colspan=
"4" class=
"doc" id=
"isComparisonOperator0"><pre>Matches comparison operators.
3011 Example
1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3015 Example
2: matches s1
< s2
3016 (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3017 struct S { bool operator
<(const S
& other); };
3018 void x(S s1, S s2) { bool b1 = s1
< s2; }
3022 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier
</a>></td><td class=
"name" onclick=
"toggle('isPrivate1')"><a name=
"isPrivate1Anchor">isPrivate
</a></td><td></td></tr>
3023 <tr><td colspan=
"4" class=
"doc" id=
"isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private
3030 private: int c; // fieldDecl(isPrivate()) matches 'c'
3034 struct Derived1 : private Base {}; // matches 'Base'
3035 class Derived2 : Base {}; // matches 'Base'
3039 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier
</a>></td><td class=
"name" onclick=
"toggle('isProtected1')"><a name=
"isProtected1Anchor">isProtected
</a></td><td></td></tr>
3040 <tr><td colspan=
"4" class=
"doc" id=
"isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify
3041 protected inheritance.
3046 protected: int b; // fieldDecl(isProtected()) matches 'b'
3051 class Derived : protected Base {}; // matches 'Base'
3055 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier
</a>></td><td class=
"name" onclick=
"toggle('isPublic1')"><a name=
"isPublic1Anchor">isPublic
</a></td><td></td></tr>
3056 <tr><td colspan=
"4" class=
"doc" id=
"isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public
3061 public: int a; // fieldDecl(isPublic()) matches 'a'
3067 class Derived1 : public Base {}; // matches 'Base'
3068 struct Derived2 : Base {}; // matches 'Base'
3072 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier
</a>></td><td class=
"name" onclick=
"toggle('isVirtual1')"><a name=
"isVirtual1Anchor">isVirtual
</a></td><td></td></tr>
3073 <tr><td colspan=
"4" class=
"doc" id=
"isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify
3074 virtual inheritance.
3079 virtual void x(); // matches x
3084 class DirectlyDerived : virtual Base {}; // matches Base
3085 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
3087 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier
</a>>
3091 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr
</a>></td><td class=
"name" onclick=
"toggle('equals5')"><a name=
"equals5Anchor">equals
</a></td><td>bool Value
</td></tr>
3092 <tr><td colspan=
"4" class=
"doc" id=
"equals5"><pre></pre></td></tr>
3095 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr
</a>></td><td class=
"name" onclick=
"toggle('equals2')"><a name=
"equals2Anchor">equals
</a></td><td>const ValueT Value
</td></tr>
3096 <tr><td colspan=
"4" class=
"doc" id=
"equals2"><pre>Matches literals that are equal to the given value of type ValueT.
3099 f('false,
3.14,
42);
3100 characterLiteral(equals(
0))
3101 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(
0))
3103 floatLiteral(equals(
3.14)) and floatLiteral(equals(
314e-2))
3105 integerLiteral(equals(
42))
3108 Note that you cannot directly match a negative numeric literal because the
3109 minus sign is not part of the literal: It is a unary operator whose operand
3110 is the positive numeric literal. Instead, you must use a unaryOperator()
3111 matcher to match the minus sign:
3113 unaryOperator(hasOperatorName(
"-"),
3114 hasUnaryOperand(integerLiteral(equals(
13))))
3116 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr
</a>>,
3117 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral
</a>>
3121 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr
</a>></td><td class=
"name" onclick=
"toggle('equals11')"><a name=
"equals11Anchor">equals
</a></td><td>double Value
</td></tr>
3122 <tr><td colspan=
"4" class=
"doc" id=
"equals11"><pre></pre></td></tr>
3125 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr
</a>></td><td class=
"name" onclick=
"toggle('equals8')"><a name=
"equals8Anchor">equals
</a></td><td>unsigned Value
</td></tr>
3126 <tr><td colspan=
"4" class=
"doc" id=
"equals8"><pre></pre></td></tr>
3129 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt
</a>></td><td class=
"name" onclick=
"toggle('isCatchAll0')"><a name=
"isCatchAll0Anchor">isCatchAll
</a></td><td></td></tr>
3130 <tr><td colspan=
"4" class=
"doc" id=
"isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
3140 cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
3144 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr
</a>></td><td class=
"name" onclick=
"toggle('argumentCountAtLeast1')"><a name=
"argumentCountAtLeast1Anchor">argumentCountAtLeast
</a></td><td>unsigned N
</td></tr>
3145 <tr><td colspan=
"4" class=
"doc" id=
"argumentCountAtLeast1"><pre>Checks that a call expression or a constructor call expression has at least
3146 the specified number of arguments (including absent default arguments).
3148 Example matches f(
0,
0) and g(
0,
0,
0)
3149 (matcher = callExpr(argumentCountAtLeast(
2)))
3150 void f(int x, int y);
3151 void g(int x, int y, int z);
3157 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr
</a>></td><td class=
"name" onclick=
"toggle('argumentCountIs1')"><a name=
"argumentCountIs1Anchor">argumentCountIs
</a></td><td>unsigned N
</td></tr>
3158 <tr><td colspan=
"4" class=
"doc" id=
"argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
3159 a specific number of arguments (including absent default arguments).
3161 Example matches f(
0,
0) (matcher = callExpr(argumentCountIs(
2)))
3162 void f(int x, int y);
3167 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr
</a>></td><td class=
"name" onclick=
"toggle('isListInitialization0')"><a name=
"isListInitialization0Anchor">isListInitialization
</a></td><td></td></tr>
3168 <tr><td colspan=
"4" class=
"doc" id=
"isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
3172 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr
</a>></td><td class=
"name" onclick=
"toggle('requiresZeroInitialization0')"><a name=
"requiresZeroInitialization0Anchor">requiresZeroInitialization
</a></td><td></td></tr>
3173 <tr><td colspan=
"4" class=
"doc" id=
"requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
3174 zero initialization.
3178 struct point { double x; double y; };
3179 point pt[
2] = { {
1.0,
2.0 } };
3181 initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
3182 will match the implicit array filler for pt[
1].
3186 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl
</a>></td><td class=
"name" onclick=
"toggle('isCopyConstructor0')"><a name=
"isCopyConstructor0Anchor">isCopyConstructor
</a></td><td></td></tr>
3187 <tr><td colspan=
"4" class=
"doc" id=
"isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
3192 S(const S
&); // #
2
3193 S(S
&&); // #
3
3195 cxxConstructorDecl(isCopyConstructor()) will match #
2, but not #
1 or #
3.
3199 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl
</a>></td><td class=
"name" onclick=
"toggle('isDefaultConstructor0')"><a name=
"isDefaultConstructor0Anchor">isDefaultConstructor
</a></td><td></td></tr>
3200 <tr><td colspan=
"4" class=
"doc" id=
"isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
3205 S(const S
&); // #
2
3206 S(S
&&); // #
3
3208 cxxConstructorDecl(isDefaultConstructor()) will match #
1, but not #
2 or #
3.
3212 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl
</a>></td><td class=
"name" onclick=
"toggle('isDelegatingConstructor0')"><a name=
"isDelegatingConstructor0Anchor">isDelegatingConstructor
</a></td><td></td></tr>
3213 <tr><td colspan=
"4" class=
"doc" id=
"isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
3219 S(S
&&) : S() {} // #
3
3221 S::S() : S(
0) {} // #
4
3222 cxxConstructorDecl(isDelegatingConstructor()) will match #
3 and #
4, but not
3227 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl
</a>></td><td class=
"name" onclick=
"toggle('isExplicit0')"><a name=
"isExplicit0Anchor">isExplicit
</a></td><td></td></tr>
3228 <tr><td colspan=
"4" class=
"doc" id=
"isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
3229 that have an explicit specifier if this explicit specifier is resolved to
3233 template
<bool b
>
3236 explicit S(double); // #
2
3237 operator int(); // #
3
3238 explicit operator bool(); // #
4
3239 explicit(false) S(bool) // #
7
3240 explicit(true) S(char) // #
8
3241 explicit(b) S(S) // #
9
3243 S(int) -
> S
<true
> // #
5
3244 explicit S(double) -
> S
<false
> // #
6
3245 cxxConstructorDecl(isExplicit()) will match #
2 and #
8, but not #
1, #
7 or #
9.
3246 cxxConversionDecl(isExplicit()) will match #
4, but not #
3.
3247 cxxDeductionGuideDecl(isExplicit()) will match #
6, but not #
5.
3251 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl
</a>></td><td class=
"name" onclick=
"toggle('isInheritingConstructor0')"><a name=
"isInheritingConstructor0Anchor">isInheritingConstructor
</a></td><td></td></tr>
3252 <tr><td colspan=
"4" class=
"doc" id=
"isInheritingConstructor0"><pre></pre></td></tr>
3255 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl
</a>></td><td class=
"name" onclick=
"toggle('isMoveConstructor0')"><a name=
"isMoveConstructor0Anchor">isMoveConstructor
</a></td><td></td></tr>
3256 <tr><td colspan=
"4" class=
"doc" id=
"isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
3261 S(const S
&); // #
2
3262 S(S
&&); // #
3
3264 cxxConstructorDecl(isMoveConstructor()) will match #
3, but not #
1 or #
2.
3268 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl
</a>></td><td class=
"name" onclick=
"toggle('isExplicit1')"><a name=
"isExplicit1Anchor">isExplicit
</a></td><td></td></tr>
3269 <tr><td colspan=
"4" class=
"doc" id=
"isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
3270 that have an explicit specifier if this explicit specifier is resolved to
3274 template
<bool b
>
3277 explicit S(double); // #
2
3278 operator int(); // #
3
3279 explicit operator bool(); // #
4
3280 explicit(false) S(bool) // #
7
3281 explicit(true) S(char) // #
8
3282 explicit(b) S(S) // #
9
3284 S(int) -
> S
<true
> // #
5
3285 explicit S(double) -
> S
<false
> // #
6
3286 cxxConstructorDecl(isExplicit()) will match #
2 and #
8, but not #
1, #
7 or #
9.
3287 cxxConversionDecl(isExplicit()) will match #
4, but not #
3.
3288 cxxDeductionGuideDecl(isExplicit()) will match #
6, but not #
5.
3292 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer
</a>></td><td class=
"name" onclick=
"toggle('isBaseInitializer0')"><a name=
"isBaseInitializer0Anchor">isBaseInitializer
</a></td><td></td></tr>
3293 <tr><td colspan=
"4" class=
"doc" id=
"isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
3294 opposed to a member.
3305 cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
3306 will match E(), but not match D(int).
3310 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer
</a>></td><td class=
"name" onclick=
"toggle('isMemberInitializer0')"><a name=
"isMemberInitializer0Anchor">isMemberInitializer
</a></td><td></td></tr>
3311 <tr><td colspan=
"4" class=
"doc" id=
"isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
3323 cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
3324 will match D(int), but not match E().
3328 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer
</a>></td><td class=
"name" onclick=
"toggle('isWritten0')"><a name=
"isWritten0Anchor">isWritten
</a></td><td></td></tr>
3329 <tr><td colspan=
"4" class=
"doc" id=
"isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
3330 code (as opposed to implicitly added by the compiler).
3335 Foo(int) : foo_(
"A") { }
3338 cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
3339 will match Foo(int), but not Foo()
3343 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl
</a>></td><td class=
"name" onclick=
"toggle('isExplicit2')"><a name=
"isExplicit2Anchor">isExplicit
</a></td><td></td></tr>
3344 <tr><td colspan=
"4" class=
"doc" id=
"isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
3345 that have an explicit specifier if this explicit specifier is resolved to
3349 template
<bool b
>
3352 explicit S(double); // #
2
3353 operator int(); // #
3
3354 explicit operator bool(); // #
4
3355 explicit(false) S(bool) // #
7
3356 explicit(true) S(char) // #
8
3357 explicit(b) S(S) // #
9
3359 S(int) -
> S
<true
> // #
5
3360 explicit S(double) -
> S
<false
> // #
6
3361 cxxConstructorDecl(isExplicit()) will match #
2 and #
8, but not #
1, #
7 or #
9.
3362 cxxConversionDecl(isExplicit()) will match #
4, but not #
3.
3363 cxxDeductionGuideDecl(isExplicit()) will match #
6, but not #
5.
3367 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr
</a>></td><td class=
"name" onclick=
"toggle('hasMemberName0')"><a name=
"hasMemberName0Anchor">hasMemberName
</a></td><td>std::string N
</td></tr>
3368 <tr><td colspan=
"4" class=
"doc" id=
"hasMemberName0"><pre>Matches template-dependent, but known, member names.
3370 In template declarations, dependent members are not resolved and so can
3371 not be matched to particular named declarations.
3373 This matcher allows to match on the known name of members.
3376 template
<typename T
>
3380 template
<typename T
>
3385 cxxDependentScopeMemberExpr(hasMemberName(
"mem")) matches `s.mem()`
3389 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr
</a>></td><td class=
"name" onclick=
"toggle('isArrow2')"><a name=
"isArrow2Anchor">isArrow
</a></td><td></td></tr>
3390 <tr><td colspan=
"4" class=
"doc" id=
"isArrow2"><pre>Matches member expressions that are called with '-
>' as opposed
3393 Member calls on the implicit this pointer match as called with '-
>'.
3397 void x() { this-
>x(); x(); Y y; y.x(); a; this-
>b; Y::b; }
3398 template
<class T
> void f() { this-
>f
<T
>(); f
<T
>(); }
3402 template
<class T
>
3404 void x() { this-
>m; }
3406 memberExpr(isArrow())
3407 matches this-
>x, x, y.x, a, this-
>b
3408 cxxDependentScopeMemberExpr(isArrow())
3410 unresolvedMemberExpr(isArrow())
3411 matches this-
>f
<T
>, f
<T
>
3415 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr
</a>></td><td class=
"name" onclick=
"toggle('memberHasSameNameAsBoundNode0')"><a name=
"memberHasSameNameAsBoundNode0Anchor">memberHasSameNameAsBoundNode
</a></td><td>std::string BindingID
</td></tr>
3416 <tr><td colspan=
"4" class=
"doc" id=
"memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound
3419 In template declarations, dependent members are not resolved and so can
3420 not be matched to particular named declarations.
3422 This matcher allows to match on the name of already-bound VarDecl, FieldDecl
3423 and CXXMethodDecl nodes.
3426 template
<typename T
>
3430 template
<typename T
>
3437 cxxDependentScopeMemberExpr(
3438 hasObjectExpression(declRefExpr(hasType(templateSpecializationType(
3439 hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has(
3440 cxxMethodDecl(hasName(
"mem")).bind(
"templMem")
3443 memberHasSameNameAsBoundNode(
"templMem")
3446 first matches and binds the @c mem member of the @c S template, then
3447 compares its name to the usage in @c s.mem() in the @c x function template
3451 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('hasOperatorName3')"><a name=
"hasOperatorName3Anchor">hasOperatorName
</a></td><td>std::string Name
</td></tr>
3452 <tr><td colspan=
"4" class=
"doc" id=
"hasOperatorName3"><pre>Matches the operator Name of operator expressions and fold expressions
3455 Example matches a || b (matcher = binaryOperator(hasOperatorName(
"||")))
3458 Example matches `(
0 + ... + args)`
3459 (matcher = cxxFoldExpr(hasOperatorName(
"+")))
3460 template
<typename... Args
>
3461 auto sum(Args... args) {
3462 return (
0 + ... + args);
3467 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('isBinaryFold0')"><a name=
"isBinaryFold0Anchor">isBinaryFold
</a></td><td></td></tr>
3468 <tr><td colspan=
"4" class=
"doc" id=
"isBinaryFold0"><pre>Matches binary fold expressions, i.e. fold expressions with an initializer.
3470 Example matches `(
0 + ... + args)`
3471 (matcher = cxxFoldExpr(isBinaryFold()))
3472 template
<typename... Args
>
3473 auto sum(Args... args) {
3474 return (
0 + ... + args);
3477 template
<typename... Args
>
3478 auto multiply(Args... args) {
3479 return (args * ...);
3484 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('isLeftFold0')"><a name=
"isLeftFold0Anchor">isLeftFold
</a></td><td></td></tr>
3485 <tr><td colspan=
"4" class=
"doc" id=
"isLeftFold0"><pre>Matches left-folding fold expressions.
3487 Example matches `(
0 + ... + args)`
3488 (matcher = cxxFoldExpr(isLeftFold()))
3489 template
<typename... Args
>
3490 auto sum(Args... args) {
3491 return (
0 + ... + args);
3494 template
<typename... Args
>
3495 auto multiply(Args... args) {
3496 return (args * ... *
1);
3501 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('isRightFold0')"><a name=
"isRightFold0Anchor">isRightFold
</a></td><td></td></tr>
3502 <tr><td colspan=
"4" class=
"doc" id=
"isRightFold0"><pre>Matches right-folding fold expressions.
3504 Example matches `(args * ... *
1)`
3505 (matcher = cxxFoldExpr(isRightFold()))
3506 template
<typename... Args
>
3507 auto sum(Args... args) {
3508 return (
0 + ... + args);
3511 template
<typename... Args
>
3512 auto multiply(Args... args) {
3513 return (args * ... *
1);
3518 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('isUnaryFold0')"><a name=
"isUnaryFold0Anchor">isUnaryFold
</a></td><td></td></tr>
3519 <tr><td colspan=
"4" class=
"doc" id=
"isUnaryFold0"><pre>Matches unary fold expressions, i.e. fold expressions without an
3522 Example matches `(args * ...)`
3523 (matcher = cxxFoldExpr(isUnaryFold()))
3524 template
<typename... Args
>
3525 auto sum(Args... args) {
3526 return (
0 + ... + args);
3529 template
<typename... Args
>
3530 auto multiply(Args... args) {
3531 return (args * ...);
3536 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl
</a>></td><td class=
"name" onclick=
"toggle('isConst0')"><a name=
"isConst0Anchor">isConst
</a></td><td></td></tr>
3537 <tr><td colspan=
"4" class=
"doc" id=
"isConst0"><pre>Matches if the given method declaration is const.
3545 cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
3549 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl
</a>></td><td class=
"name" onclick=
"toggle('isCopyAssignmentOperator0')"><a name=
"isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator
</a></td><td></td></tr>
3550 <tr><td colspan=
"4" class=
"doc" id=
"isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
3555 A
&operator=(const A
&);
3556 A
&operator=(A
&&);
3559 cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
3564 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl
</a>></td><td class=
"name" onclick=
"toggle('isExplicitObjectMemberFunction0')"><a name=
"isExplicitObjectMemberFunction0Anchor">isExplicitObjectMemberFunction
</a></td><td></td></tr>
3565 <tr><td colspan=
"4" class=
"doc" id=
"isExplicitObjectMemberFunction0"><pre>Matches if the given method declaration declares a member function with an
3566 explicit object parameter.
3570 int operator-(this A, int);
3571 void fun(this A
&&self);
3572 static int operator()(int);
3576 cxxMethodDecl(isExplicitObjectMemberFunction()) matches the first two
3577 methods but not the last two.
3581 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl
</a>></td><td class=
"name" onclick=
"toggle('isFinal1')"><a name=
"isFinal1Anchor">isFinal
</a></td><td></td></tr>
3582 <tr><td colspan=
"4" class=
"doc" id=
"isFinal1"><pre>Matches if the given method or class declaration is final.
3594 matches A and C::f, but not B, C, or B::f
3598 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl
</a>></td><td class=
"name" onclick=
"toggle('isMoveAssignmentOperator0')"><a name=
"isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator
</a></td><td></td></tr>
3599 <tr><td colspan=
"4" class=
"doc" id=
"isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
3604 A
&operator=(const A
&);
3605 A
&operator=(A
&&);
3608 cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
3613 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl
</a>></td><td class=
"name" onclick=
"toggle('isOverride0')"><a name=
"isOverride0Anchor">isOverride
</a></td><td></td></tr>
3614 <tr><td colspan=
"4" class=
"doc" id=
"isOverride0"><pre>Matches if the given method declaration overrides another method.
3621 class B : public A {
3629 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl
</a>></td><td class=
"name" onclick=
"toggle('isPure0')"><a name=
"isPure0Anchor">isPure
</a></td><td></td></tr>
3630 <tr><td colspan=
"4" class=
"doc" id=
"isPure0"><pre>Matches if the given method declaration is pure.
3635 virtual void x() =
0;
3641 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl
</a>></td><td class=
"name" onclick=
"toggle('isUserProvided0')"><a name=
"isUserProvided0Anchor">isUserProvided
</a></td><td></td></tr>
3642 <tr><td colspan=
"4" class=
"doc" id=
"isUserProvided0"><pre>Matches method declarations that are user-provided.
3647 S(const S
&) = default; // #
2
3648 S(S
&&) = delete; // #
3
3650 cxxConstructorDecl(isUserProvided()) will match #
1, but not #
2 or #
3.
3654 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl
</a>></td><td class=
"name" onclick=
"toggle('isVirtual0')"><a name=
"isVirtual0Anchor">isVirtual
</a></td><td></td></tr>
3655 <tr><td colspan=
"4" class=
"doc" id=
"isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify
3656 virtual inheritance.
3661 virtual void x(); // matches x
3666 class DirectlyDerived : virtual Base {}; // matches Base
3667 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
3669 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier
</a>>
3673 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl
</a>></td><td class=
"name" onclick=
"toggle('isVirtualAsWritten0')"><a name=
"isVirtualAsWritten0Anchor">isVirtualAsWritten
</a></td><td></td></tr>
3674 <tr><td colspan=
"4" class=
"doc" id=
"isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit
"virtual".
3681 class B : public A {
3685 matches A::x but not B::x
3689 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr
</a>></td><td class=
"name" onclick=
"toggle('isArray0')"><a name=
"isArray0Anchor">isArray
</a></td><td></td></tr>
3690 <tr><td colspan=
"4" class=
"doc" id=
"isArray0"><pre>Matches array new expressions.
3693 MyClass *p1 = new MyClass[
10];
3694 cxxNewExpr(isArray())
3695 matches the expression 'new MyClass[
10]'.
3699 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr
</a>></td><td class=
"name" onclick=
"toggle('hasAnyOperatorName1')"><a name=
"hasAnyOperatorName1Anchor">hasAnyOperatorName
</a></td><td>StringRef, ..., StringRef
</td></tr>
3700 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the
3703 hasAnyOperatorName(
"+",
"-")
3705 anyOf(hasOperatorName(
"+"), hasOperatorName(
"-"))
3709 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr
</a>></td><td class=
"name" onclick=
"toggle('hasAnyOverloadedOperatorName0')"><a name=
"hasAnyOverloadedOperatorName0Anchor">hasAnyOverloadedOperatorName
</a></td><td>StringRef, ..., StringRef
</td></tr>
3710 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names.
3712 Matches overloaded operator names specified in strings without the
3713 "operator" prefix: e.g.
"<<".
3715 hasAnyOverloadedOperatorName(
"+",
"-")
3717 anyOf(hasOverloadedOperatorName(
"+"), hasOverloadedOperatorName(
"-"))
3721 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr
</a>></td><td class=
"name" onclick=
"toggle('hasOperatorName1')"><a name=
"hasOperatorName1Anchor">hasOperatorName
</a></td><td>std::string Name
</td></tr>
3722 <tr><td colspan=
"4" class=
"doc" id=
"hasOperatorName1"><pre>Matches the operator Name of operator expressions and fold expressions
3725 Example matches a || b (matcher = binaryOperator(hasOperatorName(
"||")))
3728 Example matches `(
0 + ... + args)`
3729 (matcher = cxxFoldExpr(hasOperatorName(
"+")))
3730 template
<typename... Args
>
3731 auto sum(Args... args) {
3732 return (
0 + ... + args);
3737 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr
</a>></td><td class=
"name" onclick=
"toggle('hasOverloadedOperatorName1')"><a name=
"hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName
</a></td><td>StringRef Name
</td></tr>
3738 <tr><td colspan=
"4" class=
"doc" id=
"hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
3740 Matches overloaded operator names specified in strings without the
3741 "operator" prefix: e.g.
"<<".
3744 class A { int operator*(); };
3745 const A
&operator
<<(const A
&a, const A
&b);
3747 a
<< a; //
<-- This matches
3749 cxxOperatorCallExpr(hasOverloadedOperatorName(
"<<"))) matches the
3751 cxxRecordDecl(hasMethod(hasOverloadedOperatorName(
"*")))
3752 matches the declaration of A.
3754 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>>
3758 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr
</a>></td><td class=
"name" onclick=
"toggle('isAssignmentOperator1')"><a name=
"isAssignmentOperator1Anchor">isAssignmentOperator
</a></td><td></td></tr>
3759 <tr><td colspan=
"4" class=
"doc" id=
"isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
3761 Example
1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3765 Example
2: matches s1 = s2
3766 (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3767 struct S { S
& operator=(const S
&); };
3768 void x() { S s1, s2; s1 = s2; }
3772 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr
</a>></td><td class=
"name" onclick=
"toggle('isComparisonOperator1')"><a name=
"isComparisonOperator1Anchor">isComparisonOperator
</a></td><td></td></tr>
3773 <tr><td colspan=
"4" class=
"doc" id=
"isComparisonOperator1"><pre>Matches comparison operators.
3775 Example
1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3779 Example
2: matches s1
< s2
3780 (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3781 struct S { bool operator
<(const S
& other); };
3782 void x(S s1, S s2) { bool b1 = s1
< s2; }
3786 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>></td><td class=
"name" onclick=
"toggle('hasDefinition0')"><a name=
"hasDefinition0Anchor">hasDefinition
</a></td><td></td></tr>
3787 <tr><td colspan=
"4" class=
"doc" id=
"hasDefinition0"><pre>Matches a class declaration that is defined.
3789 Example matches x (matcher = cxxRecordDecl(hasDefinition()))
3795 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>></td><td class=
"name" onclick=
"toggle('isDerivedFrom2')"><a name=
"isDerivedFrom2Anchor">isDerivedFrom
</a></td><td>std::string BaseName
</td></tr>
3796 <tr><td colspan=
"4" class=
"doc" id=
"isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
3800 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>></td><td class=
"name" onclick=
"toggle('isDirectlyDerivedFrom2')"><a name=
"isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom
</a></td><td>std::string BaseName
</td></tr>
3801 <tr><td colspan=
"4" class=
"doc" id=
"isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
3805 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>></td><td class=
"name" onclick=
"toggle('isExplicitTemplateSpecialization2')"><a name=
"isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization
</a></td><td></td></tr>
3806 <tr><td colspan=
"4" class=
"doc" id=
"isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
3807 static member variable template instantiations.
3810 template
<typename T
> void A(T t) { }
3811 template
<> void A(int N) { }
3812 functionDecl(isExplicitTemplateSpecialization())
3813 matches the specialization A
<int
>().
3815 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>>
3819 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>></td><td class=
"name" onclick=
"toggle('isFinal0')"><a name=
"isFinal0Anchor">isFinal
</a></td><td></td></tr>
3820 <tr><td colspan=
"4" class=
"doc" id=
"isFinal0"><pre>Matches if the given method or class declaration is final.
3832 matches A and C::f, but not B, C, or B::f
3836 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>></td><td class=
"name" onclick=
"toggle('isLambda0')"><a name=
"isLambda0Anchor">isLambda
</a></td><td></td></tr>
3837 <tr><td colspan=
"4" class=
"doc" id=
"isLambda0"><pre>Matches the generated class of lambda expressions.
3842 cxxRecordDecl(isLambda()) matches the implicit class declaration of
3847 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>></td><td class=
"name" onclick=
"toggle('isSameOrDerivedFrom2')"><a name=
"isSameOrDerivedFrom2Anchor">isSameOrDerivedFrom
</a></td><td>std::string BaseName
</td></tr>
3848 <tr><td colspan=
"4" class=
"doc" id=
"isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
3849 isSameOrDerivedFrom(hasName(...)).
3853 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>></td><td class=
"name" onclick=
"toggle('isTemplateInstantiation2')"><a name=
"isTemplateInstantiation2Anchor">isTemplateInstantiation
</a></td><td></td></tr>
3854 <tr><td colspan=
"4" class=
"doc" id=
"isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
3855 member variable template instantiations.
3858 template
<typename T
> class X {}; class A {}; X
<A
> x;
3860 template
<typename T
> class X {}; class A {}; template class X
<A
>;
3862 template
<typename T
> class X {}; class A {}; extern template class X
<A
>;
3863 cxxRecordDecl(hasName(
"::X"), isTemplateInstantiation())
3864 matches the template instantiation of X
<A
>.
3867 template
<typename T
> class X {}; class A {};
3868 template
<> class X
<A
> {}; X
<A
> x;
3869 cxxRecordDecl(hasName(
"::X"), isTemplateInstantiation())
3870 does not match, as X
<A
> is an explicit template specialization.
3872 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>>
3876 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator
</a>></td><td class=
"name" onclick=
"toggle('hasAnyOperatorName2')"><a name=
"hasAnyOperatorName2Anchor">hasAnyOperatorName
</a></td><td>StringRef, ..., StringRef
</td></tr>
3877 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the
3880 hasAnyOperatorName(
"+",
"-")
3882 anyOf(hasOperatorName(
"+"), hasOperatorName(
"-"))
3886 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator
</a>></td><td class=
"name" onclick=
"toggle('hasOperatorName2')"><a name=
"hasOperatorName2Anchor">hasOperatorName
</a></td><td>std::string Name
</td></tr>
3887 <tr><td colspan=
"4" class=
"doc" id=
"hasOperatorName2"><pre>Matches the operator Name of operator expressions and fold expressions
3890 Example matches a || b (matcher = binaryOperator(hasOperatorName(
"||")))
3893 Example matches `(
0 + ... + args)`
3894 (matcher = cxxFoldExpr(hasOperatorName(
"+")))
3895 template
<typename... Args
>
3896 auto sum(Args... args) {
3897 return (
0 + ... + args);
3902 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator
</a>></td><td class=
"name" onclick=
"toggle('isAssignmentOperator2')"><a name=
"isAssignmentOperator2Anchor">isAssignmentOperator
</a></td><td></td></tr>
3903 <tr><td colspan=
"4" class=
"doc" id=
"isAssignmentOperator2"><pre>Matches all kinds of assignment operators.
3905 Example
1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3909 Example
2: matches s1 = s2
3910 (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3911 struct S { S
& operator=(const S
&); };
3912 void x() { S s1, s2; s1 = s2; }
3916 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator
</a>></td><td class=
"name" onclick=
"toggle('isComparisonOperator2')"><a name=
"isComparisonOperator2Anchor">isComparisonOperator
</a></td><td></td></tr>
3917 <tr><td colspan=
"4" class=
"doc" id=
"isComparisonOperator2"><pre>Matches comparison operators.
3919 Example
1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3923 Example
2: matches s1
< s2
3924 (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3925 struct S { bool operator
<(const S
& other); };
3926 void x(S s1, S s2) { bool b1 = s1
< s2; }
3930 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr
</a>></td><td class=
"name" onclick=
"toggle('argumentCountAtLeast2')"><a name=
"argumentCountAtLeast2Anchor">argumentCountAtLeast
</a></td><td>unsigned N
</td></tr>
3931 <tr><td colspan=
"4" class=
"doc" id=
"argumentCountAtLeast2"><pre>Checks that a call expression or a constructor call expression has at least
3932 the specified number of arguments (including absent default arguments).
3934 Example matches f(
0,
0) and g(
0,
0,
0)
3935 (matcher = callExpr(argumentCountAtLeast(
2)))
3936 void f(int x, int y);
3937 void g(int x, int y, int z);
3943 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr
</a>></td><td class=
"name" onclick=
"toggle('argumentCountIs2')"><a name=
"argumentCountIs2Anchor">argumentCountIs
</a></td><td>unsigned N
</td></tr>
3944 <tr><td colspan=
"4" class=
"doc" id=
"argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3945 a specific number of arguments (including absent default arguments).
3947 Example matches f(
0,
0) (matcher = callExpr(argumentCountIs(
2)))
3948 void f(int x, int y);
3953 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr
</a>></td><td class=
"name" onclick=
"toggle('argumentCountAtLeast0')"><a name=
"argumentCountAtLeast0Anchor">argumentCountAtLeast
</a></td><td>unsigned N
</td></tr>
3954 <tr><td colspan=
"4" class=
"doc" id=
"argumentCountAtLeast0"><pre>Checks that a call expression or a constructor call expression has at least
3955 the specified number of arguments (including absent default arguments).
3957 Example matches f(
0,
0) and g(
0,
0,
0)
3958 (matcher = callExpr(argumentCountAtLeast(
2)))
3959 void f(int x, int y);
3960 void g(int x, int y, int z);
3966 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr
</a>></td><td class=
"name" onclick=
"toggle('argumentCountIs0')"><a name=
"argumentCountIs0Anchor">argumentCountIs
</a></td><td>unsigned N
</td></tr>
3967 <tr><td colspan=
"4" class=
"doc" id=
"argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
3968 a specific number of arguments (including absent default arguments).
3970 Example matches f(
0,
0) (matcher = callExpr(argumentCountIs(
2)))
3971 void f(int x, int y);
3976 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr
</a>></td><td class=
"name" onclick=
"toggle('usesADL0')"><a name=
"usesADL0Anchor">usesADL
</a></td><td></td></tr>
3977 <tr><td colspan=
"4" class=
"doc" id=
"usesADL0"><pre>Matches call expressions which were resolved using ADL.
3979 Example matches y(x) but not y(
42) or NS::y(x).
3990 NS::y(x); // Doesn't match
3991 y(
42); // Doesn't match
3993 y(x); // Found by both unqualified lookup and ADL, doesn't match
3998 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr
</a>></td><td class=
"name" onclick=
"toggle('hasCastKind0')"><a name=
"hasCastKind0Anchor">hasCastKind
</a></td><td>CastKind Kind
</td></tr>
3999 <tr><td colspan=
"4" class=
"doc" id=
"hasCastKind0"><pre>Matches casts that has a given cast kind.
4001 Example: matches the implicit cast around
0
4002 (matcher = castExpr(hasCastKind(CK_NullToPointer)))
4005 If the matcher is use from clang-query, CastKind parameter
4006 should be passed as a quoted string. e.g., hasCastKind(
"CK_NullToPointer").
4010 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral
</a>></td><td class=
"name" onclick=
"toggle('equals4')"><a name=
"equals4Anchor">equals
</a></td><td>bool Value
</td></tr>
4011 <tr><td colspan=
"4" class=
"doc" id=
"equals4"><pre></pre></td></tr>
4014 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral
</a>></td><td class=
"name" onclick=
"toggle('equals3')"><a name=
"equals3Anchor">equals
</a></td><td>const ValueT Value
</td></tr>
4015 <tr><td colspan=
"4" class=
"doc" id=
"equals3"><pre>Matches literals that are equal to the given value of type ValueT.
4018 f('false,
3.14,
42);
4019 characterLiteral(equals(
0))
4020 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(
0))
4022 floatLiteral(equals(
3.14)) and floatLiteral(equals(
314e-2))
4024 integerLiteral(equals(
42))
4027 Note that you cannot directly match a negative numeric literal because the
4028 minus sign is not part of the literal: It is a unary operator whose operand
4029 is the positive numeric literal. Instead, you must use a unaryOperator()
4030 matcher to match the minus sign:
4032 unaryOperator(hasOperatorName(
"-"),
4033 hasUnaryOperand(integerLiteral(equals(
13))))
4035 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr
</a>>,
4036 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral
</a>>
4040 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral
</a>></td><td class=
"name" onclick=
"toggle('equals10')"><a name=
"equals10Anchor">equals
</a></td><td>double Value
</td></tr>
4041 <tr><td colspan=
"4" class=
"doc" id=
"equals10"><pre></pre></td></tr>
4044 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral
</a>></td><td class=
"name" onclick=
"toggle('equals7')"><a name=
"equals7Anchor">equals
</a></td><td>unsigned Value
</td></tr>
4045 <tr><td colspan=
"4" class=
"doc" id=
"equals7"><pre></pre></td></tr>
4048 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl
</a>></td><td class=
"name" onclick=
"toggle('templateArgumentCountIs0')"><a name=
"templateArgumentCountIs0Anchor">templateArgumentCountIs
</a></td><td>unsigned N
</td></tr>
4049 <tr><td colspan=
"4" class=
"doc" id=
"templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
4052 template
<typename T
> struct C {};
4054 classTemplateSpecializationDecl(templateArgumentCountIs(
1))
4055 matches C
<int
>.
4059 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt
</a>></td><td class=
"name" onclick=
"toggle('statementCountIs0')"><a name=
"statementCountIs0Anchor">statementCountIs
</a></td><td>unsigned N
</td></tr>
4060 <tr><td colspan=
"4" class=
"doc" id=
"statementCountIs0"><pre>Checks that a compound statement contains a specific number of
4065 compoundStmt(statementCountIs(
0)))
4067 but does not match the outer compound statement.
4071 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType
</a>></td><td class=
"name" onclick=
"toggle('hasSize0')"><a name=
"hasSize0Anchor">hasSize
</a></td><td>unsigned N
</td></tr>
4072 <tr><td colspan=
"4" class=
"doc" id=
"hasSize0"><pre>Matches nodes that have the specified size.
4079 wchar_t *ws = L
"abcd";
4081 constantArrayType(hasSize(
42))
4082 matches
"int a[42]" and
"int b[2 * 21]"
4083 stringLiteral(hasSize(
4))
4084 matches
"abcd", L
"abcd"
4088 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt
</a>></td><td class=
"name" onclick=
"toggle('declCountIs0')"><a name=
"declCountIs0Anchor">declCountIs
</a></td><td>unsigned N
</td></tr>
4089 <tr><td colspan=
"4" class=
"doc" id=
"declCountIs0"><pre>Matches declaration statements that contain a specific number of
4097 matches 'int a, b;' and 'int d =
2, e;', but not 'int c;'.
4101 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('equalsBoundNode1')"><a name=
"equalsBoundNode1Anchor">equalsBoundNode
</a></td><td>std::string ID
</td></tr>
4102 <tr><td colspan=
"4" class=
"doc" id=
"equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
4104 Matches a node if it equals the node previously bound to ID.
4107 class X { int a; int b; };
4109 has(fieldDecl(hasName(
"a"), hasType(type().bind(
"t")))),
4110 has(fieldDecl(hasName(
"b"), hasType(type(equalsBoundNode(
"t"))))))
4111 matches the class X, as a and b have the same type.
4113 Note that when multiple matches are involved via forEach* matchers,
4114 equalsBoundNodes acts as a filter.
4117 forEachDescendant(varDecl().bind(
"d")),
4118 forEachDescendant(declRefExpr(to(decl(equalsBoundNode(
"d"))))))
4119 will trigger a match for each combination of variable declaration
4120 and reference to that variable declaration within a compound statement.
4124 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('equalsNode0')"><a name=
"equalsNode0Anchor">equalsNode
</a></td><td>const Decl* Other
</td></tr>
4125 <tr><td colspan=
"4" class=
"doc" id=
"equalsNode0"><pre>Matches if a node equals another node.
4127 Decl has pointer identity in the AST.
4131 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('hasAttr0')"><a name=
"hasAttr0Anchor">hasAttr
</a></td><td>attr::Kind AttrKind
</td></tr>
4132 <tr><td colspan=
"4" class=
"doc" id=
"hasAttr0"><pre>Matches declaration that has a given attribute.
4135 __attribute__((device)) void f() { ... }
4136 decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
4137 f. If the matcher is used from clang-query, attr::Kind parameter should be
4138 passed as a quoted string. e.g., hasAttr(
"attr::CUDADevice").
4142 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('isExpandedFromMacro0')"><a name=
"isExpandedFromMacro0Anchor">isExpandedFromMacro
</a></td><td>std::string MacroName
</td></tr>
4143 <tr><td colspan=
"4" class=
"doc" id=
"isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro.
4144 Does not match if only part of the statement is expanded from that macro or
4145 if different parts of the statement are expanded from different
4146 appearances of the macro.
4150 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('isExpansionInFileMatching0')"><a name=
"isExpansionInFileMatching0Anchor">isExpansionInFileMatching
</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags
</td></tr>
4151 <tr><td colspan=
"4" class=
"doc" id=
"isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
4152 partially matching a given regex.
4154 Example matches Y but not X
4155 (matcher = cxxRecordDecl(isExpansionInFileMatching(
"AST.*"))
4156 #include
"ASTMatcher.h"
4161 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc
</a>>
4163 If the matcher is used in clang-query, RegexFlags parameter
4164 should be passed as a quoted string. e.g:
"NoFlags".
4165 Flags can be combined with '|' example
"IgnoreCase | BasicRegex"
4169 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('isExpansionInMainFile0')"><a name=
"isExpansionInMainFile0Anchor">isExpansionInMainFile
</a></td><td></td></tr>
4170 <tr><td colspan=
"4" class=
"doc" id=
"isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
4172 Example matches X but not Y
4173 (matcher = cxxRecordDecl(isExpansionInMainFile())
4174 #include
<Y.h
>
4179 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc
</a>>
4183 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('isExpansionInSystemHeader0')"><a name=
"isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader
</a></td><td></td></tr>
4184 <tr><td colspan=
"4" class=
"doc" id=
"isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
4186 Example matches Y but not X
4187 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
4188 #include
<SystemHeader.h
>
4193 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc
</a>>
4197 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('isImplicit0')"><a name=
"isImplicit0Anchor">isImplicit
</a></td><td></td></tr>
4198 <tr><td colspan=
"4" class=
"doc" id=
"isImplicit0"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
4199 implicit default/copy constructors).
4203 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('isInAnonymousNamespace0')"><a name=
"isInAnonymousNamespace0Anchor">isInAnonymousNamespace
</a></td><td></td></tr>
4204 <tr><td colspan=
"4" class=
"doc" id=
"isInAnonymousNamespace0"><pre>Matches declarations in an anonymous namespace.
4211 class vector {}; // #
1
4215 class vector {}; // #
2
4217 class vector{}; // #
3
4220 cxxRecordDecl(hasName(
"vector"), isInAnonymousNamespace()) will match
4225 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('isInStdNamespace0')"><a name=
"isInStdNamespace0Anchor">isInStdNamespace
</a></td><td></td></tr>
4226 <tr><td colspan=
"4" class=
"doc" id=
"isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
4237 inline namespace __1 {
4238 class vector {}; // #
1
4239 namespace experimental {
4244 cxxRecordDecl(hasName(
"vector"), isInStdNamespace()) will match only #
1.
4248 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('isInstantiated0')"><a name=
"isInstantiated0Anchor">isInstantiated
</a></td><td></td></tr>
4249 <tr><td colspan=
"4" class=
"doc" id=
"isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
4250 template instantiations.
4253 template
<typename T
> void A(T t) { T i; }
4256 functionDecl(isInstantiated())
4257 matches 'A(int) {...};' and 'A(unsigned) {...}'.
4261 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('isPrivate0')"><a name=
"isPrivate0Anchor">isPrivate
</a></td><td></td></tr>
4262 <tr><td colspan=
"4" class=
"doc" id=
"isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private
4269 private: int c; // fieldDecl(isPrivate()) matches 'c'
4273 struct Derived1 : private Base {}; // matches 'Base'
4274 class Derived2 : Base {}; // matches 'Base'
4278 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('isProtected0')"><a name=
"isProtected0Anchor">isProtected
</a></td><td></td></tr>
4279 <tr><td colspan=
"4" class=
"doc" id=
"isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify
4280 protected inheritance.
4285 protected: int b; // fieldDecl(isProtected()) matches 'b'
4290 class Derived : protected Base {}; // matches 'Base'
4294 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>></td><td class=
"name" onclick=
"toggle('isPublic0')"><a name=
"isPublic0Anchor">isPublic
</a></td><td></td></tr>
4295 <tr><td colspan=
"4" class=
"doc" id=
"isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public
4300 public: int a; // fieldDecl(isPublic()) matches 'a'
4306 class Derived1 : public Base {}; // matches 'Base'
4307 struct Derived2 : Base {}; // matches 'Base'
4311 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr
</a>></td><td class=
"name" onclick=
"toggle('designatorCountIs0')"><a name=
"designatorCountIs0Anchor">designatorCountIs
</a></td><td>unsigned N
</td></tr>
4312 <tr><td colspan=
"4" class=
"doc" id=
"designatorCountIs0"><pre>Matches designated initializer expressions that contain
4313 a specific number of designators.
4316 point ptarray[
10] = { [
2].y =
1.0, [
0].x =
1.0 };
4317 point ptarray2[
10] = { [
2].y =
1.0, [
2].x =
0.0, [
0].x =
1.0 };
4318 designatorCountIs(
2)
4319 matches '{ [
2].y =
1.0, [
0].x =
1.0 }',
4320 but not '{ [
2].y =
1.0, [
2].x =
0.0, [
0].x =
1.0 }'.
4324 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl
</a>></td><td class=
"name" onclick=
"toggle('isScoped0')"><a name=
"isScoped0Anchor">isScoped
</a></td><td></td></tr>
4325 <tr><td colspan=
"4" class=
"doc" id=
"isScoped0"><pre>Matches C++
11 scoped enum declaration.
4327 Example matches Y (matcher = enumDecl(isScoped()))
4333 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>></td><td class=
"name" onclick=
"toggle('isInstantiationDependent0')"><a name=
"isInstantiationDependent0Anchor">isInstantiationDependent
</a></td><td></td></tr>
4334 <tr><td colspan=
"4" class=
"doc" id=
"isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
4335 neither type- nor value-dependent.
4337 In the following example, the expression sizeof(sizeof(T() + T()))
4338 is instantiation-dependent (since it involves a template parameter T),
4339 but is neither type- nor value-dependent, since the type of the inner
4340 sizeof is known (std::size_t) and therefore the size of the outer
4342 template
<typename T
>
4343 void f(T x, T y) { sizeof(sizeof(T() + T()); }
4344 expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
4348 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>></td><td class=
"name" onclick=
"toggle('isTypeDependent0')"><a name=
"isTypeDependent0Anchor">isTypeDependent
</a></td><td></td></tr>
4349 <tr><td colspan=
"4" class=
"doc" id=
"isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
4350 is not yet instantiated.
4352 For example, the expressions
"x" and
"x + y" are type-dependent in
4353 the following code, but
"y" is not type-dependent:
4354 template
<typename T
>
4355 void add(T x, int y) {
4358 expr(isTypeDependent()) matches x + y
4362 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>></td><td class=
"name" onclick=
"toggle('isValueDependent0')"><a name=
"isValueDependent0Anchor">isValueDependent
</a></td><td></td></tr>
4363 <tr><td colspan=
"4" class=
"doc" id=
"isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
4364 non-type template parameter.
4366 For example, the array bound of
"Chars" in the following example is
4368 template
<int Size
> int f() { return Size; }
4369 expr(isValueDependent()) matches return Size
4373 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>></td><td class=
"name" onclick=
"toggle('nullPointerConstant0')"><a name=
"nullPointerConstant0Anchor">nullPointerConstant
</a></td><td></td></tr>
4374 <tr><td colspan=
"4" class=
"doc" id=
"nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
4375 GNU's __null, C++
11's nullptr, or C's NULL macro.
4380 void *v3 = __null; // GNU extension
4381 char *cp = (char *)
0;
4384 expr(nullPointerConstant())
4385 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
4390 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl
</a>></td><td class=
"name" onclick=
"toggle('hasBitWidth0')"><a name=
"hasBitWidth0Anchor">hasBitWidth
</a></td><td>unsigned Width
</td></tr>
4391 <tr><td colspan=
"4" class=
"doc" id=
"hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
4400 fieldDecl(hasBitWidth(
2))
4401 matches 'int a;' and 'int c;' but not 'int b;'.
4405 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl
</a>></td><td class=
"name" onclick=
"toggle('isBitField0')"><a name=
"isBitField0Anchor">isBitField
</a></td><td></td></tr>
4406 <tr><td colspan=
"4" class=
"doc" id=
"isBitField0"><pre>Matches non-static data members that are bit-fields.
4413 fieldDecl(isBitField())
4414 matches 'int a;' but not 'int b;'.
4418 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral
</a>></td><td class=
"name" onclick=
"toggle('equals1')"><a name=
"equals1Anchor">equals
</a></td><td>const ValueT Value
</td></tr>
4419 <tr><td colspan=
"4" class=
"doc" id=
"equals1"><pre>Matches literals that are equal to the given value of type ValueT.
4422 f('false,
3.14,
42);
4423 characterLiteral(equals(
0))
4424 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(
0))
4426 floatLiteral(equals(
3.14)) and floatLiteral(equals(
314e-2))
4428 integerLiteral(equals(
42))
4431 Note that you cannot directly match a negative numeric literal because the
4432 minus sign is not part of the literal: It is a unary operator whose operand
4433 is the positive numeric literal. Instead, you must use a unaryOperator()
4434 matcher to match the minus sign:
4436 unaryOperator(hasOperatorName(
"-"),
4437 hasUnaryOperand(integerLiteral(equals(
13))))
4439 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr
</a>>,
4440 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral
</a>>
4444 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral
</a>></td><td class=
"name" onclick=
"toggle('equals12')"><a name=
"equals12Anchor">equals
</a></td><td>double Value
</td></tr>
4445 <tr><td colspan=
"4" class=
"doc" id=
"equals12"><pre></pre></td></tr>
4448 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('hasAnyOverloadedOperatorName1')"><a name=
"hasAnyOverloadedOperatorName1Anchor">hasAnyOverloadedOperatorName
</a></td><td>StringRef, ..., StringRef
</td></tr>
4449 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names.
4451 Matches overloaded operator names specified in strings without the
4452 "operator" prefix: e.g.
"<<".
4454 hasAnyOverloadedOperatorName(
"+",
"-")
4456 anyOf(hasOverloadedOperatorName(
"+"), hasOverloadedOperatorName(
"-"))
4460 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('hasDynamicExceptionSpec0')"><a name=
"hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec
</a></td><td></td></tr>
4461 <tr><td colspan=
"4" class=
"doc" id=
"hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
4466 void h() noexcept(true);
4467 void i() noexcept(false);
4469 void k() throw(int);
4470 void l() throw(...);
4471 functionDecl(hasDynamicExceptionSpec()) and
4472 functionProtoType(hasDynamicExceptionSpec())
4473 match the declarations of j, k, and l, but not f, g, h, or i.
4477 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('hasOverloadedOperatorName0')"><a name=
"hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName
</a></td><td>StringRef Name
</td></tr>
4478 <tr><td colspan=
"4" class=
"doc" id=
"hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
4480 Matches overloaded operator names specified in strings without the
4481 "operator" prefix: e.g.
"<<".
4484 class A { int operator*(); };
4485 const A
&operator
<<(const A
&a, const A
&b);
4487 a
<< a; //
<-- This matches
4489 cxxOperatorCallExpr(hasOverloadedOperatorName(
"<<"))) matches the
4491 cxxRecordDecl(hasMethod(hasOverloadedOperatorName(
"*")))
4492 matches the declaration of A.
4494 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>>
4498 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('hasTrailingReturn0')"><a name=
"hasTrailingReturn0Anchor">hasTrailingReturn
</a></td><td></td></tr>
4499 <tr><td colspan=
"4" class=
"doc" id=
"hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
4501 Example matches Y (matcher = functionDecl(hasTrailingReturn()))
4503 auto Y() -
> int {}
4507 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('isConsteval0')"><a name=
"isConsteval0Anchor">isConsteval
</a></td><td></td></tr>
4508 <tr><td colspan=
"4" class=
"doc" id=
"isConsteval0"><pre>Matches consteval function declarations and if consteval/if ! consteval
4513 void b() { if consteval {} }
4514 void c() { if ! consteval {} }
4515 void d() { if ! consteval {} else {} }
4516 functionDecl(isConsteval())
4517 matches the declaration of
"int a()".
4518 ifStmt(isConsteval())
4519 matches the if statement in
"void b()",
"void c()",
"void d()".
4523 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('isConstexpr1')"><a name=
"isConstexpr1Anchor">isConstexpr
</a></td><td></td></tr>
4524 <tr><td colspan=
"4" class=
"doc" id=
"isConstexpr1"><pre>Matches constexpr variable and function declarations,
4528 constexpr int foo =
42;
4529 constexpr int bar();
4530 void baz() { if constexpr(
1 > 0) {} }
4531 varDecl(isConstexpr())
4532 matches the declaration of foo.
4533 functionDecl(isConstexpr())
4534 matches the declaration of bar.
4535 ifStmt(isConstexpr())
4536 matches the if statement in baz.
4540 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('isDefaulted0')"><a name=
"isDefaulted0Anchor">isDefaulted
</a></td><td></td></tr>
4541 <tr><td colspan=
"4" class=
"doc" id=
"isDefaulted0"><pre>Matches defaulted function declarations.
4545 class B { ~B() = default; };
4546 functionDecl(isDefaulted())
4547 matches the declaration of ~B, but not ~A.
4551 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('isDefinition3')"><a name=
"isDefinition3Anchor">isDefinition
</a></td><td></td></tr>
4552 <tr><td colspan=
"4" class=
"doc" id=
"isDefinition3"><pre>Matches if a declaration has a body attached.
4554 Example matches A, va, fa
4556 class B; // Doesn't match, as it has no body.
4558 extern int vb; // Doesn't match, as it doesn't define the variable.
4560 void fb(); // Doesn't match, as it has no body.
4562 - (void)ma; // Doesn't match, interface is declaration.
4568 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>>,
4569 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl
</a>>
4573 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('isDeleted0')"><a name=
"isDeleted0Anchor">isDeleted
</a></td><td></td></tr>
4574 <tr><td colspan=
"4" class=
"doc" id=
"isDeleted0"><pre>Matches deleted function declarations.
4578 void DeletedFunc() = delete;
4579 functionDecl(isDeleted())
4580 matches the declaration of DeletedFunc, but not Func.
4584 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('isExplicitTemplateSpecialization0')"><a name=
"isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization
</a></td><td></td></tr>
4585 <tr><td colspan=
"4" class=
"doc" id=
"isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
4586 static member variable template instantiations.
4589 template
<typename T
> void A(T t) { }
4590 template
<> void A(int N) { }
4591 functionDecl(isExplicitTemplateSpecialization())
4592 matches the specialization A
<int
>().
4594 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>>
4598 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('isExternC0')"><a name=
"isExternC0Anchor">isExternC
</a></td><td></td></tr>
4599 <tr><td colspan=
"4" class=
"doc" id=
"isExternC0"><pre>Matches extern
"C" function or variable declarations.
4602 extern
"C" void f() {}
4603 extern
"C" { void g() {} }
4605 extern
"C" int x =
1;
4606 extern
"C" int y =
2;
4608 functionDecl(isExternC())
4609 matches the declaration of f and g, but not the declaration of h.
4610 varDecl(isExternC())
4611 matches the declaration of x and y, but not the declaration of z.
4615 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('isInline1')"><a name=
"isInline1Anchor">isInline
</a></td><td></td></tr>
4616 <tr><td colspan=
"4" class=
"doc" id=
"isInline1"><pre>Matches functions, variables and namespace declarations that are marked with
4623 inline namespace m {}
4626 functionDecl(isInline()) will match ::f().
4627 namespaceDecl(isInline()) will match n::m.
4628 varDecl(isInline()) will match Foo;
4632 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('isMain0')"><a name=
"isMain0Anchor">isMain
</a></td><td></td></tr>
4633 <tr><td colspan=
"4" class=
"doc" id=
"isMain0"><pre>Determines whether the function is
"main", which is the entry point
4634 into an executable program.
4638 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('isNoReturn0')"><a name=
"isNoReturn0Anchor">isNoReturn
</a></td><td></td></tr>
4639 <tr><td colspan=
"4" class=
"doc" id=
"isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
4643 [[noreturn]] void a();
4644 __attribute__((noreturn)) void b();
4645 struct c { [[noreturn]] c(); };
4646 functionDecl(isNoReturn())
4647 matches all of those except
4652 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('isNoThrow0')"><a name=
"isNoThrow0Anchor">isNoThrow
</a></td><td></td></tr>
4653 <tr><td colspan=
"4" class=
"doc" id=
"isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
4659 void i() throw(int);
4660 void j() noexcept(false);
4661 functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4662 match the declarations of g, and h, but not f, i or j.
4666 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('isStaticStorageClass0')"><a name=
"isStaticStorageClass0Anchor">isStaticStorageClass
</a></td><td></td></tr>
4667 <tr><td colspan=
"4" class=
"doc" id=
"isStaticStorageClass0"><pre>Matches variable/function declarations that have
"static" storage
4668 class specifier (
"static" keyword) written in the source.
4675 functionDecl(isStaticStorageClass())
4676 matches the function declaration f.
4677 varDecl(isStaticStorageClass())
4678 matches the variable declaration i.
4682 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('isTemplateInstantiation0')"><a name=
"isTemplateInstantiation0Anchor">isTemplateInstantiation
</a></td><td></td></tr>
4683 <tr><td colspan=
"4" class=
"doc" id=
"isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
4684 member variable template instantiations.
4687 template
<typename T
> class X {}; class A {}; X
<A
> x;
4689 template
<typename T
> class X {}; class A {}; template class X
<A
>;
4691 template
<typename T
> class X {}; class A {}; extern template class X
<A
>;
4692 cxxRecordDecl(hasName(
"::X"), isTemplateInstantiation())
4693 matches the template instantiation of X
<A
>.
4696 template
<typename T
> class X {}; class A {};
4697 template
<> class X
<A
> {}; X
<A
> x;
4698 cxxRecordDecl(hasName(
"::X"), isTemplateInstantiation())
4699 does not match, as X
<A
> is an explicit template specialization.
4701 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>>
4705 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('isVariadic0')"><a name=
"isVariadic0Anchor">isVariadic
</a></td><td></td></tr>
4706 <tr><td colspan=
"4" class=
"doc" id=
"isVariadic0"><pre>Matches if a function declaration is variadic.
4708 Example matches f, but not g or h. The function i will not match, even when
4712 template
<typename... Ts
> void h(Ts...);
4717 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('isWeak0')"><a name=
"isWeak0Anchor">isWeak
</a></td><td></td></tr>
4718 <tr><td colspan=
"4" class=
"doc" id=
"isWeak0"><pre>Matches weak function declarations.
4721 void foo() __attribute__((__weakref__(
"__foo")));
4723 functionDecl(isWeak())
4724 matches the weak declaration
"foo", but not
"bar".
4728 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl
</a>></td><td class=
"name" onclick=
"toggle('parameterCountIs0')"><a name=
"parameterCountIs0Anchor">parameterCountIs
</a></td><td>unsigned N
</td></tr>
4729 <tr><td colspan=
"4" class=
"doc" id=
"parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4730 specific parameter count.
4734 void g(int i, int j) {}
4735 void h(int i, int j);
4737 void k(int x, int y, int z, ...);
4738 functionDecl(parameterCountIs(
2))
4740 functionProtoType(parameterCountIs(
2))
4742 functionProtoType(parameterCountIs(
3))
4747 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType
</a>></td><td class=
"name" onclick=
"toggle('hasDynamicExceptionSpec1')"><a name=
"hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec
</a></td><td></td></tr>
4748 <tr><td colspan=
"4" class=
"doc" id=
"hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
4753 void h() noexcept(true);
4754 void i() noexcept(false);
4756 void k() throw(int);
4757 void l() throw(...);
4758 functionDecl(hasDynamicExceptionSpec()) and
4759 functionProtoType(hasDynamicExceptionSpec())
4760 match the declarations of j, k, and l, but not f, g, h, or i.
4764 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType
</a>></td><td class=
"name" onclick=
"toggle('isNoThrow1')"><a name=
"isNoThrow1Anchor">isNoThrow
</a></td><td></td></tr>
4765 <tr><td colspan=
"4" class=
"doc" id=
"isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
4771 void i() throw(int);
4772 void j() noexcept(false);
4773 functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4774 match the declarations of g, and h, but not f, i or j.
4778 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType
</a>></td><td class=
"name" onclick=
"toggle('parameterCountIs1')"><a name=
"parameterCountIs1Anchor">parameterCountIs
</a></td><td>unsigned N
</td></tr>
4779 <tr><td colspan=
"4" class=
"doc" id=
"parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4780 specific parameter count.
4784 void g(int i, int j) {}
4785 void h(int i, int j);
4787 void k(int x, int y, int z, ...);
4788 functionDecl(parameterCountIs(
2))
4790 functionProtoType(parameterCountIs(
2))
4792 functionProtoType(parameterCountIs(
3))
4797 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt
</a>></td><td class=
"name" onclick=
"toggle('isConsteval1')"><a name=
"isConsteval1Anchor">isConsteval
</a></td><td></td></tr>
4798 <tr><td colspan=
"4" class=
"doc" id=
"isConsteval1"><pre>Matches consteval function declarations and if consteval/if ! consteval
4803 void b() { if consteval {} }
4804 void c() { if ! consteval {} }
4805 void d() { if ! consteval {} else {} }
4806 functionDecl(isConsteval())
4807 matches the declaration of
"int a()".
4808 ifStmt(isConsteval())
4809 matches the if statement in
"void b()",
"void c()",
"void d()".
4813 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt
</a>></td><td class=
"name" onclick=
"toggle('isConstexpr2')"><a name=
"isConstexpr2Anchor">isConstexpr
</a></td><td></td></tr>
4814 <tr><td colspan=
"4" class=
"doc" id=
"isConstexpr2"><pre>Matches constexpr variable and function declarations,
4818 constexpr int foo =
42;
4819 constexpr int bar();
4820 void baz() { if constexpr(
1 > 0) {} }
4821 varDecl(isConstexpr())
4822 matches the declaration of foo.
4823 functionDecl(isConstexpr())
4824 matches the declaration of bar.
4825 ifStmt(isConstexpr())
4826 matches the if statement in baz.
4830 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral
</a>></td><td class=
"name" onclick=
"toggle('equals6')"><a name=
"equals6Anchor">equals
</a></td><td>bool Value
</td></tr>
4831 <tr><td colspan=
"4" class=
"doc" id=
"equals6"><pre></pre></td></tr>
4834 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral
</a>></td><td class=
"name" onclick=
"toggle('equals0')"><a name=
"equals0Anchor">equals
</a></td><td>const ValueT Value
</td></tr>
4835 <tr><td colspan=
"4" class=
"doc" id=
"equals0"><pre>Matches literals that are equal to the given value of type ValueT.
4838 f('false,
3.14,
42);
4839 characterLiteral(equals(
0))
4840 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(
0))
4842 floatLiteral(equals(
3.14)) and floatLiteral(equals(
314e-2))
4844 integerLiteral(equals(
42))
4847 Note that you cannot directly match a negative numeric literal because the
4848 minus sign is not part of the literal: It is a unary operator whose operand
4849 is the positive numeric literal. Instead, you must use a unaryOperator()
4850 matcher to match the minus sign:
4852 unaryOperator(hasOperatorName(
"-"),
4853 hasUnaryOperand(integerLiteral(equals(
13))))
4855 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr
</a>>,
4856 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral
</a>>
4860 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral
</a>></td><td class=
"name" onclick=
"toggle('equals13')"><a name=
"equals13Anchor">equals
</a></td><td>double Value
</td></tr>
4861 <tr><td colspan=
"4" class=
"doc" id=
"equals13"><pre></pre></td></tr>
4864 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral
</a>></td><td class=
"name" onclick=
"toggle('equals9')"><a name=
"equals9Anchor">equals
</a></td><td>unsigned Value
</td></tr>
4865 <tr><td colspan=
"4" class=
"doc" id=
"equals9"><pre></pre></td></tr>
4868 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture
</a>></td><td class=
"name" onclick=
"toggle('capturesThis0')"><a name=
"capturesThis0Anchor">capturesThis
</a></td><td></td></tr>
4869 <tr><td colspan=
"4" class=
"doc" id=
"capturesThis0"><pre>Matches a `LambdaCapture` that refers to 'this'.
4875 auto l = [this]() { return cc; };
4879 lambdaExpr(hasAnyCapture(lambdaCapture(capturesThis())))
4880 matches `[this]() { return cc; }`.
4884 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture
</a>></td><td class=
"name" onclick=
"toggle('isImplicit2')"><a name=
"isImplicit2Anchor">isImplicit
</a></td><td></td></tr>
4885 <tr><td colspan=
"4" class=
"doc" id=
"isImplicit2"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
4886 implicit default/copy constructors).
4890 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr
</a>></td><td class=
"name" onclick=
"toggle('isArrow0')"><a name=
"isArrow0Anchor">isArrow
</a></td><td></td></tr>
4891 <tr><td colspan=
"4" class=
"doc" id=
"isArrow0"><pre>Matches member expressions that are called with '-
>' as opposed
4894 Member calls on the implicit this pointer match as called with '-
>'.
4898 void x() { this-
>x(); x(); Y y; y.x(); a; this-
>b; Y::b; }
4899 template
<class T
> void f() { this-
>f
<T
>(); f
<T
>(); }
4903 template
<class T
>
4905 void x() { this-
>m; }
4907 memberExpr(isArrow())
4908 matches this-
>x, x, y.x, a, this-
>b
4909 cxxDependentScopeMemberExpr(isArrow())
4911 unresolvedMemberExpr(isArrow())
4912 matches this-
>f
<T
>, f
<T
>
4916 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl
</a>></td><td class=
"name" onclick=
"toggle('hasAnyName0')"><a name=
"hasAnyName0Anchor">hasAnyName
</a></td><td>StringRef, ..., StringRef
</td></tr>
4917 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4919 This matcher is only provided as a performance optimization of hasName.
4921 is equivalent to, but faster than
4922 anyOf(hasName(a), hasName(b), hasName(c))
4926 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl
</a>></td><td class=
"name" onclick=
"toggle('hasExternalFormalLinkage0')"><a name=
"hasExternalFormalLinkage0Anchor">hasExternalFormalLinkage
</a></td><td></td></tr>
4927 <tr><td colspan=
"4" class=
"doc" id=
"hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
4929 Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
4936 Example matches f() because it has external formal linkage despite being
4937 unique to the translation unit as though it has internal likage
4938 (matcher = functionDecl(hasExternalFormalLinkage()))
4946 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl
</a>></td><td class=
"name" onclick=
"toggle('hasName0')"><a name=
"hasName0Anchor">hasName
</a></td><td>StringRef Name
</td></tr>
4947 <tr><td colspan=
"4" class=
"doc" id=
"hasName0"><pre>Matches NamedDecl nodes that have the specified name.
4949 Supports specifying enclosing namespaces or classes by prefixing the name
4950 with '
<enclosing
>::'.
4951 Does not match typedefs of an underlying type with the given name.
4953 Example matches X (Name ==
"X")
4956 Example matches X (Name is one of
"::a::b::X",
"a::b::X",
"b::X",
"X")
4957 namespace a { namespace b { class X; } }
4961 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl
</a>></td><td class=
"name" onclick=
"toggle('matchesName0')"><a name=
"matchesName0Anchor">matchesName
</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags
</td></tr>
4962 <tr><td colspan=
"4" class=
"doc" id=
"matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
4963 a substring matched by the given RegExp.
4965 Supports specifying enclosing namespaces or classes by
4966 prefixing the name with '
<enclosing
>::'. Does not match typedefs
4967 of an underlying type with the given name.
4969 Example matches X (regexp ==
"::X")
4972 Example matches X (regexp is one of
"::X",
"^foo::.*X", among others)
4973 namespace foo { namespace bar { class X; } }
4975 If the matcher is used in clang-query, RegexFlags parameter
4976 should be passed as a quoted string. e.g:
"NoFlags".
4977 Flags can be combined with '|' example
"IgnoreCase | BasicRegex"
4981 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl
</a>></td><td class=
"name" onclick=
"toggle('isAnonymous0')"><a name=
"isAnonymous0Anchor">isAnonymous
</a></td><td></td></tr>
4982 <tr><td colspan=
"4" class=
"doc" id=
"isAnonymous0"><pre>Matches anonymous namespace declarations.
4988 namespaceDecl(isAnonymous()) will match #
1 but not ::n.
4992 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl
</a>></td><td class=
"name" onclick=
"toggle('isInline0')"><a name=
"isInline0Anchor">isInline
</a></td><td></td></tr>
4993 <tr><td colspan=
"4" class=
"doc" id=
"isInline0"><pre>Matches functions, variables and namespace declarations that are marked with
5000 inline namespace m {}
5003 functionDecl(isInline()) will match ::f().
5004 namespaceDecl(isInline()) will match n::m.
5005 varDecl(isInline()) will match Foo;
5009 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause
</a>></td><td class=
"name" onclick=
"toggle('isFirstPrivateKind0')"><a name=
"isFirstPrivateKind0Anchor">isFirstPrivateKind
</a></td><td></td></tr>
5010 <tr><td colspan=
"4" class=
"doc" id=
"isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
5015 #pragma omp parallel
5016 #pragma omp parallel default(none)
5017 #pragma omp parallel default(shared)
5018 #pragma omp parallel default(private)
5019 #pragma omp parallel default(firstprivate)
5021 ``ompDefaultClause(isFirstPrivateKind())`` matches only
5022 ``default(firstprivate)``.
5026 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause
</a>></td><td class=
"name" onclick=
"toggle('isNoneKind0')"><a name=
"isNoneKind0Anchor">isNoneKind
</a></td><td></td></tr>
5027 <tr><td colspan=
"4" class=
"doc" id=
"isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
5031 #pragma omp parallel
5032 #pragma omp parallel default(none)
5033 #pragma omp parallel default(shared)
5034 #pragma omp parallel default(private)
5035 #pragma omp parallel default(firstprivate)
5037 ``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
5041 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause
</a>></td><td class=
"name" onclick=
"toggle('isPrivateKind0')"><a name=
"isPrivateKind0Anchor">isPrivateKind
</a></td><td></td></tr>
5042 <tr><td colspan=
"4" class=
"doc" id=
"isPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``private`` kind
5047 #pragma omp parallel
5048 #pragma omp parallel default(none)
5049 #pragma omp parallel default(shared)
5050 #pragma omp parallel default(private)
5051 #pragma omp parallel default(firstprivate)
5053 ``ompDefaultClause(isPrivateKind())`` matches only
5054 ``default(private)``.
5058 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause
</a>></td><td class=
"name" onclick=
"toggle('isSharedKind0')"><a name=
"isSharedKind0Anchor">isSharedKind
</a></td><td></td></tr>
5059 <tr><td colspan=
"4" class=
"doc" id=
"isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
5063 #pragma omp parallel
5064 #pragma omp parallel default(none)
5065 #pragma omp parallel default(shared)
5066 #pragma omp parallel default(private)
5067 #pragma omp parallel default(firstprivate)
5069 ``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
5073 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective
</a>></td><td class=
"name" onclick=
"toggle('isAllowedToContainClauseKind0')"><a name=
"isAllowedToContainClauseKind0Anchor">isAllowedToContainClauseKind
</a></td><td>OpenMPClauseKind CKind
</td></tr>
5074 <tr><td colspan=
"4" class=
"doc" id=
"isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
5079 #pragma omp parallel
5080 #pragma omp parallel for
5083 `ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
5084 ``omp parallel`` and ``omp parallel for``.
5086 If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
5087 should be passed as a quoted string. e.g.,
5088 ``isAllowedToContainClauseKind(
"OMPC_default").``
5092 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective
</a>></td><td class=
"name" onclick=
"toggle('isStandaloneDirective0')"><a name=
"isStandaloneDirective0Anchor">isStandaloneDirective
</a></td><td></td></tr>
5093 <tr><td colspan=
"4" class=
"doc" id=
"isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
5094 i.e., directives that can't have a structured block.
5098 #pragma omp parallel
5100 #pragma omp taskyield
5102 ``ompExecutableDirective(isStandaloneDirective()))`` matches
5107 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl
</a>></td><td class=
"name" onclick=
"toggle('isDerivedFrom3')"><a name=
"isDerivedFrom3Anchor">isDerivedFrom
</a></td><td>std::string BaseName
</td></tr>
5108 <tr><td colspan=
"4" class=
"doc" id=
"isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
5112 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl
</a>></td><td class=
"name" onclick=
"toggle('isDirectlyDerivedFrom3')"><a name=
"isDirectlyDerivedFrom3Anchor">isDirectlyDerivedFrom
</a></td><td>std::string BaseName
</td></tr>
5113 <tr><td colspan=
"4" class=
"doc" id=
"isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
5117 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl
</a>></td><td class=
"name" onclick=
"toggle('isSameOrDerivedFrom3')"><a name=
"isSameOrDerivedFrom3Anchor">isSameOrDerivedFrom
</a></td><td>std::string BaseName
</td></tr>
5118 <tr><td colspan=
"4" class=
"doc" id=
"isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
5119 isSameOrDerivedFrom(hasName(...)).
5123 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr
</a>></td><td class=
"name" onclick=
"toggle('argumentCountAtLeast3')"><a name=
"argumentCountAtLeast3Anchor">argumentCountAtLeast
</a></td><td>unsigned N
</td></tr>
5124 <tr><td colspan=
"4" class=
"doc" id=
"argumentCountAtLeast3"><pre>Checks that a call expression or a constructor call expression has at least
5125 the specified number of arguments (including absent default arguments).
5127 Example matches f(
0,
0) and g(
0,
0,
0)
5128 (matcher = callExpr(argumentCountAtLeast(
2)))
5129 void f(int x, int y);
5130 void g(int x, int y, int z);
5136 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr
</a>></td><td class=
"name" onclick=
"toggle('argumentCountIs3')"><a name=
"argumentCountIs3Anchor">argumentCountIs
</a></td><td>unsigned N
</td></tr>
5137 <tr><td colspan=
"4" class=
"doc" id=
"argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has
5138 a specific number of arguments (including absent default arguments).
5140 Example matches f(
0,
0) (matcher = callExpr(argumentCountIs(
2)))
5141 void f(int x, int y);
5146 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr
</a>></td><td class=
"name" onclick=
"toggle('hasAnySelector0')"><a name=
"hasAnySelector0Anchor">hasAnySelector
</a></td><td>StringRef, ..., StringRef
</td></tr>
5147 <tr><td colspan=
"4" class=
"doc" id=
"hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
5148 Selector.getAsString()
5150 matcher = objCMessageExpr(hasSelector(
"methodA:",
"methodB:"));
5151 matches both of the expressions below:
5152 [myObj methodA:argA];
5153 [myObj methodB:argB];
5157 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr
</a>></td><td class=
"name" onclick=
"toggle('hasKeywordSelector0')"><a name=
"hasKeywordSelector0Anchor">hasKeywordSelector
</a></td><td></td></tr>
5158 <tr><td colspan=
"4" class=
"doc" id=
"hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
5160 objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
5161 message expression in
5163 UIWebView *webView = ...;
5164 CGRect bodyFrame = webView.frame;
5165 bodyFrame.size.height = self.bodyContentHeight;
5166 webView.frame = bodyFrame;
5167 // ^---- matches here
5171 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr
</a>></td><td class=
"name" onclick=
"toggle('hasNullSelector0')"><a name=
"hasNullSelector0Anchor">hasNullSelector
</a></td><td></td></tr>
5172 <tr><td colspan=
"4" class=
"doc" id=
"hasNullSelector0"><pre>Matches when the selector is the empty selector
5174 Matches only when the selector of the objCMessageExpr is NULL. This may
5175 represent an error condition in the tree!
5179 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr
</a>></td><td class=
"name" onclick=
"toggle('hasSelector0')"><a name=
"hasSelector0Anchor">hasSelector
</a></td><td>std::string BaseName
</td></tr>
5180 <tr><td colspan=
"4" class=
"doc" id=
"hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
5182 matcher = objCMessageExpr(hasSelector(
"loadHTMLString:baseURL:"));
5183 matches the outer message expr in the code below, but NOT the message
5184 invocation for self.bodyView.
5185 [self.bodyView loadHTMLString:html baseURL:NULL];
5189 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr
</a>></td><td class=
"name" onclick=
"toggle('hasUnarySelector0')"><a name=
"hasUnarySelector0Anchor">hasUnarySelector
</a></td><td></td></tr>
5190 <tr><td colspan=
"4" class=
"doc" id=
"hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
5192 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
5193 matches self.bodyView in the code below, but NOT the outer message
5194 invocation of
"loadHTMLString:baseURL:".
5195 [self.bodyView loadHTMLString:html baseURL:NULL];
5199 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr
</a>></td><td class=
"name" onclick=
"toggle('isClassMessage0')"><a name=
"isClassMessage0Anchor">isClassMessage
</a></td><td></td></tr>
5200 <tr><td colspan=
"4" class=
"doc" id=
"isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
5203 matcher = objcMessageExpr(isClassMessage())
5205 [NSString stringWithFormat:@
"format"];
5207 NSString *x = @
"hello";
5208 [x containsString:@
"h"];
5212 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr
</a>></td><td class=
"name" onclick=
"toggle('isInstanceMessage0')"><a name=
"isInstanceMessage0Anchor">isInstanceMessage
</a></td><td></td></tr>
5213 <tr><td colspan=
"4" class=
"doc" id=
"isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
5216 matcher = objcMessageExpr(isInstanceMessage())
5218 NSString *x = @
"hello";
5219 [x containsString:@
"h"];
5221 [NSString stringWithFormat:@
"format"];
5225 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr
</a>></td><td class=
"name" onclick=
"toggle('matchesSelector0')"><a name=
"matchesSelector0Anchor">matchesSelector
</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags
</td></tr>
5226 <tr><td colspan=
"4" class=
"doc" id=
"matchesSelector0"><pre>Matches ObjC selectors whose name contains
5227 a substring matched by the given RegExp.
5228 matcher = objCMessageExpr(matchesSelector(
"loadHTMLStringmatches the outer message expr in the code below, but NOT the message
5229 invocation for self.bodyView.
5230 [self.bodyView loadHTMLString:html baseURL:NULL];
5232 If the matcher is used in clang-query, RegexFlags parameter
5233 should be passed as a quoted string. e.g: "NoFlags
".
5234 Flags can be combined with '|' example "IgnoreCase | BasicRegex
"
5238 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html
">ObjCMessageExpr</a>></td><td class="name
" onclick="toggle('numSelectorArgs0')
"><a name="numSelectorArgs0Anchor
">numSelectorArgs</a></td><td>unsigned N</td></tr>
5239 <tr><td colspan="4" class="doc
" id="numSelectorArgs0
"><pre>Matches when the selector has the specified number of arguments
5241 matcher = objCMessageExpr(numSelectorArgs(0));
5242 matches self.bodyView in the code below
5244 matcher = objCMessageExpr(numSelectorArgs(2));
5245 matches the invocation of "loadHTMLString:baseURL:
" but not that
5247 [self.bodyView loadHTMLString:html baseURL:NULL];
5251 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html
">ObjCMethodDecl</a>></td><td class="name
" onclick="toggle('isClassMethod0')
"><a name="isClassMethod0Anchor
">isClassMethod</a></td><td></td></tr>
5252 <tr><td colspan="4" class="doc
" id="isClassMethod0
"><pre>Returns true when the Objective-C method declaration is a class method.
5255 matcher = objcMethodDecl(isClassMethod())
5257 @interface I + (void)foo; @end
5259 @interface I - (void)bar; @end
5263 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html
">ObjCMethodDecl</a>></td><td class="name
" onclick="toggle('isDefinition2')
"><a name="isDefinition2Anchor
">isDefinition</a></td><td></td></tr>
5264 <tr><td colspan="4" class="doc
" id="isDefinition2
"><pre>Matches if a declaration has a body attached.
5266 Example matches A, va, fa
5268 class B; // Doesn't match, as it has no body.
5270 extern int vb; // Doesn't match, as it doesn't define the variable.
5272 void fb(); // Doesn't match, as it has no body.
5274 - (void)ma; // Doesn't match, interface is declaration.
5280 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html
">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>>,
5281 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html
">ObjCMethodDecl</a>>
5285 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html
">ObjCMethodDecl</a>></td><td class="name
" onclick="toggle('isInstanceMethod0')
"><a name="isInstanceMethod0Anchor
">isInstanceMethod</a></td><td></td></tr>
5286 <tr><td colspan="4" class="doc
" id="isInstanceMethod0
"><pre>Returns true when the Objective-C method declaration is an instance method.
5289 matcher = objcMethodDecl(isInstanceMethod())
5291 @interface I - (void)bar; @end
5293 @interface I + (void)foo; @end
5297 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html
">ParmVarDecl</a>></td><td class="name
" onclick="toggle('hasDefaultArgument0')
"><a name="hasDefaultArgument0Anchor
">hasDefaultArgument</a></td><td></td></tr>
5298 <tr><td colspan="4" class="doc
" id="hasDefaultArgument0
"><pre>Matches a declaration that has default arguments.
5300 Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
5302 void y(int val = 0) {}
5304 Deprecated. Use hasInitializer() instead to be able to
5305 match on the contents of the default argument. For example:
5307 void x(int val = 7) {}
5308 void y(int val = 42) {}
5309 parmVarDecl(hasInitializer(integerLiteral(equals(42))))
5310 matches the parameter of y
5313 parmVarDecl(hasInitializer(anything()))
5314 is equivalent to parmVarDecl(hasDefaultArgument()).
5318 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html
">ParmVarDecl</a>></td><td class="name
" onclick="toggle('isAtPosition0')
"><a name="isAtPosition0Anchor
">isAtPosition</a></td><td>unsigned N</td></tr>
5319 <tr><td colspan="4" class="doc
" id="isAtPosition0
"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter
5320 list. The parameter list could be that of either a block, function, or
5326 void f(int a, int b, int c) {
5329 ``parmVarDecl(isAtPosition(0))`` matches ``int a``.
5331 ``parmVarDecl(isAtPosition(1))`` matches ``int b``.
5335 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>></td><td class="name
" onclick="toggle('asString0')
"><a name="asString0Anchor
">asString</a></td><td>std::string Name</td></tr>
5336 <tr><td colspan="4" class="doc
" id="asString0
"><pre>Matches if the matched type is represented by the given string.
5339 class Y { public: void x(); };
5340 void z() { Y* y; y->x(); }
5341 cxxMemberCallExpr(on(hasType(asString("class Y *
"))))
5346 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>></td><td class="name
" onclick="toggle('equalsBoundNode3')
"><a name="equalsBoundNode3Anchor
">equalsBoundNode</a></td><td>std::string ID</td></tr>
5347 <tr><td colspan="4" class="doc
" id="equalsBoundNode3
"><pre>Matches if a node equals a previously bound node.
5349 Matches a node if it equals the node previously bound to ID.
5352 class X { int a; int b; };
5354 has(fieldDecl(hasName("a
"), hasType(type().bind("t
")))),
5355 has(fieldDecl(hasName("b
"), hasType(type(equalsBoundNode("t
"))))))
5356 matches the class X, as a and b have the same type.
5358 Note that when multiple matches are involved via forEach* matchers,
5359 equalsBoundNodes acts as a filter.
5362 forEachDescendant(varDecl().bind("d
")),
5363 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d
"))))))
5364 will trigger a match for each combination of variable declaration
5365 and reference to that variable declaration within a compound statement.
5369 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>></td><td class="name
" onclick="toggle('hasLocalQualifiers0')
"><a name="hasLocalQualifiers0Anchor
">hasLocalQualifiers</a></td><td></td></tr>
5370 <tr><td colspan="4" class="doc
" id="hasLocalQualifiers0
"><pre>Matches QualType nodes that have local CV-qualifiers attached to
5371 the node, not hidden within a typedef.
5374 typedef const int const_int;
5379 varDecl(hasType(hasLocalQualifiers())) matches only j and k.
5380 i is const-qualified but the qualifier is not local.
5384 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>></td><td class="name
" onclick="toggle('isAnyCharacter0')
"><a name="isAnyCharacter0Anchor
">isAnyCharacter</a></td><td></td></tr>
5385 <tr><td colspan="4" class="doc
" id="isAnyCharacter0
"><pre>Matches QualType nodes that are of character type.
5391 functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
5392 matches "a(char)
", "b(wchar_t)
", but not "c(double)
".
5396 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>></td><td class="name
" onclick="toggle('isAnyPointer0')
"><a name="isAnyPointer0Anchor
">isAnyPointer</a></td><td></td></tr>
5397 <tr><td colspan="4" class="doc
" id="isAnyPointer0
"><pre>Matches QualType nodes that are of any pointer type; this includes
5398 the Objective-C object pointer type, which is different despite being
5399 syntactically similar.
5409 varDecl(hasType(isAnyPointer()))
5410 matches "int *i
" and "Foo *f
", but not "int j
".
5414 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>></td><td class="name
" onclick="toggle('isConstQualified0')
"><a name="isConstQualified0Anchor
">isConstQualified</a></td><td></td></tr>
5415 <tr><td colspan="4" class="doc
" id="isConstQualified0
"><pre>Matches QualType nodes that are const-qualified, i.e., that
5416 include "top-level
" const.
5423 void e(int const) {};
5424 functionDecl(hasAnyParameter(hasType(isConstQualified())))
5425 matches "void b(int const)
", "void c(const int)
" and
5426 "void e(int const) {}
". It does not match d as there
5427 is no top-level const on the parameter type "const int *
".
5431 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>></td><td class="name
" onclick="toggle('isInteger0')
"><a name="isInteger0Anchor
">isInteger</a></td><td></td></tr>
5432 <tr><td colspan="4" class="doc
" id="isInteger0
"><pre>Matches QualType nodes that are of integer type.
5438 functionDecl(hasAnyParameter(hasType(isInteger())))
5439 matches "a(int)
", "b(long)
", but not "c(double)
".
5443 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>></td><td class="name
" onclick="toggle('isSignedInteger0')
"><a name="isSignedInteger0Anchor
">isSignedInteger</a></td><td></td></tr>
5444 <tr><td colspan="4" class="doc
" id="isSignedInteger0
"><pre>Matches QualType nodes that are of signed integer type.
5448 void b(unsigned long);
5450 functionDecl(hasAnyParameter(hasType(isSignedInteger())))
5451 matches "a(int)
", but not "b(unsigned long)
" and "c(double)
".
5455 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>></td><td class="name
" onclick="toggle('isUnsignedInteger0')
"><a name="isUnsignedInteger0Anchor
">isUnsignedInteger</a></td><td></td></tr>
5456 <tr><td colspan="4" class="doc
" id="isUnsignedInteger0
"><pre>Matches QualType nodes that are of unsigned integer type.
5460 void b(unsigned long);
5462 functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
5463 matches "b(unsigned long)
", but not "a(int)
" and "c(double)
".
5467 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>></td><td class="name
" onclick="toggle('isVolatileQualified0')
"><a name="isVolatileQualified0Anchor
">isVolatileQualified</a></td><td></td></tr>
5468 <tr><td colspan="4" class="doc
" id="isVolatileQualified0
"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
5469 include "top-level
" volatile.
5473 void b(int volatile);
5474 void c(volatile int);
5475 void d(volatile int*);
5476 void e(int volatile) {};
5477 functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
5478 matches "void b(int volatile)
", "void c(volatile int)
" and
5479 "void e(int volatile) {}
". It does not match d as there
5480 is no top-level volatile on the parameter type "volatile int *
".
5484 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>></td><td class="name
" onclick="toggle('equalsBoundNode0')
"><a name="equalsBoundNode0Anchor
">equalsBoundNode</a></td><td>std::string ID</td></tr>
5485 <tr><td colspan="4" class="doc
" id="equalsBoundNode0
"><pre>Matches if a node equals a previously bound node.
5487 Matches a node if it equals the node previously bound to ID.
5490 class X { int a; int b; };
5492 has(fieldDecl(hasName("a
"), hasType(type().bind("t
")))),
5493 has(fieldDecl(hasName("b
"), hasType(type(equalsBoundNode("t
"))))))
5494 matches the class X, as a and b have the same type.
5496 Note that when multiple matches are involved via forEach* matchers,
5497 equalsBoundNodes acts as a filter.
5500 forEachDescendant(varDecl().bind("d
")),
5501 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d
"))))))
5502 will trigger a match for each combination of variable declaration
5503 and reference to that variable declaration within a compound statement.
5507 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>></td><td class="name
" onclick="toggle('equalsNode1')
"><a name="equalsNode1Anchor
">equalsNode</a></td><td>const Stmt* Other</td></tr>
5508 <tr><td colspan="4" class="doc
" id="equalsNode1
"><pre>Matches if a node equals another node.
5510 Stmt has pointer identity in the AST.
5514 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>></td><td class="name
" onclick="toggle('isExpandedFromMacro1')
"><a name="isExpandedFromMacro1Anchor
">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
5515 <tr><td colspan="4" class="doc
" id="isExpandedFromMacro1
"><pre>Matches statements that are (transitively) expanded from the named macro.
5516 Does not match if only part of the statement is expanded from that macro or
5517 if different parts of the statement are expanded from different
5518 appearances of the macro.
5522 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>></td><td class="name
" onclick="toggle('isExpansionInFileMatching1')
"><a name="isExpansionInFileMatching1Anchor
">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
5523 <tr><td colspan="4" class="doc
" id="isExpansionInFileMatching1
"><pre>Matches AST nodes that were expanded within files whose name is
5524 partially matching a given regex.
5526 Example matches Y but not X
5527 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*
"))
5528 #include "ASTMatcher.h
"
5533 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>>
5535 If the matcher is used in clang-query, RegexFlags parameter
5536 should be passed as a quoted string. e.g: "NoFlags
".
5537 Flags can be combined with '|' example "IgnoreCase | BasicRegex
"
5541 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>></td><td class="name
" onclick="toggle('isExpansionInMainFile1')
"><a name="isExpansionInMainFile1Anchor
">isExpansionInMainFile</a></td><td></td></tr>
5542 <tr><td colspan="4" class="doc
" id="isExpansionInMainFile1
"><pre>Matches AST nodes that were expanded within the main-file.
5544 Example matches X but not Y
5545 (matcher = cxxRecordDecl(isExpansionInMainFile())
5546 #include <Y.h>
5551 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>>
5555 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>></td><td class="name
" onclick="toggle('isExpansionInSystemHeader1')
"><a name="isExpansionInSystemHeader1Anchor
">isExpansionInSystemHeader</a></td><td></td></tr>
5556 <tr><td colspan="4" class="doc
" id="isExpansionInSystemHeader1
"><pre>Matches AST nodes that were expanded within system-header-files.
5558 Example matches Y but not X
5559 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5560 #include <SystemHeader.h>
5565 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>>
5569 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>></td><td class="name
" onclick="toggle('isInTemplateInstantiation0')
"><a name="isInTemplateInstantiation0Anchor
">isInTemplateInstantiation</a></td><td></td></tr>
5570 <tr><td colspan="4" class="doc
" id="isInTemplateInstantiation0
"><pre>Matches statements inside of a template instantiation.
5574 template<typename T> void A(T t) { T i; j += 42;}
5577 declStmt(isInTemplateInstantiation())
5578 matches 'int i;' and 'unsigned i'.
5579 unless(stmt(isInTemplateInstantiation()))
5580 will NOT match j += 42; as it's shared between the template definition and
5585 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html
">StringLiteral</a>></td><td class="name
" onclick="toggle('hasSize1')
"><a name="hasSize1Anchor
">hasSize</a></td><td>unsigned N</td></tr>
5586 <tr><td colspan="4" class="doc
" id="hasSize1
"><pre>Matches nodes that have the specified size.
5593 wchar_t *ws = L"abcd
";
5595 constantArrayType(hasSize(42))
5596 matches "int a[
42]
" and "int b[
2 *
21]
"
5597 stringLiteral(hasSize(4))
5598 matches "abcd
", L"abcd
"
5602 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html
">TagDecl</a>></td><td class="name
" onclick="toggle('isClass0')
"><a name="isClass0Anchor
">isClass</a></td><td></td></tr>
5603 <tr><td colspan="4" class="doc
" id="isClass0
"><pre>Matches TagDecl object that are spelled with "class.
"
5605 Example matches C, but not S, U or E.
5613 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html
">TagDecl</a>></td><td class="name
" onclick="toggle('isDefinition0')
"><a name="isDefinition0Anchor
">isDefinition</a></td><td></td></tr>
5614 <tr><td colspan="4" class="doc
" id="isDefinition0
"><pre>Matches if a declaration has a body attached.
5616 Example matches A, va, fa
5618 class B; // Doesn't match, as it has no body.
5620 extern int vb; // Doesn't match, as it doesn't define the variable.
5622 void fb(); // Doesn't match, as it has no body.
5624 - (void)ma; // Doesn't match, interface is declaration.
5630 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html
">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>>,
5631 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html
">ObjCMethodDecl</a>>
5635 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html
">TagDecl</a>></td><td class="name
" onclick="toggle('isEnum0')
"><a name="isEnum0Anchor
">isEnum</a></td><td></td></tr>
5636 <tr><td colspan="4" class="doc
" id="isEnum0
"><pre>Matches TagDecl object that are spelled with "enum.
"
5638 Example matches E, but not C, S or U.
5646 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html
">TagDecl</a>></td><td class="name
" onclick="toggle('isStruct0')
"><a name="isStruct0Anchor
">isStruct</a></td><td></td></tr>
5647 <tr><td colspan="4" class="doc
" id="isStruct0
"><pre>Matches TagDecl object that are spelled with "struct.
"
5649 Example matches S, but not C, U or E.
5657 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html
">TagDecl</a>></td><td class="name
" onclick="toggle('isUnion0')
"><a name="isUnion0Anchor
">isUnion</a></td><td></td></tr>
5658 <tr><td colspan="4" class="doc
" id="isUnion0
"><pre>Matches TagDecl object that are spelled with "union.
"
5660 Example matches U, but not C, S or E.
5668 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>></td><td class="name
" onclick="toggle('equalsIntegralValue0')
"><a name="equalsIntegralValue0Anchor
">equalsIntegralValue</a></td><td>std::string Value</td></tr>
5669 <tr><td colspan="4" class="doc
" id="equalsIntegralValue0
"><pre>Matches a TemplateArgument of integral type with a given value.
5671 Note that 'Value' is a string as the template argument's value is
5672 an arbitrary precision integer. 'Value' must be euqal to the canonical
5673 representation of that integral value in base 10.
5676 template<int T> struct C {};
5678 classTemplateSpecializationDecl(
5679 hasAnyTemplateArgument(equalsIntegralValue("42")))
5680 matches the implicit instantiation of C in C<42>.
5684 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>></td><td class="name
" onclick="toggle('isIntegral0')
"><a name="isIntegral0Anchor
">isIntegral</a></td><td></td></tr>
5685 <tr><td colspan="4" class="doc
" id="isIntegral0
"><pre>Matches a TemplateArgument that is an integral value.
5688 template<int T> struct C {};
5690 classTemplateSpecializationDecl(
5691 hasAnyTemplateArgument(isIntegral()))
5692 matches the implicit instantiation of C in C<42>
5693 with isIntegral() matching 42.
5697 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>></td><td class="name
" onclick="toggle('templateArgumentCountIs1')
"><a name="templateArgumentCountIs1Anchor
">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
5698 <tr><td colspan="4" class="doc
" id="templateArgumentCountIs1
"><pre>Matches if the number of template arguments equals N.
5701 template<typename T> struct C {};
5703 classTemplateSpecializationDecl(templateArgumentCountIs(1))
5704 matches C<int>.
5708 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>></td><td class="name
" onclick="toggle('isExpandedFromMacro2')
"><a name="isExpandedFromMacro2Anchor
">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
5709 <tr><td colspan="4" class="doc
" id="isExpandedFromMacro2
"><pre>Matches statements that are (transitively) expanded from the named macro.
5710 Does not match if only part of the statement is expanded from that macro or
5711 if different parts of the statement are expanded from different
5712 appearances of the macro.
5716 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>></td><td class="name
" onclick="toggle('isExpansionInFileMatching2')
"><a name="isExpansionInFileMatching2Anchor
">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
5717 <tr><td colspan="4" class="doc
" id="isExpansionInFileMatching2
"><pre>Matches AST nodes that were expanded within files whose name is
5718 partially matching a given regex.
5720 Example matches Y but not X
5721 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*
"))
5722 #include "ASTMatcher.h
"
5727 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>>
5729 If the matcher is used in clang-query, RegexFlags parameter
5730 should be passed as a quoted string. e.g: "NoFlags
".
5731 Flags can be combined with '|' example "IgnoreCase | BasicRegex
"
5735 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>></td><td class="name
" onclick="toggle('isExpansionInMainFile2')
"><a name="isExpansionInMainFile2Anchor
">isExpansionInMainFile</a></td><td></td></tr>
5736 <tr><td colspan="4" class="doc
" id="isExpansionInMainFile2
"><pre>Matches AST nodes that were expanded within the main-file.
5738 Example matches X but not Y
5739 (matcher = cxxRecordDecl(isExpansionInMainFile())
5740 #include <Y.h>
5745 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>>
5749 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>></td><td class="name
" onclick="toggle('isExpansionInSystemHeader2')
"><a name="isExpansionInSystemHeader2Anchor
">isExpansionInSystemHeader</a></td><td></td></tr>
5750 <tr><td colspan="4" class="doc
" id="isExpansionInSystemHeader2
"><pre>Matches AST nodes that were expanded within system-header-files.
5752 Example matches Y but not X
5753 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5754 #include <SystemHeader.h>
5759 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>>
5763 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html
">Type</a>></td><td class="name
" onclick="toggle('booleanType0')
"><a name="booleanType0Anchor
">booleanType</a></td><td></td></tr>
5764 <tr><td colspan="4" class="doc
" id="booleanType0
"><pre>Matches type bool.
5767 struct S { bool func(); };
5768 functionDecl(returns(booleanType()))
5769 matches "bool func();
"
5773 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html
">Type</a>></td><td class="name
" onclick="toggle('equalsBoundNode2')
"><a name="equalsBoundNode2Anchor
">equalsBoundNode</a></td><td>std::string ID</td></tr>
5774 <tr><td colspan="4" class="doc
" id="equalsBoundNode2
"><pre>Matches if a node equals a previously bound node.
5776 Matches a node if it equals the node previously bound to ID.
5779 class X { int a; int b; };
5781 has(fieldDecl(hasName("a
"), hasType(type().bind("t
")))),
5782 has(fieldDecl(hasName("b
"), hasType(type(equalsBoundNode("t
"))))))
5783 matches the class X, as a and b have the same type.
5785 Note that when multiple matches are involved via forEach* matchers,
5786 equalsBoundNodes acts as a filter.
5789 forEachDescendant(varDecl().bind("d
")),
5790 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d
"))))))
5791 will trigger a match for each combination of variable declaration
5792 and reference to that variable declaration within a compound statement.
5796 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html
">Type</a>></td><td class="name
" onclick="toggle('equalsNode2')
"><a name="equalsNode2Anchor
">equalsNode</a></td><td>const Type* Other</td></tr>
5797 <tr><td colspan="4" class="doc
" id="equalsNode2
"><pre>Matches if a node equals another node.
5799 Type has pointer identity in the AST.
5803 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html
">Type</a>></td><td class="name
" onclick="toggle('realFloatingPointType0')
"><a name="realFloatingPointType0Anchor
">realFloatingPointType</a></td><td></td></tr>
5804 <tr><td colspan="4" class="doc
" id="realFloatingPointType0
"><pre>Matches any real floating-point type (float, double, long double).
5809 realFloatingPointType()
5810 matches "float f
" but not "int i
"
5814 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html
">Type</a>></td><td class="name
" onclick="toggle('voidType0')
"><a name="voidType0Anchor
">voidType</a></td><td></td></tr>
5815 <tr><td colspan="4" class="doc
" id="voidType0
"><pre>Matches type void.
5818 struct S { void func(); };
5819 functionDecl(returns(voidType()))
5820 matches "void func();
"
5824 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html
">UnaryExprOrTypeTraitExpr</a>></td><td class="name
" onclick="toggle('ofKind0')
"><a name="ofKind0Anchor
">ofKind</a></td><td>UnaryExprOrTypeTrait Kind</td></tr>
5825 <tr><td colspan="4" class="doc
" id="ofKind0
"><pre>Matches unary expressions of a certain kind.
5829 int s = sizeof(x) + alignof(x)
5830 unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
5833 If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
5834 should be passed as a quoted string. e.g., ofKind("UETT_SizeOf
").
5838 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html
">UnaryOperator</a>></td><td class="name
" onclick="toggle('hasAnyOperatorName3')
"><a name="hasAnyOperatorName3Anchor
">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
5839 <tr><td colspan="4" class="doc
" id="hasAnyOperatorName3
"><pre>Matches operator expressions (binary or unary) that have any of the
5842 hasAnyOperatorName("+
", "-
")
5844 anyOf(hasOperatorName("+
"), hasOperatorName("-
"))
5848 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html
">UnaryOperator</a>></td><td class="name
" onclick="toggle('hasOperatorName4')
"><a name="hasOperatorName4Anchor
">hasOperatorName</a></td><td>std::string Name</td></tr>
5849 <tr><td colspan="4" class="doc
" id="hasOperatorName4
"><pre>Matches the operator Name of operator expressions and fold expressions
5852 Example matches a || b (matcher = binaryOperator(hasOperatorName("||
")))
5855 Example matches `(0 + ... + args)`
5856 (matcher = cxxFoldExpr(hasOperatorName("+
")))
5857 template <typename... Args>
5858 auto sum(Args... args) {
5859 return (0 + ... + args);
5864 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html
">UnresolvedMemberExpr</a>></td><td class="name
" onclick="toggle('isArrow1')
"><a name="isArrow1Anchor
">isArrow</a></td><td></td></tr>
5865 <tr><td colspan="4" class="doc
" id="isArrow1
"><pre>Matches member expressions that are called with '->' as opposed
5868 Member calls on the implicit this pointer match as called with '->'.
5872 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
5873 template <class T> void f() { this->f<T>(); f<T>(); }
5877 template <class T>
5879 void x() { this->m; }
5881 memberExpr(isArrow())
5882 matches this->x, x, y.x, a, this->b
5883 cxxDependentScopeMemberExpr(isArrow())
5885 unresolvedMemberExpr(isArrow())
5886 matches this->f<T>, f<T>
5890 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('hasAutomaticStorageDuration0')
"><a name="hasAutomaticStorageDuration0Anchor
">hasAutomaticStorageDuration</a></td><td></td></tr>
5891 <tr><td colspan="4" class="doc
" id="hasAutomaticStorageDuration0
"><pre>Matches a variable declaration that has automatic storage duration.
5893 Example matches x, but not y, z, or a.
5894 (matcher = varDecl(hasAutomaticStorageDuration())
5904 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('hasGlobalStorage0')
"><a name="hasGlobalStorage0Anchor
">hasGlobalStorage</a></td><td></td></tr>
5905 <tr><td colspan="4" class="doc
" id="hasGlobalStorage0
"><pre>Matches a variable declaration that does not have local storage.
5907 Example matches y and z (matcher = varDecl(hasGlobalStorage())
5916 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('hasLocalStorage0')
"><a name="hasLocalStorage0Anchor
">hasLocalStorage</a></td><td></td></tr>
5917 <tr><td colspan="4" class="doc
" id="hasLocalStorage0
"><pre>Matches a variable declaration that has function scope and is a
5918 non-static local variable.
5920 Example matches x (matcher = varDecl(hasLocalStorage())
5929 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('hasStaticStorageDuration0')
"><a name="hasStaticStorageDuration0Anchor
">hasStaticStorageDuration</a></td><td></td></tr>
5930 <tr><td colspan="4" class="doc
" id="hasStaticStorageDuration0
"><pre>Matches a variable declaration that has static storage duration.
5931 It includes the variable declared at namespace scope and those declared
5932 with "static
" and "extern
" storage class specifiers.
5942 varDecl(hasStaticStorageDuration())
5943 matches the function declaration y, a, b and c.
5947 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('hasThreadStorageDuration0')
"><a name="hasThreadStorageDuration0Anchor
">hasThreadStorageDuration</a></td><td></td></tr>
5948 <tr><td colspan="4" class="doc
" id="hasThreadStorageDuration0
"><pre>Matches a variable declaration that has thread storage duration.
5950 Example matches z, but not x, z, or a.
5951 (matcher = varDecl(hasThreadStorageDuration())
5961 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('isConstexpr0')
"><a name="isConstexpr0Anchor
">isConstexpr</a></td><td></td></tr>
5962 <tr><td colspan="4" class="doc
" id="isConstexpr0
"><pre>Matches constexpr variable and function declarations,
5966 constexpr int foo = 42;
5967 constexpr int bar();
5968 void baz() { if constexpr(1 > 0) {} }
5969 varDecl(isConstexpr())
5970 matches the declaration of foo.
5971 functionDecl(isConstexpr())
5972 matches the declaration of bar.
5973 ifStmt(isConstexpr())
5974 matches the if statement in baz.
5978 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('isConstinit0')
"><a name="isConstinit0Anchor
">isConstinit</a></td><td></td></tr>
5979 <tr><td colspan="4" class="doc
" id="isConstinit0
"><pre>Matches constinit variable declarations.
5982 constinit int foo = 42;
5983 constinit const char* bar = "bar
";
5985 [[clang::require_constant_initialization]] int xyz = 42;
5986 varDecl(isConstinit())
5987 matches the declaration of `foo` and `bar`, but not `baz` and `xyz`.
5991 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('isDefinition1')
"><a name="isDefinition1Anchor
">isDefinition</a></td><td></td></tr>
5992 <tr><td colspan="4" class="doc
" id="isDefinition1
"><pre>Matches if a declaration has a body attached.
5994 Example matches A, va, fa
5996 class B; // Doesn't match, as it has no body.
5998 extern int vb; // Doesn't match, as it doesn't define the variable.
6000 void fb(); // Doesn't match, as it has no body.
6002 - (void)ma; // Doesn't match, interface is declaration.
6008 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html
">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>>,
6009 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html
">ObjCMethodDecl</a>>
6013 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('isExceptionVariable0')
"><a name="isExceptionVariable0Anchor
">isExceptionVariable</a></td><td></td></tr>
6014 <tr><td colspan="4" class="doc
" id="isExceptionVariable0
"><pre>Matches a variable declaration that is an exception variable from
6015 a C++ catch block, or an Objective-C statement.
6017 Example matches x (matcher = varDecl(isExceptionVariable())
6026 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('isExplicitTemplateSpecialization1')
"><a name="isExplicitTemplateSpecialization1Anchor
">isExplicitTemplateSpecialization</a></td><td></td></tr>
6027 <tr><td colspan="4" class="doc
" id="isExplicitTemplateSpecialization1
"><pre>Matches explicit template specializations of function, class, or
6028 static member variable template instantiations.
6031 template<typename T> void A(T t) { }
6032 template<> void A(int N) { }
6033 functionDecl(isExplicitTemplateSpecialization())
6034 matches the specialization A<int>().
6036 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html
">CXXRecordDecl</a>>
6040 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('isExternC1')
"><a name="isExternC1Anchor
">isExternC</a></td><td></td></tr>
6041 <tr><td colspan="4" class="doc
" id="isExternC1
"><pre>Matches extern "C
" function or variable declarations.
6044 extern "C
" void f() {}
6045 extern "C
" { void g() {} }
6047 extern "C
" int x = 1;
6048 extern "C
" int y = 2;
6050 functionDecl(isExternC())
6051 matches the declaration of f and g, but not the declaration of h.
6052 varDecl(isExternC())
6053 matches the declaration of x and y, but not the declaration of z.
6057 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('isInitCapture0')
"><a name="isInitCapture0Anchor
">isInitCapture</a></td><td></td></tr>
6058 <tr><td colspan="4" class="doc
" id="isInitCapture0
"><pre>Matches a variable serving as the implicit variable for a lambda init-
6061 Example matches x (matcher = varDecl(isInitCapture()))
6062 auto f = [x=3]() { return x; };
6066 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('isInline2')
"><a name="isInline2Anchor
">isInline</a></td><td></td></tr>
6067 <tr><td colspan="4" class="doc
" id="isInline2
"><pre>Matches functions, variables and namespace declarations that are marked with
6074 inline namespace m {}
6077 functionDecl(isInline()) will match ::f().
6078 namespaceDecl(isInline()) will match n::m.
6079 varDecl(isInline()) will match Foo;
6083 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('isStaticLocal0')
"><a name="isStaticLocal0Anchor
">isStaticLocal</a></td><td></td></tr>
6084 <tr><td colspan="4" class="doc
" id="isStaticLocal0
"><pre>Matches a static variable with local scope.
6086 Example matches y (matcher = varDecl(isStaticLocal()))
6095 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('isStaticStorageClass1')
"><a name="isStaticStorageClass1Anchor
">isStaticStorageClass</a></td><td></td></tr>
6096 <tr><td colspan="4" class="doc
" id="isStaticStorageClass1
"><pre>Matches variable/function declarations that have "static
" storage
6097 class specifier ("static
" keyword) written in the source.
6104 functionDecl(isStaticStorageClass())
6105 matches the function declaration f.
6106 varDecl(isStaticStorageClass())
6107 matches the variable declaration i.
6111 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('isTemplateInstantiation1')
"><a name="isTemplateInstantiation1Anchor
">isTemplateInstantiation</a></td><td></td></tr>
6112 <tr><td colspan="4" class="doc
" id="isTemplateInstantiation1
"><pre>Matches template instantiations of function, class, or static
6113 member variable template instantiations.
6116 template <typename T> class X {}; class A {}; X<A> x;
6118 template <typename T> class X {}; class A {}; template class X<A>;
6120 template <typename T> class X {}; class A {}; extern template class X<A>;
6121 cxxRecordDecl(hasName("::X
"), isTemplateInstantiation())
6122 matches the template instantiation of X<A>.
6125 template <typename T> class X {}; class A {};
6126 template <> class X<A> {}; X<A> x;
6127 cxxRecordDecl(hasName("::X
"), isTemplateInstantiation())
6128 does not match, as X<A> is an explicit template specialization.
6130 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html
">CXXRecordDecl</a>>
6133 <!--END_NARROWING_MATCHERS -->
6136 <!-- ======================================================================= -->
6137 <h2 id="traversal-matchers
">AST Traversal Matchers</h2>
6138 <!-- ======================================================================= -->
6140 <p>Traversal matchers specify the relationship to other nodes that are
6141 reachable from the current node.</p>
6143 <p>Note that there are special traversal matchers (has, hasDescendant, forEach and
6144 forEachDescendant) which work on all nodes and allow users to write more generic
6145 match expressions.</p>
6148 <tr style="text-align:left
"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
6149 <!-- START_TRAVERSAL_MATCHERS -->
6151 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('binaryOperation0')
"><a name="binaryOperation0Anchor
">binaryOperation</a></td><td>Matcher<*>...Matcher<*></td></tr>
6152 <tr><td colspan="4" class="doc
" id="binaryOperation0
"><pre>Matches nodes which can be used with binary operators.
6156 might be represented in the clang AST as a binaryOperator, a
6157 cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on
6159 * whether the types of var1 and var2 are fundamental (binaryOperator) or at
6160 least one is a class type (cxxOperatorCallExpr)
6161 * whether the code appears in a template declaration, if at least one of the
6162 vars is a dependent-type (binaryOperator)
6163 * whether the code relies on a rewritten binary operator, such as a
6164 spaceship operator or an inverted equality operator
6165 (cxxRewrittenBinaryOperator)
6167 This matcher elides details in places where the matchers for the nodes are
6172 hasOperatorName("!=
"),
6173 hasLHS(expr().bind("lhs
")),
6174 hasRHS(expr().bind("rhs
"))
6176 matches each use of "!=
" in:
6178 bool operator!=(const S&) const;
6187 template<typename T>
6195 bool operator==(const HasOpEq &) const;
6208 bool operator<=>(const HasOpEq &) const;
6211 void use_spaceship()
6221 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('eachOf0')
"><a name="eachOf0Anchor
">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr>
6222 <tr><td colspan="4" class="doc
" id="eachOf0
"><pre>Matches if any of the given matchers matches.
6224 Unlike anyOf, eachOf will generate a match result for each
6225 matching submatcher.
6228 class A { int a; int b; };
6230 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a
")).bind("v
")),
6231 has(fieldDecl(hasName("b
")).bind("v
"))))
6232 will generate two results binding "v
", the first of which binds
6233 the field declaration of a, the second the field declaration of
6236 Usable as: Any Matcher
6240 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('findAll0')
"><a name="findAll0Anchor
">findAll</a></td><td>Matcher<*> Matcher</td></tr>
6241 <tr><td colspan="4" class="doc
" id="findAll0
"><pre>Matches if the node or any descendant matches.
6243 Generates results for each match.
6246 class A { class B {}; class C {}; };
6248 cxxRecordDecl(hasName("::A
"),
6249 findAll(cxxRecordDecl(isDefinition()).bind("m
")))
6250 will generate results for A, B and C.
6252 Usable as: Any Matcher
6256 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('forEachDescendant0')
"><a name="forEachDescendant0Anchor
">forEachDescendant</a></td><td>Matcher<*></td></tr>
6257 <tr><td colspan="4" class="doc
" id="forEachDescendant0
"><pre>Matches AST nodes that have descendant AST nodes that match the
6260 Example matches X, A, A::X, B, B::C, B::C::X
6261 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X
")))))
6263 class A { class X {}; }; // Matches A, because A::X is a class of name
6265 class B { class C { class X {}; }; };
6267 DescendantT must be an AST base type.
6269 As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
6270 each result that matches instead of only on the first one.
6272 Note: Recursively combined ForEachDescendant can cause many matches:
6273 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
6274 forEachDescendant(cxxRecordDecl())
6276 will match 10 times (plus injected class name matches) on:
6277 class A { class B { class C { class D { class E {}; }; }; }; };
6279 Usable as: Any Matcher
6283 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('forEach0')
"><a name="forEach0Anchor
">forEach</a></td><td>Matcher<*></td></tr>
6284 <tr><td colspan="4" class="doc
" id="forEach0
"><pre>Matches AST nodes that have child AST nodes that match the
6287 Example matches X, Y, Y::X, Z::Y, Z::Y::X
6288 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X
")))
6290 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X
6292 class Z { class Y { class X {}; }; }; // Does not match Z.
6294 ChildT must be an AST base type.
6296 As opposed to 'has', 'forEach' will cause a match for each result that
6297 matches instead of only on the first one.
6299 Usable as: Any Matcher
6303 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('hasAncestor0')
"><a name="hasAncestor0Anchor
">hasAncestor</a></td><td>Matcher<*></td></tr>
6304 <tr><td colspan="4" class="doc
" id="hasAncestor0
"><pre>Matches AST nodes that have an ancestor that matches the provided
6308 void f() { if (true) { int x = 42; } }
6309 void g() { for (;;) { int x = 43; } }
6310 expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
6312 Usable as: Any Matcher
6316 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('hasDescendant0')
"><a name="hasDescendant0Anchor
">hasDescendant</a></td><td>Matcher<*></td></tr>
6317 <tr><td colspan="4" class="doc
" id="hasDescendant0
"><pre>Matches AST nodes that have descendant AST nodes that match the
6320 Example matches X, Y, Z
6321 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X
")))))
6322 class X {}; // Matches X, because X::X is a class of name X inside X.
6323 class Y { class X {}; };
6324 class Z { class Y { class X {}; }; };
6326 DescendantT must be an AST base type.
6328 Usable as: Any Matcher
6332 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('has0')
"><a name="has0Anchor
">has</a></td><td>Matcher<*></td></tr>
6333 <tr><td colspan="4" class="doc
" id="has0
"><pre>Matches AST nodes that have child AST nodes that match the
6336 Example matches X, Y
6337 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X
")))
6338 class X {}; // Matches X, because X::X is a class of name X inside X.
6339 class Y { class X {}; };
6340 class Z { class Y { class X {}; }; }; // Does not match Z.
6342 ChildT must be an AST base type.
6344 Usable as: Any Matcher
6345 Note that has is direct matcher, so it also matches things like implicit
6346 casts and paren casts. If you are matching with expr then you should
6347 probably consider using ignoringParenImpCasts like:
6348 has(ignoringParenImpCasts(expr())).
6352 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('hasParent0')
"><a name="hasParent0Anchor
">hasParent</a></td><td>Matcher<*></td></tr>
6353 <tr><td colspan="4" class="doc
" id="hasParent0
"><pre>Matches AST nodes that have a parent that matches the provided
6357 void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
6358 compoundStmt(hasParent(ifStmt())) matches "{ int x =
43; }
".
6360 Usable as: Any Matcher
6364 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('invocation0')
"><a name="invocation0Anchor
">invocation</a></td><td>Matcher<*>...Matcher<*></td></tr>
6365 <tr><td colspan="4" class="doc
" id="invocation0
"><pre>Matches function calls and constructor calls
6367 Because CallExpr and CXXConstructExpr do not share a common
6368 base class with API accessing arguments etc, AST Matchers for code
6369 which should match both are typically duplicated. This matcher
6370 removes the need for duplication.
6373 struct ConstructorTakesInt
6375 ConstructorTakesInt(int i) {}
6378 void callTakesInt(int i)
6389 ConstructorTakesInt cti(42);
6393 invocation(hasArgument(0, integerLiteral(equals(42))))
6394 matches the expression in both doCall and doConstruct
6398 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('optionally0')
"><a name="optionally0Anchor
">optionally</a></td><td>Matcher<*></td></tr>
6399 <tr><td colspan="4" class="doc
" id="optionally0
"><pre>Matches any node regardless of the submatcher.
6401 However, optionally will retain any bindings generated by the submatcher.
6402 Useful when additional information which may or may not present about a main
6403 matching node is desired.
6412 fieldDecl(hasName("bar
")).bind("var
")
6414 will produce a result binding for both "record
" and "var
".
6415 The matcher will produce a "record
" binding for even if there is no data
6416 member named "bar
" in that class.
6418 Usable as: Any Matcher
6422 <tr><td>Matcher<*></td><td class="name
" onclick="toggle('traverse0')
"><a name="traverse0Anchor
">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr>
6423 <tr><td colspan="4" class="doc
" id="traverse0
"><pre>Causes all nested matchers to be matched with the specified traversal kind.
6431 traverse(TK_IgnoreUnlessSpelledInSource,
6432 varDecl(hasInitializer(floatLiteral().bind("init
")))
6434 matches the variable declaration with "init
" bound to the "3.0".
6438 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html
">AbstractConditionalOperator</a>></td><td class="name
" onclick="toggle('hasCondition5')
"><a name="hasCondition5Anchor
">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
6439 <tr><td colspan="4" class="doc
" id="hasCondition5
"><pre>Matches the condition expression of an if statement, for loop,
6440 switch statement or conditional operator.
6442 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6447 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html
">AbstractConditionalOperator</a>></td><td class="name
" onclick="toggle('hasFalseExpression0')
"><a name="hasFalseExpression0Anchor
">hasFalseExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
6448 <tr><td colspan="4" class="doc
" id="hasFalseExpression0
"><pre>Matches the false branch expression of a conditional operator
6449 (binary or ternary).
6457 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html
">AbstractConditionalOperator</a>></td><td class="name
" onclick="toggle('hasTrueExpression0')
"><a name="hasTrueExpression0Anchor
">hasTrueExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
6458 <tr><td colspan="4" class="doc
" id="hasTrueExpression0
"><pre>Matches the true branch expression of a conditional operator.
6460 Example 1 (conditional ternary operator): matches a
6463 Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
6468 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html
">AddrLabelExpr</a>></td><td class="name
" onclick="toggle('hasDeclaration15')
"><a name="hasDeclaration15Anchor
">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
6469 <tr><td colspan="4" class="doc
" id="hasDeclaration15
"><pre>Matches a node if the declaration associated with that node
6470 matches the given matcher.
6472 The associated declaration is:
6473 - for type nodes, the declaration of the underlying type
6474 - for CallExpr, the declaration of the callee
6475 - for MemberExpr, the declaration of the referenced member
6476 - for CXXConstructExpr, the declaration of the constructor
6477 - for CXXNewExpr, the declaration of the operator new
6478 - for ObjCIvarExpr, the declaration of the ivar
6480 For type nodes, hasDeclaration will generally match the declaration of the
6485 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6486 typedefDecl. A common use case is to match the underlying, desugared type.
6487 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6488 varDecl(hasType(hasUnqualifiedDesugaredType(
6489 recordType(hasDeclaration(decl())))))
6490 In this matcher, the decl will match the CXXRecordDecl of class X.
6492 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html
">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html
">CallExpr</a>>,
6493 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html
">CXXConstructExpr</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_1DeclRefExpr.html
">DeclRefExpr</a>>,
6494 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html
">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html
">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html
">LabelStmt</a>>,
6495 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html
">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html
">RecordType</a>>,
6496 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html
">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>>,
6497 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html
">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html
">TypedefType</a>>,
6498 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
6502 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html
">ArraySubscriptExpr</a>></td><td class="name
" onclick="toggle('hasBase0')
"><a name="hasBase0Anchor
">hasBase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
6503 <tr><td colspan="4" class="doc
" id="hasBase0
"><pre>Matches the base expression of an array subscript expression.
6507 void f() { i[1] = 42; }
6508 arraySubscriptExpression(hasBase(implicitCastExpr(
6509 hasSourceExpression(declRefExpr()))))
6510 matches i[1] with the declRefExpr() matching i
6514 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html
">ArraySubscriptExpr</a>></td><td class="name
" onclick="toggle('hasIndex0')
"><a name="hasIndex0Anchor
">hasIndex</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
6515 <tr><td colspan="4" class="doc
" id="hasIndex0
"><pre>Matches the index expression of an array subscript expression.
6519 void f() { i[1] = 42; }
6520 arraySubscriptExpression(hasIndex(integerLiteral()))
6521 matches i[1] with the integerLiteral() matching 1
6525 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html
">ArraySubscriptExpr</a>></td><td class="name
" onclick="toggle('hasLHS3')
"><a name="hasLHS3Anchor
">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
6526 <tr><td colspan="4" class="doc
" id="hasLHS3
"><pre>Matches the left hand side of binary operator expressions.
6528 Example matches a (matcher = binaryOperator(hasLHS()))
6533 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html
">ArraySubscriptExpr</a>></td><td class="name
" onclick="toggle('hasRHS3')
"><a name="hasRHS3Anchor
">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
6534 <tr><td colspan="4" class="doc
" id="hasRHS3
"><pre>Matches the right hand side of binary operator expressions.
6536 Example matches b (matcher = binaryOperator(hasRHS()))
6541 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html
">ArrayType</a>></td><td class="name
" onclick="toggle('hasElementType0')
"><a name="hasElementType0Anchor
">hasElementType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html
">Type</a>></td></tr>
6542 <tr><td colspan="4" class="doc
" id="hasElementType0
"><pre>Matches arrays and C99 complex types that have a specific element
6549 arrayType(hasElementType(builtinType()))
6552 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html
">ArrayType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html
">ComplexType</a>>
6556 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html
">AtomicType</a>></td><td class="name
" onclick="toggle('hasValueType0')
"><a name="hasValueType0Anchor
">hasValueType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html
">Type</a>></td></tr>
6557 <tr><td colspan="4" class="doc
" id="hasValueType0
"><pre>Matches atomic types with a specific value type.
6562 atomicType(hasValueType(isInteger()))
6563 matches "_Atomic(int) i
"
6565 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html
">AtomicType</a>>
6569 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html
">AutoType</a>></td><td class="name
" onclick="toggle('hasDeducedType0')
"><a name="hasDeducedType0Anchor
">hasDeducedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html
">Type</a>></td></tr>
6570 <tr><td colspan="4" class="doc
" id="hasDeducedType0
"><pre>Matches AutoType nodes where the deduced type is a specific type.
6572 Note: There is no TypeLoc for the deduced type and thus no
6573 getDeducedLoc() matcher.
6578 autoType(hasDeducedType(isInteger()))
6581 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html
">AutoType</a>>
6585 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BaseUsingDecl.html
">BaseUsingDecl</a>></td><td class="name
" onclick="toggle('hasAnyUsingShadowDecl0')
"><a name="hasAnyUsingShadowDecl0Anchor
">hasAnyUsingShadowDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html
">UsingShadowDecl</a>> InnerMatcher</td></tr>
6586 <tr><td colspan="4" class="doc
" id="hasAnyUsingShadowDecl0
"><pre>Matches any using shadow declaration.
6589 namespace X { void b(); }
6591 usingDecl(hasAnyUsingShadowDecl(hasName("b
"))))
6592 matches using X::b </pre></td></tr>
6595 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html
">BinaryOperator</a>></td><td class="name
" onclick="toggle('hasEitherOperand0')
"><a name="hasEitherOperand0Anchor
">hasEitherOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
6596 <tr><td colspan="4" class="doc
" id="hasEitherOperand0
"><pre>Matches if either the left hand side or the right hand side of a
6597 binary operator or fold expression matches.
6601 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html
">BinaryOperator</a>></td><td class="name
" onclick="toggle('hasLHS0')
"><a name="hasLHS0Anchor
">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
6602 <tr><td colspan="4" class="doc
" id="hasLHS0
"><pre>Matches the left hand side of binary operator expressions.
6604 Example matches a (matcher = binaryOperator(hasLHS()))
6609 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html
">BinaryOperator</a>></td><td class="name
" onclick="toggle('hasOperands0')
"><a name="hasOperands0Anchor
">hasOperands</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> Matcher1, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> Matcher2</td></tr>
6610 <tr><td colspan="4" class="doc
" id="hasOperands0
"><pre>Matches if both matchers match with opposite sides of the binary operator
6613 Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6614 integerLiteral(equals(2)))
6622 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html
">BinaryOperator</a>></td><td class="name
" onclick="toggle('hasRHS0')
"><a name="hasRHS0Anchor
">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
6623 <tr><td colspan="4" class="doc
" id="hasRHS0
"><pre>Matches the right hand side of binary operator expressions.
6625 Example matches b (matcher = binaryOperator(hasRHS()))
6630 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html
">BindingDecl</a>></td><td class="name
" onclick="toggle('forDecomposition0')
"><a name="forDecomposition0Anchor
">forDecomposition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html
">ValueDecl</a>> InnerMatcher</td></tr>
6631 <tr><td colspan="4" class="doc
" id="forDecomposition0
"><pre>Matches the DecompositionDecl the binding belongs to.
6637 auto &[f, s, t] = arr;
6642 bindingDecl(hasName("f
"),
6643 forDecomposition(decompositionDecl())
6644 matches 'f' in 'auto &[f, s, t]'.
6648 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html
">BlockDecl</a>></td><td class="name
" onclick="toggle('hasAnyParameter2')
"><a name="hasAnyParameter2Anchor
">hasAnyParameter</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html
">ParmVarDecl</a>> InnerMatcher</td></tr>
6649 <tr><td colspan="4" class="doc
" id="hasAnyParameter2
"><pre>Matches any parameter of a function or an ObjC method declaration or a
6652 Does not match the 'this' parameter of a method.
6655 class X { void f(int x, int y, int z) {} };
6656 cxxMethodDecl(hasAnyParameter(hasName("y
")))
6657 matches f(int x, int y, int z) {}
6658 with hasAnyParameter(...)
6661 For ObjectiveC, given
6662 @interface I - (void) f:(int) y; @end
6664 the matcher objcMethodDecl(hasAnyParameter(hasName("y
")))
6665 matches the declaration of method f with hasParameter
6669 b = ^(int y) { printf("%d
", y) };
6671 the matcher blockDecl(hasAnyParameter(hasName("y
")))
6672 matches the declaration of the block b with hasParameter
6677 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html
">BlockDecl</a>></td><td class="name
" onclick="toggle('hasParameter2')
"><a name="hasParameter2Anchor
">hasParameter</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html
">ParmVarDecl</a>> InnerMatcher</td></tr>
6678 <tr><td colspan="4" class="doc
" id="hasParameter2
"><pre>Matches the n'th parameter of a function or an ObjC method
6679 declaration or a block.
6682 class X { void f(int x) {} };
6683 cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6685 with hasParameter(...)
6688 For ObjectiveC, given
6689 @interface I - (void) f:(int) y; @end
6691 the matcher objcMethodDecl(hasParameter(0, hasName("y
")))
6692 matches the declaration of method f with hasParameter
6697 <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>
6698 <tr><td colspan="4" class="doc
" id="hasTypeLoc0
"><pre>Matches if the type location of a node matches the inner matcher.
6702 declaratorDecl(hasTypeLoc(loc(asString("int
"))))
6706 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int
"))))
6709 struct Foo { Foo(int, int); };
6711 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo
"))))
6714 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>>,
6715 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>>,
6716 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>>,
6717 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html
">CXXUnresolvedConstructExpr</a>>,
6718 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html
">CompoundLiteralExpr</a>>,
6719 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>>,
6720 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>>,
6721 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html
">TypedefNameDecl</a>>
6725 <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>
6726 <tr><td colspan="4" class="doc
" id="pointee0
"><pre>Narrows PointerType (and similar) matchers to those where the
6727 pointee matches a given matcher.
6733 pointerType(pointee(isConstQualified(), isInteger()))
6734 matches "int const *b
"
6736 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html
">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html
">MemberPointerType</a>>,
6737 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html
">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html
">ReferenceType</a>>
6741 <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>
6742 <tr><td colspan="4" class="doc
" id="hasTypeLoc1
"><pre>Matches if the type location of a node matches the inner matcher.
6746 declaratorDecl(hasTypeLoc(loc(asString("int
"))))
6750 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int
"))))
6753 struct Foo { Foo(int, int); };
6755 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo
"))))
6758 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>>,
6759 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>>,
6760 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>>,
6761 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html
">CXXUnresolvedConstructExpr</a>>,
6762 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html
">CompoundLiteralExpr</a>>,
6763 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>>,
6764 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>>,
6765 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html
">TypedefNameDecl</a>>
6769 <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>
6770 <tr><td colspan="4" class="doc
" id="hasType8
"><pre>Overloaded to match the declaration of the expression's or value
6773 In case of a value declaration (for example a variable declaration),
6774 this resolves one layer of indirection. For example, in the value
6775 declaration "X x;
", cxxRecordDecl(hasName("X
")) matches the declaration of
6776 X, while varDecl(hasType(cxxRecordDecl(hasName("X
")))) matches the
6779 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X
")))))
6780 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X
")))))
6781 and friend class X (matcher = friendDecl(hasType("X
"))
6782 and public virtual X (matcher = cxxBaseSpecifier(hasType(
6783 cxxRecordDecl(hasName("X
"))))
6785 void y(X &x) { x; X z; }
6786 class Y { friend class X; };
6787 class Z : public virtual X {};
6789 Example matches class Derived
6790 (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base
"))))))
6792 class Derived : Base {};
6794 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html
">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html
">ValueDecl</a>>,
6795 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html
">CXXBaseSpecifier</a>>
6799 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html
">CXXBaseSpecifier</a>></td><td class="name
" onclick="toggle('hasType4')
"><a name="hasType4Anchor
">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerMatcher</td></tr>
6800 <tr><td colspan="4" class="doc
" id="hasType4
"><pre>Matches if the expression's or declaration's type matches a type
6803 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X
")))))
6804 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X
")))))
6805 and U (matcher = typedefDecl(hasType(asString("int
")))
6806 and friend class X (matcher = friendDecl(hasType("X
"))
6807 and public virtual X (matcher = cxxBaseSpecifier(hasType(
6808 asString("class X
")))
6810 void y(X &x) { x; X z; }
6812 class Y { friend class X; };
6813 class Z : public virtual X {};
6817 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html
">CXXConstructExpr</a>></td><td class="name
" onclick="toggle('forEachArgumentWithParam1')
"><a name="forEachArgumentWithParam1Anchor
">forEachArgumentWithParam</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html
">ParmVarDecl</a>> ParamMatcher</td></tr>
6818 <tr><td colspan="4" class="doc
" id="forEachArgumentWithParam1
"><pre>Matches all arguments and their respective ParmVarDecl.
6825 forEachArgumentWithParam(
6826 declRefExpr(to(varDecl(hasName("y
")))),
6827 parmVarDecl(hasType(isInteger()))
6830 with declRefExpr(...)
6832 and parmVarDecl(...)
6837 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html
">CXXConstructExpr</a>></td><td class="name
" onclick="toggle('forEachArgumentWithParamType1')
"><a name="forEachArgumentWithParamType1Anchor
">forEachArgumentWithParamType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> ParamMatcher</td></tr>
6838 <tr><td colspan="4" class="doc
" id="forEachArgumentWithParamType1
"><pre>Matches all arguments and their respective types for a CallExpr or
6839 CXXConstructExpr. It is very similar to forEachArgumentWithParam but
6840 it works on calls through function pointers as well.
6842 The difference is, that function pointers do not provide access to a
6843 ParmVarDecl, but only the QualType for each argument.
6849 void (*f_ptr)(int) = f;
6852 forEachArgumentWithParamType(
6853 declRefExpr(to(varDecl(hasName("y
")))),
6854 qualType(isInteger()).bind("type)
6856 matches f(y) and f_ptr(y)
6857 with declRefExpr(...)
6864 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr
</a>></td><td class=
"name" onclick=
"toggle('hasAnyArgument1')"><a name=
"hasAnyArgument1Anchor">hasAnyArgument
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
6865 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
6866 expression, or an ObjC-message-send expression.
6869 void x(int, int, int) { int y; x(
1, y,
42); }
6870 callExpr(hasAnyArgument(declRefExpr()))
6872 with hasAnyArgument(...)
6875 For ObjectiveC, given
6876 @interface I - (void) f:(int) y; @end
6877 void foo(I *i) { [i f:
12]; }
6878 objcMessageExpr(hasAnyArgument(integerLiteral(equals(
12))))
6883 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr
</a>></td><td class=
"name" onclick=
"toggle('hasArgument1')"><a name=
"hasArgument1Anchor">hasArgument
</a></td><td>unsigned N, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
6884 <tr><td colspan=
"4" class=
"doc" id=
"hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
6887 Example matches y in x(y)
6888 (matcher = callExpr(hasArgument(
0, declRefExpr())))
6889 void x(int) { int y; x(y); }
6893 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr
</a>></td><td class=
"name" onclick=
"toggle('hasDeclaration13')"><a name=
"hasDeclaration13Anchor">hasDeclaration
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>> InnerMatcher
</td></tr>
6894 <tr><td colspan=
"4" class=
"doc" id=
"hasDeclaration13"><pre>Matches a node if the declaration associated with that node
6895 matches the given matcher.
6897 The associated declaration is:
6898 - for type nodes, the declaration of the underlying type
6899 - for CallExpr, the declaration of the callee
6900 - for MemberExpr, the declaration of the referenced member
6901 - for CXXConstructExpr, the declaration of the constructor
6902 - for CXXNewExpr, the declaration of the operator new
6903 - for ObjCIvarExpr, the declaration of the ivar
6905 For type nodes, hasDeclaration will generally match the declaration of the
6910 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6911 typedefDecl. A common use case is to match the underlying, desugared type.
6912 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6913 varDecl(hasType(hasUnqualifiedDesugaredType(
6914 recordType(hasDeclaration(decl())))))
6915 In this matcher, the decl will match the CXXRecordDecl of class X.
6917 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr
</a>>,
6918 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr
</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_1DeclRefExpr.html">DeclRefExpr
</a>>,
6919 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt
</a>>,
6920 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType
</a>>,
6921 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType
</a>>,
6922 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType
</a>>,
6923 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType
</a>>
6927 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl
</a>></td><td class=
"name" onclick=
"toggle('forEachConstructorInitializer0')"><a name=
"forEachConstructorInitializer0Anchor">forEachConstructorInitializer
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer
</a>> InnerMatcher
</td></tr>
6928 <tr><td colspan=
"4" class=
"doc" id=
"forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
6931 class A { A() : i(
42), j(
42) {} int i; int j; };
6932 cxxConstructorDecl(forEachConstructorInitializer(
6933 forField(decl().bind(
"x"))
6935 will trigger two matches, binding for 'i' and 'j' respectively.
6939 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl
</a>></td><td class=
"name" onclick=
"toggle('hasAnyConstructorInitializer0')"><a name=
"hasAnyConstructorInitializer0Anchor">hasAnyConstructorInitializer
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer
</a>> InnerMatcher
</td></tr>
6940 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
6947 cxxRecordDecl(has(cxxConstructorDecl(
6948 hasAnyConstructorInitializer(anything())
6950 record matches Foo, hasAnyConstructorInitializer matches foo_(
1)
6954 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer
</a>></td><td class=
"name" onclick=
"toggle('forField0')"><a name=
"forField0Anchor">forField
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl
</a>> InnerMatcher
</td></tr>
6955 <tr><td colspan=
"4" class=
"doc" id=
"forField0"><pre>Matches the field declaration of a constructor initializer.
6962 cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6963 forField(hasName(
"foo_"))))))
6965 with forField matching foo_
6969 <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>
6970 <tr><td colspan=
"4" class=
"doc" id=
"hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher.
6974 declaratorDecl(hasTypeLoc(loc(asString(
"int"))))
6978 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString(
"int"))))
6981 struct Foo { Foo(int, int); };
6983 cxxFunctionalCastExpr(hasTypeLoc(loc(asString(
"struct Foo"))))
6986 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>>,
6987 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>>,
6988 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>>,
6989 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr
</a>>,
6990 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr
</a>>,
6991 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>>,
6992 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>>,
6993 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl
</a>>
6997 <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>
6998 <tr><td colspan=
"4" class=
"doc" id=
"withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
7005 cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
7006 withInitializer(integerLiteral(equals(
1)))))))
7008 with withInitializer matching (
1)
7012 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr
</a>></td><td class=
"name" onclick=
"toggle('hasObjectExpression2')"><a name=
"hasObjectExpression2Anchor">hasObjectExpression
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7013 <tr><td colspan=
"4" class=
"doc" id=
"hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
7014 given matcher. Implicit object expressions are included; that is, it matches
7015 use of implicit `this`.
7020 int f(X x) { x.m; return m; }
7022 memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName(
"X")))))
7023 matches `x.m`, but not `m`; however,
7024 memberExpr(hasObjectExpression(hasType(pointsTo(
7025 cxxRecordDecl(hasName(
"X"))))))
7026 matches `m` (aka. `this-
>m`), but not `x.m`.
7030 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</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_1Stmt.html">Stmt
</a>> InnerMatcher
</td></tr>
7031 <tr><td colspan=
"4" class=
"doc" id=
"callee1"><pre>Matches if the call or fold expression's callee expression matches.
7034 class Y { void x() { this-
>x(); x(); Y y; y.x(); } };
7036 callExpr(callee(expr()))
7037 matches this-
>x(), x(), y.x(), f()
7039 matching this-
>x, x, y.x, f respectively
7042 template
<typename... Args
>
7043 auto sum(Args... args) {
7044 return (
0 + ... + args);
7047 template
<typename... Args
>
7048 auto multiply(Args... args) {
7049 return (args * ... *
1);
7051 cxxFoldExpr(callee(expr()))
7052 matches (args * ... *
1)
7056 Note: Callee cannot take the more general internal::Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>>
7057 because this introduces ambiguous overloads with calls to Callee taking a
7058 internal::Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>>, as the matcher hierarchy is purely
7059 implemented in terms of implicit casts.
7063 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('hasEitherOperand2')"><a name=
"hasEitherOperand2Anchor">hasEitherOperand
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7064 <tr><td colspan=
"4" class=
"doc" id=
"hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a
7065 binary operator or fold expression matches.
7069 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('hasFoldInit0')"><a name=
"hasFoldInit0Anchor">hasFoldInit
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMacher
</td></tr>
7070 <tr><td colspan=
"4" class=
"doc" id=
"hasFoldInit0"><pre>Matches the operand that does not contain the parameter pack.
7072 Example matches `(
0 + ... + args)` and `(args * ... *
1)`
7073 (matcher = cxxFoldExpr(hasFoldInit(expr())))
7074 with hasFoldInit(...)
7075 matching `
0` and `
1` respectively
7076 template
<typename... Args
>
7077 auto sum(Args... args) {
7078 return (
0 + ... + args);
7081 template
<typename... Args
>
7082 auto multiply(Args... args) {
7083 return (args * ... *
1);
7088 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('hasLHS4')"><a name=
"hasLHS4Anchor">hasLHS
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7089 <tr><td colspan=
"4" class=
"doc" id=
"hasLHS4"><pre>Matches the left hand side of binary operator expressions.
7091 Example matches a (matcher = binaryOperator(hasLHS()))
7096 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('hasOperands2')"><a name=
"hasOperands2Anchor">hasOperands
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> Matcher1, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> Matcher2
</td></tr>
7097 <tr><td colspan=
"4" class=
"doc" id=
"hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator
7100 Example matcher = binaryOperator(hasOperands(integerLiteral(equals(
1),
7101 integerLiteral(equals(
2)))
7109 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('hasPattern0')"><a name=
"hasPattern0Anchor">hasPattern
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMacher
</td></tr>
7110 <tr><td colspan=
"4" class=
"doc" id=
"hasPattern0"><pre>Matches the operand that contains the parameter pack.
7112 Example matches `(
0 + ... + args)`
7113 (matcher = cxxFoldExpr(hasPattern(expr())))
7114 with hasPattern(...)
7116 template
<typename... Args
>
7117 auto sum(Args... args) {
7118 return (
0 + ... + args);
7121 template
<typename... Args
>
7122 auto multiply(Args... args) {
7123 return (args * ... *
1);
7128 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXFoldExpr.html">CXXFoldExpr
</a>></td><td class=
"name" onclick=
"toggle('hasRHS4')"><a name=
"hasRHS4Anchor">hasRHS
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7129 <tr><td colspan=
"4" class=
"doc" id=
"hasRHS4"><pre>Matches the right hand side of binary operator expressions.
7131 Example matches b (matcher = binaryOperator(hasRHS()))
7136 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt
</a>></td><td class=
"name" onclick=
"toggle('hasBody3')"><a name=
"hasBody3Anchor">hasBody
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>> InnerMatcher
</td></tr>
7137 <tr><td colspan=
"4" class=
"doc" id=
"hasBody3"><pre>Matches a 'for', 'while', 'while' statement or a function or coroutine
7138 definition that has a given body. Note that in case of functions or
7139 coroutines this matcher only matches the definition itself and not the
7140 other declarations of the same function or coroutine.
7144 forStmt(hasBody(compoundStmt()))
7145 matches 'for (;;) {}'
7152 functionDecl(hasBody(compoundStmt()))
7153 matches 'void f() {}'
7156 but does not match 'void f();'
7160 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt
</a>></td><td class=
"name" onclick=
"toggle('hasInitStatement2')"><a name=
"hasInitStatement2Anchor">hasInitStatement
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>> InnerMatcher
</td></tr>
7161 <tr><td colspan=
"4" class=
"doc" id=
"hasInitStatement2"><pre>Matches selection statements with initializer.
7165 if (int i = foobar(); i
> 0) {}
7166 switch (int i = foobar(); i) {}
7167 for (auto
& a = get_range(); auto
& x : a) {}
7170 if (foobar()
> 0) {}
7171 switch (foobar()) {}
7172 for (auto
& x : get_range()) {}
7174 ifStmt(hasInitStatement(anything()))
7175 matches the if statement in foo but not in bar.
7176 switchStmt(hasInitStatement(anything()))
7177 matches the switch statement in foo but not in bar.
7178 cxxForRangeStmt(hasInitStatement(anything()))
7179 matches the range for statement in foo but not in bar.
7183 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt
</a>></td><td class=
"name" onclick=
"toggle('hasLoopVariable0')"><a name=
"hasLoopVariable0Anchor">hasLoopVariable
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl
</a>> InnerMatcher
</td></tr>
7184 <tr><td colspan=
"4" class=
"doc" id=
"hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
7187 forStmt(hasLoopVariable(anything()))
7193 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt
</a>></td><td class=
"name" onclick=
"toggle('hasRangeInit0')"><a name=
"hasRangeInit0Anchor">hasRangeInit
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7194 <tr><td colspan=
"4" class=
"doc" id=
"hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
7197 forStmt(hasRangeInit(anything()))
7203 <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>
7204 <tr><td colspan=
"4" class=
"doc" id=
"hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher.
7208 declaratorDecl(hasTypeLoc(loc(asString(
"int"))))
7212 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString(
"int"))))
7215 struct Foo { Foo(int, int); };
7217 cxxFunctionalCastExpr(hasTypeLoc(loc(asString(
"struct Foo"))))
7220 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>>,
7221 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>>,
7222 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>>,
7223 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr
</a>>,
7224 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr
</a>>,
7225 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>>,
7226 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>>,
7227 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl
</a>>
7231 <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>
7232 <tr><td colspan=
"4" class=
"doc" id=
"onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
7233 `on`, matches the argument directly without stripping away anything.
7236 class Y { public: void m(); };
7238 class X : public Y { void g(); };
7239 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
7240 cxxMemberCallExpr(onImplicitObjectArgument(hasType(
7241 cxxRecordDecl(hasName(
"Y")))))
7242 matches `y.m()`, `x.m()` and (`g()).m()`, but not `x.g()`).
7243 cxxMemberCallExpr(on(callExpr()))
7244 only matches `(g()).m()` (the parens are ignored).
7246 FIXME: Overload to allow directly matching types?
7250 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr
</a>></td><td class=
"name" onclick=
"toggle('on0')"><a name=
"on0Anchor">on
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7251 <tr><td colspan=
"4" class=
"doc" id=
"on0"><pre>Matches on the implicit object argument of a member call expression, after
7252 stripping off any parentheses or implicit casts.
7255 class Y { public: void m(); };
7257 class X : public Y {};
7258 void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
7259 cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName(
"Y")))))
7260 matches `y.m()` and `(g()).m()`.
7261 cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName(
"X")))))
7263 cxxMemberCallExpr(on(callExpr()))
7264 matches `(g()).m()`.
7266 FIXME: Overload to allow directly matching types?
7270 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr
</a>></td><td class=
"name" onclick=
"toggle('thisPointerType1')"><a name=
"thisPointerType1Anchor">thisPointerType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>> InnerMatcher
</td></tr>
7271 <tr><td colspan=
"4" class=
"doc" id=
"thisPointerType1"><pre>Overloaded to match the type's declaration.
7275 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr
</a>></td><td class=
"name" onclick=
"toggle('thisPointerType0')"><a name=
"thisPointerType0Anchor">thisPointerType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType
</a>> InnerMatcher
</td></tr>
7276 <tr><td colspan=
"4" class=
"doc" id=
"thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
7277 matches the InnerMatcher, or is a pointer to a type that matches the
7281 class Y { public: void m(); };
7282 class X : public Y { void g(); };
7283 void z() { Y y; y.m(); Y *p; p-
>m(); X x; x.m(); x.g(); }
7284 cxxMemberCallExpr(thisPointerType(hasDeclaration(
7285 cxxRecordDecl(hasName(
"Y")))))
7286 matches `y.m()`, `p-
>m()` and `x.m()`.
7287 cxxMemberCallExpr(thisPointerType(hasDeclaration(
7288 cxxRecordDecl(hasName(
"X")))))
7293 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl
</a>></td><td class=
"name" onclick=
"toggle('forEachOverridden0')"><a name=
"forEachOverridden0Anchor">forEachOverridden
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl
</a>> InnerMatcher
</td></tr>
7294 <tr><td colspan=
"4" class=
"doc" id=
"forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
7295 produce multiple matches.
7298 class A { virtual void f(); };
7299 class B : public A { void f(); };
7300 class C : public B { void f(); };
7301 cxxMethodDecl(ofClass(hasName(
"C")),
7302 forEachOverridden(cxxMethodDecl().bind(
"b"))).bind(
"d")
7303 matches once, with
"b" binding
"A::f" and
"d" binding
"C::f" (Note
7304 that B::f is not overridden by C::f).
7306 The check can produce multiple matches in case of multiple inheritance, e.g.
7307 class A1 { virtual void f(); };
7308 class A2 { virtual void f(); };
7309 class C : public A1, public A2 { void f(); };
7310 cxxMethodDecl(ofClass(hasName(
"C")),
7311 forEachOverridden(cxxMethodDecl().bind(
"b"))).bind(
"d")
7312 matches twice, once with
"b" binding
"A1::f" and
"d" binding
"C::f", and
7313 once with
"b" binding
"A2::f" and
"d" binding
"C::f".
7317 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl
</a>></td><td class=
"name" onclick=
"toggle('ofClass0')"><a name=
"ofClass0Anchor">ofClass
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>> InnerMatcher
</td></tr>
7318 <tr><td colspan=
"4" class=
"doc" id=
"ofClass0"><pre>Matches the class declaration that the given method declaration
7321 FIXME: Generalize this for other kinds of declarations.
7322 FIXME: What other kind of declarations would we need to generalize
7325 Example matches A() in the last line
7326 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
7327 ofClass(hasName(
"A"))))))
7336 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr
</a>></td><td class=
"name" onclick=
"toggle('hasAnyPlacementArg0')"><a name=
"hasAnyPlacementArg0Anchor">hasAnyPlacementArg
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7337 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
7340 MyClass *p1 = new (Storage) MyClass();
7341 cxxNewExpr(hasAnyPlacementArg(anything()))
7342 matches the expression 'new (Storage,
16) MyClass()'.
7346 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr
</a>></td><td class=
"name" onclick=
"toggle('hasArraySize0')"><a name=
"hasArraySize0Anchor">hasArraySize
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7347 <tr><td colspan=
"4" class=
"doc" id=
"hasArraySize0"><pre>Matches array new expressions with a given array size.
7350 MyClass *p1 = new MyClass[
10];
7351 cxxNewExpr(hasArraySize(integerLiteral(equals(
10))))
7352 matches the expression 'new MyClass[
10]'.
7356 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr
</a>></td><td class=
"name" onclick=
"toggle('hasDeclaration12')"><a name=
"hasDeclaration12Anchor">hasDeclaration
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>> InnerMatcher
</td></tr>
7357 <tr><td colspan=
"4" class=
"doc" id=
"hasDeclaration12"><pre>Matches a node if the declaration associated with that node
7358 matches the given matcher.
7360 The associated declaration is:
7361 - for type nodes, the declaration of the underlying type
7362 - for CallExpr, the declaration of the callee
7363 - for MemberExpr, the declaration of the referenced member
7364 - for CXXConstructExpr, the declaration of the constructor
7365 - for CXXNewExpr, the declaration of the operator new
7366 - for ObjCIvarExpr, the declaration of the ivar
7368 For type nodes, hasDeclaration will generally match the declaration of the
7373 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7374 typedefDecl. A common use case is to match the underlying, desugared type.
7375 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7376 varDecl(hasType(hasUnqualifiedDesugaredType(
7377 recordType(hasDeclaration(decl())))))
7378 In this matcher, the decl will match the CXXRecordDecl of class X.
7380 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr
</a>>,
7381 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr
</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_1DeclRefExpr.html">DeclRefExpr
</a>>,
7382 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt
</a>>,
7383 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType
</a>>,
7384 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType
</a>>,
7385 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType
</a>>,
7386 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType
</a>>
7390 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr
</a>></td><td class=
"name" onclick=
"toggle('hasPlacementArg0')"><a name=
"hasPlacementArg0Anchor">hasPlacementArg
</a></td><td>unsigned Index, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7391 <tr><td colspan=
"4" class=
"doc" id=
"hasPlacementArg0"><pre>Matches placement new expression arguments.
7394 MyClass *p1 = new (Storage,
16) MyClass();
7395 cxxNewExpr(hasPlacementArg(
1, integerLiteral(equals(
16))))
7396 matches the expression 'new (Storage,
16) MyClass()'.
7400 <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>
7401 <tr><td colspan=
"4" class=
"doc" id=
"hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher.
7405 declaratorDecl(hasTypeLoc(loc(asString(
"int"))))
7409 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString(
"int"))))
7412 struct Foo { Foo(int, int); };
7414 cxxFunctionalCastExpr(hasTypeLoc(loc(asString(
"struct Foo"))))
7417 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>>,
7418 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>>,
7419 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>>,
7420 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr
</a>>,
7421 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr
</a>>,
7422 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>>,
7423 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>>,
7424 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl
</a>>
7428 <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>
7429 <tr><td colspan=
"4" class=
"doc" id=
"hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a
7430 binary operator or fold expression matches.
7434 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr
</a>></td><td class=
"name" onclick=
"toggle('hasLHS1')"><a name=
"hasLHS1Anchor">hasLHS
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7435 <tr><td colspan=
"4" class=
"doc" id=
"hasLHS1"><pre>Matches the left hand side of binary operator expressions.
7437 Example matches a (matcher = binaryOperator(hasLHS()))
7442 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr
</a>></td><td class=
"name" onclick=
"toggle('hasOperands1')"><a name=
"hasOperands1Anchor">hasOperands
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> Matcher1, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> Matcher2
</td></tr>
7443 <tr><td colspan=
"4" class=
"doc" id=
"hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator
7446 Example matcher = binaryOperator(hasOperands(integerLiteral(equals(
1),
7447 integerLiteral(equals(
2)))
7455 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr
</a>></td><td class=
"name" onclick=
"toggle('hasRHS1')"><a name=
"hasRHS1Anchor">hasRHS
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7456 <tr><td colspan=
"4" class=
"doc" id=
"hasRHS1"><pre>Matches the right hand side of binary operator expressions.
7458 Example matches b (matcher = binaryOperator(hasRHS()))
7463 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr
</a>></td><td class=
"name" onclick=
"toggle('hasUnaryOperand1')"><a name=
"hasUnaryOperand1Anchor">hasUnaryOperand
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7464 <tr><td colspan=
"4" class=
"doc" id=
"hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches.
7466 Example matches true (matcher = hasUnaryOperand(
7467 cxxBoolLiteral(equals(true))))
7472 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>></td><td class=
"name" onclick=
"toggle('hasAnyBase0')"><a name=
"hasAnyBase0Anchor">hasAnyBase
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier
</a>> BaseSpecMatcher
</td></tr>
7473 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
7476 matcher hasAnyBase(hasType(cxxRecordDecl(hasName(
"SpecialBase"))))
7481 class Proxy : SpecialBase {}; // matches Proxy
7482 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived
7484 FIXME: Refactor this and isDerivedFrom to reuse implementation.
7488 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>></td><td class=
"name" onclick=
"toggle('hasDirectBase0')"><a name=
"hasDirectBase0Anchor">hasDirectBase
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier
</a>> BaseSpecMatcher
</td></tr>
7489 <tr><td colspan=
"4" class=
"doc" id=
"hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher.
7492 matcher hasDirectBase(hasType(cxxRecordDecl(hasName(
"SpecialBase"))))
7497 class Proxy : SpecialBase {}; // matches Proxy
7498 class IndirectlyDerived : Proxy {}; // doesn't match
7502 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>></td><td class=
"name" onclick=
"toggle('hasMethod0')"><a name=
"hasMethod0Anchor">hasMethod
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl
</a>> InnerMatcher
</td></tr>
7503 <tr><td colspan=
"4" class=
"doc" id=
"hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
7506 class A { void func(); };
7507 class B { void member(); };
7509 cxxRecordDecl(hasMethod(hasName(
"func"))) matches the declaration of
7514 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>></td><td class=
"name" onclick=
"toggle('isDerivedFrom0')"><a name=
"isDerivedFrom0Anchor">isDerivedFrom
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl
</a>> Base
</td></tr>
7515 <tr><td colspan=
"4" class=
"doc" id=
"isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
7516 matching Base, or Objective-C classes that directly or indirectly
7517 subclass a class matching Base.
7519 Note that a class is not considered to be derived from itself.
7521 Example matches Y, Z, C (Base == hasName(
"X"))
7523 class Y : public X {}; // directly derived
7524 class Z : public Y {}; // indirectly derived
7527 class C : public B {}; // derived from a typedef of X
7529 In the following example, Bar matches isDerivedFrom(hasName(
"X")):
7532 class Bar : public Foo {}; // derived from a type that X is a typedef of
7534 In the following example, Bar matches isDerivedFrom(hasName(
"NSObject"))
7535 @interface NSObject @end
7536 @interface Bar : NSObject @end
7538 Usable as: Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>>, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl
</a>>
7542 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>></td><td class=
"name" onclick=
"toggle('isDirectlyDerivedFrom0')"><a name=
"isDirectlyDerivedFrom0Anchor">isDirectlyDerivedFrom
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl
</a>> Base
</td></tr>
7543 <tr><td colspan=
"4" class=
"doc" id=
"isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
7546 Note that a class is not considered to be derived from itself.
7548 Example matches Y, C (Base == hasName(
"X"))
7550 class Y : public X {}; // directly derived
7551 class Z : public Y {}; // indirectly derived
7554 class C : public B {}; // derived from a typedef of X
7556 In the following example, Bar matches isDerivedFrom(hasName(
"X")):
7559 class Bar : public Foo {}; // derived from a type that X is a typedef of
7563 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl
</a>></td><td class=
"name" onclick=
"toggle('isSameOrDerivedFrom0')"><a name=
"isSameOrDerivedFrom0Anchor">isSameOrDerivedFrom
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl
</a>> Base
</td></tr>
7564 <tr><td colspan=
"4" class=
"doc" id=
"isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
7569 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator
</a>></td><td class=
"name" onclick=
"toggle('hasEitherOperand3')"><a name=
"hasEitherOperand3Anchor">hasEitherOperand
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7570 <tr><td colspan=
"4" class=
"doc" id=
"hasEitherOperand3"><pre>Matches if either the left hand side or the right hand side of a
7571 binary operator or fold expression matches.
7575 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator
</a>></td><td class=
"name" onclick=
"toggle('hasLHS2')"><a name=
"hasLHS2Anchor">hasLHS
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7576 <tr><td colspan=
"4" class=
"doc" id=
"hasLHS2"><pre>Matches the left hand side of binary operator expressions.
7578 Example matches a (matcher = binaryOperator(hasLHS()))
7583 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator
</a>></td><td class=
"name" onclick=
"toggle('hasOperands3')"><a name=
"hasOperands3Anchor">hasOperands
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> Matcher1, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> Matcher2
</td></tr>
7584 <tr><td colspan=
"4" class=
"doc" id=
"hasOperands3"><pre>Matches if both matchers match with opposite sides of the binary operator
7587 Example matcher = binaryOperator(hasOperands(integerLiteral(equals(
1),
7588 integerLiteral(equals(
2)))
7596 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator
</a>></td><td class=
"name" onclick=
"toggle('hasRHS2')"><a name=
"hasRHS2Anchor">hasRHS
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7597 <tr><td colspan=
"4" class=
"doc" id=
"hasRHS2"><pre>Matches the right hand side of binary operator expressions.
7599 Example matches b (matcher = binaryOperator(hasRHS()))
7604 <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>
7605 <tr><td colspan=
"4" class=
"doc" id=
"hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher.
7609 declaratorDecl(hasTypeLoc(loc(asString(
"int"))))
7613 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString(
"int"))))
7616 struct Foo { Foo(int, int); };
7618 cxxFunctionalCastExpr(hasTypeLoc(loc(asString(
"struct Foo"))))
7621 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>>,
7622 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>>,
7623 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>>,
7624 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr
</a>>,
7625 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr
</a>>,
7626 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>>,
7627 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>>,
7628 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl
</a>>
7632 <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>
7633 <tr><td colspan=
"4" class=
"doc" id=
"hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
7634 expression, or an ObjC-message-send expression.
7637 void x(int, int, int) { int y; x(
1, y,
42); }
7638 callExpr(hasAnyArgument(declRefExpr()))
7640 with hasAnyArgument(...)
7643 For ObjectiveC, given
7644 @interface I - (void) f:(int) y; @end
7645 void foo(I *i) { [i f:
12]; }
7646 objcMessageExpr(hasAnyArgument(integerLiteral(equals(
12))))
7651 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr
</a>></td><td class=
"name" onclick=
"toggle('hasArgument2')"><a name=
"hasArgument2Anchor">hasArgument
</a></td><td>unsigned N, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> InnerMatcher
</td></tr>
7652 <tr><td colspan=
"4" class=
"doc" id=
"hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
7655 Example matches y in x(y)
7656 (matcher = callExpr(hasArgument(
0, declRefExpr())))
7657 void x(int) { int y; x(y); }
7661 <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>
7662 <tr><td colspan=
"4" class=
"doc" id=
"hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher.
7666 declaratorDecl(hasTypeLoc(loc(asString(
"int"))))
7670 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString(
"int"))))
7673 struct Foo { Foo(int, int); };
7675 cxxFunctionalCastExpr(hasTypeLoc(loc(asString(
"struct Foo"))))
7678 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>>,
7679 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>>,
7680 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>>,
7681 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr
</a>>,
7682 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr
</a>>,
7683 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>>,
7684 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>>,
7685 Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl
</a>>
7689 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr
</a>></td><td class=
"name" onclick=
"toggle('callee3')"><a name=
"callee3Anchor">callee
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>> InnerMatcher
</td></tr>
7690 <tr><td colspan=
"4" class=
"doc" id=
"callee3"><pre>Matches
1) if the call expression's callee's declaration matches the
7691 given matcher; or
2) if the Obj-C message expression's callee's method
7692 declaration matches the given matcher.
7694 Example matches y.x() (matcher = callExpr(callee(
7695 cxxMethodDecl(hasName(
"x")))))
7696 class Y { public: void x(); };
7697 void z() { Y y; y.x(); }
7699 Example
2. Matches [I foo] with
7700 objcMessageExpr(callee(objcMethodDecl(hasName(
"foo"))))
7702 @interface I: NSObject
7710 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr
</a>></td><td class=
"name" onclick=
"toggle('callee0')"><a name=
"callee0Anchor">callee
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt
</a>> InnerMatcher
</td></tr>
7711 <tr><td colspan=
"4" class=
"doc" id=
"callee0"><pre>Matches if the call or fold expression's callee expression matches.
7714 class Y { void x() { this-
>x(); x(); Y y; y.x(); } };
7716 callExpr(callee(expr()))
7717 matches this-
>x(), x(), y.x(), f()
7719 matching this-
>x, x, y.x, f respectively
7722 template
<typename... Args
>
7723 auto sum(Args... args) {
7724 return (
0 + ... + args);
7727 template
<typename... Args
>
7728 auto multiply(Args... args) {
7729 return (args * ... *
1);
7731 cxxFoldExpr(callee(expr()))
7732 matches (args * ... *
1)
7736 Note: Callee cannot take the more general internal::Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>>
7737 because this introduces ambiguous overloads with calls to Callee taking a
7738 internal::Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl
</a>>, as the matcher hierarchy is purely
7739 implemented in terms of implicit casts.
7743 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr
</a>></td><td class=
"name" onclick=
"toggle('forEachArgumentWithParam0')"><a name=
"forEachArgumentWithParam0Anchor">forEachArgumentWithParam
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> ArgMatcher, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl
</a>> ParamMatcher
</td></tr>
7744 <tr><td colspan=
"4" class=
"doc" id=
"forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
7751 forEachArgumentWithParam(
7752 declRefExpr(to(varDecl(hasName(
"y")))),
7753 parmVarDecl(hasType(isInteger()))
7756 with declRefExpr(...)
7758 and parmVarDecl(...)
7763 <tr><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr
</a>></td><td class=
"name" onclick=
"toggle('forEachArgumentWithParamType0')"><a name=
"forEachArgumentWithParamType0Anchor">forEachArgumentWithParamType
</a></td><td>Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr
</a>> ArgMatcher, Matcher
<<a href=
"https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType
</a>> ParamMatcher
</td></tr>
7764 <tr><td colspan=
"4" class=
"doc" id=
"forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or
7765 CXXConstructExpr. It is very similar to forEachArgumentWithParam but
7766 it works on calls through function pointers as well.
7768 The difference is, that function pointers do not provide access to a
7769 ParmVarDecl, but only the QualType for each argument.
7775 void (*f_ptr)(int) = f;
7778 forEachArgumentWithParamType(
7779 declRefExpr(to(varDecl(hasName(
"y")))),
7780 qualType(isInteger()).bind(
"type)
7782 matches f(y) and f_ptr(y)
7783 with declRefExpr(...)
7790 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html
">CallExpr</a>></td><td class="name
" onclick="toggle('hasAnyArgument0')
"><a name="hasAnyArgument0Anchor
">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
7791 <tr><td colspan="4" class="doc
" id="hasAnyArgument0
"><pre>Matches any argument of a call expression or a constructor call
7792 expression, or an ObjC-message-send expression.
7795 void x(int, int, int) { int y; x(1, y, 42); }
7796 callExpr(hasAnyArgument(declRefExpr()))
7798 with hasAnyArgument(...)
7801 For ObjectiveC, given
7802 @interface I - (void) f:(int) y; @end
7803 void foo(I *i) { [i f:12]; }
7804 objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7809 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html
">CallExpr</a>></td><td class="name
" onclick="toggle('hasArgument0')
"><a name="hasArgument0Anchor
">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
7810 <tr><td colspan="4" class="doc
" id="hasArgument0
"><pre>Matches the n'th argument of a call expression or a constructor
7813 Example matches y in x(y)
7814 (matcher = callExpr(hasArgument(0, declRefExpr())))
7815 void x(int) { int y; x(y); }
7819 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html
">CallExpr</a>></td><td class="name
" onclick="toggle('hasDeclaration14')
"><a name="hasDeclaration14Anchor
">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
7820 <tr><td colspan="4" class="doc
" id="hasDeclaration14
"><pre>Matches a node if the declaration associated with that node
7821 matches the given matcher.
7823 The associated declaration is:
7824 - for type nodes, the declaration of the underlying type
7825 - for CallExpr, the declaration of the callee
7826 - for MemberExpr, the declaration of the referenced member
7827 - for CXXConstructExpr, the declaration of the constructor
7828 - for CXXNewExpr, the declaration of the operator new
7829 - for ObjCIvarExpr, the declaration of the ivar
7831 For type nodes, hasDeclaration will generally match the declaration of the
7836 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7837 typedefDecl. A common use case is to match the underlying, desugared type.
7838 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7839 varDecl(hasType(hasUnqualifiedDesugaredType(
7840 recordType(hasDeclaration(decl())))))
7841 In this matcher, the decl will match the CXXRecordDecl of class X.
7843 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html
">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html
">CallExpr</a>>,
7844 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html
">CXXConstructExpr</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_1DeclRefExpr.html
">DeclRefExpr</a>>,
7845 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html
">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html
">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html
">LabelStmt</a>>,
7846 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html
">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html
">RecordType</a>>,
7847 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html
">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>>,
7848 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html
">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html
">TypedefType</a>>,
7849 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
7853 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html
">CaseStmt</a>></td><td class="name
" onclick="toggle('hasCaseConstant0')
"><a name="hasCaseConstant0Anchor
">hasCaseConstant</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
7854 <tr><td colspan="4" class="doc
" id="hasCaseConstant0
"><pre>If the given case statement does not use the GNU case range
7855 extension, matches the constant given in the statement.
7858 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
7859 caseStmt(hasCaseConstant(integerLiteral()))
7864 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html
">CastExpr</a>></td><td class="name
" onclick="toggle('hasSourceExpression0')
"><a name="hasSourceExpression0Anchor
">hasSourceExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
7865 <tr><td colspan="4" class="doc
" id="hasSourceExpression0
"><pre>Matches if the cast's source expression
7866 or opaque value's source expression matches the given matcher.
7868 Example 1: matches "a string
"
7869 (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
7870 class URL { URL(string); };
7871 URL url = "a string
";
7873 Example 2: matches 'b' (matcher =
7874 opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
7879 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html
">ClassTemplateSpecializationDecl</a>></td><td class="name
" onclick="toggle('forEachTemplateArgument0')
"><a name="forEachTemplateArgument0Anchor
">forEachTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>> InnerMatcher</td></tr>
7880 <tr><td colspan="4" class="doc
" id="forEachTemplateArgument0
"><pre>Matches templateSpecializationType, class template specialization,
7881 variable template specialization, and function template specialization
7882 nodes where the template argument matches the inner matcher. This matcher
7883 may produce multiple matches.
7886 template <typename T, unsigned N, unsigned M>
7889 constexpr unsigned R = 2;
7890 Matrix<int, R * 2, R * 4> M;
7892 template <typename T, typename U>
7893 void f(T&& t, U&& u) {}
7897 templateSpecializationType(forEachTemplateArgument(isExpr(expr())))
7898 matches twice, with expr() matching 'R * 2' and 'R * 4'
7899 functionDecl(forEachTemplateArgument(refersToType(builtinType())))
7900 matches the specialization f<unsigned, bool> twice, for 'unsigned'
7905 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html
">ClassTemplateSpecializationDecl</a>></td><td class="name
" onclick="toggle('hasAnyTemplateArgumentLoc0')
"><a name="hasAnyTemplateArgumentLoc0Anchor
">hasAnyTemplateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
7906 <tr><td colspan="4" class="doc
" id="hasAnyTemplateArgumentLoc0
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
7907 variable template specializations, and function template specializations
7908 that have at least one `TemplateArgumentLoc` matching the given
7912 template<typename T> class A {};
7914 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(
7915 hasTypeLoc(loc(asString("int
")))))))
7916 matches `A<int> a`.
7920 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html
">ClassTemplateSpecializationDecl</a>></td><td class="name
" onclick="toggle('hasAnyTemplateArgument0')
"><a name="hasAnyTemplateArgument0Anchor
">hasAnyTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>> InnerMatcher</td></tr>
7921 <tr><td colspan="4" class="doc
" id="hasAnyTemplateArgument0
"><pre>Matches templateSpecializationTypes, class template specializations,
7922 variable template specializations, and function template specializations
7923 that have at least one TemplateArgument matching the given InnerMatcher.
7926 template<typename T> class A {};
7927 template<> class A<double> {};
7930 template<typename T> f() {};
7931 void func() { f<int>(); };
7933 classTemplateSpecializationDecl(hasAnyTemplateArgument(
7934 refersToType(asString("int
"))))
7935 matches the specialization A<int>
7937 functionDecl(hasAnyTemplateArgument(refersToType(asString("int
"))))
7938 matches the specialization f<int>
7942 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html
">ClassTemplateSpecializationDecl</a>></td><td class="name
" onclick="toggle('hasSpecializedTemplate0')
"><a name="hasSpecializedTemplate0Anchor
">hasSpecializedTemplate</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html
">ClassTemplateDecl</a>> InnerMatcher</td></tr>
7943 <tr><td colspan="4" class="doc
" id="hasSpecializedTemplate0
"><pre>Matches the specialized template of a specialization declaration.
7946 template<typename T> class A {}; #1
7947 template<> class A<int> {}; #2
7948 classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
7949 matches '#2' with classTemplateDecl() matching the class template
7950 declaration of 'A' at #1.
7954 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html
">ClassTemplateSpecializationDecl</a>></td><td class="name
" onclick="toggle('hasTemplateArgumentLoc0')
"><a name="hasTemplateArgumentLoc0Anchor
">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
7955 <tr><td colspan="4" class="doc
" id="hasTemplateArgumentLoc0
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
7956 variable template specializations, and function template specializations
7957 where the n'th `TemplateArgumentLoc` matches the given `InnerMatcher`.
7960 template<typename T, typename U> class A {};
7961 A<double, int> b;
7962 A<int, double> c;
7963 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
7964 hasTypeLoc(loc(asString("double
")))))))
7965 matches `A<double, int> b`, but not `A<int, double> c`.
7969 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html
">ClassTemplateSpecializationDecl</a>></td><td class="name
" onclick="toggle('hasTemplateArgument0')
"><a name="hasTemplateArgument0Anchor
">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>> InnerMatcher</td></tr>
7970 <tr><td colspan="4" class="doc
" id="hasTemplateArgument0
"><pre>Matches templateSpecializationType, class template specializations,
7971 variable template specializations, and function template specializations
7972 where the n'th TemplateArgument matches the given InnerMatcher.
7975 template<typename T, typename U> class A {};
7976 A<bool, int> b;
7977 A<int, bool> c;
7979 template<typename T> void f() {}
7980 void func() { f<int>(); };
7981 classTemplateSpecializationDecl(hasTemplateArgument(
7982 1, refersToType(asString("int
"))))
7983 matches the specialization A<bool, int>
7985 functionDecl(hasTemplateArgument(0, refersToType(asString("int
"))))
7986 matches the specialization f<int>
7990 <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>
7991 <tr><td colspan="4" class="doc
" id="hasElementType1
"><pre>Matches arrays and C99 complex types that have a specific element
7998 arrayType(hasElementType(builtinType()))
8001 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html
">ArrayType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html
">ComplexType</a>>
8005 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html
">CompoundLiteralExpr</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>
8006 <tr><td colspan="4" class="doc
" id="hasTypeLoc7
"><pre>Matches if the type location of a node matches the inner matcher.
8010 declaratorDecl(hasTypeLoc(loc(asString("int
"))))
8014 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int
"))))
8017 struct Foo { Foo(int, int); };
8019 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo
"))))
8022 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>>,
8023 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>>,
8024 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>>,
8025 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html
">CXXUnresolvedConstructExpr</a>>,
8026 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html
">CompoundLiteralExpr</a>>,
8027 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>>,
8028 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>>,
8029 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html
">TypedefNameDecl</a>>
8033 <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>
8034 <tr><td colspan="4" class="doc
" id="hasAnySubstatement0
"><pre>Matches compound statements where at least one substatement matches
8035 a given matcher. Also matches StmtExprs that have CompoundStmt as children.
8039 hasAnySubstatement(compoundStmt())
8040 matches '{ {}; 1+2; }'
8046 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoroutineBodyStmt.html
">CoroutineBodyStmt</a>></td><td class="name
" onclick="toggle('hasBody5')
"><a name="hasBody5Anchor
">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>> InnerMatcher</td></tr>
8047 <tr><td colspan="4" class="doc
" id="hasBody5
"><pre>Matches a 'for', 'while', 'while' statement or a function or coroutine
8048 definition that has a given body. Note that in case of functions or
8049 coroutines this matcher only matches the definition itself and not the
8050 other declarations of the same function or coroutine.
8054 forStmt(hasBody(compoundStmt()))
8055 matches 'for (;;) {}'
8062 functionDecl(hasBody(compoundStmt()))
8063 matches 'void f() {}'
8066 but does not match 'void f();'
8070 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html
">DecayedType</a>></td><td class="name
" onclick="toggle('hasDecayedType0')
"><a name="hasDecayedType0Anchor
">hasDecayedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerType</td></tr>
8071 <tr><td colspan="4" class="doc
" id="hasDecayedType0
"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher
8075 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html
">DeclRefExpr</a>></td><td class="name
" onclick="toggle('hasAnyTemplateArgumentLoc3')
"><a name="hasAnyTemplateArgumentLoc3Anchor
">hasAnyTemplateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
8076 <tr><td colspan="4" class="doc
" id="hasAnyTemplateArgumentLoc3
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
8077 variable template specializations, and function template specializations
8078 that have at least one `TemplateArgumentLoc` matching the given
8082 template<typename T> class A {};
8084 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(
8085 hasTypeLoc(loc(asString("int
")))))))
8086 matches `A<int> a`.
8090 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html
">DeclRefExpr</a>></td><td class="name
" onclick="toggle('hasDeclaration11')
"><a name="hasDeclaration11Anchor
">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
8091 <tr><td colspan="4" class="doc
" id="hasDeclaration11
"><pre>Matches a node if the declaration associated with that node
8092 matches the given matcher.
8094 The associated declaration is:
8095 - for type nodes, the declaration of the underlying type
8096 - for CallExpr, the declaration of the callee
8097 - for MemberExpr, the declaration of the referenced member
8098 - for CXXConstructExpr, the declaration of the constructor
8099 - for CXXNewExpr, the declaration of the operator new
8100 - for ObjCIvarExpr, the declaration of the ivar
8102 For type nodes, hasDeclaration will generally match the declaration of the
8107 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8108 typedefDecl. A common use case is to match the underlying, desugared type.
8109 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8110 varDecl(hasType(hasUnqualifiedDesugaredType(
8111 recordType(hasDeclaration(decl())))))
8112 In this matcher, the decl will match the CXXRecordDecl of class X.
8114 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html
">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html
">CallExpr</a>>,
8115 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html
">CXXConstructExpr</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_1DeclRefExpr.html
">DeclRefExpr</a>>,
8116 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html
">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html
">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html
">LabelStmt</a>>,
8117 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html
">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html
">RecordType</a>>,
8118 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html
">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>>,
8119 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html
">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html
">TypedefType</a>>,
8120 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
8124 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html
">DeclRefExpr</a>></td><td class="name
" onclick="toggle('hasTemplateArgumentLoc3')
"><a name="hasTemplateArgumentLoc3Anchor
">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
8125 <tr><td colspan="4" class="doc
" id="hasTemplateArgumentLoc3
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
8126 variable template specializations, and function template specializations
8127 where the n'th `TemplateArgumentLoc` matches the given `InnerMatcher`.
8130 template<typename T, typename U> class A {};
8131 A<double, int> b;
8132 A<int, double> c;
8133 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
8134 hasTypeLoc(loc(asString("double
")))))))
8135 matches `A<double, int> b`, but not `A<int, double> c`.
8139 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html
">DeclRefExpr</a>></td><td class="name
" onclick="toggle('throughUsingDecl0')
"><a name="throughUsingDecl0Anchor
">throughUsingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html
">UsingShadowDecl</a>> Inner</td></tr>
8140 <tr><td colspan="4" class="doc
" id="throughUsingDecl0
"><pre>Matches if a node refers to a declaration through a specific
8141 using shadow declaration.
8144 namespace a { int f(); }
8147 declRefExpr(throughUsingDecl(anything()))
8150 namespace a { class X{}; }
8153 typeLoc(loc(usingType(throughUsingDecl(anything()))))
8156 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html
">DeclRefExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html
">UsingType</a>>
8160 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html
">DeclRefExpr</a>></td><td class="name
" onclick="toggle('to0')
"><a name="to0Anchor
">to</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
8161 <tr><td colspan="4" class="doc
" id="to0
"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
8164 Example matches x in if(x)
8165 (matcher = declRefExpr(to(varDecl(hasName("x
")))))
8171 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html
">DeclStmt</a>></td><td class="name
" onclick="toggle('containsDeclaration0')
"><a name="containsDeclaration0Anchor
">containsDeclaration</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
8172 <tr><td colspan="4" class="doc
" id="containsDeclaration0
"><pre>Matches the n'th declaration of a declaration statement.
8174 Note that this does not work for global declarations because the AST
8175 breaks up multiple-declaration DeclStmt's into multiple single-declaration
8177 Example: Given non-global declarations
8181 declStmt(containsDeclaration(
8182 0, varDecl(hasInitializer(anything()))))
8183 matches only 'int d = 2, e;', and
8184 declStmt(containsDeclaration(1, varDecl()))
8185 matches 'int a, b = 0' as well as 'int d = 2, e;'
8186 but 'int c;' is not matched.
8190 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html
">DeclStmt</a>></td><td class="name
" onclick="toggle('hasSingleDecl0')
"><a name="hasSingleDecl0Anchor
">hasSingleDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
8191 <tr><td colspan="4" class="doc
" id="hasSingleDecl0
"><pre>Matches the Decl of a DeclStmt which has a single declaration.
8196 declStmt(hasSingleDecl(anything()))
8197 matches 'int c;' but not 'int a, b;'.
8201 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html
">DeclaratorDecl</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>
8202 <tr><td colspan="4" class="doc
" id="hasTypeLoc8
"><pre>Matches if the type location of a node matches the inner matcher.
8206 declaratorDecl(hasTypeLoc(loc(asString("int
"))))
8210 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int
"))))
8213 struct Foo { Foo(int, int); };
8215 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo
"))))
8218 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>>,
8219 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>>,
8220 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>>,
8221 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html
">CXXUnresolvedConstructExpr</a>>,
8222 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html
">CompoundLiteralExpr</a>>,
8223 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>>,
8224 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>>,
8225 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html
">TypedefNameDecl</a>>
8229 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>></td><td class="name
" onclick="toggle('hasDeclContext0')
"><a name="hasDeclContext0Anchor
">hasDeclContext</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
8230 <tr><td colspan="4" class="doc
" id="hasDeclContext0
"><pre>Matches declarations whose declaration context, interpreted as a
8231 Decl, matches InnerMatcher.
8240 cxxRcordDecl(hasDeclContext(namedDecl(hasName("M
")))) matches the
8241 declaration of class D.
8245 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html
">DecltypeType</a>></td><td class="name
" onclick="toggle('hasUnderlyingType0')
"><a name="hasUnderlyingType0Anchor
">hasUnderlyingType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html
">Type</a>></td></tr>
8246 <tr><td colspan="4" class="doc
" id="hasUnderlyingType0
"><pre>Matches DecltypeType or UsingType nodes to find the underlying type.
8250 decltype(2.0) b = 2.0;
8251 decltypeType(hasUnderlyingType(isInteger()))
8252 matches the type of "a
"
8254 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html
">DecltypeType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html
">UsingType</a>>
8258 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html
">DecompositionDecl</a>></td><td class="name
" onclick="toggle('hasAnyBinding0')
"><a name="hasAnyBinding0Anchor
">hasAnyBinding</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html
">BindingDecl</a>> InnerMatcher</td></tr>
8259 <tr><td colspan="4" class="doc
" id="hasAnyBinding0
"><pre>Matches any binding of a DecompositionDecl.
8265 auto &[f, s, t] = arr;
8270 decompositionDecl(hasAnyBinding(bindingDecl(hasName("f
").bind("fBinding
"))))
8271 matches the decomposition decl with 'f' bound to "fBinding
".
8275 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html
">DecompositionDecl</a>></td><td class="name
" onclick="toggle('hasBinding0')
"><a name="hasBinding0Anchor
">hasBinding</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html
">BindingDecl</a>> InnerMatcher</td></tr>
8276 <tr><td colspan="4" class="doc
" id="hasBinding0
"><pre>Matches the Nth binding of a DecompositionDecl.
8282 auto &[f, s, t] = arr;
8287 decompositionDecl(hasBinding(0,
8288 bindingDecl(hasName("f
").bind("fBinding
"))))
8289 matches the decomposition decl with 'f' bound to "fBinding
".
8293 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html
">DoStmt</a>></td><td class="name
" onclick="toggle('hasBody0')
"><a name="hasBody0Anchor
">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>> InnerMatcher</td></tr>
8294 <tr><td colspan="4" class="doc
" id="hasBody0
"><pre>Matches a 'for', 'while', 'while' statement or a function or coroutine
8295 definition that has a given body. Note that in case of functions or
8296 coroutines this matcher only matches the definition itself and not the
8297 other declarations of the same function or coroutine.
8301 forStmt(hasBody(compoundStmt()))
8302 matches 'for (;;) {}'
8309 functionDecl(hasBody(compoundStmt()))
8310 matches 'void f() {}'
8313 but does not match 'void f();'
8317 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html
">DoStmt</a>></td><td class="name
" onclick="toggle('hasCondition3')
"><a name="hasCondition3Anchor
">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
8318 <tr><td colspan="4" class="doc
" id="hasCondition3
"><pre>Matches the condition expression of an if statement, for loop,
8319 switch statement or conditional operator.
8321 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8326 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html
">ElaboratedTypeLoc</a>></td><td class="name
" onclick="toggle('hasNamedTypeLoc0')
"><a name="hasNamedTypeLoc0Anchor
">hasNamedTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>> InnerMatcher</td></tr>
8327 <tr><td colspan="4" class="doc
" id="hasNamedTypeLoc0
"><pre>Matches elaborated `TypeLoc`s that have a named `TypeLoc` matching
8331 template <typename T>
8333 class C<int> c;
8337 elaboratedTypeLoc(hasNamedTypeLoc(templateSpecializationTypeLoc()));
8338 matches the `TypeLoc` of the variable declaration of `c`, but not `d`.
8342 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html
">ElaboratedType</a>></td><td class="name
" onclick="toggle('hasQualifier0')
"><a name="hasQualifier0Anchor
">hasQualifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html
">NestedNameSpecifier</a>> InnerMatcher</td></tr>
8343 <tr><td colspan="4" class="doc
" id="hasQualifier0
"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
8344 matches InnerMatcher if the qualifier exists.
8354 elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N
"))))
8355 matches the type of the variable declaration of d.
8359 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html
">ElaboratedType</a>></td><td class="name
" onclick="toggle('namesType0')
"><a name="namesType0Anchor
">namesType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerMatcher</td></tr>
8360 <tr><td colspan="4" class="doc
" id="namesType0
"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
8370 elaboratedType(namesType(recordType(
8371 hasDeclaration(namedDecl(hasName("D
")))))) matches the type of the variable
8376 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html
">EnumType</a>></td><td class="name
" onclick="toggle('hasDeclaration10')
"><a name="hasDeclaration10Anchor
">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
8377 <tr><td colspan="4" class="doc
" id="hasDeclaration10
"><pre>Matches a node if the declaration associated with that node
8378 matches the given matcher.
8380 The associated declaration is:
8381 - for type nodes, the declaration of the underlying type
8382 - for CallExpr, the declaration of the callee
8383 - for MemberExpr, the declaration of the referenced member
8384 - for CXXConstructExpr, the declaration of the constructor
8385 - for CXXNewExpr, the declaration of the operator new
8386 - for ObjCIvarExpr, the declaration of the ivar
8388 For type nodes, hasDeclaration will generally match the declaration of the
8393 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8394 typedefDecl. A common use case is to match the underlying, desugared type.
8395 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8396 varDecl(hasType(hasUnqualifiedDesugaredType(
8397 recordType(hasDeclaration(decl())))))
8398 In this matcher, the decl will match the CXXRecordDecl of class X.
8400 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html
">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html
">CallExpr</a>>,
8401 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html
">CXXConstructExpr</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_1DeclRefExpr.html
">DeclRefExpr</a>>,
8402 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html
">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html
">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html
">LabelStmt</a>>,
8403 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html
">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html
">RecordType</a>>,
8404 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html
">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>>,
8405 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html
">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html
">TypedefType</a>>,
8406 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
8410 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html
">ExplicitCastExpr</a>></td><td class="name
" onclick="toggle('hasDestinationType0')
"><a name="hasDestinationType0Anchor
">hasDestinationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerMatcher</td></tr>
8411 <tr><td colspan="4" class="doc
" id="hasDestinationType0
"><pre>Matches casts whose destination type matches a given matcher.
8413 (Note: Clang's AST refers to other conversions as "casts
" too, and calls
8414 actual casts "explicit
" casts.)
8418 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html
">ExplicitCastExpr</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>
8419 <tr><td colspan="4" class="doc
" id="hasTypeLoc9
"><pre>Matches if the type location of a node matches the inner matcher.
8423 declaratorDecl(hasTypeLoc(loc(asString("int
"))))
8427 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int
"))))
8430 struct Foo { Foo(int, int); };
8432 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo
"))))
8435 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>>,
8436 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>>,
8437 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>>,
8438 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html
">CXXUnresolvedConstructExpr</a>>,
8439 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html
">CompoundLiteralExpr</a>>,
8440 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>>,
8441 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>>,
8442 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html
">TypedefNameDecl</a>>
8446 <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>
8447 <tr><td colspan="4" class="doc
" id="hasType5
"><pre>Overloaded to match the declaration of the expression's or value
8450 In case of a value declaration (for example a variable declaration),
8451 this resolves one layer of indirection. For example, in the value
8452 declaration "X x;
", cxxRecordDecl(hasName("X
")) matches the declaration of
8453 X, while varDecl(hasType(cxxRecordDecl(hasName("X
")))) matches the
8456 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X
")))))
8457 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X
")))))
8458 and friend class X (matcher = friendDecl(hasType("X
"))
8459 and public virtual X (matcher = cxxBaseSpecifier(hasType(
8460 cxxRecordDecl(hasName("X
"))))
8462 void y(X &x) { x; X z; }
8463 class Y { friend class X; };
8464 class Z : public virtual X {};
8466 Example matches class Derived
8467 (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base
"))))))
8469 class Derived : Base {};
8471 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html
">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html
">ValueDecl</a>>,
8472 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html
">CXXBaseSpecifier</a>>
8476 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>></td><td class="name
" onclick="toggle('hasType0')
"><a name="hasType0Anchor
">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerMatcher</td></tr>
8477 <tr><td colspan="4" class="doc
" id="hasType0
"><pre>Matches if the expression's or declaration's type matches a type
8480 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X
")))))
8481 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X
")))))
8482 and U (matcher = typedefDecl(hasType(asString("int
")))
8483 and friend class X (matcher = friendDecl(hasType("X
"))
8484 and public virtual X (matcher = cxxBaseSpecifier(hasType(
8485 asString("class X
")))
8487 void y(X &x) { x; X z; }
8489 class Y { friend class X; };
8490 class Z : public virtual X {};
8494 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>></td><td class="name
" onclick="toggle('ignoringElidableConstructorCall0')
"><a name="ignoringElidableConstructorCall0Anchor
">ignoringElidableConstructorCall</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
8495 <tr><td colspan="4" class="doc
" id="ignoringElidableConstructorCall0
"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
8496 elidable constructor and other corresponding bookkeeping nodes.
8498 In C++17, elidable copy constructors are no longer being generated in the
8499 AST as it is not permitted by the standard. They are, however, part of the
8500 AST in C++14 and earlier. So, a matcher must abstract over these differences
8501 to work in all language modes. This matcher skips elidable constructor-call
8502 AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
8503 various implicit nodes inside the constructor calls, all of which will not
8504 appear in the C++17 AST.
8514 ``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
8515 matches ``H D = G()`` in C++11 through C++17 (and beyond).
8519 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>></td><td class="name
" onclick="toggle('ignoringImpCasts0')
"><a name="ignoringImpCasts0Anchor
">ignoringImpCasts</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
8520 <tr><td colspan="4" class="doc
" id="ignoringImpCasts0
"><pre>Matches expressions that match InnerMatcher after any implicit casts
8523 Parentheses and explicit casts are not discarded.
8532 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
8533 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
8534 would match the declarations for a, b, c, and d, but not e.
8536 varDecl(hasInitializer(integerLiteral()))
8537 varDecl(hasInitializer(declRefExpr()))
8538 only match the declarations for a.
8542 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>></td><td class="name
" onclick="toggle('ignoringImplicit0')
"><a name="ignoringImplicit0Anchor
">ignoringImplicit</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
8543 <tr><td colspan="4" class="doc
" id="ignoringImplicit0
"><pre>Matches expressions that match InnerMatcher after any implicit AST
8544 nodes are stripped off.
8546 Parentheses and explicit casts are not discarded.
8553 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
8554 would match the declarations for a, b, and c.
8556 varDecl(hasInitializer(cxxConstructExpr()))
8557 only match the declarations for b and c.
8561 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>></td><td class="name
" onclick="toggle('ignoringParenCasts0')
"><a name="ignoringParenCasts0Anchor
">ignoringParenCasts</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
8562 <tr><td colspan="4" class="doc
" id="ignoringParenCasts0
"><pre>Matches expressions that match InnerMatcher after parentheses and
8563 casts are stripped off.
8565 Implicit and non-C Style casts are also discarded.
8569 void* c = reinterpret_cast<char*>(0);
8572 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
8573 would match the declarations for a, b, c, and d.
8575 varDecl(hasInitializer(integerLiteral()))
8576 only match the declaration for a.
8580 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>></td><td class="name
" onclick="toggle('ignoringParenImpCasts0')
"><a name="ignoringParenImpCasts0Anchor
">ignoringParenImpCasts</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
8581 <tr><td colspan="4" class="doc
" id="ignoringParenImpCasts0
"><pre>Matches expressions that match InnerMatcher after implicit casts and
8582 parentheses are stripped off.
8584 Explicit casts are not discarded.
8591 long e = ((long) 0l);
8593 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
8594 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
8595 would match the declarations for a, b, c, and d, but not e.
8597 varDecl(hasInitializer(integerLiteral()))
8598 varDecl(hasInitializer(declRefExpr()))
8599 would only match the declaration for a.
8603 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>></td><td class="name
" onclick="toggle('ignoringParens1')
"><a name="ignoringParens1Anchor
">ignoringParens</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
8604 <tr><td colspan="4" class="doc
" id="ignoringParens1
"><pre>Overload ignoringParens for Expr.
8607 const char* str = ("my-string
");
8609 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
8610 would match the implicit cast resulting from the assignment.
8614 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html
">FieldDecl</a>></td><td class="name
" onclick="toggle('hasInClassInitializer0')
"><a name="hasInClassInitializer0Anchor
">hasInClassInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
8615 <tr><td colspan="4" class="doc
" id="hasInClassInitializer0
"><pre>Matches non-static data members that have an in-class initializer.
8623 fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
8624 matches 'int a;' but not 'int b;'.
8625 fieldDecl(hasInClassInitializer(anything()))
8626 matches 'int a;' and 'int b;' but not 'int c;'.
8630 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html
">ForStmt</a>></td><td class="name
" onclick="toggle('hasBody1')
"><a name="hasBody1Anchor
">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>> InnerMatcher</td></tr>
8631 <tr><td colspan="4" class="doc
" id="hasBody1
"><pre>Matches a 'for', 'while', 'while' statement or a function or coroutine
8632 definition that has a given body. Note that in case of functions or
8633 coroutines this matcher only matches the definition itself and not the
8634 other declarations of the same function or coroutine.
8638 forStmt(hasBody(compoundStmt()))
8639 matches 'for (;;) {}'
8646 functionDecl(hasBody(compoundStmt()))
8647 matches 'void f() {}'
8650 but does not match 'void f();'
8654 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html
">ForStmt</a>></td><td class="name
" onclick="toggle('hasCondition1')
"><a name="hasCondition1Anchor
">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
8655 <tr><td colspan="4" class="doc
" id="hasCondition1
"><pre>Matches the condition expression of an if statement, for loop,
8656 switch statement or conditional operator.
8658 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8663 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html
">ForStmt</a>></td><td class="name
" onclick="toggle('hasIncrement0')
"><a name="hasIncrement0Anchor
">hasIncrement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>> InnerMatcher</td></tr>
8664 <tr><td colspan="4" class="doc
" id="hasIncrement0
"><pre>Matches the increment statement of a for loop.
8667 forStmt(hasIncrement(unaryOperator(hasOperatorName("++
"))))
8669 for (x; x < N; ++x) { }
8673 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html
">ForStmt</a>></td><td class="name
" onclick="toggle('hasLoopInit0')
"><a name="hasLoopInit0Anchor
">hasLoopInit</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>> InnerMatcher</td></tr>
8674 <tr><td colspan="4" class="doc
" id="hasLoopInit0
"><pre>Matches the initialization statement of a for loop.
8677 forStmt(hasLoopInit(declStmt()))
8678 matches 'int x = 0' in
8679 for (int x = 0; x < N; ++x) { }
8683 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html
">FriendDecl</a>></td><td class="name
" onclick="toggle('hasType6')
"><a name="hasType6Anchor
">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
8684 <tr><td colspan="4" class="doc
" id="hasType6
"><pre>Overloaded to match the declaration of the expression's or value
8687 In case of a value declaration (for example a variable declaration),
8688 this resolves one layer of indirection. For example, in the value
8689 declaration "X x;
", cxxRecordDecl(hasName("X
")) matches the declaration of
8690 X, while varDecl(hasType(cxxRecordDecl(hasName("X
")))) matches the
8693 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X
")))))
8694 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X
")))))
8695 and friend class X (matcher = friendDecl(hasType("X
"))
8696 and public virtual X (matcher = cxxBaseSpecifier(hasType(
8697 cxxRecordDecl(hasName("X
"))))
8699 void y(X &x) { x; X z; }
8700 class Y { friend class X; };
8701 class Z : public virtual X {};
8703 Example matches class Derived
8704 (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base
"))))))
8706 class Derived : Base {};
8708 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html
">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html
">ValueDecl</a>>,
8709 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html
">CXXBaseSpecifier</a>>
8713 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html
">FriendDecl</a>></td><td class="name
" onclick="toggle('hasType1')
"><a name="hasType1Anchor
">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerMatcher</td></tr>
8714 <tr><td colspan="4" class="doc
" id="hasType1
"><pre>Matches if the expression's or declaration's type matches a type
8717 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X
")))))
8718 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X
")))))
8719 and U (matcher = typedefDecl(hasType(asString("int
")))
8720 and friend class X (matcher = friendDecl(hasType("X
"))
8721 and public virtual X (matcher = cxxBaseSpecifier(hasType(
8722 asString("class X
")))
8724 void y(X &x) { x; X z; }
8726 class Y { friend class X; };
8727 class Z : public virtual X {};
8731 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>></td><td class="name
" onclick="toggle('forEachTemplateArgument2')
"><a name="forEachTemplateArgument2Anchor
">forEachTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>> InnerMatcher</td></tr>
8732 <tr><td colspan="4" class="doc
" id="forEachTemplateArgument2
"><pre>Matches templateSpecializationType, class template specialization,
8733 variable template specialization, and function template specialization
8734 nodes where the template argument matches the inner matcher. This matcher
8735 may produce multiple matches.
8738 template <typename T, unsigned N, unsigned M>
8741 constexpr unsigned R = 2;
8742 Matrix<int, R * 2, R * 4> M;
8744 template <typename T, typename U>
8745 void f(T&& t, U&& u) {}
8749 templateSpecializationType(forEachTemplateArgument(isExpr(expr())))
8750 matches twice, with expr() matching 'R * 2' and 'R * 4'
8751 functionDecl(forEachTemplateArgument(refersToType(builtinType())))
8752 matches the specialization f<unsigned, bool> twice, for 'unsigned'
8757 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>></td><td class="name
" onclick="toggle('hasAnyBody0')
"><a name="hasAnyBody0Anchor
">hasAnyBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>> InnerMatcher</td></tr>
8758 <tr><td colspan="4" class="doc
" id="hasAnyBody0
"><pre>Matches a function declaration that has a given body present in the AST.
8759 Note that this matcher matches all the declarations of a function whose
8760 body is present in the AST.
8766 functionDecl(hasAnyBody(compoundStmt()))
8767 matches both 'void f();'
8771 but does not match 'void g();'
8775 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>></td><td class="name
" onclick="toggle('hasAnyParameter0')
"><a name="hasAnyParameter0Anchor
">hasAnyParameter</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html
">ParmVarDecl</a>> InnerMatcher</td></tr>
8776 <tr><td colspan="4" class="doc
" id="hasAnyParameter0
"><pre>Matches any parameter of a function or an ObjC method declaration or a
8779 Does not match the 'this' parameter of a method.
8782 class X { void f(int x, int y, int z) {} };
8783 cxxMethodDecl(hasAnyParameter(hasName("y
")))
8784 matches f(int x, int y, int z) {}
8785 with hasAnyParameter(...)
8788 For ObjectiveC, given
8789 @interface I - (void) f:(int) y; @end
8791 the matcher objcMethodDecl(hasAnyParameter(hasName("y
")))
8792 matches the declaration of method f with hasParameter
8796 b = ^(int y) { printf("%d
", y) };
8798 the matcher blockDecl(hasAnyParameter(hasName("y
")))
8799 matches the declaration of the block b with hasParameter
8804 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>></td><td class="name
" onclick="toggle('hasAnyTemplateArgumentLoc2')
"><a name="hasAnyTemplateArgumentLoc2Anchor
">hasAnyTemplateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
8805 <tr><td colspan="4" class="doc
" id="hasAnyTemplateArgumentLoc2
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
8806 variable template specializations, and function template specializations
8807 that have at least one `TemplateArgumentLoc` matching the given
8811 template<typename T> class A {};
8813 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(
8814 hasTypeLoc(loc(asString("int
")))))))
8815 matches `A<int> a`.
8819 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>></td><td class="name
" onclick="toggle('hasAnyTemplateArgument2')
"><a name="hasAnyTemplateArgument2Anchor
">hasAnyTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>> InnerMatcher</td></tr>
8820 <tr><td colspan="4" class="doc
" id="hasAnyTemplateArgument2
"><pre>Matches templateSpecializationTypes, class template specializations,
8821 variable template specializations, and function template specializations
8822 that have at least one TemplateArgument matching the given InnerMatcher.
8825 template<typename T> class A {};
8826 template<> class A<double> {};
8829 template<typename T> f() {};
8830 void func() { f<int>(); };
8832 classTemplateSpecializationDecl(hasAnyTemplateArgument(
8833 refersToType(asString("int
"))))
8834 matches the specialization A<int>
8836 functionDecl(hasAnyTemplateArgument(refersToType(asString("int
"))))
8837 matches the specialization f<int>
8841 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>></td><td class="name
" onclick="toggle('hasBody4')
"><a name="hasBody4Anchor
">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>> InnerMatcher</td></tr>
8842 <tr><td colspan="4" class="doc
" id="hasBody4
"><pre>Matches a 'for', 'while', 'while' statement or a function or coroutine
8843 definition that has a given body. Note that in case of functions or
8844 coroutines this matcher only matches the definition itself and not the
8845 other declarations of the same function or coroutine.
8849 forStmt(hasBody(compoundStmt()))
8850 matches 'for (;;) {}'
8857 functionDecl(hasBody(compoundStmt()))
8858 matches 'void f() {}'
8861 but does not match 'void f();'
8865 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>></td><td class="name
" onclick="toggle('hasExplicitSpecifier0')
"><a name="hasExplicitSpecifier0Anchor
">hasExplicitSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
8866 <tr><td colspan="4" class="doc
" id="hasExplicitSpecifier0
"><pre>Matches the expression in an explicit specifier if present in the given
8870 template<bool b>
8873 explicit S(double); // #2
8874 operator int(); // #3
8875 explicit operator bool(); // #4
8876 explicit(false) S(bool) // # 7
8877 explicit(true) S(char) // # 8
8878 explicit(b) S(S) // # 9
8880 S(int) -> S<true> // #5
8881 explicit S(double) -> S<false> // #6
8882 cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
8883 cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
8884 cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
8888 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>></td><td class="name
" onclick="toggle('hasParameter0')
"><a name="hasParameter0Anchor
">hasParameter</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html
">ParmVarDecl</a>> InnerMatcher</td></tr>
8889 <tr><td colspan="4" class="doc
" id="hasParameter0
"><pre>Matches the n'th parameter of a function or an ObjC method
8890 declaration or a block.
8893 class X { void f(int x) {} };
8894 cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8896 with hasParameter(...)
8899 For ObjectiveC, given
8900 @interface I - (void) f:(int) y; @end
8902 the matcher objcMethodDecl(hasParameter(0, hasName("y
")))
8903 matches the declaration of method f with hasParameter
8908 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>></td><td class="name
" onclick="toggle('hasReturnTypeLoc0')
"><a name="hasReturnTypeLoc0Anchor
">hasReturnTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>> ReturnMatcher</td></tr>
8909 <tr><td colspan="4" class="doc
" id="hasReturnTypeLoc0
"><pre>Matches a function declared with the specified return `TypeLoc`.
8912 int f() { return 5; }
8914 functionDecl(hasReturnTypeLoc(loc(asString("int
"))))
8915 matches the declaration of `f`, but not `g`.
8919 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>></td><td class="name
" onclick="toggle('hasTemplateArgumentLoc2')
"><a name="hasTemplateArgumentLoc2Anchor
">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
8920 <tr><td colspan="4" class="doc
" id="hasTemplateArgumentLoc2
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
8921 variable template specializations, and function template specializations
8922 where the n'th `TemplateArgumentLoc` matches the given `InnerMatcher`.
8925 template<typename T, typename U> class A {};
8926 A<double, int> b;
8927 A<int, double> c;
8928 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
8929 hasTypeLoc(loc(asString("double
")))))))
8930 matches `A<double, int> b`, but not `A<int, double> c`.
8934 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>></td><td class="name
" onclick="toggle('hasTemplateArgument2')
"><a name="hasTemplateArgument2Anchor
">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>> InnerMatcher</td></tr>
8935 <tr><td colspan="4" class="doc
" id="hasTemplateArgument2
"><pre>Matches templateSpecializationType, class template specializations,
8936 variable template specializations, and function template specializations
8937 where the n'th TemplateArgument matches the given InnerMatcher.
8940 template<typename T, typename U> class A {};
8941 A<bool, int> b;
8942 A<int, bool> c;
8944 template<typename T> void f() {}
8945 void func() { f<int>(); };
8946 classTemplateSpecializationDecl(hasTemplateArgument(
8947 1, refersToType(asString("int
"))))
8948 matches the specialization A<bool, int>
8950 functionDecl(hasTemplateArgument(0, refersToType(asString("int
"))))
8951 matches the specialization f<int>
8955 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>></td><td class="name
" onclick="toggle('returns0')
"><a name="returns0Anchor
">returns</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerMatcher</td></tr>
8956 <tr><td colspan="4" class="doc
" id="returns0
"><pre>Matches the return type of a function declaration.
8959 class X { int f() { return 1; } };
8960 cxxMethodDecl(returns(asString("int
")))
8961 matches int f() { return 1; }
8965 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html
">IfStmt</a>></td><td class="name
" onclick="toggle('hasCondition0')
"><a name="hasCondition0Anchor
">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
8966 <tr><td colspan="4" class="doc
" id="hasCondition0
"><pre>Matches the condition expression of an if statement, for loop,
8967 switch statement or conditional operator.
8969 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8974 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html
">IfStmt</a>></td><td class="name
" onclick="toggle('hasConditionVariableStatement0')
"><a name="hasConditionVariableStatement0Anchor
">hasConditionVariableStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html
">DeclStmt</a>> InnerMatcher</td></tr>
8975 <tr><td colspan="4" class="doc
" id="hasConditionVariableStatement0
"><pre>Matches the condition variable statement in an if statement.
8978 if (A* a = GetAPointer()) {}
8979 hasConditionVariableStatement(...)
8980 matches 'A* a = GetAPointer()'.
8984 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html
">IfStmt</a>></td><td class="name
" onclick="toggle('hasElse0')
"><a name="hasElse0Anchor
">hasElse</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>> InnerMatcher</td></tr>
8985 <tr><td colspan="4" class="doc
" id="hasElse0
"><pre>Matches the else-statement of an if statement.
8987 Examples matches the if statement
8988 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
8989 if (false) false; else true;
8993 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html
">IfStmt</a>></td><td class="name
" onclick="toggle('hasInitStatement0')
"><a name="hasInitStatement0Anchor
">hasInitStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>> InnerMatcher</td></tr>
8994 <tr><td colspan="4" class="doc
" id="hasInitStatement0
"><pre>Matches selection statements with initializer.
8998 if (int i = foobar(); i > 0) {}
8999 switch (int i = foobar(); i) {}
9000 for (auto& a = get_range(); auto& x : a) {}
9003 if (foobar() > 0) {}
9004 switch (foobar()) {}
9005 for (auto& x : get_range()) {}
9007 ifStmt(hasInitStatement(anything()))
9008 matches the if statement in foo but not in bar.
9009 switchStmt(hasInitStatement(anything()))
9010 matches the switch statement in foo but not in bar.
9011 cxxForRangeStmt(hasInitStatement(anything()))
9012 matches the range for statement in foo but not in bar.
9016 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html
">IfStmt</a>></td><td class="name
" onclick="toggle('hasThen0')
"><a name="hasThen0Anchor
">hasThen</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>> InnerMatcher</td></tr>
9017 <tr><td colspan="4" class="doc
" id="hasThen0
"><pre>Matches the then-statement of an if statement.
9019 Examples matches the if statement
9020 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
9021 if (false) true; else false;
9025 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html
">ImplicitCastExpr</a>></td><td class="name
" onclick="toggle('hasImplicitDestinationType0')
"><a name="hasImplicitDestinationType0Anchor
">hasImplicitDestinationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerMatcher</td></tr>
9026 <tr><td colspan="4" class="doc
" id="hasImplicitDestinationType0
"><pre>Matches implicit casts whose destination type matches a given
9031 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html
">InitListExpr</a>></td><td class="name
" onclick="toggle('hasInit0')
"><a name="hasInit0Anchor
">hasInit</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
9032 <tr><td colspan="4" class="doc
" id="hasInit0
"><pre>Matches the n'th item of an initializer list expression.
9035 (matcher = initListExpr(hasInit(0, expr())))
9040 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html
">InitListExpr</a>></td><td class="name
" onclick="toggle('hasSyntacticForm0')
"><a name="hasSyntacticForm0Anchor
">hasSyntacticForm</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
9041 <tr><td colspan="4" class="doc
" id="hasSyntacticForm0
"><pre>Matches the syntactic form of init list expressions
9042 (if expression have it).
9046 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html
">InjectedClassNameType</a>></td><td class="name
" onclick="toggle('hasDeclaration9')
"><a name="hasDeclaration9Anchor
">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
9047 <tr><td colspan="4" class="doc
" id="hasDeclaration9
"><pre>Matches a node if the declaration associated with that node
9048 matches the given matcher.
9050 The associated declaration is:
9051 - for type nodes, the declaration of the underlying type
9052 - for CallExpr, the declaration of the callee
9053 - for MemberExpr, the declaration of the referenced member
9054 - for CXXConstructExpr, the declaration of the constructor
9055 - for CXXNewExpr, the declaration of the operator new
9056 - for ObjCIvarExpr, the declaration of the ivar
9058 For type nodes, hasDeclaration will generally match the declaration of the
9063 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9064 typedefDecl. A common use case is to match the underlying, desugared type.
9065 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9066 varDecl(hasType(hasUnqualifiedDesugaredType(
9067 recordType(hasDeclaration(decl())))))
9068 In this matcher, the decl will match the CXXRecordDecl of class X.
9070 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html
">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html
">CallExpr</a>>,
9071 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html
">CXXConstructExpr</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_1DeclRefExpr.html
">DeclRefExpr</a>>,
9072 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html
">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html
">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html
">LabelStmt</a>>,
9073 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html
">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html
">RecordType</a>>,
9074 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html
">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>>,
9075 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html
">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html
">TypedefType</a>>,
9076 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
9080 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html
">LabelStmt</a>></td><td class="name
" onclick="toggle('hasDeclaration8')
"><a name="hasDeclaration8Anchor
">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
9081 <tr><td colspan="4" class="doc
" id="hasDeclaration8
"><pre>Matches a node if the declaration associated with that node
9082 matches the given matcher.
9084 The associated declaration is:
9085 - for type nodes, the declaration of the underlying type
9086 - for CallExpr, the declaration of the callee
9087 - for MemberExpr, the declaration of the referenced member
9088 - for CXXConstructExpr, the declaration of the constructor
9089 - for CXXNewExpr, the declaration of the operator new
9090 - for ObjCIvarExpr, the declaration of the ivar
9092 For type nodes, hasDeclaration will generally match the declaration of the
9097 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9098 typedefDecl. A common use case is to match the underlying, desugared type.
9099 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9100 varDecl(hasType(hasUnqualifiedDesugaredType(
9101 recordType(hasDeclaration(decl())))))
9102 In this matcher, the decl will match the CXXRecordDecl of class X.
9104 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html
">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html
">CallExpr</a>>,
9105 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html
">CXXConstructExpr</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_1DeclRefExpr.html
">DeclRefExpr</a>>,
9106 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html
">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html
">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html
">LabelStmt</a>>,
9107 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html
">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html
">RecordType</a>>,
9108 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html
">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>>,
9109 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html
">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html
">TypedefType</a>>,
9110 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
9114 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html
">LambdaCapture</a>></td><td class="name
" onclick="toggle('capturesVar0')
"><a name="capturesVar0Anchor
">capturesVar</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html
">ValueDecl</a>> InnerMatcher</td></tr>
9115 <tr><td colspan="4" class="doc
" id="capturesVar0
"><pre>Matches a `LambdaCapture` that refers to the specified `VarDecl`. The
9116 `VarDecl` can be a separate variable that is captured by value or
9117 reference, or a synthesized variable if the capture has an initializer.
9123 auto g = [x = 1](){};
9126 lambdaExpr(hasAnyCapture(lambdaCapture(capturesVar(hasName("x
")))),
9127 capturesVar(hasName("x
")) matches `x` and `x = 1`.
9131 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html
">LambdaExpr</a>></td><td class="name
" onclick="toggle('forEachLambdaCapture0')
"><a name="forEachLambdaCapture0Anchor
">forEachLambdaCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html
">LambdaCapture</a>> InnerMatcher</td></tr>
9132 <tr><td colspan="4" class="doc
" id="forEachLambdaCapture0
"><pre>Matches each lambda capture in a lambda expression.
9138 auto f = [=]() { return x + y + z; };
9140 lambdaExpr(forEachLambdaCapture(
9141 lambdaCapture(capturesVar(varDecl(hasType(isInteger()))))))
9142 will trigger two matches, binding for 'x' and 'y' respectively.
9146 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html
">LambdaExpr</a>></td><td class="name
" onclick="toggle('hasAnyCapture0')
"><a name="hasAnyCapture0Anchor
">hasAnyCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html
">LambdaCapture</a>> InnerMatcher</td></tr>
9147 <tr><td colspan="4" class="doc
" id="hasAnyCapture0
"><pre>Matches any capture in a lambda expression.
9152 auto f = [=](){ return t; };
9154 lambdaExpr(hasAnyCapture(lambdaCapture())) and
9155 lambdaExpr(hasAnyCapture(lambdaCapture(refersToVarDecl(hasName("t
")))))
9156 both match `[=](){ return t; }`.
9160 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html
">MemberExpr</a>></td><td class="name
" onclick="toggle('hasDeclaration7')
"><a name="hasDeclaration7Anchor
">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
9161 <tr><td colspan="4" class="doc
" id="hasDeclaration7
"><pre>Matches a node if the declaration associated with that node
9162 matches the given matcher.
9164 The associated declaration is:
9165 - for type nodes, the declaration of the underlying type
9166 - for CallExpr, the declaration of the callee
9167 - for MemberExpr, the declaration of the referenced member
9168 - for CXXConstructExpr, the declaration of the constructor
9169 - for CXXNewExpr, the declaration of the operator new
9170 - for ObjCIvarExpr, the declaration of the ivar
9172 For type nodes, hasDeclaration will generally match the declaration of the
9177 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9178 typedefDecl. A common use case is to match the underlying, desugared type.
9179 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9180 varDecl(hasType(hasUnqualifiedDesugaredType(
9181 recordType(hasDeclaration(decl())))))
9182 In this matcher, the decl will match the CXXRecordDecl of class X.
9184 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html
">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html
">CallExpr</a>>,
9185 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html
">CXXConstructExpr</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_1DeclRefExpr.html
">DeclRefExpr</a>>,
9186 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html
">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html
">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html
">LabelStmt</a>>,
9187 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html
">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html
">RecordType</a>>,
9188 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html
">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>>,
9189 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html
">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html
">TypedefType</a>>,
9190 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
9194 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html
">MemberExpr</a>></td><td class="name
" onclick="toggle('hasObjectExpression0')
"><a name="hasObjectExpression0Anchor
">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
9195 <tr><td colspan="4" class="doc
" id="hasObjectExpression0
"><pre>Matches a member expression where the object expression is matched by a
9196 given matcher. Implicit object expressions are included; that is, it matches
9197 use of implicit `this`.
9202 int f(X x) { x.m; return m; }
9204 memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X
")))))
9205 matches `x.m`, but not `m`; however,
9206 memberExpr(hasObjectExpression(hasType(pointsTo(
9207 cxxRecordDecl(hasName("X
"))))))
9208 matches `m` (aka. `this->m`), but not `x.m`.
9212 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html
">MemberExpr</a>></td><td class="name
" onclick="toggle('member0')
"><a name="member0Anchor
">member</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html
">ValueDecl</a>> InnerMatcher</td></tr>
9213 <tr><td colspan="4" class="doc
" id="member0
"><pre>Matches a member expression where the member is matched by a
9217 struct { int first, second; } first, second;
9218 int i(second.first);
9219 int j(first.second);
9220 memberExpr(member(hasName("first
")))
9221 matches second.first
9222 but not first.second (because the member name there is "second
").
9226 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html
">MemberPointerType</a>></td><td class="name
" onclick="toggle('pointee1')
"><a name="pointee1Anchor
">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html
">Type</a>></td></tr>
9227 <tr><td colspan="4" class="doc
" id="pointee1
"><pre>Narrows PointerType (and similar) matchers to those where the
9228 pointee matches a given matcher.
9234 pointerType(pointee(isConstQualified(), isInteger()))
9235 matches "int const *b
"
9237 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html
">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html
">MemberPointerType</a>>,
9238 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html
">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html
">ReferenceType</a>>
9242 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html
">NamedDecl</a>></td><td class="name
" onclick="toggle('hasUnderlyingDecl0')
"><a name="hasUnderlyingDecl0Anchor
">hasUnderlyingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html
">NamedDecl</a>> InnerMatcher</td></tr>
9243 <tr><td colspan="4" class="doc
" id="hasUnderlyingDecl0
"><pre>Matches a NamedDecl whose underlying declaration matches the given
9247 namespace N { template<class T> void f(T t); }
9248 template <class T> void g() { using N::f; f(T()); }
9249 unresolvedLookupExpr(hasAnyDeclaration(
9250 namedDecl(hasUnderlyingDecl(hasName("::N::f
")))))
9251 matches the use of f in g() .
9255 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html
">NestedNameSpecifierLoc</a>></td><td class="name
" onclick="toggle('hasPrefix1')
"><a name="hasPrefix1Anchor
">hasPrefix</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html
">NestedNameSpecifierLoc</a>> InnerMatcher</td></tr>
9256 <tr><td colspan="4" class="doc
" id="hasPrefix1
"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
9259 struct A { struct B { struct C {}; }; };
9261 nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A
")))))
9266 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html
">NestedNameSpecifierLoc</a>></td><td class="name
" onclick="toggle('loc1')
"><a name="loc1Anchor
">loc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html
">NestedNameSpecifier</a>> InnerMatcher</td></tr>
9267 <tr><td colspan="4" class="doc
" id="loc1
"><pre>Matches NestedNameSpecifierLocs for which the given inner
9268 NestedNameSpecifier-matcher matches.
9272 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html
">NestedNameSpecifierLoc</a>></td><td class="name
" onclick="toggle('specifiesTypeLoc0')
"><a name="specifiesTypeLoc0Anchor
">specifiesTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>> InnerMatcher</td></tr>
9273 <tr><td colspan="4" class="doc
" id="specifiesTypeLoc0
"><pre>Matches nested name specifier locs that specify a type matching the
9277 struct A { struct B { struct C {}; }; };
9279 nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
9280 hasDeclaration(cxxRecordDecl(hasName("A
")))))))
9285 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html
">NestedNameSpecifier</a>></td><td class="name
" onclick="toggle('hasPrefix0')
"><a name="hasPrefix0Anchor
">hasPrefix</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html
">NestedNameSpecifier</a>> InnerMatcher</td></tr>
9286 <tr><td colspan="4" class="doc
" id="hasPrefix0
"><pre>Matches on the prefix of a NestedNameSpecifier.
9289 struct A { struct B { struct C {}; }; };
9291 nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A
")))) and
9296 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html
">NestedNameSpecifier</a>></td><td class="name
" onclick="toggle('specifiesNamespace0')
"><a name="specifiesNamespace0Anchor
">specifiesNamespace</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html
">NamespaceDecl</a>> InnerMatcher</td></tr>
9297 <tr><td colspan="4" class="doc
" id="specifiesNamespace0
"><pre>Matches nested name specifiers that specify a namespace matching the
9298 given namespace matcher.
9301 namespace ns { struct A {}; }
9303 nestedNameSpecifier(specifiesNamespace(hasName("ns
")))
9308 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html
">NestedNameSpecifier</a>></td><td class="name
" onclick="toggle('specifiesType0')
"><a name="specifiesType0Anchor
">specifiesType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerMatcher</td></tr>
9309 <tr><td colspan="4" class="doc
" id="specifiesType0
"><pre>Matches nested name specifiers that specify a type matching the
9310 given QualType matcher without qualifiers.
9313 struct A { struct B { struct C {}; }; };
9315 nestedNameSpecifier(specifiesType(
9316 hasDeclaration(cxxRecordDecl(hasName("A
")))
9322 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html
">OMPExecutableDirective</a>></td><td class="name
" onclick="toggle('hasAnyClause0')
"><a name="hasAnyClause0Anchor
">hasAnyClause</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html
">OMPClause</a>> InnerMatcher</td></tr>
9323 <tr><td colspan="4" class="doc
" id="hasAnyClause0
"><pre>Matches any clause in an OpenMP directive.
9327 #pragma omp parallel
9328 #pragma omp parallel default(none)
9330 ``ompExecutableDirective(hasAnyClause(anything()))`` matches
9331 ``omp parallel default(none)``.
9335 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html
">OMPExecutableDirective</a>></td><td class="name
" onclick="toggle('hasStructuredBlock0')
"><a name="hasStructuredBlock0Anchor
">hasStructuredBlock</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>> InnerMatcher</td></tr>
9336 <tr><td colspan="4" class="doc
" id="hasStructuredBlock0
"><pre>Matches the structured-block of the OpenMP executable directive
9338 Prerequisite: the executable directive must not be standalone directive.
9339 If it is, it will never match.
9343 #pragma omp parallel
9345 #pragma omp parallel
9348 ``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
9352 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html
">ObjCInterfaceDecl</a>></td><td class="name
" onclick="toggle('isDerivedFrom1')
"><a name="isDerivedFrom1Anchor
">isDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html
">NamedDecl</a>> Base</td></tr>
9353 <tr><td colspan="4" class="doc
" id="isDerivedFrom1
"><pre>Matches C++ classes that are directly or indirectly derived from a class
9354 matching Base, or Objective-C classes that directly or indirectly
9355 subclass a class matching Base.
9357 Note that a class is not considered to be derived from itself.
9359 Example matches Y, Z, C (Base == hasName("X
"))
9361 class Y : public X {}; // directly derived
9362 class Z : public Y {}; // indirectly derived
9365 class C : public B {}; // derived from a typedef of X
9367 In the following example, Bar matches isDerivedFrom(hasName("X
")):
9370 class Bar : public Foo {}; // derived from a type that X is a typedef of
9372 In the following example, Bar matches isDerivedFrom(hasName("NSObject
"))
9373 @interface NSObject @end
9374 @interface Bar : NSObject @end
9376 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html
">CXXRecordDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html
">ObjCInterfaceDecl</a>>
9380 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html
">ObjCInterfaceDecl</a>></td><td class="name
" onclick="toggle('isDirectlyDerivedFrom1')
"><a name="isDirectlyDerivedFrom1Anchor
">isDirectlyDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html
">NamedDecl</a>> Base</td></tr>
9381 <tr><td colspan="4" class="doc
" id="isDirectlyDerivedFrom1
"><pre>Matches C++ or Objective-C classes that are directly derived from a class
9384 Note that a class is not considered to be derived from itself.
9386 Example matches Y, C (Base == hasName("X
"))
9388 class Y : public X {}; // directly derived
9389 class Z : public Y {}; // indirectly derived
9392 class C : public B {}; // derived from a typedef of X
9394 In the following example, Bar matches isDerivedFrom(hasName("X
")):
9397 class Bar : public Foo {}; // derived from a type that X is a typedef of
9401 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html
">ObjCInterfaceDecl</a>></td><td class="name
" onclick="toggle('isSameOrDerivedFrom1')
"><a name="isSameOrDerivedFrom1Anchor
">isSameOrDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html
">NamedDecl</a>> Base</td></tr>
9402 <tr><td colspan="4" class="doc
" id="isSameOrDerivedFrom1
"><pre>Similar to isDerivedFrom(), but also matches classes that directly
9407 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html
">ObjCMessageExpr</a>></td><td class="name
" onclick="toggle('callee2')
"><a name="callee2Anchor
">callee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
9408 <tr><td colspan="4" class="doc
" id="callee2
"><pre>Matches 1) if the call expression's callee's declaration matches the
9409 given matcher; or 2) if the Obj-C message expression's callee's method
9410 declaration matches the given matcher.
9412 Example matches y.x() (matcher = callExpr(callee(
9413 cxxMethodDecl(hasName("x
")))))
9414 class Y { public: void x(); };
9415 void z() { Y y; y.x(); }
9417 Example 2. Matches [I foo] with
9418 objcMessageExpr(callee(objcMethodDecl(hasName("foo
"))))
9420 @interface I: NSObject
9428 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html
">ObjCMessageExpr</a>></td><td class="name
" onclick="toggle('hasAnyArgument3')
"><a name="hasAnyArgument3Anchor
">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
9429 <tr><td colspan="4" class="doc
" id="hasAnyArgument3
"><pre>Matches any argument of a call expression or a constructor call
9430 expression, or an ObjC-message-send expression.
9433 void x(int, int, int) { int y; x(1, y, 42); }
9434 callExpr(hasAnyArgument(declRefExpr()))
9436 with hasAnyArgument(...)
9439 For ObjectiveC, given
9440 @interface I - (void) f:(int) y; @end
9441 void foo(I *i) { [i f:12]; }
9442 objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
9447 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html
">ObjCMessageExpr</a>></td><td class="name
" onclick="toggle('hasArgument3')
"><a name="hasArgument3Anchor
">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
9448 <tr><td colspan="4" class="doc
" id="hasArgument3
"><pre>Matches the n'th argument of a call expression or a constructor
9451 Example matches y in x(y)
9452 (matcher = callExpr(hasArgument(0, declRefExpr())))
9453 void x(int) { int y; x(y); }
9457 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html
">ObjCMessageExpr</a>></td><td class="name
" onclick="toggle('hasReceiver0')
"><a name="hasReceiver0Anchor
">hasReceiver</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
9458 <tr><td colspan="4" class="doc
" id="hasReceiver0
"><pre>Matches if the Objective-C message is sent to an instance,
9459 and the inner matcher matches on that instance.
9461 For example the method call in
9462 NSString *x = @"hello
";
9463 [x containsString:@"h
"];
9465 objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x
"))))))
9469 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html
">ObjCMessageExpr</a>></td><td class="name
" onclick="toggle('hasReceiverType0')
"><a name="hasReceiverType0Anchor
">hasReceiverType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerMatcher</td></tr>
9470 <tr><td colspan="4" class="doc
" id="hasReceiverType0
"><pre>Matches on the receiver of an ObjectiveC Message expression.
9473 matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *
")));
9474 matches the [webView ...] message invocation.
9475 NSString *webViewJavaScript = ...
9476 UIWebView *webView = ...
9477 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
9481 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html
">ObjCMethodDecl</a>></td><td class="name
" onclick="toggle('hasAnyParameter1')
"><a name="hasAnyParameter1Anchor
">hasAnyParameter</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html
">ParmVarDecl</a>> InnerMatcher</td></tr>
9482 <tr><td colspan="4" class="doc
" id="hasAnyParameter1
"><pre>Matches any parameter of a function or an ObjC method declaration or a
9485 Does not match the 'this' parameter of a method.
9488 class X { void f(int x, int y, int z) {} };
9489 cxxMethodDecl(hasAnyParameter(hasName("y
")))
9490 matches f(int x, int y, int z) {}
9491 with hasAnyParameter(...)
9494 For ObjectiveC, given
9495 @interface I - (void) f:(int) y; @end
9497 the matcher objcMethodDecl(hasAnyParameter(hasName("y
")))
9498 matches the declaration of method f with hasParameter
9502 b = ^(int y) { printf("%d
", y) };
9504 the matcher blockDecl(hasAnyParameter(hasName("y
")))
9505 matches the declaration of the block b with hasParameter
9510 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html
">ObjCMethodDecl</a>></td><td class="name
" onclick="toggle('hasParameter1')
"><a name="hasParameter1Anchor
">hasParameter</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html
">ParmVarDecl</a>> InnerMatcher</td></tr>
9511 <tr><td colspan="4" class="doc
" id="hasParameter1
"><pre>Matches the n'th parameter of a function or an ObjC method
9512 declaration or a block.
9515 class X { void f(int x) {} };
9516 cxxMethodDecl(hasParameter(0, hasType(varDecl())))
9518 with hasParameter(...)
9521 For ObjectiveC, given
9522 @interface I - (void) f:(int) y; @end
9524 the matcher objcMethodDecl(hasParameter(0, hasName("y
")))
9525 matches the declaration of method f with hasParameter
9530 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html
">ObjCPropertyDecl</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>
9531 <tr><td colspan="4" class="doc
" id="hasTypeLoc10
"><pre>Matches if the type location of a node matches the inner matcher.
9535 declaratorDecl(hasTypeLoc(loc(asString("int
"))))
9539 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int
"))))
9542 struct Foo { Foo(int, int); };
9544 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo
"))))
9547 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>>,
9548 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>>,
9549 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>>,
9550 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html
">CXXUnresolvedConstructExpr</a>>,
9551 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html
">CompoundLiteralExpr</a>>,
9552 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>>,
9553 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>>,
9554 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html
">TypedefNameDecl</a>>
9558 <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>
9559 <tr><td colspan="4" class="doc
" id="hasSourceExpression1
"><pre>Matches if the cast's source expression
9560 or opaque value's source expression matches the given matcher.
9562 Example 1: matches "a string
"
9563 (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
9564 class URL { URL(string); };
9565 URL url = "a string
";
9567 Example 2: matches 'b' (matcher =
9568 opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
9573 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OverloadExpr.html
">OverloadExpr</a>></td><td class="name
" onclick="toggle('hasAnyDeclaration0')
"><a name="hasAnyDeclaration0Anchor
">hasAnyDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
9574 <tr><td colspan="4" class="doc
" id="hasAnyDeclaration0
"><pre>Matches an OverloadExpr if any of the declarations in the set of
9575 overloads matches the given matcher.
9578 template <typename T> void foo(T);
9579 template <typename T> void bar(T);
9580 template <typename T> void baz(T t) {
9584 unresolvedLookupExpr(hasAnyDeclaration(
9585 functionTemplateDecl(hasName("foo
"))))
9586 matches foo in foo(t); but not bar in bar(t);
9590 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html
">ParenType</a>></td><td class="name
" onclick="toggle('innerType0')
"><a name="innerType0Anchor
">innerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html
">Type</a>></td></tr>
9591 <tr><td colspan="4" class="doc
" id="innerType0
"><pre>Matches ParenType nodes where the inner type is a specific type.
9594 int (*ptr_to_array)[4];
9595 int (*ptr_to_func)(int);
9597 varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
9598 ptr_to_func but not ptr_to_array.
9600 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html
">ParenType</a>>
9604 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html
">PointerTypeLoc</a>></td><td class="name
" onclick="toggle('hasPointeeLoc0')
"><a name="hasPointeeLoc0Anchor
">hasPointeeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>> PointeeMatcher</td></tr>
9605 <tr><td colspan="4" class="doc
" id="hasPointeeLoc0
"><pre>Matches pointer `TypeLoc`s that have a pointee `TypeLoc` matching
9610 pointerTypeLoc(hasPointeeLoc(loc(asString("int
"))))
9615 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html
">PointerType</a>></td><td class="name
" onclick="toggle('pointee2')
"><a name="pointee2Anchor
">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html
">Type</a>></td></tr>
9616 <tr><td colspan="4" class="doc
" id="pointee2
"><pre>Narrows PointerType (and similar) matchers to those where the
9617 pointee matches a given matcher.
9623 pointerType(pointee(isConstQualified(), isInteger()))
9624 matches "int const *b
"
9626 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html
">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html
">MemberPointerType</a>>,
9627 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html
">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html
">ReferenceType</a>>
9631 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>></td><td class="name
" onclick="toggle('hasCanonicalType0')
"><a name="hasCanonicalType0Anchor
">hasCanonicalType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerMatcher</td></tr>
9632 <tr><td colspan="4" class="doc
" id="hasCanonicalType0
"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
9635 typedef int &int_ref;
9639 varDecl(hasType(qualType(referenceType()))))) will not match the
9640 declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
9644 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>></td><td class="name
" onclick="toggle('hasDeclaration6')
"><a name="hasDeclaration6Anchor
">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
9645 <tr><td colspan="4" class="doc
" id="hasDeclaration6
"><pre>Matches a node if the declaration associated with that node
9646 matches the given matcher.
9648 The associated declaration is:
9649 - for type nodes, the declaration of the underlying type
9650 - for CallExpr, the declaration of the callee
9651 - for MemberExpr, the declaration of the referenced member
9652 - for CXXConstructExpr, the declaration of the constructor
9653 - for CXXNewExpr, the declaration of the operator new
9654 - for ObjCIvarExpr, the declaration of the ivar
9656 For type nodes, hasDeclaration will generally match the declaration of the
9661 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9662 typedefDecl. A common use case is to match the underlying, desugared type.
9663 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9664 varDecl(hasType(hasUnqualifiedDesugaredType(
9665 recordType(hasDeclaration(decl())))))
9666 In this matcher, the decl will match the CXXRecordDecl of class X.
9668 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html
">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html
">CallExpr</a>>,
9669 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html
">CXXConstructExpr</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_1DeclRefExpr.html
">DeclRefExpr</a>>,
9670 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html
">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html
">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html
">LabelStmt</a>>,
9671 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html
">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html
">RecordType</a>>,
9672 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html
">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>>,
9673 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html
">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html
">TypedefType</a>>,
9674 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
9678 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>></td><td class="name
" onclick="toggle('ignoringParens0')
"><a name="ignoringParens0Anchor
">ignoringParens</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerMatcher</td></tr>
9679 <tr><td colspan="4" class="doc
" id="ignoringParens0
"><pre>Matches types that match InnerMatcher after any parens are stripped.
9684 varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
9685 would match the declaration for fp.
9689 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>></td><td class="name
" onclick="toggle('pointsTo1')
"><a name="pointsTo1Anchor
">pointsTo</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
9690 <tr><td colspan="4" class="doc
" id="pointsTo1
"><pre>Overloaded to match the pointee type's declaration.
9694 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>></td><td class="name
" onclick="toggle('pointsTo0')
"><a name="pointsTo0Anchor
">pointsTo</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerMatcher</td></tr>
9695 <tr><td colspan="4" class="doc
" id="pointsTo0
"><pre>Matches if the matched type is a pointer type and the pointee type
9696 matches the specified matcher.
9698 Example matches y->x()
9699 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
9700 cxxRecordDecl(hasName("Y
")))))))
9701 class Y { public: void x(); };
9702 void z() { Y *y; y->x(); }
9706 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>></td><td class="name
" onclick="toggle('references1')
"><a name="references1Anchor
">references</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
9707 <tr><td colspan="4" class="doc
" id="references1
"><pre>Overloaded to match the referenced type's declaration.
9711 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>></td><td class="name
" onclick="toggle('references0')
"><a name="references0Anchor
">references</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerMatcher</td></tr>
9712 <tr><td colspan="4" class="doc
" id="references0
"><pre>Matches if the matched type is a reference type and the referenced
9713 type matches the specified matcher.
9715 Example matches X &x and const X &y
9716 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X
"))))))
9726 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualifiedTypeLoc.html
">QualifiedTypeLoc</a>></td><td class="name
" onclick="toggle('hasUnqualifiedLoc0')
"><a name="hasUnqualifiedLoc0Anchor
">hasUnqualifiedLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>> InnerMatcher</td></tr>
9727 <tr><td colspan="4" class="doc
" id="hasUnqualifiedLoc0
"><pre>Matches `QualifiedTypeLoc`s that have an unqualified `TypeLoc` matching
9733 qualifiedTypeLoc(hasUnqualifiedLoc(pointerTypeLoc()))
9734 matches the `TypeLoc` of the variable declaration of `x`, but not `y`.
9738 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html
">RecordType</a>></td><td class="name
" onclick="toggle('hasDeclaration5')
"><a name="hasDeclaration5Anchor
">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
9739 <tr><td colspan="4" class="doc
" id="hasDeclaration5
"><pre>Matches a node if the declaration associated with that node
9740 matches the given matcher.
9742 The associated declaration is:
9743 - for type nodes, the declaration of the underlying type
9744 - for CallExpr, the declaration of the callee
9745 - for MemberExpr, the declaration of the referenced member
9746 - for CXXConstructExpr, the declaration of the constructor
9747 - for CXXNewExpr, the declaration of the operator new
9748 - for ObjCIvarExpr, the declaration of the ivar
9750 For type nodes, hasDeclaration will generally match the declaration of the
9755 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9756 typedefDecl. A common use case is to match the underlying, desugared type.
9757 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9758 varDecl(hasType(hasUnqualifiedDesugaredType(
9759 recordType(hasDeclaration(decl())))))
9760 In this matcher, the decl will match the CXXRecordDecl of class X.
9762 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html
">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html
">CallExpr</a>>,
9763 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html
">CXXConstructExpr</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_1DeclRefExpr.html
">DeclRefExpr</a>>,
9764 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html
">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html
">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html
">LabelStmt</a>>,
9765 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html
">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html
">RecordType</a>>,
9766 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html
">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>>,
9767 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html
">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html
">TypedefType</a>>,
9768 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
9772 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html
">ReferenceTypeLoc</a>></td><td class="name
" onclick="toggle('hasReferentLoc0')
"><a name="hasReferentLoc0Anchor
">hasReferentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>> ReferentMatcher</td></tr>
9773 <tr><td colspan="4" class="doc
" id="hasReferentLoc0
"><pre>Matches reference `TypeLoc`s that have a referent `TypeLoc` matching
9779 referenceTypeLoc(hasReferentLoc(loc(asString("int
"))))
9784 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html
">ReferenceType</a>></td><td class="name
" onclick="toggle('pointee3')
"><a name="pointee3Anchor
">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html
">Type</a>></td></tr>
9785 <tr><td colspan="4" class="doc
" id="pointee3
"><pre>Narrows PointerType (and similar) matchers to those where the
9786 pointee matches a given matcher.
9792 pointerType(pointee(isConstQualified(), isInteger()))
9793 matches "int const *b
"
9795 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html
">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html
">MemberPointerType</a>>,
9796 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html
">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html
">ReferenceType</a>>
9800 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html
">ReturnStmt</a>></td><td class="name
" onclick="toggle('hasReturnValue0')
"><a name="hasReturnValue0Anchor
">hasReturnValue</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
9801 <tr><td colspan="4" class="doc
" id="hasReturnValue0
"><pre>Matches the return value expression of a return statement
9805 hasReturnValue(binaryOperator())
9806 matches 'return a + b'
9807 with binaryOperator()
9812 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html
">StmtExpr</a>></td><td class="name
" onclick="toggle('hasAnySubstatement1')
"><a name="hasAnySubstatement1Anchor
">hasAnySubstatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>> InnerMatcher</td></tr>
9813 <tr><td colspan="4" class="doc
" id="hasAnySubstatement1
"><pre>Matches compound statements where at least one substatement matches
9814 a given matcher. Also matches StmtExprs that have CompoundStmt as children.
9818 hasAnySubstatement(compoundStmt())
9819 matches '{ {}; 1+2; }'
9825 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>></td><td class="name
" onclick="toggle('alignOfExpr0')
"><a name="alignOfExpr0Anchor
">alignOfExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html
">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr>
9826 <tr><td colspan="4" class="doc
" id="alignOfExpr0
"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
9831 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>></td><td class="name
" onclick="toggle('forCallable0')
"><a name="forCallable0Anchor
">forCallable</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
9832 <tr><td colspan="4" class="doc
" id="forCallable0
"><pre>Matches declaration of the function, method, or block the statement
9836 F& operator=(const F& o) {
9837 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; });
9840 returnStmt(forCallable(functionDecl(hasName("operator=
"))))
9841 matches 'return *this'
9842 but does not match 'return v > 0'
9847 dispatch_sync(queue, ^{ int y = 2; });
9849 declStmt(forCallable(objcMethodDecl()))
9851 but does not match 'int y = 2'.
9852 whereas declStmt(forCallable(blockDecl()))
9854 but does not match 'int x = 1'.
9858 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>></td><td class="name
" onclick="toggle('forFunction0')
"><a name="forFunction0Anchor
">forFunction</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
">FunctionDecl</a>> InnerMatcher</td></tr>
9859 <tr><td colspan="4" class="doc
" id="forFunction0
"><pre>Matches declaration of the function the statement belongs to.
9861 Deprecated. Use forCallable() to correctly handle the situation when
9862 the declaration is not a function (but a block or an Objective-C method).
9863 forFunction() not only fails to take non-functions into account but also
9864 may match the wrong declaration in their presence.
9867 F& operator=(const F& o) {
9868 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; });
9871 returnStmt(forFunction(hasName("operator=
")))
9872 matches 'return *this'
9873 but does not match 'return v > 0'
9877 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>></td><td class="name
" onclick="toggle('sizeOfExpr0')
"><a name="sizeOfExpr0Anchor
">sizeOfExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html
">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr>
9878 <tr><td colspan="4" class="doc
" id="sizeOfExpr0
"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
9883 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html
">SubstTemplateTypeParmType</a>></td><td class="name
" onclick="toggle('hasReplacementType0')
"><a name="hasReplacementType0Anchor
">hasReplacementType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html
">Type</a>></td></tr>
9884 <tr><td colspan="4" class="doc
" id="hasReplacementType0
"><pre>Matches template type parameter substitutions that have a replacement
9885 type that matches the provided matcher.
9888 template <typename T>
9893 substTemplateTypeParmType(hasReplacementType(type())) matches int
9897 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html
">SwitchStmt</a>></td><td class="name
" onclick="toggle('forEachSwitchCase0')
"><a name="forEachSwitchCase0Anchor
">forEachSwitchCase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html
">SwitchCase</a>> InnerMatcher</td></tr>
9898 <tr><td colspan="4" class="doc
" id="forEachSwitchCase0
"><pre>Matches each case or default statement belonging to the given switch
9899 statement. This matcher may produce multiple matches.
9902 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
9903 switchStmt(forEachSwitchCase(caseStmt().bind("c
"))).bind("s
")
9904 matches four times, with "c
" binding each of "case
1:
", "case
2:
",
9905 "case
3:
" and "case
4:
", and "s
" respectively binding "switch (
1)
",
9906 "switch (
1)
", "switch (
2)
" and "switch (
2)
".
9910 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html
">SwitchStmt</a>></td><td class="name
" onclick="toggle('hasCondition4')
"><a name="hasCondition4Anchor
">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
9911 <tr><td colspan="4" class="doc
" id="hasCondition4
"><pre>Matches the condition expression of an if statement, for loop,
9912 switch statement or conditional operator.
9914 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9919 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html
">SwitchStmt</a>></td><td class="name
" onclick="toggle('hasInitStatement1')
"><a name="hasInitStatement1Anchor
">hasInitStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>> InnerMatcher</td></tr>
9920 <tr><td colspan="4" class="doc
" id="hasInitStatement1
"><pre>Matches selection statements with initializer.
9924 if (int i = foobar(); i > 0) {}
9925 switch (int i = foobar(); i) {}
9926 for (auto& a = get_range(); auto& x : a) {}
9929 if (foobar() > 0) {}
9930 switch (foobar()) {}
9931 for (auto& x : get_range()) {}
9933 ifStmt(hasInitStatement(anything()))
9934 matches the if statement in foo but not in bar.
9935 switchStmt(hasInitStatement(anything()))
9936 matches the switch statement in foo but not in bar.
9937 cxxForRangeStmt(hasInitStatement(anything()))
9938 matches the range for statement in foo but not in bar.
9942 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html
">TagType</a>></td><td class="name
" onclick="toggle('hasDeclaration4')
"><a name="hasDeclaration4Anchor
">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
9943 <tr><td colspan="4" class="doc
" id="hasDeclaration4
"><pre>Matches a node if the declaration associated with that node
9944 matches the given matcher.
9946 The associated declaration is:
9947 - for type nodes, the declaration of the underlying type
9948 - for CallExpr, the declaration of the callee
9949 - for MemberExpr, the declaration of the referenced member
9950 - for CXXConstructExpr, the declaration of the constructor
9951 - for CXXNewExpr, the declaration of the operator new
9952 - for ObjCIvarExpr, the declaration of the ivar
9954 For type nodes, hasDeclaration will generally match the declaration of the
9959 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9960 typedefDecl. A common use case is to match the underlying, desugared type.
9961 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9962 varDecl(hasType(hasUnqualifiedDesugaredType(
9963 recordType(hasDeclaration(decl())))))
9964 In this matcher, the decl will match the CXXRecordDecl of class X.
9966 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html
">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html
">CallExpr</a>>,
9967 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html
">CXXConstructExpr</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_1DeclRefExpr.html
">DeclRefExpr</a>>,
9968 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html
">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html
">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html
">LabelStmt</a>>,
9969 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html
">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html
">RecordType</a>>,
9970 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html
">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>>,
9971 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html
">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html
">TypedefType</a>>,
9972 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
9976 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</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>
9977 <tr><td colspan="4" class="doc
" id="hasTypeLoc11
"><pre>Matches if the type location of a node matches the inner matcher.
9981 declaratorDecl(hasTypeLoc(loc(asString("int
"))))
9985 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int
"))))
9988 struct Foo { Foo(int, int); };
9990 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo
"))))
9993 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>>,
9994 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>>,
9995 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>>,
9996 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html
">CXXUnresolvedConstructExpr</a>>,
9997 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html
">CompoundLiteralExpr</a>>,
9998 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>>,
9999 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>>,
10000 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html
">TypedefNameDecl</a>>
10004 <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>
10005 <tr><td colspan="4" class="doc
" id="isExpr0
"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
10008 struct B { int next; };
10009 template<int(B::*next_ptr)> struct A {};
10010 A<&B::next> a;
10011 templateSpecializationType(hasAnyTemplateArgument(
10012 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next
"))))))))
10013 matches the specialization A<&B::next> with fieldDecl(...) matching
10018 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>></td><td class="name
" onclick="toggle('refersToDeclaration0')
"><a name="refersToDeclaration0Anchor
">refersToDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
10019 <tr><td colspan="4" class="doc
" id="refersToDeclaration0
"><pre>Matches a canonical TemplateArgument that refers to a certain
10023 struct B { int next; };
10024 template<int(B::*next_ptr)> struct A {};
10025 A<&B::next> a;
10026 classTemplateSpecializationDecl(hasAnyTemplateArgument(
10027 refersToDeclaration(fieldDecl(hasName("next
")))))
10028 matches the specialization A<&B::next> with fieldDecl(...) matching
10033 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>></td><td class="name
" onclick="toggle('refersToIntegralType0')
"><a name="refersToIntegralType0Anchor
">refersToIntegralType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerMatcher</td></tr>
10034 <tr><td colspan="4" class="doc
" id="refersToIntegralType0
"><pre>Matches a TemplateArgument that refers to an integral type.
10037 template<int T> struct C {};
10039 classTemplateSpecializationDecl(
10040 hasAnyTemplateArgument(refersToIntegralType(asString("int
"))))
10041 matches the implicit instantiation of C in C<42>.
10045 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>></td><td class="name
" onclick="toggle('refersToTemplate0')
"><a name="refersToTemplate0Anchor
">refersToTemplate</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html
">TemplateName</a>> InnerMatcher</td></tr>
10046 <tr><td colspan="4" class="doc
" id="refersToTemplate0
"><pre>Matches a TemplateArgument that refers to a certain template.
10049 template<template <typename> class S> class X {};
10050 template<typename T> class Y {};
10052 classTemplateSpecializationDecl(hasAnyTemplateArgument(
10053 refersToTemplate(templateName())))
10054 matches the specialization X<Y>
10058 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>></td><td class="name
" onclick="toggle('refersToType0')
"><a name="refersToType0Anchor
">refersToType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerMatcher</td></tr>
10059 <tr><td colspan="4" class="doc
" id="refersToType0
"><pre>Matches a TemplateArgument that refers to a certain type.
10063 template<typename T> struct A {};
10065 classTemplateSpecializationDecl(hasAnyTemplateArgument(refersToType(
10066 recordType(hasDeclaration(recordDecl(hasName("X
")))))))
10067 matches the specialization of struct A generated by A<X>.
10071 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html
">TemplateSpecializationTypeLoc</a>></td><td class="name
" onclick="toggle('hasAnyTemplateArgumentLoc4')
"><a name="hasAnyTemplateArgumentLoc4Anchor
">hasAnyTemplateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
10072 <tr><td colspan="4" class="doc
" id="hasAnyTemplateArgumentLoc4
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
10073 variable template specializations, and function template specializations
10074 that have at least one `TemplateArgumentLoc` matching the given
10078 template<typename T> class A {};
10080 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(
10081 hasTypeLoc(loc(asString("int
")))))))
10082 matches `A<int> a`.
10086 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html
">TemplateSpecializationTypeLoc</a>></td><td class="name
" onclick="toggle('hasTemplateArgumentLoc4')
"><a name="hasTemplateArgumentLoc4Anchor
">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
10087 <tr><td colspan="4" class="doc
" id="hasTemplateArgumentLoc4
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
10088 variable template specializations, and function template specializations
10089 where the n'th `TemplateArgumentLoc` matches the given `InnerMatcher`.
10092 template<typename T, typename U> class A {};
10093 A<double, int> b;
10094 A<int, double> c;
10095 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
10096 hasTypeLoc(loc(asString("double
")))))))
10097 matches `A<double, int> b`, but not `A<int, double> c`.
10101 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>></td><td class="name
" onclick="toggle('forEachTemplateArgument3')
"><a name="forEachTemplateArgument3Anchor
">forEachTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>> InnerMatcher</td></tr>
10102 <tr><td colspan="4" class="doc
" id="forEachTemplateArgument3
"><pre>Matches templateSpecializationType, class template specialization,
10103 variable template specialization, and function template specialization
10104 nodes where the template argument matches the inner matcher. This matcher
10105 may produce multiple matches.
10108 template <typename T, unsigned N, unsigned M>
10111 constexpr unsigned R = 2;
10112 Matrix<int, R * 2, R * 4> M;
10114 template <typename T, typename U>
10115 void f(T&& t, U&& u) {}
10119 templateSpecializationType(forEachTemplateArgument(isExpr(expr())))
10120 matches twice, with expr() matching 'R * 2' and 'R * 4'
10121 functionDecl(forEachTemplateArgument(refersToType(builtinType())))
10122 matches the specialization f<unsigned, bool> twice, for 'unsigned'
10127 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>></td><td class="name
" onclick="toggle('hasAnyTemplateArgument3')
"><a name="hasAnyTemplateArgument3Anchor
">hasAnyTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>> InnerMatcher</td></tr>
10128 <tr><td colspan="4" class="doc
" id="hasAnyTemplateArgument3
"><pre>Matches templateSpecializationTypes, class template specializations,
10129 variable template specializations, and function template specializations
10130 that have at least one TemplateArgument matching the given InnerMatcher.
10133 template<typename T> class A {};
10134 template<> class A<double> {};
10137 template<typename T> f() {};
10138 void func() { f<int>(); };
10140 classTemplateSpecializationDecl(hasAnyTemplateArgument(
10141 refersToType(asString("int
"))))
10142 matches the specialization A<int>
10144 functionDecl(hasAnyTemplateArgument(refersToType(asString("int
"))))
10145 matches the specialization f<int>
10149 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>></td><td class="name
" onclick="toggle('hasDeclaration3')
"><a name="hasDeclaration3Anchor
">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
10150 <tr><td colspan="4" class="doc
" id="hasDeclaration3
"><pre>Matches a node if the declaration associated with that node
10151 matches the given matcher.
10153 The associated declaration is:
10154 - for type nodes, the declaration of the underlying type
10155 - for CallExpr, the declaration of the callee
10156 - for MemberExpr, the declaration of the referenced member
10157 - for CXXConstructExpr, the declaration of the constructor
10158 - for CXXNewExpr, the declaration of the operator new
10159 - for ObjCIvarExpr, the declaration of the ivar
10161 For type nodes, hasDeclaration will generally match the declaration of the
10162 sugared type. Given
10166 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
10167 typedefDecl. A common use case is to match the underlying, desugared type.
10168 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
10169 varDecl(hasType(hasUnqualifiedDesugaredType(
10170 recordType(hasDeclaration(decl())))))
10171 In this matcher, the decl will match the CXXRecordDecl of class X.
10173 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html
">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html
">CallExpr</a>>,
10174 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html
">CXXConstructExpr</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_1DeclRefExpr.html
">DeclRefExpr</a>>,
10175 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html
">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html
">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html
">LabelStmt</a>>,
10176 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html
">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html
">RecordType</a>>,
10177 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html
">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>>,
10178 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html
">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html
">TypedefType</a>>,
10179 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
10183 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>></td><td class="name
" onclick="toggle('hasTemplateArgument3')
"><a name="hasTemplateArgument3Anchor
">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>> InnerMatcher</td></tr>
10184 <tr><td colspan="4" class="doc
" id="hasTemplateArgument3
"><pre>Matches templateSpecializationType, class template specializations,
10185 variable template specializations, and function template specializations
10186 where the n'th TemplateArgument matches the given InnerMatcher.
10189 template<typename T, typename U> class A {};
10190 A<bool, int> b;
10191 A<int, bool> c;
10193 template<typename T> void f() {}
10194 void func() { f<int>(); };
10195 classTemplateSpecializationDecl(hasTemplateArgument(
10196 1, refersToType(asString("int
"))))
10197 matches the specialization A<bool, int>
10199 functionDecl(hasTemplateArgument(0, refersToType(asString("int
"))))
10200 matches the specialization f<int>
10204 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html
">TemplateTypeParmType</a>></td><td class="name
" onclick="toggle('hasDeclaration2')
"><a name="hasDeclaration2Anchor
">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
10205 <tr><td colspan="4" class="doc
" id="hasDeclaration2
"><pre>Matches a node if the declaration associated with that node
10206 matches the given matcher.
10208 The associated declaration is:
10209 - for type nodes, the declaration of the underlying type
10210 - for CallExpr, the declaration of the callee
10211 - for MemberExpr, the declaration of the referenced member
10212 - for CXXConstructExpr, the declaration of the constructor
10213 - for CXXNewExpr, the declaration of the operator new
10214 - for ObjCIvarExpr, the declaration of the ivar
10216 For type nodes, hasDeclaration will generally match the declaration of the
10217 sugared type. Given
10221 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
10222 typedefDecl. A common use case is to match the underlying, desugared type.
10223 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
10224 varDecl(hasType(hasUnqualifiedDesugaredType(
10225 recordType(hasDeclaration(decl())))))
10226 In this matcher, the decl will match the CXXRecordDecl of class X.
10228 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html
">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html
">CallExpr</a>>,
10229 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html
">CXXConstructExpr</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_1DeclRefExpr.html
">DeclRefExpr</a>>,
10230 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html
">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html
">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html
">LabelStmt</a>>,
10231 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html
">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html
">RecordType</a>>,
10232 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html
">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>>,
10233 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html
">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html
">TypedefType</a>>,
10234 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
10238 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html
">TypeLoc</a>></td><td class="name
" onclick="toggle('loc0')
"><a name="loc0Anchor
">loc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerMatcher</td></tr>
10239 <tr><td colspan="4" class="doc
" id="loc0
"><pre>Matches TypeLocs for which the given inner
10240 QualType-matcher matches.
10244 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html
">TypedefNameDecl</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>
10245 <tr><td colspan="4" class="doc
" id="hasTypeLoc12
"><pre>Matches if the type location of a node matches the inner matcher.
10249 declaratorDecl(hasTypeLoc(loc(asString("int
"))))
10253 cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int
"))))
10256 struct Foo { Foo(int, int); };
10257 auto x = Foo(1, 2);
10258 cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo
"))))
10261 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>>,
10262 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>>,
10263 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>>,
10264 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html
">CXXUnresolvedConstructExpr</a>>,
10265 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html
">CompoundLiteralExpr</a>>,
10266 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>>,
10267 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>>,
10268 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html
">TypedefNameDecl</a>>
10272 <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>
10273 <tr><td colspan="4" class="doc
" id="hasType2
"><pre>Matches if the expression's or declaration's type matches a type
10276 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X
")))))
10277 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X
")))))
10278 and U (matcher = typedefDecl(hasType(asString("int
")))
10279 and friend class X (matcher = friendDecl(hasType("X
"))
10280 and public virtual X (matcher = cxxBaseSpecifier(hasType(
10281 asString("class X
")))
10283 void y(X &x) { x; X z; }
10285 class Y { friend class X; };
10286 class Z : public virtual X {};
10290 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html
">TypedefType</a>></td><td class="name
" onclick="toggle('hasDeclaration1')
"><a name="hasDeclaration1Anchor
">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
10291 <tr><td colspan="4" class="doc
" id="hasDeclaration1
"><pre>Matches a node if the declaration associated with that node
10292 matches the given matcher.
10294 The associated declaration is:
10295 - for type nodes, the declaration of the underlying type
10296 - for CallExpr, the declaration of the callee
10297 - for MemberExpr, the declaration of the referenced member
10298 - for CXXConstructExpr, the declaration of the constructor
10299 - for CXXNewExpr, the declaration of the operator new
10300 - for ObjCIvarExpr, the declaration of the ivar
10302 For type nodes, hasDeclaration will generally match the declaration of the
10303 sugared type. Given
10307 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
10308 typedefDecl. A common use case is to match the underlying, desugared type.
10309 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
10310 varDecl(hasType(hasUnqualifiedDesugaredType(
10311 recordType(hasDeclaration(decl())))))
10312 In this matcher, the decl will match the CXXRecordDecl of class X.
10314 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html
">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html
">CallExpr</a>>,
10315 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html
">CXXConstructExpr</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_1DeclRefExpr.html
">DeclRefExpr</a>>,
10316 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html
">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html
">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html
">LabelStmt</a>>,
10317 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html
">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html
">RecordType</a>>,
10318 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html
">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>>,
10319 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html
">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html
">TypedefType</a>>,
10320 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
10324 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html
">Type</a>></td><td class="name
" onclick="toggle('hasUnqualifiedDesugaredType0')
"><a name="hasUnqualifiedDesugaredType0Anchor
">hasUnqualifiedDesugaredType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html
">Type</a>> InnerMatcher</td></tr>
10325 <tr><td colspan="4" class="doc
" id="hasUnqualifiedDesugaredType0
"><pre>Matches if the matched type matches the unqualified desugared
10326 type of the matched node.
10331 The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
10336 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html
">UnaryExprOrTypeTraitExpr</a>></td><td class="name
" onclick="toggle('hasArgumentOfType0')
"><a name="hasArgumentOfType0Anchor
">hasArgumentOfType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerMatcher</td></tr>
10337 <tr><td colspan="4" class="doc
" id="hasArgumentOfType0
"><pre>Matches unary expressions that have a specific type of argument.
10340 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
10341 unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int
"))
10342 matches sizeof(a) and alignof(c)
10346 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html
">UnaryOperator</a>></td><td class="name
" onclick="toggle('hasUnaryOperand0')
"><a name="hasUnaryOperand0Anchor
">hasUnaryOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
10347 <tr><td colspan="4" class="doc
" id="hasUnaryOperand0
"><pre>Matches if the operand of a unary operator matches.
10349 Example matches true (matcher = hasUnaryOperand(
10350 cxxBoolLiteral(equals(true))))
10355 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html
">UnresolvedMemberExpr</a>></td><td class="name
" onclick="toggle('hasObjectExpression1')
"><a name="hasObjectExpression1Anchor
">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
10356 <tr><td colspan="4" class="doc
" id="hasObjectExpression1
"><pre>Matches a member expression where the object expression is matched by a
10357 given matcher. Implicit object expressions are included; that is, it matches
10358 use of implicit `this`.
10363 int f(X x) { x.m; return m; }
10365 memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X
")))))
10366 matches `x.m`, but not `m`; however,
10367 memberExpr(hasObjectExpression(hasType(pointsTo(
10368 cxxRecordDecl(hasName("X
"))))))
10369 matches `m` (aka. `this->m`), but not `x.m`.
10373 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>></td><td class="name
" onclick="toggle('hasDeclaration0')
"><a name="hasDeclaration0Anchor
">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
10374 <tr><td colspan="4" class="doc
" id="hasDeclaration0
"><pre>Matches a node if the declaration associated with that node
10375 matches the given matcher.
10377 The associated declaration is:
10378 - for type nodes, the declaration of the underlying type
10379 - for CallExpr, the declaration of the callee
10380 - for MemberExpr, the declaration of the referenced member
10381 - for CXXConstructExpr, the declaration of the constructor
10382 - for CXXNewExpr, the declaration of the operator new
10383 - for ObjCIvarExpr, the declaration of the ivar
10385 For type nodes, hasDeclaration will generally match the declaration of the
10386 sugared type. Given
10390 in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
10391 typedefDecl. A common use case is to match the underlying, desugared type.
10392 This can be achieved by using the hasUnqualifiedDesugaredType matcher:
10393 varDecl(hasType(hasUnqualifiedDesugaredType(
10394 recordType(hasDeclaration(decl())))))
10395 In this matcher, the decl will match the CXXRecordDecl of class X.
10397 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html
">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html
">CallExpr</a>>,
10398 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html
">CXXConstructExpr</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_1DeclRefExpr.html
">DeclRefExpr</a>>,
10399 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html
">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html
">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html
">LabelStmt</a>>,
10400 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html
">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html
">RecordType</a>>,
10401 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html
">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html
">TemplateSpecializationType</a>>,
10402 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html
">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html
">TypedefType</a>>,
10403 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html
">UnresolvedUsingType</a>>
10407 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html
">UsingShadowDecl</a>></td><td class="name
" onclick="toggle('hasTargetDecl0')
"><a name="hasTargetDecl0Anchor
">hasTargetDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html
">NamedDecl</a>> InnerMatcher</td></tr>
10408 <tr><td colspan="4" class="doc
" id="hasTargetDecl0
"><pre>Matches a using shadow declaration where the target declaration is
10409 matched by the given matcher.
10412 namespace X { int a; void b(); }
10415 usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
10416 matches using X::b but not using X::a </pre></td></tr>
10419 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html
">UsingType</a>></td><td class="name
" onclick="toggle('hasUnderlyingType1')
"><a name="hasUnderlyingType1Anchor
">hasUnderlyingType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html
">Type</a>></td></tr>
10420 <tr><td colspan="4" class="doc
" id="hasUnderlyingType1
"><pre>Matches DecltypeType or UsingType nodes to find the underlying type.
10424 decltype(2.0) b = 2.0;
10425 decltypeType(hasUnderlyingType(isInteger()))
10426 matches the type of "a
"
10428 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html
">DecltypeType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html
">UsingType</a>>
10432 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html
">UsingType</a>></td><td class="name
" onclick="toggle('throughUsingDecl1')
"><a name="throughUsingDecl1Anchor
">throughUsingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html
">UsingShadowDecl</a>> Inner</td></tr>
10433 <tr><td colspan="4" class="doc
" id="throughUsingDecl1
"><pre>Matches if a node refers to a declaration through a specific
10434 using shadow declaration.
10437 namespace a { int f(); }
10440 declRefExpr(throughUsingDecl(anything()))
10443 namespace a { class X{}; }
10446 typeLoc(loc(usingType(throughUsingDecl(anything()))))
10449 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html
">DeclRefExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html
">UsingType</a>>
10453 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html
">ValueDecl</a>></td><td class="name
" onclick="toggle('hasType7')
"><a name="hasType7Anchor
">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html
">Decl</a>> InnerMatcher</td></tr>
10454 <tr><td colspan="4" class="doc
" id="hasType7
"><pre>Overloaded to match the declaration of the expression's or value
10455 declaration's type.
10457 In case of a value declaration (for example a variable declaration),
10458 this resolves one layer of indirection. For example, in the value
10459 declaration "X x;
", cxxRecordDecl(hasName("X
")) matches the declaration of
10460 X, while varDecl(hasType(cxxRecordDecl(hasName("X
")))) matches the
10463 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X
")))))
10464 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X
")))))
10465 and friend class X (matcher = friendDecl(hasType("X
"))
10466 and public virtual X (matcher = cxxBaseSpecifier(hasType(
10467 cxxRecordDecl(hasName("X
"))))
10469 void y(X &x) { x; X z; }
10470 class Y { friend class X; };
10471 class Z : public virtual X {};
10473 Example matches class Derived
10474 (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base
"))))))
10476 class Derived : Base {};
10478 Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html
">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html
">ValueDecl</a>>,
10479 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html
">CXXBaseSpecifier</a>>
10483 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html
">ValueDecl</a>></td><td class="name
" onclick="toggle('hasType3')
"><a name="hasType3Anchor
">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html
">QualType</a>> InnerMatcher</td></tr>
10484 <tr><td colspan="4" class="doc
" id="hasType3
"><pre>Matches if the expression's or declaration's type matches a type
10487 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X
")))))
10488 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X
")))))
10489 and U (matcher = typedefDecl(hasType(asString("int
")))
10490 and friend class X (matcher = friendDecl(hasType("X
"))
10491 and public virtual X (matcher = cxxBaseSpecifier(hasType(
10492 asString("class X
")))
10494 void y(X &x) { x; X z; }
10496 class Y { friend class X; };
10497 class Z : public virtual X {};
10501 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html
">VarDecl</a>></td><td class="name
" onclick="toggle('hasInitializer0')
"><a name="hasInitializer0Anchor
">hasInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
10502 <tr><td colspan="4" class="doc
" id="hasInitializer0
"><pre>Matches a variable declaration that has an initializer expression
10503 that matches the given matcher.
10505 Example matches x (matcher = varDecl(hasInitializer(callExpr())))
10506 bool y() { return true; }
10511 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarTemplateSpecializationDecl.html
">VarTemplateSpecializationDecl</a>></td><td class="name
" onclick="toggle('forEachTemplateArgument1')
"><a name="forEachTemplateArgument1Anchor
">forEachTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>> InnerMatcher</td></tr>
10512 <tr><td colspan="4" class="doc
" id="forEachTemplateArgument1
"><pre>Matches templateSpecializationType, class template specialization,
10513 variable template specialization, and function template specialization
10514 nodes where the template argument matches the inner matcher. This matcher
10515 may produce multiple matches.
10518 template <typename T, unsigned N, unsigned M>
10521 constexpr unsigned R = 2;
10522 Matrix<int, R * 2, R * 4> M;
10524 template <typename T, typename U>
10525 void f(T&& t, U&& u) {}
10529 templateSpecializationType(forEachTemplateArgument(isExpr(expr())))
10530 matches twice, with expr() matching 'R * 2' and 'R * 4'
10531 functionDecl(forEachTemplateArgument(refersToType(builtinType())))
10532 matches the specialization f<unsigned, bool> twice, for 'unsigned'
10537 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarTemplateSpecializationDecl.html
">VarTemplateSpecializationDecl</a>></td><td class="name
" onclick="toggle('hasAnyTemplateArgumentLoc1')
"><a name="hasAnyTemplateArgumentLoc1Anchor
">hasAnyTemplateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
10538 <tr><td colspan="4" class="doc
" id="hasAnyTemplateArgumentLoc1
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
10539 variable template specializations, and function template specializations
10540 that have at least one `TemplateArgumentLoc` matching the given
10544 template<typename T> class A {};
10546 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(
10547 hasTypeLoc(loc(asString("int
")))))))
10548 matches `A<int> a`.
10552 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarTemplateSpecializationDecl.html
">VarTemplateSpecializationDecl</a>></td><td class="name
" onclick="toggle('hasAnyTemplateArgument1')
"><a name="hasAnyTemplateArgument1Anchor
">hasAnyTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>> InnerMatcher</td></tr>
10553 <tr><td colspan="4" class="doc
" id="hasAnyTemplateArgument1
"><pre>Matches templateSpecializationTypes, class template specializations,
10554 variable template specializations, and function template specializations
10555 that have at least one TemplateArgument matching the given InnerMatcher.
10558 template<typename T> class A {};
10559 template<> class A<double> {};
10562 template<typename T> f() {};
10563 void func() { f<int>(); };
10565 classTemplateSpecializationDecl(hasAnyTemplateArgument(
10566 refersToType(asString("int
"))))
10567 matches the specialization A<int>
10569 functionDecl(hasAnyTemplateArgument(refersToType(asString("int
"))))
10570 matches the specialization f<int>
10574 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarTemplateSpecializationDecl.html
">VarTemplateSpecializationDecl</a>></td><td class="name
" onclick="toggle('hasTemplateArgumentLoc1')
"><a name="hasTemplateArgumentLoc1Anchor
">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html
">TemplateArgumentLoc</a>> InnerMatcher</td></tr>
10575 <tr><td colspan="4" class="doc
" id="hasTemplateArgumentLoc1
"><pre>Matches template specialization `TypeLoc`s, class template specializations,
10576 variable template specializations, and function template specializations
10577 where the n'th `TemplateArgumentLoc` matches the given `InnerMatcher`.
10580 template<typename T, typename U> class A {};
10581 A<double, int> b;
10582 A<int, double> c;
10583 varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
10584 hasTypeLoc(loc(asString("double
")))))))
10585 matches `A<double, int> b`, but not `A<int, double> c`.
10589 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarTemplateSpecializationDecl.html
">VarTemplateSpecializationDecl</a>></td><td class="name
" onclick="toggle('hasTemplateArgument1')
"><a name="hasTemplateArgument1Anchor
">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html
">TemplateArgument</a>> InnerMatcher</td></tr>
10590 <tr><td colspan="4" class="doc
" id="hasTemplateArgument1
"><pre>Matches templateSpecializationType, class template specializations,
10591 variable template specializations, and function template specializations
10592 where the n'th TemplateArgument matches the given InnerMatcher.
10595 template<typename T, typename U> class A {};
10596 A<bool, int> b;
10597 A<int, bool> c;
10599 template<typename T> void f() {}
10600 void func() { f<int>(); };
10601 classTemplateSpecializationDecl(hasTemplateArgument(
10602 1, refersToType(asString("int
"))))
10603 matches the specialization A<bool, int>
10605 functionDecl(hasTemplateArgument(0, refersToType(asString("int
"))))
10606 matches the specialization f<int>
10610 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html
">VariableArrayType</a>></td><td class="name
" onclick="toggle('hasSizeExpr0')
"><a name="hasSizeExpr0Anchor
">hasSizeExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
10611 <tr><td colspan="4" class="doc
" id="hasSizeExpr0
"><pre>Matches VariableArrayType nodes that have a specific size
10618 variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
10619 varDecl(hasName("b
")))))))
10624 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html
">WhileStmt</a>></td><td class="name
" onclick="toggle('hasBody2')
"><a name="hasBody2Anchor
">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html
">Stmt</a>> InnerMatcher</td></tr>
10625 <tr><td colspan="4" class="doc
" id="hasBody2
"><pre>Matches a 'for', 'while', 'while' statement or a function or coroutine
10626 definition that has a given body. Note that in case of functions or
10627 coroutines this matcher only matches the definition itself and not the
10628 other declarations of the same function or coroutine.
10632 forStmt(hasBody(compoundStmt()))
10633 matches 'for (;;) {}'
10634 with compoundStmt()
10640 functionDecl(hasBody(compoundStmt()))
10641 matches 'void f() {}'
10642 with compoundStmt()
10644 but does not match 'void f();'
10648 <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html
">WhileStmt</a>></td><td class="name
" onclick="toggle('hasCondition2')
"><a name="hasCondition2Anchor
">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html
">Expr</a>> InnerMatcher</td></tr>
10649 <tr><td colspan="4" class="doc
" id="hasCondition2
"><pre>Matches the condition expression of an if statement, for loop,
10650 switch statement or conditional operator.
10652 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
10656 <!--END_TRAVERSAL_MATCHERS -->