]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - docs/LibASTMatchersReference.html
Vendor import of clang trunk r238337:
[FreeBSD/FreeBSD.git] / docs / LibASTMatchersReference.html
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2           "http://www.w3.org/TR/html4/strict.dtd">
3 <html>
4 <head>
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">
9 td {
10   padding: .33em;
11 }
12 td.doc {
13   display: none;
14   border-bottom: 1px solid black;
15 }
16 td.name:hover {
17   color: blue;
18   cursor: pointer;
19 }
20 </style>
21 <script type="text/javascript">
22 function toggle(id) {
23   if (!id) return;
24   row = document.getElementById(id);
25   if (row.style.display != 'table-cell')
26     row.style.display = 'table-cell';
27   else
28     row.style.display = 'none';
29 }
30 </script>
31 </head>
32 <body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
33
34 <!--#include virtual="../menu.html.incl"-->
35
36 <div id="content">
37
38 <h1>AST Matcher Reference</h1>
39
40 <p>This document shows all currently implemented matchers. The matchers are grouped
41 by category and node type they match. You can click on matcher names to show the
42 matcher's source documentation.</p>
43
44 <p>There are three different basic categories of matchers:
45 <ul>
46 <li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
47 <li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
48 <li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
49 </ul>
50 </p>
51
52 <p>Within each category the matchers are ordered by node type they match on.
53 Note that if a matcher can match multiple node types, it will it will appear
54 multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
55 find all matchers that can be used to match on Stmt nodes.</p>
56
57 <p>The exception to that rule are matchers that can match on any node. Those
58 are marked with a * and are listed in the beginning of each category.</p>
59
60 <p>Note that the categorization of matchers is a great help when you combine
61 them into matcher expressions. You will usually want to form matcher expressions
62 that read like english sentences by alternating between node matchers and
63 narrowing or traversal matchers, like this:
64 <pre>
65 recordDecl(hasDescendant(
66     ifStmt(hasTrueExpression(
67         expr(hasDescendant(
68             ifStmt()))))))
69 </pre>
70 </p>
71
72 <!-- ======================================================================= -->
73 <h2 id="decl-matchers">Node Matchers</h2>
74 <!-- ======================================================================= -->
75
76 <p>Node matchers are at the core of matcher expressions - they specify the type
77 of node that is expected. Every match expression starts with a node matcher,
78 which can then be further refined with a narrowing or traversal matcher. All
79 traversal matchers take node matchers as their arguments.</p>
80
81 <p>For convenience, all node matchers take an arbitrary number of arguments
82 and implicitly act as allOf matchers.</p>
83
84 <p>Node matchers are the only matchers that support the bind("id") call to
85 bind the matched node to the given string, to be later retrieved from the
86 match callback.</p>
87
88 <p>It is important to remember that the arguments to node matchers are
89 predicates on the same node, just with additional information about the type.
90 This is often useful to make matcher expression more readable by inlining bind
91 calls into redundant node matchers inside another node matcher:
92 <pre>
93 // This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
94 // the same node.
95 recordDecl(decl().bind("id"), hasName("::MyClass"))
96 </pre>
97 </p>
98
99 <table>
100 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
101 <!-- START_DECL_MATCHERS -->
102
103 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('ctorInitializer0')"><a name="ctorInitializer0Anchor">ctorInitializer</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;...</td></tr>
104 <tr><td colspan="4" class="doc" id="ctorInitializer0"><pre>Matches constructor initializers.
105
106 Examples matches i(42).
107   class C {
108     C() : i(42) {}
109     int i;
110   };
111 </pre></td></tr>
112
113
114 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>&gt;...</td></tr>
115 <tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
116
117 Given
118   class C {
119   public:
120     int a;
121   };
122 accessSpecDecl()
123   matches 'public:'
124 </pre></td></tr>
125
126
127 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
128 <tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
129
130 Example matches Z
131   template&lt;class T&gt; class Z {};
132 </pre></td></tr>
133
134
135 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
136 <tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
137
138 Given
139   template&lt;typename T&gt; class A {};
140   template&lt;&gt; class A&lt;double&gt; {};
141   A&lt;int&gt; a;
142 classTemplateSpecializationDecl()
143   matches the specializations A&lt;int&gt; and A&lt;double&gt;
144 </pre></td></tr>
145
146
147 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('constructorDecl0')"><a name="constructorDecl0Anchor">constructorDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
148 <tr><td colspan="4" class="doc" id="constructorDecl0"><pre>Matches C++ constructor declarations.
149
150 Example matches Foo::Foo() and Foo::Foo(int)
151   class Foo {
152    public:
153     Foo();
154     Foo(int);
155     int DoSomething();
156   };
157 </pre></td></tr>
158
159
160 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
161 <tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
162
163 Examples matches X, C, and the friend declaration inside C;
164   void X();
165   class C {
166     friend X;
167   };
168 </pre></td></tr>
169
170
171 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;...</td></tr>
172 <tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
173 and non-type template parameter declarations).
174
175 Given
176   class X { int y; };
177 declaratorDecl()
178   matches int y.
179 </pre></td></tr>
180
181
182 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('destructorDecl0')"><a name="destructorDecl0Anchor">destructorDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
183 <tr><td colspan="4" class="doc" id="destructorDecl0"><pre>Matches explicit C++ destructor declarations.
184
185 Example matches Foo::~Foo()
186   class Foo {
187    public:
188     virtual ~Foo();
189   };
190 </pre></td></tr>
191
192
193 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
194 <tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
195
196 Example matches A, B, C
197   enum X {
198     A, B, C
199   };
200 </pre></td></tr>
201
202
203 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
204 <tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
205
206 Example matches X
207   enum X {
208     A, B, C
209   };
210 </pre></td></tr>
211
212
213 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
214 <tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
215
216 Given
217   class X { int m; };
218 fieldDecl()
219   matches 'm'.
220 </pre></td></tr>
221
222
223 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;...</td></tr>
224 <tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
225
226 Given
227   class X { friend void foo(); };
228 friendDecl()
229   matches 'friend void foo()'.
230 </pre></td></tr>
231
232
233 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
234 <tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
235
236 Example matches f
237   void f();
238 </pre></td></tr>
239
240
241 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
242 <tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
243
244 Example matches f
245   template&lt;class T&gt; void f(T t) {}
246 </pre></td></tr>
247
248
249 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>&gt;...</td></tr>
250 <tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
251
252 Given
253   extern "C" {}
254 linkageSpecDecl()
255   matches "extern "C" {}"
256 </pre></td></tr>
257
258
259 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('methodDecl0')"><a name="methodDecl0Anchor">methodDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
260 <tr><td colspan="4" class="doc" id="methodDecl0"><pre>Matches method declarations.
261
262 Example matches y
263   class X { void y(); };
264 </pre></td></tr>
265
266
267 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
268 <tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
269
270 Example matches X, S, the anonymous union type, i, and U;
271   typedef int X;
272   struct S {
273     union {
274       int i;
275     } U;
276   };
277 </pre></td></tr>
278
279
280 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;...</td></tr>
281 <tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
282
283 Given
284   namespace {}
285   namespace test {}
286 namespaceDecl()
287   matches "namespace {}" and "namespace test {}"
288 </pre></td></tr>
289
290
291 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;...</td></tr>
292 <tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
293
294 Given
295   void f(int x);
296 parmVarDecl()
297   matches int x.
298 </pre></td></tr>
299
300
301 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
302 <tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches C++ class declarations.
303
304 Example matches X, Z
305   class X;
306   template&lt;class T&gt; class Z {};
307 </pre></td></tr>
308
309
310 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
311 <tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
312
313 Given
314   int X;
315   namespace NS {
316   int Y;
317   }  namespace NS
318 decl(hasDeclContext(translationUnitDecl()))
319   matches "int X", but not "int Y".
320 </pre></td></tr>
321
322
323 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>&gt;...</td></tr>
324 <tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
325
326 Given
327   typedef int X;
328 typedefDecl()
329   matches "typedef int X"
330 </pre></td></tr>
331
332
333 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>&gt;...</td></tr>
334 <tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
335
336 Given
337   template&lt;typename X&gt;
338   class C : private X {
339     using X::x;
340   };
341 unresolvedUsingValueDecl()
342   matches using X::x </pre></td></tr>
343
344
345 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;...</td></tr>
346 <tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
347
348 Given
349   namespace X { int x; }
350   using X::x;
351 usingDecl()
352   matches using X::x </pre></td></tr>
353
354
355 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>&gt;...</td></tr>
356 <tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
357
358 Given
359   namespace X { int x; }
360   using namespace X;
361 usingDirectiveDecl()
362   matches using namespace X </pre></td></tr>
363
364
365 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;...</td></tr>
366 <tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
367
368 Example matches A, B, C and F
369   enum X { A, B, C };
370   void F();
371 </pre></td></tr>
372
373
374 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;...</td></tr>
375 <tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
376
377 Note: this does not match declarations of member variables, which are
378 "field" declarations in Clang parlance.
379
380 Example matches a
381   int a;
382 </pre></td></tr>
383
384
385 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;...</td></tr>
386 <tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
387 </pre></td></tr>
388
389
390 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;...</td></tr>
391 <tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
392
393 Given
394   namespace ns {
395     struct A { static void f(); };
396     void A::f() {}
397     void g() { A::f(); }
398   }
399   ns::A a;
400 nestedNameSpecifier()
401   matches "ns::" and both "A::"
402 </pre></td></tr>
403
404
405 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;...</td></tr>
406 <tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
407 </pre></td></tr>
408
409
410 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('CUDAKernelCallExpr0')"><a name="CUDAKernelCallExpr0Anchor">CUDAKernelCallExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>&gt;...</td></tr>
411 <tr><td colspan="4" class="doc" id="CUDAKernelCallExpr0"><pre>Matches CUDA kernel call expression.
412
413 Example matches,
414   kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
415 </pre></td></tr>
416
417
418 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;...</td></tr>
419 <tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
420
421 Given
422   int i = a[1];
423 arraySubscriptExpr()
424   matches "a[1]"
425 </pre></td></tr>
426
427
428 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>&gt;...</td></tr>
429 <tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
430
431  int i = 100;
432   __asm("mov al, 2");
433 asmStmt()
434   matches '__asm("mov al, 2")'
435 </pre></td></tr>
436
437
438 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;...</td></tr>
439 <tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
440
441 Example matches a || b
442   !(a || b)
443 </pre></td></tr>
444
445
446 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('bindTemporaryExpr0')"><a name="bindTemporaryExpr0Anchor">bindTemporaryExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
447 <tr><td colspan="4" class="doc" id="bindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
448
449 Example matches FunctionTakesString(GetStringByValue())
450     (matcher = bindTemporaryExpr())
451   FunctionTakesString(GetStringByValue());
452   FunctionTakesStringByPointer(GetStringPointer());
453 </pre></td></tr>
454
455
456 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('boolLiteral0')"><a name="boolLiteral0Anchor">boolLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
457 <tr><td colspan="4" class="doc" id="boolLiteral0"><pre>Matches bool literals.
458
459 Example matches true
460   true
461 </pre></td></tr>
462
463
464 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>&gt;...</td></tr>
465 <tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
466
467 Given
468   while (true) { break; }
469 breakStmt()
470   matches 'break'
471 </pre></td></tr>
472
473
474 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>&gt;...</td></tr>
475 <tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
476
477 Example: Matches (int*) 2.2f in
478   int i = (int) 2.2f;
479 </pre></td></tr>
480
481
482 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;...</td></tr>
483 <tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
484
485 Example matches x.y() and y()
486   X x;
487   x.y();
488   y();
489 </pre></td></tr>
490
491
492 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;...</td></tr>
493 <tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
494
495 Given
496   switch(a) { case 42: break; default: break; }
497 caseStmt()
498   matches 'case 42: break;'.
499 </pre></td></tr>
500
501
502 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;...</td></tr>
503 <tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
504
505 Example: castExpr() matches each of the following:
506   (int) 3;
507   const_cast&lt;Expr *&gt;(SubExpr);
508   char c = 0;
509 but does not match
510   int i = (0);
511   int k = 0;
512 </pre></td></tr>
513
514
515 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('catchStmt0')"><a name="catchStmt0Anchor">catchStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
516 <tr><td colspan="4" class="doc" id="catchStmt0"><pre>Matches catch statements.
517
518   try {} catch(int i) {}
519 catchStmt()
520   matches 'catch(int i)'
521 </pre></td></tr>
522
523
524 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;...</td></tr>
525 <tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
526
527 Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
528 though.
529
530 Example matches 'a', L'a'
531   char ch = 'a'; wchar_t chw = L'a';
532 </pre></td></tr>
533
534
535 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;...</td></tr>
536 <tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
537
538 Example match: {1}, (1, 2)
539   int array[4] = {1}; vector int myvec = (vector int)(1, 2);
540 </pre></td></tr>
541
542
543 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;...</td></tr>
544 <tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
545
546 Example matches '{}' and '{{}}'in 'for (;;) {{}}'
547   for (;;) {{}}
548 </pre></td></tr>
549
550
551 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;...</td></tr>
552 <tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
553
554 Example matches a ? b : c
555   (a ? b : c) + 42
556 </pre></td></tr>
557
558
559 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constCastExpr0')"><a name="constCastExpr0Anchor">constCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
560 <tr><td colspan="4" class="doc" id="constCastExpr0"><pre>Matches a const_cast expression.
561
562 Example: Matches const_cast&lt;int*&gt;(&amp;r) in
563   int n = 42;
564   const int &amp;r(n);
565   int* p = const_cast&lt;int*&gt;(&amp;r);
566 </pre></td></tr>
567
568
569 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constructExpr0')"><a name="constructExpr0Anchor">constructExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
570 <tr><td colspan="4" class="doc" id="constructExpr0"><pre>Matches constructor call expressions (including implicit ones).
571
572 Example matches string(ptr, n) and ptr within arguments of f
573     (matcher = constructExpr())
574   void f(const string &amp;a, const string &amp;b);
575   char *ptr;
576   int n;
577   f(string(ptr, n), ptr);
578 </pre></td></tr>
579
580
581 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>&gt;...</td></tr>
582 <tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
583
584 Given
585   while (true) { continue; }
586 continueStmt()
587   matches 'continue'
588 </pre></td></tr>
589
590
591 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;...</td></tr>
592 <tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
593
594 Example matches x in if (x)
595   bool x;
596   if (x) {}
597 </pre></td></tr>
598
599
600 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;...</td></tr>
601 <tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
602
603 Given
604   int a;
605 declStmt()
606   matches 'int a'.
607 </pre></td></tr>
608
609
610 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultArgExpr0')"><a name="defaultArgExpr0Anchor">defaultArgExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
611 <tr><td colspan="4" class="doc" id="defaultArgExpr0"><pre>Matches the value of a default argument at the call site.
612
613 Example matches the CXXDefaultArgExpr placeholder inserted for the
614     default value of the second parameter in the call expression f(42)
615     (matcher = defaultArgExpr())
616   void f(int x, int y = 0);
617   f(42);
618 </pre></td></tr>
619
620
621 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>&gt;...</td></tr>
622 <tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
623
624 Given
625   switch(a) { case 42: break; default: break; }
626 defaultStmt()
627   matches 'default: break;'.
628 </pre></td></tr>
629
630
631 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('deleteExpr0')"><a name="deleteExpr0Anchor">deleteExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
632 <tr><td colspan="4" class="doc" id="deleteExpr0"><pre>Matches delete expressions.
633
634 Given
635   delete X;
636 deleteExpr()
637   matches 'delete X'.
638 </pre></td></tr>
639
640
641 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;...</td></tr>
642 <tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
643
644 Given
645   do {} while (true);
646 doStmt()
647   matches 'do {} while(true)'
648 </pre></td></tr>
649
650
651 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('dynamicCastExpr0')"><a name="dynamicCastExpr0Anchor">dynamicCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
652 <tr><td colspan="4" class="doc" id="dynamicCastExpr0"><pre>Matches a dynamic_cast expression.
653
654 Example:
655   dynamicCastExpr()
656 matches
657   dynamic_cast&lt;D*&gt;(&amp;b);
658 in
659   struct B { virtual ~B() {} }; struct D : B {};
660   B b;
661   D* p = dynamic_cast&lt;D*&gt;(&amp;b);
662 </pre></td></tr>
663
664
665 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;...</td></tr>
666 <tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
667
668 Matches any cast expression written in user code, whether it be a
669 C-style cast, a functional-style cast, or a keyword cast.
670
671 Does not match implicit conversions.
672
673 Note: the name "explicitCast" is chosen to match Clang's terminology, as
674 Clang uses the term "cast" to apply to implicit conversions as well as to
675 actual cast expressions.
676
677 hasDestinationType.
678
679 Example: matches all five of the casts in
680   int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
681 but does not match the implicit conversion in
682   long ell = 42;
683 </pre></td></tr>
684
685
686 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;...</td></tr>
687 <tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
688
689 Example matches x()
690   void f() { x(); }
691 </pre></td></tr>
692
693
694 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>&gt;...</td></tr>
695 <tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
696 of the sub-expression's evaluation.
697
698 Example matches std::string()
699   const std::string str = std::string();
700 </pre></td></tr>
701
702
703 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;...</td></tr>
704 <tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g.
705 1.0, 1.0f, 1.0L and 1e10.
706
707 Does not match implicit conversions such as
708   float a = 10;
709 </pre></td></tr>
710
711
712 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forRangeStmt0')"><a name="forRangeStmt0Anchor">forRangeStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
713 <tr><td colspan="4" class="doc" id="forRangeStmt0"><pre>Matches range-based for statements.
714
715 forRangeStmt() matches 'for (auto a : i)'
716   int i[] =  {1, 2, 3}; for (auto a : i);
717   for(int j = 0; j &lt; 5; ++j);
718 </pre></td></tr>
719
720
721 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;...</td></tr>
722 <tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
723
724 Example matches 'for (;;) {}'
725   for (;;) {}
726   int i[] =  {1, 2, 3}; for (auto a : i);
727 </pre></td></tr>
728
729
730 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('functionalCastExpr0')"><a name="functionalCastExpr0Anchor">functionalCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
731 <tr><td colspan="4" class="doc" id="functionalCastExpr0"><pre>Matches functional cast expressions
732
733 Example: Matches Foo(bar);
734   Foo f = bar;
735   Foo g = (Foo) bar;
736   Foo h = Foo(bar);
737 </pre></td></tr>
738
739
740 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>&gt;...</td></tr>
741 <tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
742
743 Given
744   goto FOO;
745   FOO: bar();
746 gotoStmt()
747   matches 'goto FOO'
748 </pre></td></tr>
749
750
751 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;...</td></tr>
752 <tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
753
754 Example matches 'if (x) {}'
755   if (x) {}
756 </pre></td></tr>
757
758
759 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;...</td></tr>
760 <tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
761
762 This matches many different places, including function call return value
763 eliding, as well as any type conversions.
764 </pre></td></tr>
765
766
767 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;...</td></tr>
768 <tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
769
770 Given
771   int a[] = { 1, 2 };
772   struct B { int x, y; };
773   B b = { 5, 6 };
774 initListExpr()
775   matches "{ 1, 2 }" and "{ 5, 6 }"
776 </pre></td></tr>
777
778
779 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;...</td></tr>
780 <tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g.
781 1, 1L, 0x1 and 1U.
782
783 Does not match character-encoded integers such as L'a'.
784 </pre></td></tr>
785
786
787 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;...</td></tr>
788 <tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
789
790 Given
791   goto FOO;
792   FOO: bar();
793 labelStmt()
794   matches 'FOO:'
795 </pre></td></tr>
796
797
798 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;...</td></tr>
799 <tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
800
801 Example matches [&amp;](){return 5;}
802   [&amp;](){return 5;}
803 </pre></td></tr>
804
805
806 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>&gt;...</td></tr>
807 <tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
808
809 Example: Given
810   struct T {void func()};
811   T f();
812   void g(T);
813 materializeTemporaryExpr() matches 'f()' in these statements
814   T u(f());
815   g(f());
816 but does not match
817   f();
818   f().func();
819 </pre></td></tr>
820
821
822 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('memberCallExpr0')"><a name="memberCallExpr0Anchor">memberCallExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
823 <tr><td colspan="4" class="doc" id="memberCallExpr0"><pre>Matches member call expressions.
824
825 Example matches x.y()
826   X x;
827   x.y();
828 </pre></td></tr>
829
830
831 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;...</td></tr>
832 <tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
833
834 Given
835   class Y {
836     void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
837     int a; static int b;
838   };
839 memberExpr()
840   matches this-&gt;x, x, y.x, a, this-&gt;b
841 </pre></td></tr>
842
843
844 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('newExpr0')"><a name="newExpr0Anchor">newExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
845 <tr><td colspan="4" class="doc" id="newExpr0"><pre>Matches new expressions.
846
847 Given
848   new X;
849 newExpr()
850   matches 'new X'.
851 </pre></td></tr>
852
853
854 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('nullPtrLiteralExpr0')"><a name="nullPtrLiteralExpr0Anchor">nullPtrLiteralExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
855 <tr><td colspan="4" class="doc" id="nullPtrLiteralExpr0"><pre>Matches nullptr literal.
856 </pre></td></tr>
857
858
859 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>&gt;...</td></tr>
860 <tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
861
862   foo();;
863 nullStmt()
864   matches the second ';'
865 </pre></td></tr>
866
867
868 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('operatorCallExpr0')"><a name="operatorCallExpr0Anchor">operatorCallExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
869 <tr><td colspan="4" class="doc" id="operatorCallExpr0"><pre>Matches overloaded operator calls.
870
871 Note that if an operator isn't overloaded, it won't match. Instead, use
872 binaryOperator matcher.
873 Currently it does not match operators such as new delete.
874 FIXME: figure out why these do not match?
875
876 Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
877     (matcher = operatorCallExpr())
878   ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
879   ostream &amp;o; int b = 1, c = 1;
880   o &lt;&lt; b &lt;&lt; c;
881 </pre></td></tr>
882
883
884 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('reinterpretCastExpr0')"><a name="reinterpretCastExpr0Anchor">reinterpretCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
885 <tr><td colspan="4" class="doc" id="reinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
886
887 Either the source expression or the destination type can be matched
888 using has(), but hasDestinationType() is more specific and can be
889 more readable.
890
891 Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
892   void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
893 </pre></td></tr>
894
895
896 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;...</td></tr>
897 <tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
898
899 Given
900   return 1;
901 returnStmt()
902   matches 'return 1'
903 </pre></td></tr>
904
905
906 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('staticCastExpr0')"><a name="staticCastExpr0Anchor">staticCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
907 <tr><td colspan="4" class="doc" id="staticCastExpr0"><pre>Matches a C++ static_cast expression.
908
909 hasDestinationType
910 reinterpretCast
911
912 Example:
913   staticCastExpr()
914 matches
915   static_cast&lt;long&gt;(8)
916 in
917   long eight(static_cast&lt;long&gt;(8));
918 </pre></td></tr>
919
920
921 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;...</td></tr>
922 <tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
923
924 Given
925   { ++a; }
926 stmt()
927   matches both the compound statement '{ ++a; }' and '++a'.
928 </pre></td></tr>
929
930
931 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;...</td></tr>
932 <tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
933
934 Example matches "abcd", L"abcd"
935   char *s = "abcd"; wchar_t *ws = L"abcd"
936 </pre></td></tr>
937
938
939 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>&gt;...</td></tr>
940 <tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
941
942 Given
943   template &lt;int N&gt;
944   struct A { static const int n = N; };
945   struct B : public A&lt;42&gt; {};
946 substNonTypeTemplateParmExpr()
947   matches "N" in the right-hand side of "static const int n = N;"
948 </pre></td></tr>
949
950
951 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt;...</td></tr>
952 <tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
953
954 Given
955   switch(a) { case 42: break; default: break; }
956 switchCase()
957   matches 'case 42: break;' and 'default: break;'.
958 </pre></td></tr>
959
960
961 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;...</td></tr>
962 <tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
963
964 Given
965   switch(a) { case 42: break; default: break; }
966 switchStmt()
967   matches 'switch(a)'.
968 </pre></td></tr>
969
970
971 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('temporaryObjectExpr0')"><a name="temporaryObjectExpr0Anchor">temporaryObjectExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
972 <tr><td colspan="4" class="doc" id="temporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
973
974 Example: Matches Foo(bar, bar)
975   Foo h = Foo(bar, bar);
976 </pre></td></tr>
977
978
979 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('thisExpr0')"><a name="thisExpr0Anchor">thisExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
980 <tr><td colspan="4" class="doc" id="thisExpr0"><pre>Matches implicit and explicit this expressions.
981
982 Example matches the implicit this expression in "return i".
983     (matcher = thisExpr())
984 struct foo {
985   int i;
986   int f() { return i; }
987 };
988 </pre></td></tr>
989
990
991 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('throwExpr0')"><a name="throwExpr0Anchor">throwExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
992 <tr><td colspan="4" class="doc" id="throwExpr0"><pre>Matches throw expressions.
993
994   try { throw 5; } catch(int i) {}
995 throwExpr()
996   matches 'throw 5'
997 </pre></td></tr>
998
999
1000 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('tryStmt0')"><a name="tryStmt0Anchor">tryStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
1001 <tr><td colspan="4" class="doc" id="tryStmt0"><pre>Matches try statements.
1002
1003   try {} catch(int i) {}
1004 tryStmt()
1005   matches 'try {}'
1006 </pre></td></tr>
1007
1008
1009 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;...</td></tr>
1010 <tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1011
1012 Given
1013   Foo x = bar;
1014   int y = sizeof(x) + alignof(x);
1015 unaryExprOrTypeTraitExpr()
1016   matches sizeof(x) and alignof(x)
1017 </pre></td></tr>
1018
1019
1020 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;...</td></tr>
1021 <tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1022
1023 Example matches !a
1024   !a || b
1025 </pre></td></tr>
1026
1027
1028 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedConstructExpr0')"><a name="unresolvedConstructExpr0Anchor">unresolvedConstructExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
1029 <tr><td colspan="4" class="doc" id="unresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1030
1031 Example matches T(t) in return statement of f
1032     (matcher = unresolvedConstructExpr())
1033   template &lt;typename T&gt;
1034   void f(const T&amp; t) { return T(t); }
1035 </pre></td></tr>
1036
1037
1038 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>&gt;...</td></tr>
1039 <tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1040
1041 Example match: "foo"_suffix
1042 </pre></td></tr>
1043
1044
1045 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;...</td></tr>
1046 <tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1047
1048 Given
1049   while (true) {}
1050 whileStmt()
1051   matches 'while (true) {}'.
1052 </pre></td></tr>
1053
1054
1055 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;...</td></tr>
1056 <tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1057
1058 Given
1059   template &lt;typename T&gt; struct C {};
1060   C&lt;int&gt; c;
1061 templateArgument()
1062   matches 'int' in C&lt;int&gt;.
1063 </pre></td></tr>
1064
1065
1066 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;...</td></tr>
1067 <tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1068 </pre></td></tr>
1069
1070
1071 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;...</td></tr>
1072 <tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1073
1074 Given
1075   int a[] = { 2, 3 };
1076   int b[4];
1077   void f() { int c[a[0]]; }
1078 arrayType()
1079   matches "int a[]", "int b[4]" and "int c[a[0]]";
1080 </pre></td></tr>
1081
1082
1083 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;...</td></tr>
1084 <tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1085
1086 Given
1087   _Atomic(int) i;
1088 atomicType()
1089   matches "_Atomic(int) i"
1090 </pre></td></tr>
1091
1092
1093 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;...</td></tr>
1094 <tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1095
1096 Given:
1097   auto n = 4;
1098   int v[] = { 2, 3 }
1099   for (auto i : v) { }
1100 autoType()
1101   matches "auto n" and "auto i"
1102 </pre></td></tr>
1103
1104
1105 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;...</td></tr>
1106 <tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1107 "void (^)(int)".
1108
1109 The pointee is always required to be a FunctionType.
1110 </pre></td></tr>
1111
1112
1113 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>&gt;...</td></tr>
1114 <tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1115
1116 Given
1117   struct A {};
1118   A a;
1119   int b;
1120   float c;
1121   bool d;
1122 builtinType()
1123   matches "int b", "float c" and "bool d"
1124 </pre></td></tr>
1125
1126
1127 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;...</td></tr>
1128 <tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1129
1130 Given
1131   _Complex float f;
1132 complexType()
1133   matches "_Complex float f"
1134 </pre></td></tr>
1135
1136
1137 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;...</td></tr>
1138 <tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1139
1140 Given
1141   void() {
1142     int a[2];
1143     int b[] = { 2, 3 };
1144     int c[b[0]];
1145   }
1146 constantArrayType()
1147   matches "int a[2]"
1148 </pre></td></tr>
1149
1150
1151 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>&gt;...</td></tr>
1152 <tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1153
1154 Given
1155   template&lt;typename T, int Size&gt;
1156   class array {
1157     T data[Size];
1158   };
1159 dependentSizedArrayType
1160   matches "T data[Size]"
1161 </pre></td></tr>
1162
1163
1164 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;...</td></tr>
1165 <tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1166 qualified name.
1167
1168 Given
1169   namespace N {
1170     namespace M {
1171       class D {};
1172     }
1173   }
1174   class C {};
1175
1176   class C c;
1177   N::M::D d;
1178
1179 elaboratedType() matches the type of the variable declarations of both
1180 c and d.
1181 </pre></td></tr>
1182
1183
1184 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>&gt;...</td></tr>
1185 <tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1186
1187 Given
1188   int (*f)(int);
1189   void g();
1190 functionType()
1191   matches "int (*f)(int)" and the type of "g".
1192 </pre></td></tr>
1193
1194
1195 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>&gt;...</td></tr>
1196 <tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1197
1198 Given
1199   int a[] = { 2, 3 };
1200   int b[42];
1201   void f(int c[]) { int d[a[0]]; };
1202 incompleteArrayType()
1203   matches "int a[]" and "int c[]"
1204 </pre></td></tr>
1205
1206
1207 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>&gt;...</td></tr>
1208 <tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1209
1210 Given:
1211   int *a;
1212   int &amp;b = *a;
1213   int &amp;&amp;c = 1;
1214   auto &amp;d = b;
1215   auto &amp;&amp;e = c;
1216   auto &amp;&amp;f = 2;
1217   int g = 5;
1218
1219 lValueReferenceType() matches the types of b, d, and e. e is
1220 matched since the type is deduced as int&amp; by reference collapsing rules.
1221 </pre></td></tr>
1222
1223
1224 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;...</td></tr>
1225 <tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1226 Given
1227   struct A { int i; }
1228   A::* ptr = A::i;
1229 memberPointerType()
1230   matches "A::* ptr"
1231 </pre></td></tr>
1232
1233
1234 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;...</td></tr>
1235 <tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1236
1237 Given
1238   int (*ptr_to_array)[4];
1239   int *array_of_ptrs[4];
1240
1241 varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1242 array_of_ptrs.
1243 </pre></td></tr>
1244
1245
1246 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;...</td></tr>
1247 <tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types.
1248
1249 Given
1250   int *a;
1251   int &amp;b = *a;
1252   int c = 5;
1253 pointerType()
1254   matches "int *a"
1255 </pre></td></tr>
1256
1257
1258 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>&gt;...</td></tr>
1259 <tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1260
1261 Given:
1262   int *a;
1263   int &amp;b = *a;
1264   int &amp;&amp;c = 1;
1265   auto &amp;d = b;
1266   auto &amp;&amp;e = c;
1267   auto &amp;&amp;f = 2;
1268   int g = 5;
1269
1270 rValueReferenceType() matches the types of c and f. e is not
1271 matched as it is deduced to int&amp; by reference collapsing rules.
1272 </pre></td></tr>
1273
1274
1275 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;...</td></tr>
1276 <tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1277
1278 Given
1279   class C {};
1280   struct S {};
1281
1282   C c;
1283   S s;
1284
1285 recordType() matches the type of the variable declarations of both c
1286 and s.
1287 </pre></td></tr>
1288
1289
1290 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;...</td></tr>
1291 <tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1292
1293 Given
1294   int *a;
1295   int &amp;b = *a;
1296   int &amp;&amp;c = 1;
1297   auto &amp;d = b;
1298   auto &amp;&amp;e = c;
1299   auto &amp;&amp;f = 2;
1300   int g = 5;
1301
1302 referenceType() matches the types of b, c, d, e, and f.
1303 </pre></td></tr>
1304
1305
1306 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;...</td></tr>
1307 <tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1308
1309 Given
1310   template &lt;typename T&gt;
1311   class C { };
1312
1313   template class C&lt;int&gt;;  A
1314   C&lt;char&gt; var;            B
1315
1316 templateSpecializationType() matches the type of the explicit
1317 instantiation in A and the type of the variable declaration in B.
1318 </pre></td></tr>
1319
1320
1321 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;...</td></tr>
1322 <tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1323 </pre></td></tr>
1324
1325
1326 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;...</td></tr>
1327 <tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1328
1329 Given
1330   typedef int X;
1331 typedefType()
1332   matches "typedef int X"
1333 </pre></td></tr>
1334
1335
1336 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>&gt;...</td></tr>
1337 <tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1338
1339 Given:
1340   typedef __underlying_type(T) type;
1341 unaryTransformType()
1342   matches "__underlying_type(T)"
1343 </pre></td></tr>
1344
1345
1346 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>&gt;...</td></tr>
1347 <tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1348 integer-constant-expression.
1349
1350 Given
1351   void f() {
1352     int a[] = { 2, 3 }
1353     int b[42];
1354     int c[a[0]];
1355   }
1356 variableArrayType()
1357   matches "int c[a[0]]"
1358 </pre></td></tr>
1359
1360 <!--END_DECL_MATCHERS -->
1361 </table>
1362
1363 <!-- ======================================================================= -->
1364 <h2 id="narrowing-matchers">Narrowing Matchers</h2>
1365 <!-- ======================================================================= -->
1366
1367 <p>Narrowing matchers match certain attributes on the current node, thus
1368 narrowing down the set of nodes of the current type to match on.</p>
1369
1370 <p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1371 which allow users to create more powerful match expressions.</p>
1372
1373 <table>
1374 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1375 <!-- START_NARROWING_MATCHERS -->
1376
1377 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
1378 <tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1379
1380 Usable as: Any Matcher
1381 </pre></td></tr>
1382
1383
1384 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
1385 <tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1386
1387 Usable as: Any Matcher
1388 </pre></td></tr>
1389
1390
1391 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1392 <tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1393
1394 Useful when another matcher requires a child matcher, but there's no
1395 additional constraint. This will often be used with an explicit conversion
1396 to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1397
1398 Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1399 "int* p" and "void f()" in
1400   int* p;
1401   void f();
1402
1403 Usable as: Any Matcher
1404 </pre></td></tr>
1405
1406
1407 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
1408 <tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1409
1410 Example matches Y (matcher = recordDecl(unless(hasName("X"))))
1411   class X {};
1412   class Y {};
1413
1414 Usable as: Any Matcher
1415 </pre></td></tr>
1416
1417
1418 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
1419 <tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1420 unary).
1421
1422 Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1423   !(a || b)
1424 </pre></td></tr>
1425
1426
1427 <tr><td>Matcher&lt;CXXBoolLiteral&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT  Value</td></tr>
1428 <tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1429
1430 Example matches true (matcher = boolLiteral(equals(true)))
1431   true
1432
1433 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1434            Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
1435 </pre></td></tr>
1436
1437
1438 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
1439 <tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1440 a specific number of arguments (including absent default arguments).
1441
1442 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1443   void f(int x, int y);
1444   f(0, 0);
1445 </pre></td></tr>
1446
1447
1448 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr>
1449 <tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
1450 </pre></td></tr>
1451
1452
1453 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr>
1454 <tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
1455 code (as opposed to implicitly added by the compiler).
1456
1457 Given
1458   struct Foo {
1459     Foo() { }
1460     Foo(int) : foo_("A") { }
1461     string foo_;
1462   };
1463 constructorDecl(hasAnyConstructorInitializer(isWritten()))
1464   will match Foo(int), but not Foo()
1465 </pre></td></tr>
1466
1467
1468 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr>
1469 <tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
1470
1471 Given
1472 struct A {
1473   void foo() const;
1474   void bar();
1475 };
1476
1477 methodDecl(isConst()) matches A::foo() but not A::bar()
1478 </pre></td></tr>
1479
1480
1481 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr>
1482 <tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
1483
1484 Given
1485   class A {
1486    public:
1487     virtual void x();
1488   };
1489   class B : public A {
1490    public:
1491     virtual void x();
1492   };
1493   matches B::x
1494 </pre></td></tr>
1495
1496
1497 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr>
1498 <tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
1499
1500 Given
1501   class A {
1502    public:
1503     virtual void x() = 0;
1504   };
1505   matches A::x
1506 </pre></td></tr>
1507
1508
1509 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr>
1510 <tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
1511
1512 Given
1513   class A {
1514    public:
1515     virtual void x();
1516   };
1517   matches A::x
1518 </pre></td></tr>
1519
1520
1521 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
1522 <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
1523
1524 Matches overloaded operator names specified in strings without the
1525 "operator" prefix: e.g. "&lt;&lt;".
1526
1527 Given:
1528   class A { int operator*(); };
1529   const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1530   A a;
1531   a &lt;&lt; a;   &lt;-- This matches
1532
1533 operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1534 line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1535 the declaration of A.
1536
1537 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
1538 </pre></td></tr>
1539
1540
1541 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
1542 <tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
1543 </pre></td></tr>
1544
1545
1546 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
1547 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
1548 static member variable template instantiations.
1549
1550 Given
1551   template&lt;typename T&gt; void A(T t) { }
1552   template&lt;&gt; void A(int N) { }
1553 functionDecl(isExplicitTemplateSpecialization())
1554   matches the specialization A&lt;int&gt;().
1555
1556 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
1557 </pre></td></tr>
1558
1559
1560 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
1561 <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
1562 isSameOrDerivedFrom(hasName(...)).
1563 </pre></td></tr>
1564
1565
1566 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr>
1567 <tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
1568 member variable template instantiations.
1569
1570 Given
1571   template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1572 or
1573   template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
1574 recordDecl(hasName("::X"), isTemplateInstantiation())
1575   matches the template instantiation of X&lt;A&gt;.
1576
1577 But given
1578   template &lt;typename T&gt;  class X {}; class A {};
1579   template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
1580 recordDecl(hasName("::X"), isTemplateInstantiation())
1581   does not match, as X&lt;A&gt; is an explicit template specialization.
1582
1583 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
1584 </pre></td></tr>
1585
1586
1587 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs0')"><a name="argumentCountIs0Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
1588 <tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
1589 a specific number of arguments (including absent default arguments).
1590
1591 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1592   void f(int x, int y);
1593   f(0, 0);
1594 </pre></td></tr>
1595
1596
1597 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>ValueT  Value</td></tr>
1598 <tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
1599
1600 Example matches true (matcher = boolLiteral(equals(true)))
1601   true
1602
1603 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1604            Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
1605 </pre></td></tr>
1606
1607
1608 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
1609 <tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
1610
1611 Given
1612   template&lt;typename T&gt; struct C {};
1613   C&lt;int&gt; c;
1614 classTemplateSpecializationDecl(templateArgumentCountIs(1))
1615   matches C&lt;int&gt;.
1616 </pre></td></tr>
1617
1618
1619 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;</td><td class="name" onclick="toggle('statementCountIs0')"><a name="statementCountIs0Anchor">statementCountIs</a></td><td>unsigned N</td></tr>
1620 <tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
1621 child statements.
1622
1623 Example: Given
1624   { for (;;) {} }
1625 compoundStmt(statementCountIs(0)))
1626   matches '{}'
1627   but does not match the outer compound statement.
1628 </pre></td></tr>
1629
1630
1631 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;</td><td class="name" onclick="toggle('hasSize0')"><a name="hasSize0Anchor">hasSize</a></td><td>unsigned N</td></tr>
1632 <tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size.
1633
1634 Given
1635   int a[42];
1636   int b[2 * 21];
1637   int c[41], d[43];
1638 constantArrayType(hasSize(42))
1639   matches "int a[42]" and "int b[2 * 21]"
1640 </pre></td></tr>
1641
1642
1643 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;</td><td class="name" onclick="toggle('declCountIs0')"><a name="declCountIs0Anchor">declCountIs</a></td><td>unsigned N</td></tr>
1644 <tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
1645 declarations.
1646
1647 Example: Given
1648   int a, b;
1649   int c;
1650   int d = 2, e;
1651 declCountIs(2)
1652   matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
1653 </pre></td></tr>
1654
1655
1656 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
1657 <tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
1658
1659 Matches a node if it equals the node previously bound to ID.
1660
1661 Given
1662   class X { int a; int b; };
1663 recordDecl(
1664     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1665     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1666   matches the class X, as a and b have the same type.
1667
1668 Note that when multiple matches are involved via forEach* matchers,
1669 equalsBoundNodes acts as a filter.
1670 For example:
1671 compoundStmt(
1672     forEachDescendant(varDecl().bind("d")),
1673     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1674 will trigger a match for each combination of variable declaration
1675 and reference to that variable declaration within a compound statement.
1676 </pre></td></tr>
1677
1678
1679 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr>
1680 <tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
1681
1682 Given
1683   __attribute__((device)) void f() { ... }
1684 decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
1685 f.
1686 </pre></td></tr>
1687
1688
1689 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
1690 <tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
1691 partially matching a given regex.
1692
1693 Example matches Y but not X
1694     (matcher = recordDecl(isExpansionInFileMatching("AST.*"))
1695   #include "ASTMatcher.h"
1696   class X {};
1697 ASTMatcher.h:
1698   class Y {};
1699
1700 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
1701 </pre></td></tr>
1702
1703
1704 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr>
1705 <tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
1706
1707 Example matches X but not Y (matcher = recordDecl(isExpansionInMainFile())
1708   #include &lt;Y.h&gt;
1709   class X {};
1710 Y.h:
1711   class Y {};
1712
1713 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
1714 </pre></td></tr>
1715
1716
1717 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
1718 <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
1719
1720 Example matches Y but not X
1721     (matcher = recordDecl(isExpansionInSystemHeader())
1722   #include &lt;SystemHeader.h&gt;
1723   class X {};
1724 SystemHeader.h:
1725   class Y {};
1726
1727 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
1728 </pre></td></tr>
1729
1730
1731 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
1732 <tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
1733 by the compiler (eg. implicit defaultcopy constructors).
1734 </pre></td></tr>
1735
1736
1737 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr>
1738 <tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
1739
1740 Given
1741   class C {
1742   public:    int a;
1743   protected: int b;
1744   private:   int c;
1745   };
1746 fieldDecl(isPrivate())
1747   matches 'int c;' 
1748 </pre></td></tr>
1749
1750
1751 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr>
1752 <tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
1753
1754 Given
1755   class C {
1756   public:    int a;
1757   protected: int b;
1758   private:   int c;
1759   };
1760 fieldDecl(isProtected())
1761   matches 'int b;' 
1762 </pre></td></tr>
1763
1764
1765 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr>
1766 <tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
1767
1768 Given
1769   class C {
1770   public:    int a;
1771   protected: int b;
1772   private:   int c;
1773   };
1774 fieldDecl(isPublic())
1775   matches 'int a;' 
1776 </pre></td></tr>
1777
1778
1779 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>ValueT  Value</td></tr>
1780 <tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
1781
1782 Example matches true (matcher = boolLiteral(equals(true)))
1783   true
1784
1785 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1786            Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
1787 </pre></td></tr>
1788
1789
1790 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
1791 <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
1792
1793 Matches overloaded operator names specified in strings without the
1794 "operator" prefix: e.g. "&lt;&lt;".
1795
1796 Given:
1797   class A { int operator*(); };
1798   const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1799   A a;
1800   a &lt;&lt; a;   &lt;-- This matches
1801
1802 operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1803 line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1804 the declaration of A.
1805
1806 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
1807 </pre></td></tr>
1808
1809
1810 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
1811 <tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
1812
1813 Example matches A, va, fa
1814   class A {};
1815   class B;  Doesn't match, as it has no body.
1816   int va;
1817   extern int vb;  Doesn't match, as it doesn't define the variable.
1818   void fa() {}
1819   void fb();  Doesn't match, as it has no body.
1820
1821 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
1822 </pre></td></tr>
1823
1824
1825 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr>
1826 <tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
1827
1828 Given:
1829   void Func();
1830   void DeletedFunc() = delete;
1831 functionDecl(isDeleted())
1832   matches the declaration of DeletedFunc, but not Func.
1833 </pre></td></tr>
1834
1835
1836 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization0')"><a name="isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
1837 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
1838 static member variable template instantiations.
1839
1840 Given
1841   template&lt;typename T&gt; void A(T t) { }
1842   template&lt;&gt; void A(int N) { }
1843 functionDecl(isExplicitTemplateSpecialization())
1844   matches the specialization A&lt;int&gt;().
1845
1846 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
1847 </pre></td></tr>
1848
1849
1850 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr>
1851 <tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
1852
1853 Given:
1854   extern "C" void f() {}
1855   extern "C" { void g() {} }
1856   void h() {}
1857 functionDecl(isExternC())
1858   matches the declaration of f and g, but not the declaration h
1859 </pre></td></tr>
1860
1861
1862 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr>
1863 <tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
1864 member variable template instantiations.
1865
1866 Given
1867   template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1868 or
1869   template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
1870 recordDecl(hasName("::X"), isTemplateInstantiation())
1871   matches the template instantiation of X&lt;A&gt;.
1872
1873 But given
1874   template &lt;typename T&gt;  class X {}; class A {};
1875   template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
1876 recordDecl(hasName("::X"), isTemplateInstantiation())
1877   does not match, as X&lt;A&gt; is an explicit template specialization.
1878
1879 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
1880 </pre></td></tr>
1881
1882
1883 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs0')"><a name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
1884 <tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls that have a specific parameter count.
1885
1886 Given
1887   void f(int i) {}
1888   void g(int i, int j) {}
1889 functionDecl(parameterCountIs(2))
1890   matches g(int i, int j) {}
1891 </pre></td></tr>
1892
1893
1894 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>ValueT  Value</td></tr>
1895 <tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
1896
1897 Example matches true (matcher = boolLiteral(equals(true)))
1898   true
1899
1900 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1901            Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
1902 </pre></td></tr>
1903
1904
1905 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow0')"><a name="isArrow0Anchor">isArrow</a></td><td></td></tr>
1906 <tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
1907 to '.'.
1908
1909 Member calls on the implicit this pointer match as called with '-&gt;'.
1910
1911 Given
1912   class Y {
1913     void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1914     int a;
1915     static int b;
1916   };
1917 memberExpr(isArrow())
1918   matches this-&gt;x, x, y.x, a, this-&gt;b
1919 </pre></td></tr>
1920
1921
1922 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>std::string  Name</td></tr>
1923 <tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
1924
1925 Supports specifying enclosing namespaces or classes by prefixing the name
1926 with '&lt;enclosing&gt;::'.
1927 Does not match typedefs of an underlying type with the given name.
1928
1929 Example matches X (Name == "X")
1930   class X;
1931
1932 Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
1933   namespace a { namespace b { class X; } }
1934 </pre></td></tr>
1935
1936
1937 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>std::string RegExp</td></tr>
1938 <tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
1939 a substring matched by the given RegExp.
1940
1941 Supports specifying enclosing namespaces or classes by
1942 prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
1943 of an underlying type with the given name.
1944
1945 Example matches X (regexp == "::X")
1946   class X;
1947
1948 Example matches X (regexp is one of "::X", "^foo::.*X", among others)
1949   namespace foo { namespace bar { class X; } }
1950 </pre></td></tr>
1951
1952
1953 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('asString0')"><a name="asString0Anchor">asString</a></td><td>std::string Name</td></tr>
1954 <tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
1955
1956 Given
1957   class Y { public: void x(); };
1958   void z() { Y* y; y-&gt;x(); }
1959 callExpr(on(hasType(asString("class Y *"))))
1960   matches y-&gt;x()
1961 </pre></td></tr>
1962
1963
1964 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
1965 <tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
1966
1967 Matches a node if it equals the node previously bound to ID.
1968
1969 Given
1970   class X { int a; int b; };
1971 recordDecl(
1972     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1973     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1974   matches the class X, as a and b have the same type.
1975
1976 Note that when multiple matches are involved via forEach* matchers,
1977 equalsBoundNodes acts as a filter.
1978 For example:
1979 compoundStmt(
1980     forEachDescendant(varDecl().bind("d")),
1981     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1982 will trigger a match for each combination of variable declaration
1983 and reference to that variable declaration within a compound statement.
1984 </pre></td></tr>
1985
1986
1987 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasLocalQualifiers0')"><a name="hasLocalQualifiers0Anchor">hasLocalQualifiers</a></td><td></td></tr>
1988 <tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
1989 the node, not hidden within a typedef.
1990
1991 Given
1992   typedef const int const_int;
1993   const_int i;
1994   int *const j;
1995   int *volatile k;
1996   int m;
1997 varDecl(hasType(hasLocalQualifiers())) matches only j and k.
1998 i is const-qualified but the qualifier is not local.
1999 </pre></td></tr>
2000
2001
2002 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isConstQualified0')"><a name="isConstQualified0Anchor">isConstQualified</a></td><td></td></tr>
2003 <tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
2004 include "top-level" const.
2005
2006 Given
2007   void a(int);
2008   void b(int const);
2009   void c(const int);
2010   void d(const int*);
2011   void e(int const) {};
2012 functionDecl(hasAnyParameter(hasType(isConstQualified())))
2013   matches "void b(int const)", "void c(const int)" and
2014   "void e(int const) {}". It does not match d as there
2015   is no top-level const on the parameter type "const int *".
2016 </pre></td></tr>
2017
2018
2019 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isInteger0')"><a name="isInteger0Anchor">isInteger</a></td><td></td></tr>
2020 <tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
2021
2022 Given
2023   void a(int);
2024   void b(long);
2025   void c(double);
2026 functionDecl(hasAnyParameter(hasType(isInteger())))
2027 matches "a(int)", "b(long)", but not "c(double)".
2028 </pre></td></tr>
2029
2030
2031 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
2032 <tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
2033
2034 Matches a node if it equals the node previously bound to ID.
2035
2036 Given
2037   class X { int a; int b; };
2038 recordDecl(
2039     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2040     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2041   matches the class X, as a and b have the same type.
2042
2043 Note that when multiple matches are involved via forEach* matchers,
2044 equalsBoundNodes acts as a filter.
2045 For example:
2046 compoundStmt(
2047     forEachDescendant(varDecl().bind("d")),
2048     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2049 will trigger a match for each combination of variable declaration
2050 and reference to that variable declaration within a compound statement.
2051 </pre></td></tr>
2052
2053
2054 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
2055 <tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
2056 partially matching a given regex.
2057
2058 Example matches Y but not X
2059     (matcher = recordDecl(isExpansionInFileMatching("AST.*"))
2060   #include "ASTMatcher.h"
2061   class X {};
2062 ASTMatcher.h:
2063   class Y {};
2064
2065 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2066 </pre></td></tr>
2067
2068
2069 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr>
2070 <tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
2071
2072 Example matches X but not Y (matcher = recordDecl(isExpansionInMainFile())
2073   #include &lt;Y.h&gt;
2074   class X {};
2075 Y.h:
2076   class Y {};
2077
2078 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2079 </pre></td></tr>
2080
2081
2082 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
2083 <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
2084
2085 Example matches Y but not X
2086     (matcher = recordDecl(isExpansionInSystemHeader())
2087   #include &lt;SystemHeader.h&gt;
2088   class X {};
2089 SystemHeader.h:
2090   class Y {};
2091
2092 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2093 </pre></td></tr>
2094
2095
2096 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition0')"><a name="isDefinition0Anchor">isDefinition</a></td><td></td></tr>
2097 <tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
2098
2099 Example matches A, va, fa
2100   class A {};
2101   class B;  Doesn't match, as it has no body.
2102   int va;
2103   extern int vb;  Doesn't match, as it doesn't define the variable.
2104   void fa() {}
2105   void fb();  Doesn't match, as it has no body.
2106
2107 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
2108 </pre></td></tr>
2109
2110
2111 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr>
2112 <tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
2113
2114 Note that 'Value' is a string as the template argument's value is
2115 an arbitrary precision integer. 'Value' must be euqal to the canonical
2116 representation of that integral value in base 10.
2117
2118 Given
2119   template&lt;int T&gt; struct A {};
2120   C&lt;42&gt; c;
2121 classTemplateSpecializationDecl(
2122   hasAnyTemplateArgument(equalsIntegralValue("42")))
2123   matches the implicit instantiation of C in C&lt;42&gt;.
2124 </pre></td></tr>
2125
2126
2127 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr>
2128 <tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
2129
2130 Given
2131   template&lt;int T&gt; struct A {};
2132   C&lt;42&gt; c;
2133 classTemplateSpecializationDecl(
2134   hasAnyTemplateArgument(isIntegral()))
2135   matches the implicit instantiation of C in C&lt;42&gt;
2136   with isIntegral() matching 42.
2137 </pre></td></tr>
2138
2139
2140 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs1')"><a name="templateArgumentCountIs1Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
2141 <tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
2142
2143 Given
2144   template&lt;typename T&gt; struct C {};
2145   C&lt;int&gt; c;
2146 classTemplateSpecializationDecl(templateArgumentCountIs(1))
2147   matches C&lt;int&gt;.
2148 </pre></td></tr>
2149
2150
2151 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
2152 <tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
2153 partially matching a given regex.
2154
2155 Example matches Y but not X
2156     (matcher = recordDecl(isExpansionInFileMatching("AST.*"))
2157   #include "ASTMatcher.h"
2158   class X {};
2159 ASTMatcher.h:
2160   class Y {};
2161
2162 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2163 </pre></td></tr>
2164
2165
2166 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr>
2167 <tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
2168
2169 Example matches X but not Y (matcher = recordDecl(isExpansionInMainFile())
2170   #include &lt;Y.h&gt;
2171   class X {};
2172 Y.h:
2173   class Y {};
2174
2175 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2176 </pre></td></tr>
2177
2178
2179 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader2')"><a name="isExpansionInSystemHeader2Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
2180 <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
2181
2182 Example matches Y but not X
2183     (matcher = recordDecl(isExpansionInSystemHeader())
2184   #include &lt;SystemHeader.h&gt;
2185   class X {};
2186 SystemHeader.h:
2187   class Y {};
2188
2189 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2190 </pre></td></tr>
2191
2192
2193 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode2')"><a name="equalsBoundNode2Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
2194 <tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
2195
2196 Matches a node if it equals the node previously bound to ID.
2197
2198 Given
2199   class X { int a; int b; };
2200 recordDecl(
2201     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2202     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2203   matches the class X, as a and b have the same type.
2204
2205 Note that when multiple matches are involved via forEach* matchers,
2206 equalsBoundNodes acts as a filter.
2207 For example:
2208 compoundStmt(
2209     forEachDescendant(varDecl().bind("d")),
2210     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2211 will trigger a match for each combination of variable declaration
2212 and reference to that variable declaration within a compound statement.
2213 </pre></td></tr>
2214
2215
2216 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr>
2217 <tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
2218
2219 Given
2220  struct S { void func(); };
2221 functionDecl(returns(voidType()))
2222   matches "void func();"
2223 </pre></td></tr>
2224
2225
2226 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;</td><td class="name" onclick="toggle('ofKind0')"><a name="ofKind0Anchor">ofKind</a></td><td>UnaryExprOrTypeTrait Kind</td></tr>
2227 <tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
2228
2229 Given
2230   int x;
2231   int s = sizeof(x) + alignof(x)
2232 unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
2233   matches sizeof(x)
2234 </pre></td></tr>
2235
2236
2237 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
2238 <tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
2239 unary).
2240
2241 Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2242   !(a || b)
2243 </pre></td></tr>
2244
2245
2246 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr>
2247 <tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
2248
2249 Example matches y and z (matcher = varDecl(hasGlobalStorage())
2250 void f() {
2251   int x;
2252   static int y;
2253 }
2254 int z;
2255 </pre></td></tr>
2256
2257
2258 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr>
2259 <tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
2260 non-static local variable.
2261
2262 Example matches x (matcher = varDecl(hasLocalStorage())
2263 void f() {
2264   int x;
2265   static int y;
2266 }
2267 int z;
2268 </pre></td></tr>
2269
2270
2271 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition1')"><a name="isDefinition1Anchor">isDefinition</a></td><td></td></tr>
2272 <tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
2273
2274 Example matches A, va, fa
2275   class A {};
2276   class B;  Doesn't match, as it has no body.
2277   int va;
2278   extern int vb;  Doesn't match, as it doesn't define the variable.
2279   void fa() {}
2280   void fb();  Doesn't match, as it has no body.
2281
2282 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
2283 </pre></td></tr>
2284
2285
2286 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization1')"><a name="isExplicitTemplateSpecialization1Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
2287 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
2288 static member variable template instantiations.
2289
2290 Given
2291   template&lt;typename T&gt; void A(T t) { }
2292   template&lt;&gt; void A(int N) { }
2293 functionDecl(isExplicitTemplateSpecialization())
2294   matches the specialization A&lt;int&gt;().
2295
2296 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
2297 </pre></td></tr>
2298
2299
2300 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation1')"><a name="isTemplateInstantiation1Anchor">isTemplateInstantiation</a></td><td></td></tr>
2301 <tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
2302 member variable template instantiations.
2303
2304 Given
2305   template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2306 or
2307   template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2308 recordDecl(hasName("::X"), isTemplateInstantiation())
2309   matches the template instantiation of X&lt;A&gt;.
2310
2311 But given
2312   template &lt;typename T&gt;  class X {}; class A {};
2313   template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2314 recordDecl(hasName("::X"), isTemplateInstantiation())
2315   does not match, as X&lt;A&gt; is an explicit template specialization.
2316
2317 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
2318 </pre></td></tr>
2319
2320
2321 <tr><td>Matcher&lt;internal::Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;&gt;</td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
2322 <tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
2323 template instantiations.
2324
2325 Given
2326   template&lt;typename T&gt; void A(T t) { T i; }
2327   A(0);
2328   A(0U);
2329 functionDecl(isInstantiated())
2330   matches 'A(int) {...};' and 'A(unsigned) {...}'.
2331 </pre></td></tr>
2332
2333
2334 <tr><td>Matcher&lt;internal::Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;&gt;</td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr>
2335 <tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
2336
2337 Given
2338   int j;
2339   template&lt;typename T&gt; void A(T t) { T i; j += 42;}
2340   A(0);
2341   A(0U);
2342 declStmt(isInTemplateInstantiation())
2343   matches 'int i;' and 'unsigned i'.
2344 unless(stmt(isInTemplateInstantiation()))
2345   will NOT match j += 42; as it's shared between the template definition and
2346   instantiation.
2347 </pre></td></tr>
2348
2349 <!--END_NARROWING_MATCHERS -->
2350 </table>
2351
2352 <!-- ======================================================================= -->
2353 <h2 id="traversal-matchers">AST Traversal Matchers</h2>
2354 <!-- ======================================================================= -->
2355
2356 <p>Traversal matchers specify the relationship to other nodes that are
2357 reachable from the current node.</p>
2358
2359 <p>Note that there are special traversal matchers (has, hasDescendant, forEach and
2360 forEachDescendant) which work on all nodes and allow users to write more generic
2361 match expressions.</p>
2362
2363 <table>
2364 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2365 <!-- START_TRAVERSAL_MATCHERS -->
2366
2367 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
2368 <tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
2369
2370 Unlike anyOf, eachOf will generate a match result for each
2371 matching submatcher.
2372
2373 For example, in:
2374   class A { int a; int b; };
2375 The matcher:
2376   recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
2377                     has(fieldDecl(hasName("b")).bind("v"))))
2378 will generate two results binding "v", the first of which binds
2379 the field declaration of a, the second the field declaration of
2380 b.
2381
2382 Usable as: Any Matcher
2383 </pre></td></tr>
2384
2385
2386 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
2387 <tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2388 provided matcher.
2389
2390 Example matches X, A, B, C
2391     (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
2392   class X {};  Matches X, because X::X is a class of name X inside X.
2393   class A { class X {}; };
2394   class B { class C { class X {}; }; };
2395
2396 DescendantT must be an AST base type.
2397
2398 As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
2399 each result that matches instead of only on the first one.
2400
2401 Note: Recursively combined ForEachDescendant can cause many matches:
2402   recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
2403 will match 10 times (plus injected class name matches) on:
2404   class A { class B { class C { class D { class E {}; }; }; }; };
2405
2406 Usable as: Any Matcher
2407 </pre></td></tr>
2408
2409
2410 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
2411 <tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
2412 provided matcher.
2413
2414 Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
2415   class X {};  Matches X, because X::X is a class of name X inside X.
2416   class Y { class X {}; };
2417   class Z { class Y { class X {}; }; };  Does not match Z.
2418
2419 ChildT must be an AST base type.
2420
2421 As opposed to 'has', 'forEach' will cause a match for each result that
2422 matches instead of only on the first one.
2423
2424 Usable as: Any Matcher
2425 </pre></td></tr>
2426
2427
2428 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
2429 <tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
2430 matcher.
2431
2432 Given
2433 void f() { if (true) { int x = 42; } }
2434 void g() { for (;;) { int x = 43; } }
2435 expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
2436
2437 Usable as: Any Matcher
2438 </pre></td></tr>
2439
2440
2441 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
2442 <tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2443 provided matcher.
2444
2445 Example matches X, Y, Z
2446     (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
2447   class X {};  Matches X, because X::X is a class of name X inside X.
2448   class Y { class X {}; };
2449   class Z { class Y { class X {}; }; };
2450
2451 DescendantT must be an AST base type.
2452
2453 Usable as: Any Matcher
2454 </pre></td></tr>
2455
2456
2457 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
2458 <tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
2459 provided matcher.
2460
2461 Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
2462   class X {};  Matches X, because X::X is a class of name X inside X.
2463   class Y { class X {}; };
2464   class Z { class Y { class X {}; }; };  Does not match Z.
2465
2466 ChildT must be an AST base type.
2467
2468 Usable as: Any Matcher
2469 </pre></td></tr>
2470
2471
2472 <tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
2473 <tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
2474 matcher.
2475
2476 Given
2477 void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
2478 compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
2479
2480 Usable as: Any Matcher
2481 </pre></td></tr>
2482
2483
2484 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasBase0')"><a name="hasBase0Anchor">hasBase</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2485 <tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
2486
2487 Given
2488   int i[5];
2489   void f() { i[1] = 42; }
2490 arraySubscriptExpression(hasBase(implicitCastExpr(
2491     hasSourceExpression(declRefExpr()))))
2492   matches i[1] with the declRefExpr() matching i
2493 </pre></td></tr>
2494
2495
2496 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasIndex0')"><a name="hasIndex0Anchor">hasIndex</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2497 <tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
2498
2499 Given
2500   int i[5];
2501   void f() { i[1] = 42; }
2502 arraySubscriptExpression(hasIndex(integerLiteral()))
2503   matches i[1] with the integerLiteral() matching 1
2504 </pre></td></tr>
2505
2506
2507 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayTypeLoc.html">ArrayTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasElementTypeLoc0')"><a name="hasElementTypeLoc0Anchor">hasElementTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
2508 <tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
2509 type.
2510
2511 Given
2512   struct A {};
2513   A a[7];
2514   int b[7];
2515 arrayType(hasElementType(builtinType()))
2516   matches "int b[7]"
2517
2518 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
2519 </pre></td></tr>
2520
2521
2522 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;</td><td class="name" onclick="toggle('hasElementType0')"><a name="hasElementType0Anchor">hasElementType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
2523 <tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
2524 type.
2525
2526 Given
2527   struct A {};
2528   A a[7];
2529   int b[7];
2530 arrayType(hasElementType(builtinType()))
2531   matches "int b[7]"
2532
2533 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
2534 </pre></td></tr>
2535
2536
2537 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicTypeLoc.html">AtomicTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasValueTypeLoc0')"><a name="hasValueTypeLoc0Anchor">hasValueTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
2538 <tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
2539
2540 Given
2541   _Atomic(int) i;
2542   _Atomic(float) f;
2543 atomicType(hasValueType(isInteger()))
2544  matches "_Atomic(int) i"
2545
2546 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2547 </pre></td></tr>
2548
2549
2550 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;</td><td class="name" onclick="toggle('hasValueType0')"><a name="hasValueType0Anchor">hasValueType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
2551 <tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
2552
2553 Given
2554   _Atomic(int) i;
2555   _Atomic(float) f;
2556 atomicType(hasValueType(isInteger()))
2557  matches "_Atomic(int) i"
2558
2559 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2560 </pre></td></tr>
2561
2562
2563 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;</td><td class="name" onclick="toggle('hasDeducedType0')"><a name="hasDeducedType0Anchor">hasDeducedType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
2564 <tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
2565
2566 Note: There is no TypeLoc for the deduced type and thus no
2567 getDeducedLoc() matcher.
2568
2569 Given
2570   auto a = 1;
2571   auto b = 2.0;
2572 autoType(hasDeducedType(isInteger()))
2573   matches "auto a"
2574
2575 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
2576 </pre></td></tr>
2577
2578
2579 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;  InnerMatcher</td></tr>
2580 <tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
2581 binary operator matches.
2582 </pre></td></tr>
2583
2584
2585 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasLHS0')"><a name="hasLHS0Anchor">hasLHS</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2586 <tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
2587
2588 Example matches a (matcher = binaryOperator(hasLHS()))
2589   a || b
2590 </pre></td></tr>
2591
2592
2593 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasRHS0')"><a name="hasRHS0Anchor">hasRHS</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2594 <tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
2595
2596 Example matches b (matcher = binaryOperator(hasRHS()))
2597   a || b
2598 </pre></td></tr>
2599
2600
2601 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerTypeLoc.html">BlockPointerTypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointeeLoc0')"><a name="pointeeLoc0Anchor">pointeeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
2602 <tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
2603 pointee matches a given matcher.
2604
2605 Given
2606   int *a;
2607   int const *b;
2608   float const *f;
2609 pointerType(pointee(isConstQualified(), isInteger()))
2610   matches "int const *b"
2611
2612 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
2613   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
2614 </pre></td></tr>
2615
2616
2617 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;</td><td class="name" onclick="toggle('pointee0')"><a name="pointee0Anchor">pointee</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
2618 <tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
2619 pointee matches a given matcher.
2620
2621 Given
2622   int *a;
2623   int const *b;
2624   float const *f;
2625 pointerType(pointee(isConstQualified(), isInteger()))
2626   matches "int const *b"
2627
2628 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
2629   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
2630 </pre></td></tr>
2631
2632
2633 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument1')"><a name="hasAnyArgument1Anchor">hasAnyArgument</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2634 <tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
2635 expression.
2636
2637 Given
2638   void x(int, int, int) { int y; x(1, y, 42); }
2639 callExpr(hasAnyArgument(declRefExpr()))
2640   matches x(1, y, 42)
2641 with hasAnyArgument(...)
2642   matching y
2643
2644 FIXME: Currently this will ignore parentheses and implicit casts on
2645 the argument before applying the inner matcher. We'll want to remove
2646 this to allow for greater control by the user once ignoreImplicit()
2647 has been implemented.
2648 </pre></td></tr>
2649
2650
2651 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument1')"><a name="hasArgument1Anchor">hasArgument</a></td><td>unsigned N, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2652 <tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
2653 call expression.
2654
2655 Example matches y in x(y)
2656     (matcher = callExpr(hasArgument(0, declRefExpr())))
2657   void x(int) { int y; x(y); }
2658 </pre></td></tr>
2659
2660
2661 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
2662 <tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
2663 matches the given matcher.
2664
2665 The associated declaration is:
2666 - for type nodes, the declaration of the underlying type
2667 - for CallExpr, the declaration of the callee
2668 - for MemberExpr, the declaration of the referenced member
2669 - for CXXConstructExpr, the declaration of the constructor
2670
2671 Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2672 function. e.g. various subtypes of clang::Type and various expressions.
2673
2674 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
2675   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
2676   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
2677   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
2678   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
2679   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
2680 </pre></td></tr>
2681
2682
2683 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('forEachConstructorInitializer0')"><a name="forEachConstructorInitializer0Anchor">forEachConstructorInitializer</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt; InnerMatcher</td></tr>
2684 <tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
2685
2686 Given
2687   class A { A() : i(42), j(42) {} int i; int j; };
2688 constructorDecl(forEachConstructorInitializer(forField(decl().bind("x"))))
2689   will trigger two matches, binding for 'i' and 'j' respectively.
2690 </pre></td></tr>
2691
2692
2693 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyConstructorInitializer0')"><a name="hasAnyConstructorInitializer0Anchor">hasAnyConstructorInitializer</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt; InnerMatcher</td></tr>
2694 <tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
2695
2696 Given
2697   struct Foo {
2698     Foo() : foo_(1) { }
2699     int foo_;
2700   };
2701 recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
2702   record matches Foo, hasAnyConstructorInitializer matches foo_(1)
2703 </pre></td></tr>
2704
2705
2706 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('forField0')"><a name="forField0Anchor">forField</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt; InnerMatcher</td></tr>
2707 <tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
2708
2709 Given
2710   struct Foo {
2711     Foo() : foo_(1) { }
2712     int foo_;
2713   };
2714 recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
2715     forField(hasName("foo_"))))))
2716   matches Foo
2717 with forField matching foo_
2718 </pre></td></tr>
2719
2720
2721 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('withInitializer0')"><a name="withInitializer0Anchor">withInitializer</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2722 <tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
2723
2724 Given
2725   struct Foo {
2726     Foo() : foo_(1) { }
2727     int foo_;
2728   };
2729 recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
2730     withInitializer(integerLiteral(equals(1)))))))
2731   matches Foo
2732 with withInitializer matching (1)
2733 </pre></td></tr>
2734
2735
2736 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody3')"><a name="hasBody3Anchor">hasBody</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
2737 <tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', or 'do while' statement that has
2738 a given body.
2739
2740 Given
2741   for (;;) {}
2742 hasBody(compoundStmt())
2743   matches 'for (;;) {}'
2744 with compoundStmt()
2745   matching '{}'
2746 </pre></td></tr>
2747
2748
2749 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasLoopVariable0')"><a name="hasLoopVariable0Anchor">hasLoopVariable</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt; InnerMatcher</td></tr>
2750 <tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
2751
2752 Example:
2753     forStmt(hasLoopVariable(anything()))
2754 matches 'int x' in
2755     for (int x : a) { }
2756 </pre></td></tr>
2757
2758
2759 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasRangeInit0')"><a name="hasRangeInit0Anchor">hasRangeInit</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2760 <tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
2761
2762 Example:
2763     forStmt(hasRangeInit(anything()))
2764 matches 'a' in
2765     for (int x : a) { }
2766 </pre></td></tr>
2767
2768
2769 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('onImplicitObjectArgument0')"><a name="onImplicitObjectArgument0Anchor">onImplicitObjectArgument</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2770 <tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
2771
2772
2773 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('on0')"><a name="on0Anchor">on</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2774 <tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
2775
2776 Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
2777   class Y { public: void x(); };
2778   void z() { Y y; y.x(); }",
2779
2780 FIXME: Overload to allow directly matching types?
2781 </pre></td></tr>
2782
2783
2784 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('thisPointerType1')"><a name="thisPointerType1Anchor">thisPointerType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
2785 <tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
2786 </pre></td></tr>
2787
2788
2789 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('thisPointerType0')"><a name="thisPointerType0Anchor">thisPointerType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
2790 <tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
2791 matcher, or is a pointer to a type that matches the InnerMatcher.
2792 </pre></td></tr>
2793
2794
2795 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('ofClass0')"><a name="ofClass0Anchor">ofClass</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt; InnerMatcher</td></tr>
2796 <tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
2797 belongs to.
2798
2799 FIXME: Generalize this for other kinds of declarations.
2800 FIXME: What other kind of declarations would we need to generalize
2801 this to?
2802
2803 Example matches A() in the last line
2804     (matcher = constructExpr(hasDeclaration(methodDecl(
2805         ofClass(hasName("A"))))))
2806   class A {
2807    public:
2808     A();
2809   };
2810   A a = A();
2811 </pre></td></tr>
2812
2813
2814 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasMethod0')"><a name="hasMethod0Anchor">hasMethod</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt; InnerMatcher</td></tr>
2815 <tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
2816
2817 Given:
2818   class A { void func(); };
2819   class B { void member(); };
2820
2821 recordDecl(hasMethod(hasName("func"))) matches the declaration of A
2822 but not B.
2823 </pre></td></tr>
2824
2825
2826 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom0')"><a name="isDerivedFrom0Anchor">isDerivedFrom</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
2827 <tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
2828 a class matching Base.
2829
2830 Note that a class is not considered to be derived from itself.
2831
2832 Example matches Y, Z, C (Base == hasName("X"))
2833   class X;
2834   class Y : public X {};  directly derived
2835   class Z : public Y {};  indirectly derived
2836   typedef X A;
2837   typedef A B;
2838   class C : public B {};  derived from a typedef of X
2839
2840 In the following example, Bar matches isDerivedFrom(hasName("X")):
2841   class Foo;
2842   typedef Foo X;
2843   class Bar : public Foo {};  derived from a type that X is a typedef of
2844 </pre></td></tr>
2845
2846
2847 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom0')"><a name="isSameOrDerivedFrom0Anchor">isSameOrDerivedFrom</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
2848 <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
2849 match Base.
2850 </pre></td></tr>
2851
2852
2853 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('callee1')"><a name="callee1Anchor">callee</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
2854 <tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
2855 given matcher.
2856
2857 Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
2858   class Y { public: void x(); };
2859   void z() { Y y; y.x(); }
2860 </pre></td></tr>
2861
2862
2863 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('callee0')"><a name="callee0Anchor">callee</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
2864 <tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
2865
2866 Given
2867   class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
2868   void f() { f(); }
2869 callExpr(callee(expr()))
2870   matches this-&gt;x(), x(), y.x(), f()
2871 with callee(...)
2872   matching this-&gt;x, x, y.x, f respectively
2873
2874 Note: Callee cannot take the more general internal::Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
2875 because this introduces ambiguous overloads with calls to Callee taking a
2876 internal::Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
2877 implemented in terms of implicit casts.
2878 </pre></td></tr>
2879
2880
2881 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument0')"><a name="hasAnyArgument0Anchor">hasAnyArgument</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2882 <tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
2883 expression.
2884
2885 Given
2886   void x(int, int, int) { int y; x(1, y, 42); }
2887 callExpr(hasAnyArgument(declRefExpr()))
2888   matches x(1, y, 42)
2889 with hasAnyArgument(...)
2890   matching y
2891
2892 FIXME: Currently this will ignore parentheses and implicit casts on
2893 the argument before applying the inner matcher. We'll want to remove
2894 this to allow for greater control by the user once ignoreImplicit()
2895 has been implemented.
2896 </pre></td></tr>
2897
2898
2899 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument0')"><a name="hasArgument0Anchor">hasArgument</a></td><td>unsigned N, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2900 <tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
2901 call expression.
2902
2903 Example matches y in x(y)
2904     (matcher = callExpr(hasArgument(0, declRefExpr())))
2905   void x(int) { int y; x(y); }
2906 </pre></td></tr>
2907
2908
2909 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
2910 <tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
2911 matches the given matcher.
2912
2913 The associated declaration is:
2914 - for type nodes, the declaration of the underlying type
2915 - for CallExpr, the declaration of the callee
2916 - for MemberExpr, the declaration of the referenced member
2917 - for CXXConstructExpr, the declaration of the constructor
2918
2919 Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2920 function. e.g. various subtypes of clang::Type and various expressions.
2921
2922 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
2923   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
2924   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
2925   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
2926   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
2927   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
2928 </pre></td></tr>
2929
2930
2931 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;</td><td class="name" onclick="toggle('hasCaseConstant0')"><a name="hasCaseConstant0Anchor">hasCaseConstant</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2932 <tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
2933 extension, matches the constant given in the statement.
2934
2935 Given
2936   switch (1) { case 1: case 1+1: case 3 ... 4: ; }
2937 caseStmt(hasCaseConstant(integerLiteral()))
2938   matches "case 1:"
2939 </pre></td></tr>
2940
2941
2942 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasSourceExpression0')"><a name="hasSourceExpression0Anchor">hasSourceExpression</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2943 <tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher.
2944
2945 Example: matches "a string" (matcher =
2946                                  hasSourceExpression(constructExpr()))
2947 class URL { URL(string); };
2948 URL url = "a string";
2949 </pre></td></tr>
2950
2951
2952 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument0')"><a name="hasAnyTemplateArgument0Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
2953 <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
2954 TemplateArgument matching the given InnerMatcher.
2955
2956 Given
2957   template&lt;typename T&gt; class A {};
2958   template&lt;&gt; class A&lt;double&gt; {};
2959   A&lt;int&gt; a;
2960 classTemplateSpecializationDecl(hasAnyTemplateArgument(
2961     refersToType(asString("int"))))
2962   matches the specialization A&lt;int&gt;
2963 </pre></td></tr>
2964
2965
2966 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgument0')"><a name="hasTemplateArgument0Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
2967 <tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
2968 matches the given InnerMatcher.
2969
2970 Given
2971   template&lt;typename T, typename U&gt; class A {};
2972   A&lt;bool, int&gt; b;
2973   A&lt;int, bool&gt; c;
2974 classTemplateSpecializationDecl(hasTemplateArgument(
2975     1, refersToType(asString("int"))))
2976   matches the specialization A&lt;bool, int&gt;
2977 </pre></td></tr>
2978
2979
2980 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexTypeLoc.html">ComplexTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasElementTypeLoc1')"><a name="hasElementTypeLoc1Anchor">hasElementTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
2981 <tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
2982 type.
2983
2984 Given
2985   struct A {};
2986   A a[7];
2987   int b[7];
2988 arrayType(hasElementType(builtinType()))
2989   matches "int b[7]"
2990
2991 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
2992 </pre></td></tr>
2993
2994
2995 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;</td><td class="name" onclick="toggle('hasElementType1')"><a name="hasElementType1Anchor">hasElementType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
2996 <tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
2997 type.
2998
2999 Given
3000   struct A {};
3001   A a[7];
3002   int b[7];
3003 arrayType(hasElementType(builtinType()))
3004   matches "int b[7]"
3005
3006 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
3007 </pre></td></tr>
3008
3009
3010 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;</td><td class="name" onclick="toggle('hasAnySubstatement0')"><a name="hasAnySubstatement0Anchor">hasAnySubstatement</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3011 <tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
3012 a given matcher.
3013
3014 Given
3015   { {}; 1+2; }
3016 hasAnySubstatement(compoundStmt())
3017   matches '{ {}; 1+2; }'
3018 with compoundStmt()
3019   matching '{}'
3020 </pre></td></tr>
3021
3022
3023 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasCondition4')"><a name="hasCondition4Anchor">hasCondition</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3024 <tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
3025 or conditional operator.
3026
3027 Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3028   if (true) {}
3029 </pre></td></tr>
3030
3031
3032 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasFalseExpression0')"><a name="hasFalseExpression0Anchor">hasFalseExpression</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3033 <tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator.
3034
3035 Example matches b
3036   condition ? a : b
3037 </pre></td></tr>
3038
3039
3040 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasTrueExpression0')"><a name="hasTrueExpression0Anchor">hasTrueExpression</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3041 <tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
3042
3043 Example matches a
3044   condition ? a : b
3045 </pre></td></tr>
3046
3047
3048 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
3049 <tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
3050 matches the given matcher.
3051
3052 The associated declaration is:
3053 - for type nodes, the declaration of the underlying type
3054 - for CallExpr, the declaration of the callee
3055 - for MemberExpr, the declaration of the referenced member
3056 - for CXXConstructExpr, the declaration of the constructor
3057
3058 Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3059 function. e.g. various subtypes of clang::Type and various expressions.
3060
3061 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3062   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3063   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3064   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3065   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3066   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3067 </pre></td></tr>
3068
3069
3070 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('throughUsingDecl0')"><a name="throughUsingDecl0Anchor">throughUsingDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; InnerMatcher</td></tr>
3071 <tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
3072 specific using shadow declaration.
3073
3074 FIXME: This currently only works for functions. Fix.
3075
3076 Given
3077   namespace a { void f() {} }
3078   using a::f;
3079   void g() {
3080     f();     Matches this ..
3081     a::f();  .. but not this.
3082   }
3083 declRefExpr(throughUsingDeclaration(anything()))
3084   matches f()
3085 </pre></td></tr>
3086
3087
3088 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('to0')"><a name="to0Anchor">to</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3089 <tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
3090 specified matcher.
3091
3092 Example matches x in if(x)
3093     (matcher = declRefExpr(to(varDecl(hasName("x")))))
3094   bool x;
3095   if (x) {}
3096 </pre></td></tr>
3097
3098
3099 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;</td><td class="name" onclick="toggle('containsDeclaration0')"><a name="containsDeclaration0Anchor">containsDeclaration</a></td><td>unsigned N, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3100 <tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
3101
3102 Note that this does not work for global declarations because the AST
3103 breaks up multiple-declaration DeclStmt's into multiple single-declaration
3104 DeclStmt's.
3105 Example: Given non-global declarations
3106   int a, b = 0;
3107   int c;
3108   int d = 2, e;
3109 declStmt(containsDeclaration(
3110       0, varDecl(hasInitializer(anything()))))
3111   matches only 'int d = 2, e;', and
3112 declStmt(containsDeclaration(1, varDecl()))
3113   matches 'int a, b = 0' as well as 'int d = 2, e;'
3114   but 'int c;' is not matched.
3115 </pre></td></tr>
3116
3117
3118 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;</td><td class="name" onclick="toggle('hasSingleDecl0')"><a name="hasSingleDecl0Anchor">hasSingleDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3119 <tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
3120
3121 Given
3122   int a, b;
3123   int c;
3124 declStmt(hasSingleDecl(anything()))
3125   matches 'int c;' but not 'int a, b;'.
3126 </pre></td></tr>
3127
3128
3129 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc0')"><a name="hasTypeLoc0Anchor">hasTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
3130 <tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
3131 the inner matcher.
3132
3133 Given
3134   int x;
3135 declaratorDecl(hasTypeLoc(loc(asString("int"))))
3136   matches int x
3137 </pre></td></tr>
3138
3139
3140 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('hasDeclContext0')"><a name="hasDeclContext0Anchor">hasDeclContext</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3141 <tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
3142 Decl, matches InnerMatcher.
3143
3144 Given
3145   namespace N {
3146     namespace M {
3147       class D {};
3148     }
3149   }
3150
3151 recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
3152 declaration of class D.
3153 </pre></td></tr>
3154
3155
3156 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody0')"><a name="hasBody0Anchor">hasBody</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3157 <tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has
3158 a given body.
3159
3160 Given
3161   for (;;) {}
3162 hasBody(compoundStmt())
3163   matches 'for (;;) {}'
3164 with compoundStmt()
3165   matching '{}'
3166 </pre></td></tr>
3167
3168
3169 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition3')"><a name="hasCondition3Anchor">hasCondition</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3170 <tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
3171 or conditional operator.
3172
3173 Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3174   if (true) {}
3175 </pre></td></tr>
3176
3177
3178 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;</td><td class="name" onclick="toggle('hasQualifier0')"><a name="hasQualifier0Anchor">hasQualifier</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
3179 <tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
3180 matches InnerMatcher if the qualifier exists.
3181
3182 Given
3183   namespace N {
3184     namespace M {
3185       class D {};
3186     }
3187   }
3188   N::M::D d;
3189
3190 elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
3191 matches the type of the variable declaration of d.
3192 </pre></td></tr>
3193
3194
3195 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;</td><td class="name" onclick="toggle('namesType0')"><a name="namesType0Anchor">namesType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3196 <tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
3197
3198 Given
3199   namespace N {
3200     namespace M {
3201       class D {};
3202     }
3203   }
3204   N::M::D d;
3205
3206 elaboratedType(namesType(recordType(
3207 hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
3208 declaration of d.
3209 </pre></td></tr>
3210
3211
3212 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
3213 <tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
3214 matches the given matcher.
3215
3216 The associated declaration is:
3217 - for type nodes, the declaration of the underlying type
3218 - for CallExpr, the declaration of the callee
3219 - for MemberExpr, the declaration of the referenced member
3220 - for CXXConstructExpr, the declaration of the constructor
3221
3222 Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3223 function. e.g. various subtypes of clang::Type and various expressions.
3224
3225 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3226   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3227   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3228   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3229   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3230   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3231 </pre></td></tr>
3232
3233
3234 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;</td><td class="name" onclick="toggle('hasDestinationType0')"><a name="hasDestinationType0Anchor">hasDestinationType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3235 <tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
3236
3237 (Note: Clang's AST refers to other conversions as "casts" too, and calls
3238 actual casts "explicit" casts.)
3239 </pre></td></tr>
3240
3241
3242 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3243 <tr><td colspan="4" class="doc" id="hasType2"><pre>Overloaded to match the declaration of the expression's or value
3244 declaration's type.
3245
3246 In case of a value declaration (for example a variable declaration),
3247 this resolves one layer of indirection. For example, in the value
3248 declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
3249 while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
3250 of x."
3251
3252 Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3253             and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
3254  class X {};
3255  void y(X &amp;x) { x; X z; }
3256
3257 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;
3258 </pre></td></tr>
3259
3260
3261 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('hasType0')"><a name="hasType0Anchor">hasType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3262 <tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
3263 matcher.
3264
3265 Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3266             and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
3267  class X {};
3268  void y(X &amp;x) { x; X z; }
3269 </pre></td></tr>
3270
3271
3272 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringImpCasts0')"><a name="ignoringImpCasts0Anchor">ignoringImpCasts</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3273 <tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
3274 are stripped off.
3275
3276 Parentheses and explicit casts are not discarded.
3277 Given
3278   int arr[5];
3279   int a = 0;
3280   char b = 0;
3281   const int c = a;
3282   int *d = arr;
3283   long e = (long) 0l;
3284 The matchers
3285    varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
3286    varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
3287 would match the declarations for a, b, c, and d, but not e.
3288 While
3289    varDecl(hasInitializer(integerLiteral()))
3290    varDecl(hasInitializer(declRefExpr()))
3291 only match the declarations for b, c, and d.
3292 </pre></td></tr>
3293
3294
3295 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringParenCasts0')"><a name="ignoringParenCasts0Anchor">ignoringParenCasts</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3296 <tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
3297 casts are stripped off.
3298
3299 Implicit and non-C Style casts are also discarded.
3300 Given
3301   int a = 0;
3302   char b = (0);
3303   void* c = reinterpret_cast&lt;char*&gt;(0);
3304   char d = char(0);
3305 The matcher
3306    varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
3307 would match the declarations for a, b, c, and d.
3308 while
3309    varDecl(hasInitializer(integerLiteral()))
3310 only match the declaration for a.
3311 </pre></td></tr>
3312
3313
3314 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringParenImpCasts0')"><a name="ignoringParenImpCasts0Anchor">ignoringParenImpCasts</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3315 <tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
3316 parentheses are stripped off.
3317
3318 Explicit casts are not discarded.
3319 Given
3320   int arr[5];
3321   int a = 0;
3322   char b = (0);
3323   const int c = a;
3324   int *d = (arr);
3325   long e = ((long) 0l);
3326 The matchers
3327    varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
3328    varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
3329 would match the declarations for a, b, c, and d, but not e.
3330 while
3331    varDecl(hasInitializer(integerLiteral()))
3332    varDecl(hasInitializer(declRefExpr()))
3333 would only match the declaration for a.
3334 </pre></td></tr>
3335
3336
3337 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody1')"><a name="hasBody1Anchor">hasBody</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3338 <tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has
3339 a given body.
3340
3341 Given
3342   for (;;) {}
3343 hasBody(compoundStmt())
3344   matches 'for (;;) {}'
3345 with compoundStmt()
3346   matching '{}'
3347 </pre></td></tr>
3348
3349
3350 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition1')"><a name="hasCondition1Anchor">hasCondition</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3351 <tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
3352 or conditional operator.
3353
3354 Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3355   if (true) {}
3356 </pre></td></tr>
3357
3358
3359 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('hasIncrement0')"><a name="hasIncrement0Anchor">hasIncrement</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3360 <tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
3361
3362 Example:
3363     forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
3364 matches '++x' in
3365     for (x; x &lt; N; ++x) { }
3366 </pre></td></tr>
3367
3368
3369 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('hasLoopInit0')"><a name="hasLoopInit0Anchor">hasLoopInit</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3370 <tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
3371
3372 Example:
3373     forStmt(hasLoopInit(declStmt()))
3374 matches 'int x = 0' in
3375     for (int x = 0; x &lt; N; ++x) { }
3376 </pre></td></tr>
3377
3378
3379 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyParameter0')"><a name="hasAnyParameter0Anchor">hasAnyParameter</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
3380 <tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
3381
3382 Does not match the 'this' parameter of a method.
3383
3384 Given
3385   class X { void f(int x, int y, int z) {} };
3386 methodDecl(hasAnyParameter(hasName("y")))
3387   matches f(int x, int y, int z) {}
3388 with hasAnyParameter(...)
3389   matching int y
3390 </pre></td></tr>
3391
3392
3393 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasParameter0')"><a name="hasParameter0Anchor">hasParameter</a></td><td>unsigned N, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
3394 <tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
3395
3396 Given
3397   class X { void f(int x) {} };
3398 methodDecl(hasParameter(0, hasType(varDecl())))
3399   matches f(int x) {}
3400 with hasParameter(...)
3401   matching int x
3402 </pre></td></tr>
3403
3404
3405 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('returns0')"><a name="returns0Anchor">returns</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3406 <tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
3407
3408 Given:
3409   class X { int f() { return 1; } };
3410 methodDecl(returns(asString("int")))
3411   matches int f() { return 1; }
3412 </pre></td></tr>
3413
3414
3415 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition0')"><a name="hasCondition0Anchor">hasCondition</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3416 <tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
3417 or conditional operator.
3418
3419 Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3420   if (true) {}
3421 </pre></td></tr>
3422
3423
3424 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasConditionVariableStatement0')"><a name="hasConditionVariableStatement0Anchor">hasConditionVariableStatement</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt; InnerMatcher</td></tr>
3425 <tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
3426
3427 Given
3428   if (A* a = GetAPointer()) {}
3429 hasConditionVariableStatement(...)
3430   matches 'A* a = GetAPointer()'.
3431 </pre></td></tr>
3432
3433
3434 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasElse0')"><a name="hasElse0Anchor">hasElse</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3435 <tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
3436
3437 Examples matches the if statement
3438   (matcher = ifStmt(hasElse(boolLiteral(equals(true)))))
3439   if (false) false; else true;
3440 </pre></td></tr>
3441
3442
3443 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasThen0')"><a name="hasThen0Anchor">hasThen</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3444 <tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
3445
3446 Examples matches the if statement
3447   (matcher = ifStmt(hasThen(boolLiteral(equals(true)))))
3448   if (false) true; else false;
3449 </pre></td></tr>
3450
3451
3452 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;</td><td class="name" onclick="toggle('hasImplicitDestinationType0')"><a name="hasImplicitDestinationType0Anchor">hasImplicitDestinationType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3453 <tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
3454 matcher.
3455
3456 FIXME: Unit test this matcher
3457 </pre></td></tr>
3458
3459
3460 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
3461 <tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
3462 matches the given matcher.
3463
3464 The associated declaration is:
3465 - for type nodes, the declaration of the underlying type
3466 - for CallExpr, the declaration of the callee
3467 - for MemberExpr, the declaration of the referenced member
3468 - for CXXConstructExpr, the declaration of the constructor
3469
3470 Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3471 function. e.g. various subtypes of clang::Type and various expressions.
3472
3473 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3474   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3475   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3476   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3477   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3478   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3479 </pre></td></tr>
3480
3481
3482 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
3483 <tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
3484 matches the given matcher.
3485
3486 The associated declaration is:
3487 - for type nodes, the declaration of the underlying type
3488 - for CallExpr, the declaration of the callee
3489 - for MemberExpr, the declaration of the referenced member
3490 - for CXXConstructExpr, the declaration of the constructor
3491
3492 Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3493 function. e.g. various subtypes of clang::Type and various expressions.
3494
3495 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3496   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3497   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3498   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3499   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3500   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3501 </pre></td></tr>
3502
3503
3504 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
3505 <tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
3506 matches the given matcher.
3507
3508 The associated declaration is:
3509 - for type nodes, the declaration of the underlying type
3510 - for CallExpr, the declaration of the callee
3511 - for MemberExpr, the declaration of the referenced member
3512 - for CXXConstructExpr, the declaration of the constructor
3513
3514 Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3515 function. e.g. various subtypes of clang::Type and various expressions.
3516
3517 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3518   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3519   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3520   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3521   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3522   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3523 </pre></td></tr>
3524
3525
3526 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasObjectExpression0')"><a name="hasObjectExpression0Anchor">hasObjectExpression</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3527 <tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
3528 matched by a given matcher.
3529
3530 Given
3531   struct X { int m; };
3532   void f(X x) { x.m; m; }
3533 memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
3534   matches "x.m" and "m"
3535 with hasObjectExpression(...)
3536   matching "x" and the implicit object expression of "m" which has type X*.
3537 </pre></td></tr>
3538
3539
3540 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('member0')"><a name="member0Anchor">member</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt; InnerMatcher</td></tr>
3541 <tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
3542 given matcher.
3543
3544 Given
3545   struct { int first, second; } first, second;
3546   int i(second.first);
3547   int j(first.second);
3548 memberExpr(member(hasName("first")))
3549   matches second.first
3550   but not first.second (because the member name there is "second").
3551 </pre></td></tr>
3552
3553
3554 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerTypeLoc.html">MemberPointerTypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointeeLoc1')"><a name="pointeeLoc1Anchor">pointeeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
3555 <tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
3556 pointee matches a given matcher.
3557
3558 Given
3559   int *a;
3560   int const *b;
3561   float const *f;
3562 pointerType(pointee(isConstQualified(), isInteger()))
3563   matches "int const *b"
3564
3565 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
3566   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
3567 </pre></td></tr>
3568
3569
3570 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;</td><td class="name" onclick="toggle('pointee1')"><a name="pointee1Anchor">pointee</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
3571 <tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
3572 pointee matches a given matcher.
3573
3574 Given
3575   int *a;
3576   int const *b;
3577   float const *f;
3578 pointerType(pointee(isConstQualified(), isInteger()))
3579   matches "int const *b"
3580
3581 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
3582   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
3583 </pre></td></tr>
3584
3585
3586 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('hasPrefix1')"><a name="hasPrefix1Anchor">hasPrefix</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt; InnerMatcher</td></tr>
3587 <tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
3588
3589 Given
3590   struct A { struct B { struct C {}; }; };
3591   A::B::C c;
3592 nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
3593   matches "A::"
3594 </pre></td></tr>
3595
3596
3597 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('specifiesTypeLoc0')"><a name="specifiesTypeLoc0Anchor">specifiesTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; InnerMatcher</td></tr>
3598 <tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
3599 given TypeLoc.
3600
3601 Given
3602   struct A { struct B { struct C {}; }; };
3603   A::B::C c;
3604 nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
3605   hasDeclaration(recordDecl(hasName("A")))))))
3606   matches "A::"
3607 </pre></td></tr>
3608
3609
3610 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('hasPrefix0')"><a name="hasPrefix0Anchor">hasPrefix</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
3611 <tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
3612
3613 Given
3614   struct A { struct B { struct C {}; }; };
3615   A::B::C c;
3616 nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
3617   matches "A::"
3618 </pre></td></tr>
3619
3620
3621 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('specifiesNamespace0')"><a name="specifiesNamespace0Anchor">specifiesNamespace</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt; InnerMatcher</td></tr>
3622 <tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
3623 given namespace matcher.
3624
3625 Given
3626   namespace ns { struct A {}; }
3627   ns::A a;
3628 nestedNameSpecifier(specifiesNamespace(hasName("ns")))
3629   matches "ns::"
3630 </pre></td></tr>
3631
3632
3633 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('specifiesType0')"><a name="specifiesType0Anchor">specifiesType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3634 <tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
3635 given QualType matcher without qualifiers.
3636
3637 Given
3638   struct A { struct B { struct C {}; }; };
3639   A::B::C c;
3640 nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
3641   matches "A::"
3642 </pre></td></tr>
3643
3644
3645 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;</td><td class="name" onclick="toggle('innerType0')"><a name="innerType0Anchor">innerType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
3646 <tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
3647
3648 Given
3649   int (*ptr_to_array)[4];
3650   int (*ptr_to_func)(int);
3651
3652 varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
3653 ptr_to_func but not ptr_to_array.
3654
3655 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
3656 </pre></td></tr>
3657
3658
3659 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointeeLoc2')"><a name="pointeeLoc2Anchor">pointeeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
3660 <tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
3661 pointee matches a given matcher.
3662
3663 Given
3664   int *a;
3665   int const *b;
3666   float const *f;
3667 pointerType(pointee(isConstQualified(), isInteger()))
3668   matches "int const *b"
3669
3670 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
3671   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
3672 </pre></td></tr>
3673
3674
3675 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;</td><td class="name" onclick="toggle('pointee2')"><a name="pointee2Anchor">pointee</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
3676 <tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
3677 pointee matches a given matcher.
3678
3679 Given
3680   int *a;
3681   int const *b;
3682   float const *f;
3683 pointerType(pointee(isConstQualified(), isInteger()))
3684   matches "int const *b"
3685
3686 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
3687   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
3688 </pre></td></tr>
3689
3690
3691 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasCanonicalType0')"><a name="hasCanonicalType0Anchor">hasCanonicalType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3692 <tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
3693
3694 Given:
3695   typedef int &amp;int_ref;
3696   int a;
3697   int_ref b = a;
3698
3699 varDecl(hasType(qualType(referenceType()))))) will not match the
3700 declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
3701 </pre></td></tr>
3702
3703
3704 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
3705 <tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
3706 matches the given matcher.
3707
3708 The associated declaration is:
3709 - for type nodes, the declaration of the underlying type
3710 - for CallExpr, the declaration of the callee
3711 - for MemberExpr, the declaration of the referenced member
3712 - for CXXConstructExpr, the declaration of the constructor
3713
3714 Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3715 function. e.g. various subtypes of clang::Type and various expressions.
3716
3717 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3718   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3719   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3720   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3721   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3722   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3723 </pre></td></tr>
3724
3725
3726 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('pointsTo1')"><a name="pointsTo1Anchor">pointsTo</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3727 <tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
3728 </pre></td></tr>
3729
3730
3731 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('pointsTo0')"><a name="pointsTo0Anchor">pointsTo</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3732 <tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
3733 matches the specified matcher.
3734
3735 Example matches y-&gt;x()
3736     (matcher = callExpr(on(hasType(pointsTo(recordDecl(hasName("Y")))))))
3737   class Y { public: void x(); };
3738   void z() { Y *y; y-&gt;x(); }
3739 </pre></td></tr>
3740
3741
3742 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('references1')"><a name="references1Anchor">references</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3743 <tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
3744 </pre></td></tr>
3745
3746
3747 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('references0')"><a name="references0Anchor">references</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3748 <tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
3749 type matches the specified matcher.
3750
3751 Example matches X &amp;x and const X &amp;y
3752     (matcher = varDecl(hasType(references(recordDecl(hasName("X"))))))
3753   class X {
3754     void a(X b) {
3755       X &amp;x = b;
3756       const X &amp;y = b;
3757     }
3758   };
3759 </pre></td></tr>
3760
3761
3762 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
3763 <tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
3764 matches the given matcher.
3765
3766 The associated declaration is:
3767 - for type nodes, the declaration of the underlying type
3768 - for CallExpr, the declaration of the callee
3769 - for MemberExpr, the declaration of the referenced member
3770 - for CXXConstructExpr, the declaration of the constructor
3771
3772 Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3773 function. e.g. various subtypes of clang::Type and various expressions.
3774
3775 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3776   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3777   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3778   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3779   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3780   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3781 </pre></td></tr>
3782
3783
3784 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointeeLoc3')"><a name="pointeeLoc3Anchor">pointeeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
3785 <tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
3786 pointee matches a given matcher.
3787
3788 Given
3789   int *a;
3790   int const *b;
3791   float const *f;
3792 pointerType(pointee(isConstQualified(), isInteger()))
3793   matches "int const *b"
3794
3795 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
3796   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
3797 </pre></td></tr>
3798
3799
3800 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;</td><td class="name" onclick="toggle('pointee3')"><a name="pointee3Anchor">pointee</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
3801 <tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
3802 pointee matches a given matcher.
3803
3804 Given
3805   int *a;
3806   int const *b;
3807   float const *f;
3808 pointerType(pointee(isConstQualified(), isInteger()))
3809   matches "int const *b"
3810
3811 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
3812   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
3813 </pre></td></tr>
3814
3815
3816 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('alignOfExpr0')"><a name="alignOfExpr0Anchor">alignOfExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr>
3817 <tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3818 alignof.
3819 </pre></td></tr>
3820
3821
3822 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('sizeOfExpr0')"><a name="sizeOfExpr0Anchor">sizeOfExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr>
3823 <tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3824 sizeof.
3825 </pre></td></tr>
3826
3827
3828 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;</td><td class="name" onclick="toggle('forEachSwitchCase0')"><a name="forEachSwitchCase0Anchor">forEachSwitchCase</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt; InnerMatcher</td></tr>
3829 <tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
3830 statement. This matcher may produce multiple matches.
3831
3832 Given
3833   switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
3834 switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
3835   matches four times, with "c" binding each of "case 1:", "case 2:",
3836 "case 3:" and "case 4:", and "s" respectively binding "switch (1)",
3837 "switch (1)", "switch (2)" and "switch (2)".
3838 </pre></td></tr>
3839
3840
3841 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
3842 <tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
3843 matches the given matcher.
3844
3845 The associated declaration is:
3846 - for type nodes, the declaration of the underlying type
3847 - for CallExpr, the declaration of the callee
3848 - for MemberExpr, the declaration of the referenced member
3849 - for CXXConstructExpr, the declaration of the constructor
3850
3851 Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3852 function. e.g. various subtypes of clang::Type and various expressions.
3853
3854 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3855   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3856   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3857   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3858   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3859   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3860 </pre></td></tr>
3861
3862
3863 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('isExpr0')"><a name="isExpr0Anchor">isExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3864 <tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
3865
3866 Given
3867   template&lt;typename T&gt; struct A {};
3868   struct B { B* next; };
3869   A&lt;&amp;B::next&gt; a;
3870 templateSpecializationType(hasAnyTemplateArgument(
3871   isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
3872   matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
3873     B::next
3874 </pre></td></tr>
3875
3876
3877 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToDeclaration0')"><a name="refersToDeclaration0Anchor">refersToDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3878 <tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
3879 declaration.
3880
3881 Given
3882   template&lt;typename T&gt; struct A {};
3883   struct B { B* next; };
3884   A&lt;&amp;B::next&gt; a;
3885 classTemplateSpecializationDecl(hasAnyTemplateArgument(
3886     refersToDeclaration(fieldDecl(hasName("next"))))
3887   matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
3888     B::next
3889 </pre></td></tr>
3890
3891
3892 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToIntegralType0')"><a name="refersToIntegralType0Anchor">refersToIntegralType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3893 <tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
3894
3895 Given
3896   template&lt;int T&gt; struct A {};
3897   C&lt;42&gt; c;
3898 classTemplateSpecializationDecl(
3899   hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
3900   matches the implicit instantiation of C in C&lt;42&gt;.
3901 </pre></td></tr>
3902
3903
3904 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToType0')"><a name="refersToType0Anchor">refersToType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3905 <tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
3906
3907 Given
3908   struct X {};
3909   template&lt;typename T&gt; struct A {};
3910   A&lt;X&gt; a;
3911 classTemplateSpecializationDecl(hasAnyTemplateArgument(
3912     refersToType(class(hasName("X")))))
3913   matches the specialization A&lt;X&gt;
3914 </pre></td></tr>
3915
3916
3917 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument1')"><a name="hasAnyTemplateArgument1Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
3918 <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations that have at least one
3919 TemplateArgument matching the given InnerMatcher.
3920
3921 Given
3922   template&lt;typename T&gt; class A {};
3923   template&lt;&gt; class A&lt;double&gt; {};
3924   A&lt;int&gt; a;
3925 classTemplateSpecializationDecl(hasAnyTemplateArgument(
3926     refersToType(asString("int"))))
3927   matches the specialization A&lt;int&gt;
3928 </pre></td></tr>
3929
3930
3931 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
3932 <tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
3933 matches the given matcher.
3934
3935 The associated declaration is:
3936 - for type nodes, the declaration of the underlying type
3937 - for CallExpr, the declaration of the callee
3938 - for MemberExpr, the declaration of the referenced member
3939 - for CXXConstructExpr, the declaration of the constructor
3940
3941 Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3942 function. e.g. various subtypes of clang::Type and various expressions.
3943
3944 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3945   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3946   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3947   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3948   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3949   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3950 </pre></td></tr>
3951
3952
3953 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgument1')"><a name="hasTemplateArgument1Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
3954 <tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
3955 matches the given InnerMatcher.
3956
3957 Given
3958   template&lt;typename T, typename U&gt; class A {};
3959   A&lt;bool, int&gt; b;
3960   A&lt;int, bool&gt; c;
3961 classTemplateSpecializationDecl(hasTemplateArgument(
3962     1, refersToType(asString("int"))))
3963   matches the specialization A&lt;bool, int&gt;
3964 </pre></td></tr>
3965
3966
3967 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
3968 <tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
3969 matches the given matcher.
3970
3971 The associated declaration is:
3972 - for type nodes, the declaration of the underlying type
3973 - for CallExpr, the declaration of the callee
3974 - for MemberExpr, the declaration of the referenced member
3975 - for CXXConstructExpr, the declaration of the constructor
3976
3977 Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3978 function. e.g. various subtypes of clang::Type and various expressions.
3979
3980 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3981   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3982   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3983   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3984   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3985   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3986 </pre></td></tr>
3987
3988
3989 <tr><td>Matcher&lt;T&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher&lt;T&gt;  Matcher</td></tr>
3990 <tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
3991
3992 Generates results for each match.
3993
3994 For example, in:
3995   class A { class B {}; class C {}; };
3996 The matcher:
3997   recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
3998 will generate results for A, B and C.
3999
4000 Usable as: Any Matcher
4001 </pre></td></tr>
4002
4003
4004 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
4005 <tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
4006 matches the given matcher.
4007
4008 The associated declaration is:
4009 - for type nodes, the declaration of the underlying type
4010 - for CallExpr, the declaration of the callee
4011 - for MemberExpr, the declaration of the referenced member
4012 - for CXXConstructExpr, the declaration of the constructor
4013
4014 Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4015 function. e.g. various subtypes of clang::Type and various expressions.
4016
4017 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
4018   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
4019   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
4020   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
4021   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4022   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4023 </pre></td></tr>
4024
4025
4026 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgumentOfType0')"><a name="hasArgumentOfType0Anchor">hasArgumentOfType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
4027 <tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
4028
4029 Given
4030   int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
4031 unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
4032   matches sizeof(a) and alignof(c)
4033 </pre></td></tr>
4034
4035
4036 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasUnaryOperand0')"><a name="hasUnaryOperand0Anchor">hasUnaryOperand</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4037 <tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
4038
4039 Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
4040   !true
4041 </pre></td></tr>
4042
4043
4044 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
4045 <tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
4046 matches the given matcher.
4047
4048 The associated declaration is:
4049 - for type nodes, the declaration of the underlying type
4050 - for CallExpr, the declaration of the callee
4051 - for MemberExpr, the declaration of the referenced member
4052 - for CXXConstructExpr, the declaration of the constructor
4053
4054 Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4055 function. e.g. various subtypes of clang::Type and various expressions.
4056
4057 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
4058   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
4059   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
4060   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
4061   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4062   Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4063 </pre></td></tr>
4064
4065
4066 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyUsingShadowDecl0')"><a name="hasAnyUsingShadowDecl0Anchor">hasAnyUsingShadowDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; InnerMatcher</td></tr>
4067 <tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
4068
4069 Given
4070   namespace X { void b(); }
4071   using X::b;
4072 usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
4073   matches using X::b </pre></td></tr>
4074
4075
4076 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt;</td><td class="name" onclick="toggle('hasTargetDecl0')"><a name="hasTargetDecl0Anchor">hasTargetDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; InnerMatcher</td></tr>
4077 <tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
4078 matched by the given matcher.
4079
4080 Given
4081   namespace X { int a; void b(); }
4082   using X::a;
4083   using X::b;
4084 usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
4085   matches using X::b but not using X::a </pre></td></tr>
4086
4087
4088 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType3')"><a name="hasType3Anchor">hasType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4089 <tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
4090 declaration's type.
4091
4092 In case of a value declaration (for example a variable declaration),
4093 this resolves one layer of indirection. For example, in the value
4094 declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
4095 while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
4096 of x."
4097
4098 Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
4099             and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
4100  class X {};
4101  void y(X &amp;x) { x; X z; }
4102
4103 Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;
4104 </pre></td></tr>
4105
4106
4107 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType1')"><a name="hasType1Anchor">hasType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
4108 <tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
4109 matcher.
4110
4111 Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
4112             and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
4113  class X {};
4114  void y(X &amp;x) { x; X z; }
4115 </pre></td></tr>
4116
4117
4118 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasInitializer0')"><a name="hasInitializer0Anchor">hasInitializer</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4119 <tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
4120 that matches the given matcher.
4121
4122 Example matches x (matcher = varDecl(hasInitializer(callExpr())))
4123   bool y() { return true; }
4124   bool x = y();
4125 </pre></td></tr>
4126
4127
4128 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>&gt;</td><td class="name" onclick="toggle('hasSizeExpr0')"><a name="hasSizeExpr0Anchor">hasSizeExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4129 <tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
4130 expression.
4131
4132 Given
4133   void f(int b) {
4134     int a[b];
4135   }
4136 variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
4137   varDecl(hasName("b")))))))
4138   matches "int a[b]"
4139 </pre></td></tr>
4140
4141
4142 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody2')"><a name="hasBody2Anchor">hasBody</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
4143 <tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has
4144 a given body.
4145
4146 Given
4147   for (;;) {}
4148 hasBody(compoundStmt())
4149   matches 'for (;;) {}'
4150 with compoundStmt()
4151   matching '{}'
4152 </pre></td></tr>
4153
4154
4155 <tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition2')"><a name="hasCondition2Anchor">hasCondition</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4156 <tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
4157 or conditional operator.
4158
4159 Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
4160   if (true) {}
4161 </pre></td></tr>
4162
4163
4164 <tr><td>Matcher&lt;internal::BindableMatcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;&gt;</td><td class="name" onclick="toggle('loc1')"><a name="loc1Anchor">loc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
4165 <tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
4166 NestedNameSpecifier-matcher matches.
4167 </pre></td></tr>
4168
4169
4170 <tr><td>Matcher&lt;internal::BindableMatcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;&gt;</td><td class="name" onclick="toggle('loc0')"><a name="loc0Anchor">loc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
4171 <tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
4172 QualType-matcher matches.
4173 </pre></td></tr>
4174
4175 <!--END_TRAVERSAL_MATCHERS -->
4176 </table>
4177
4178 </div>
4179 </body>
4180 </html>
4181
4182