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">
9td {
10  padding: .33em;
11}
12td.doc {
13  display: none;
14  border-bottom: 1px solid black;
15}
16td.name:hover {
17  color: blue;
18  cursor: pointer;
19}
20</style>
21<script type="text/javascript">
22function 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
41by category and node type they match. You can click on matcher names to show the
42matcher'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.
53Note that if a matcher can match multiple node types, it will it will appear
54multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
55find 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
58are 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
61them into matcher expressions. You will usually want to form matcher expressions
62that read like english sentences by alternating between node matchers and
63narrowing or traversal matchers, like this:
64<pre>
65recordDecl(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
77of node that is expected. Every match expression starts with a node matcher,
78which can then be further refined with a narrowing or traversal matcher. All
79traversal matchers take node matchers as their arguments.</p>
80
81<p>For convenience, all node matchers take an arbitrary number of arguments
82and implicitly act as allOf matchers.</p>
83
84<p>Node matchers are the only matchers that support the bind("id") call to
85bind the matched node to the given string, to be later retrieved from the
86match callback.</p>
87
88<p>It is important to remember that the arguments to node matchers are
89predicates on the same node, just with additional information about the type.
90This is often useful to make matcher expression more readable by inlining bind
91calls 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.
95recordDecl(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('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</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="cxxCtorInitializer0"><pre>Matches constructor initializers.
105
106Examples 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
117Given
118  class C {
119  public:
120    int a;
121  };
122accessSpecDecl()
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
130Example 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
138Given
139  template&lt;typename T&gt; class A {};
140  template&lt;&gt; class A&lt;double&gt; {};
141  A&lt;int&gt; a;
142classTemplateSpecializationDecl()
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('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</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="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
149
150Example 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('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;...</td></tr>
161<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
162
163Example matches the operator.
164  class X { operator int() const; };
165</pre></td></tr>
166
167
168<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
169<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
170
171Example matches Foo::~Foo()
172  class Foo {
173   public:
174    virtual ~Foo();
175  };
176</pre></td></tr>
177
178
179<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
180<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
181
182Example matches y
183  class X { void y(); };
184</pre></td></tr>
185
186
187<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
188<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
189
190Example matches X, Z
191  class X;
192  template&lt;class T&gt; class Z {};
193</pre></td></tr>
194
195
196<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>
197<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
198
199Examples matches X, C, and the friend declaration inside C;
200  void X();
201  class C {
202    friend X;
203  };
204</pre></td></tr>
205
206
207<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>
208<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
209and non-type template parameter declarations).
210
211Given
212  class X { int y; };
213declaratorDecl()
214  matches int y.
215</pre></td></tr>
216
217
218<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>
219<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
220
221Example matches A, B, C
222  enum X {
223    A, B, C
224  };
225</pre></td></tr>
226
227
228<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>
229<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
230
231Example matches X
232  enum X {
233    A, B, C
234  };
235</pre></td></tr>
236
237
238<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>
239<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
240
241Given
242  class X { int m; };
243fieldDecl()
244  matches 'm'.
245</pre></td></tr>
246
247
248<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>
249<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
250
251Given
252  class X { friend void foo(); };
253friendDecl()
254  matches 'friend void foo()'.
255</pre></td></tr>
256
257
258<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>
259<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
260
261Example matches f
262  void f();
263</pre></td></tr>
264
265
266<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>
267<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
268
269Example matches f
270  template&lt;class T&gt; void f(T t) {}
271</pre></td></tr>
272
273
274<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>&gt;...</td></tr>
275<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
276
277Given
278  goto FOO;
279  FOO: bar();
280labelDecl()
281  matches 'FOO:'
282</pre></td></tr>
283
284
285<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>
286<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
287
288Given
289  extern "C" {}
290linkageSpecDecl()
291  matches "extern "C" {}"
292</pre></td></tr>
293
294
295<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>
296<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
297
298Example matches X, S, the anonymous union type, i, and U;
299  typedef int X;
300  struct S {
301    union {
302      int i;
303    } U;
304  };
305</pre></td></tr>
306
307
308<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>&gt;...</td></tr>
309<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
310
311Given
312  namespace test {}
313  namespace alias = ::test;
314namespaceAliasDecl()
315  matches "namespace alias" but not "namespace test"
316</pre></td></tr>
317
318
319<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>
320<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
321
322Given
323  namespace {}
324  namespace test {}
325namespaceDecl()
326  matches "namespace {}" and "namespace test {}"
327</pre></td></tr>
328
329
330<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>&gt;...</td></tr>
331<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
332
333Given
334  template &lt;typename T, int N&gt; struct C {};
335nonTypeTemplateParmDecl()
336  matches 'N', but not 'T'.
337</pre></td></tr>
338
339
340<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>&gt;...</td></tr>
341<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
342
343Example matches Foo (Additions)
344  @interface Foo (Additions)
345  @end
346</pre></td></tr>
347
348
349<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;...</td></tr>
350<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
351
352Example matches Foo
353  @interface Foo
354  @end
355</pre></td></tr>
356
357
358<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>&gt;...</td></tr>
359<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
360
361Example matches _enabled
362  @implementation Foo {
363    BOOL _enabled;
364  }
365  @end
366</pre></td></tr>
367
368
369<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;...</td></tr>
370<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
371
372Example matches both declaration and definition of -[Foo method]
373  @interface Foo
374  - (void)method;
375  @end
376
377  @implementation Foo
378  - (void)method {}
379  @end
380</pre></td></tr>
381
382
383<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;...</td></tr>
384<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
385
386Example matches enabled
387  @interface Foo
388  @property BOOL enabled;
389  @end
390</pre></td></tr>
391
392
393<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>&gt;...</td></tr>
394<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
395
396Example matches FooDelegate
397  @protocol FooDelegate
398  @end
399</pre></td></tr>
400
401
402<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>
403<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
404
405Given
406  void f(int x);
407parmVarDecl()
408  matches int x.
409</pre></td></tr>
410
411
412<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_1RecordDecl.html">RecordDecl</a>&gt;...</td></tr>
413<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
414
415Example matches X, Z, U, and S
416  class X;
417  template&lt;class T&gt; class Z {};
418  struct S {};
419  union U {};
420</pre></td></tr>
421
422
423<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>&gt;...</td></tr>
424<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
425
426Example:
427  staticAssertExpr()
428matches
429  static_assert(sizeof(S) == sizeof(int))
430in
431  struct S {
432    int x;
433  };
434  static_assert(sizeof(S) == sizeof(int));
435</pre></td></tr>
436
437
438<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>&gt;...</td></tr>
439<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
440
441Given
442  template &lt;typename T, int N&gt; struct C {};
443templateTypeParmDecl()
444  matches 'T', but not 'N'.
445</pre></td></tr>
446
447
448<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>
449<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
450
451Given
452  int X;
453  namespace NS {
454  int Y;
455  }  namespace NS
456decl(hasDeclContext(translationUnitDecl()))
457  matches "int X", but not "int Y".
458</pre></td></tr>
459
460
461<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>&gt;...</td></tr>
462<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
463
464Given
465  typedef int X;
466  using Y = int;
467typeAliasDecl()
468  matches "using Y = int", but not "typedef int X"
469</pre></td></tr>
470
471
472<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>&gt;...</td></tr>
473<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
474
475typeAliasTemplateDecl() matches
476  template &lt;typename T&gt;
477  using Y = X&lt;T&gt;;
478</pre></td></tr>
479
480
481<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>
482<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
483
484Given
485  typedef int X;
486  using Y = int;
487typedefDecl()
488  matches "typedef int X", but not "using Y = int"
489</pre></td></tr>
490
491
492<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;...</td></tr>
493<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
494
495Given
496  typedef int X;
497  using Y = int;
498typedefNameDecl()
499  matches "typedef int X" and "using Y = int"
500</pre></td></tr>
501
502
503<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>&gt;...</td></tr>
504<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
505typename.
506
507Given
508  template &lt;typename T&gt;
509  struct Base { typedef T Foo; };
510
511  template&lt;typename T&gt;
512  struct S : private Base&lt;T&gt; {
513    using typename Base&lt;T&gt;::Foo;
514  };
515unresolvedUsingTypenameDecl()
516  matches using Base&lt;T&gt;::Foo </pre></td></tr>
517
518
519<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>
520<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
521
522Given
523  template&lt;typename X&gt;
524  class C : private X {
525    using X::x;
526  };
527unresolvedUsingValueDecl()
528  matches using X::x </pre></td></tr>
529
530
531<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>
532<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
533
534Given
535  namespace X { int x; }
536  using X::x;
537usingDecl()
538  matches using X::x </pre></td></tr>
539
540
541<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>
542<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
543
544Given
545  namespace X { int x; }
546  using namespace X;
547usingDirectiveDecl()
548  matches using namespace X </pre></td></tr>
549
550
551<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>
552<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
553
554Example matches A, B, C and F
555  enum X { A, B, C };
556  void F();
557</pre></td></tr>
558
559
560<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>
561<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
562
563Note: this does not match declarations of member variables, which are
564"field" declarations in Clang parlance.
565
566Example matches a
567  int a;
568</pre></td></tr>
569
570
571<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>
572<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
573</pre></td></tr>
574
575
576<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>
577<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
578
579Given
580  namespace ns {
581    struct A { static void f(); };
582    void A::f() {}
583    void g() { A::f(); }
584  }
585  ns::A a;
586nestedNameSpecifier()
587  matches "ns::" and both "A::"
588</pre></td></tr>
589
590
591<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>
592<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
593</pre></td></tr>
594
595
596<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;...</td></tr>
597<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
598
599Given
600  FOO: bar();
601  void *ptr = &amp;&amp;FOO;
602  goto *bar;
603addrLabelExpr()
604  matches '&amp;&amp;FOO'
605</pre></td></tr>
606
607
608<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>
609<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
610
611Given
612  int i = a[1];
613arraySubscriptExpr()
614  matches "a[1]"
615</pre></td></tr>
616
617
618<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>
619<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
620
621 int i = 100;
622  __asm("mov al, 2");
623asmStmt()
624  matches '__asm("mov al, 2")'
625</pre></td></tr>
626
627
628<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>&gt;...</td></tr>
629<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
630Example matches __atomic_load_n(ptr, 1)
631  void foo() { int *ptr; __atomic_load_n(ptr, 1); }
632</pre></td></tr>
633
634
635<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>&gt;...</td></tr>
636<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
637
638Example matches a ?: b
639  (a ?: b) + 42;
640</pre></td></tr>
641
642
643<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>
644<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
645
646Example matches a || b
647  !(a || b)
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('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>
652<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
653
654Given
655  while (true) { break; }
656breakStmt()
657  matches 'break'
658</pre></td></tr>
659
660
661<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>
662<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
663
664Example: Matches (int) 2.2f in
665  int i = (int) 2.2f;
666</pre></td></tr>
667
668
669<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>
670<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
671
672Example matches x.y() and y()
673  X x;
674  x.y();
675  y();
676</pre></td></tr>
677
678
679<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>
680<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
681
682Given
683  switch(a) { case 42: break; default: break; }
684caseStmt()
685  matches 'case 42: break;'.
686</pre></td></tr>
687
688
689<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>
690<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
691
692Example: castExpr() matches each of the following:
693  (int) 3;
694  const_cast&lt;Expr *&gt;(SubExpr);
695  char c = 0;
696but does not match
697  int i = (0);
698  int k = 0;
699</pre></td></tr>
700
701
702<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>
703<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
704
705Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
706though.
707
708Example matches 'a', L'a'
709  char ch = 'a';
710  wchar_t chw = L'a';
711</pre></td></tr>
712
713
714<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>
715<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
716
717Example match: {1}, (1, 2)
718  int array[4] = {1};
719  vector int myvec = (vector int)(1, 2);
720</pre></td></tr>
721
722
723<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>
724<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
725
726Example matches '{}' and '{{}}'in 'for (;;) {{}}'
727  for (;;) {{}}
728</pre></td></tr>
729
730
731<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>
732<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
733
734Example matches a ? b : c
735  (a ? b : c) + 42
736</pre></td></tr>
737
738
739<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>
740<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
741
742Given
743  while (true) { continue; }
744continueStmt()
745  matches 'continue'
746</pre></td></tr>
747
748
749<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>
750<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
751
752Example matches,
753  kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
754</pre></td></tr>
755
756
757<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
758<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
759
760Example matches FunctionTakesString(GetStringByValue())
761    (matcher = cxxBindTemporaryExpr())
762  FunctionTakesString(GetStringByValue());
763  FunctionTakesStringByPointer(GetStringPointer());
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('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
768<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
769
770Example matches true
771  true
772</pre></td></tr>
773
774
775<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
776<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
777
778  try {} catch(int i) {}
779cxxCatchStmt()
780  matches 'catch(int i)'
781</pre></td></tr>
782
783
784<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
785<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
786
787Example: Matches const_cast&lt;int*&gt;(&amp;r) in
788  int n = 42;
789  const int &amp;r(n);
790  int* p = const_cast&lt;int*&gt;(&amp;r);
791</pre></td></tr>
792
793
794<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
795<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
796
797Example matches string(ptr, n) and ptr within arguments of f
798    (matcher = cxxConstructExpr())
799  void f(const string &amp;a, const string &amp;b);
800  char *ptr;
801  int n;
802  f(string(ptr, n), ptr);
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('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
807<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
808
809Example matches the CXXDefaultArgExpr placeholder inserted for the
810    default value of the second parameter in the call expression f(42)
811    (matcher = cxxDefaultArgExpr())
812  void f(int x, int y = 0);
813  f(42);
814</pre></td></tr>
815
816
817<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
818<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
819
820Given
821  delete X;
822cxxDeleteExpr()
823  matches 'delete X'.
824</pre></td></tr>
825
826
827<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
828<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
829
830Example:
831  cxxDynamicCastExpr()
832matches
833  dynamic_cast&lt;D*&gt;(&amp;b);
834in
835  struct B { virtual ~B() {} }; struct D : B {};
836  B b;
837  D* p = dynamic_cast&lt;D*&gt;(&amp;b);
838</pre></td></tr>
839
840
841<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
842<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
843
844cxxForRangeStmt() matches 'for (auto a : i)'
845  int i[] =  {1, 2, 3}; for (auto a : i);
846  for(int j = 0; j &lt; 5; ++j);
847</pre></td></tr>
848
849
850<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
851<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
852
853Example: Matches Foo(bar);
854  Foo f = bar;
855  Foo g = (Foo) bar;
856  Foo h = Foo(bar);
857</pre></td></tr>
858
859
860<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
861<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
862
863Example matches x.y()
864  X x;
865  x.y();
866</pre></td></tr>
867
868
869<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
870<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
871
872Given
873  new X;
874cxxNewExpr()
875  matches 'new X'.
876</pre></td></tr>
877
878
879<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
880<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
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('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
885<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
886
887Note that if an operator isn't overloaded, it won't match. Instead, use
888binaryOperator matcher.
889Currently it does not match operators such as new delete.
890FIXME: figure out why these do not match?
891
892Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
893    (matcher = cxxOperatorCallExpr())
894  ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
895  ostream &amp;o; int b = 1, c = 1;
896  o &lt;&lt; b &lt;&lt; c;
897</pre></td></tr>
898
899
900<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
901<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
902
903Either the source expression or the destination type can be matched
904using has(), but hasDestinationType() is more specific and can be
905more readable.
906
907Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
908  void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
909</pre></td></tr>
910
911
912<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
913<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
914
915See also: hasDestinationType
916See also: reinterpretCast
917
918Example:
919  cxxStaticCastExpr()
920matches
921  static_cast&lt;long&gt;(8)
922in
923  long eight(static_cast&lt;long&gt;(8));
924</pre></td></tr>
925
926
927<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>&gt;...</td></tr>
928<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
929
930Given
931  std::vector&lt;int&gt; a({ 1, 2, 3 });
932  std::vector&lt;int&gt; b = { 4, 5 };
933  int c[] = { 6, 7 };
934  std::pair&lt;int, int&gt; d = { 8, 9 };
935cxxStdInitializerListExpr()
936  matches "{ 1, 2, 3 }" and "{ 4, 5 }"
937</pre></td></tr>
938
939
940<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
941<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
942
943Example: Matches Foo(bar, bar)
944  Foo h = Foo(bar, bar);
945</pre></td></tr>
946
947
948<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
949<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
950
951Example matches the implicit this expression in "return i".
952    (matcher = cxxThisExpr())
953struct foo {
954  int i;
955  int f() { return i; }
956};
957</pre></td></tr>
958
959
960<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
961<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
962
963  try { throw 5; } catch(int i) {}
964cxxThrowExpr()
965  matches 'throw 5'
966</pre></td></tr>
967
968
969<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
970<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
971
972  try {} catch(int i) {}
973cxxTryStmt()
974  matches 'try {}'
975</pre></td></tr>
976
977
978<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
979<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
980
981Example matches T(t) in return statement of f
982    (matcher = cxxUnresolvedConstructExpr())
983  template &lt;typename T&gt;
984  void f(const T&amp; t) { return T(t); }
985</pre></td></tr>
986
987
988<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>
989<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
990
991Example matches x in if (x)
992  bool x;
993  if (x) {}
994</pre></td></tr>
995
996
997<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>
998<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
999
1000Given
1001  int a;
1002declStmt()
1003  matches 'int a'.
1004</pre></td></tr>
1005
1006
1007<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>
1008<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1009
1010Given
1011  switch(a) { case 42: break; default: break; }
1012defaultStmt()
1013  matches 'default: break;'.
1014</pre></td></tr>
1015
1016
1017<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;...</td></tr>
1018<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1019
1020Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1021  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1022</pre></td></tr>
1023
1024
1025<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>
1026<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1027
1028Given
1029  do {} while (true);
1030doStmt()
1031  matches 'do {} while(true)'
1032</pre></td></tr>
1033
1034
1035<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>
1036<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1037
1038Matches any cast expression written in user code, whether it be a
1039C-style cast, a functional-style cast, or a keyword cast.
1040
1041Does not match implicit conversions.
1042
1043Note: the name "explicitCast" is chosen to match Clang's terminology, as
1044Clang uses the term "cast" to apply to implicit conversions as well as to
1045actual cast expressions.
1046
1047See also: hasDestinationType.
1048
1049Example: matches all five of the casts in
1050  int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1051but does not match the implicit conversion in
1052  long ell = 42;
1053</pre></td></tr>
1054
1055
1056<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>
1057<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1058
1059Example matches x()
1060  void f() { x(); }
1061</pre></td></tr>
1062
1063
1064<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>
1065<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1066of the sub-expression's evaluation.
1067
1068Example matches std::string()
1069  const std::string str = std::string();
1070</pre></td></tr>
1071
1072
1073<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>
1074<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g.
10751.0, 1.0f, 1.0L and 1e10.
1076
1077Does not match implicit conversions such as
1078  float a = 10;
1079</pre></td></tr>
1080
1081
1082<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>
1083<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1084
1085Example matches 'for (;;) {}'
1086  for (;;) {}
1087  int i[] =  {1, 2, 3}; for (auto a : i);
1088</pre></td></tr>
1089
1090
1091<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>&gt;...</td></tr>
1092<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1093</pre></td></tr>
1094
1095
1096<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>
1097<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1098
1099Given
1100  goto FOO;
1101  FOO: bar();
1102gotoStmt()
1103  matches 'goto FOO'
1104</pre></td></tr>
1105
1106
1107<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>
1108<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1109
1110Example matches 'if (x) {}'
1111  if (x) {}
1112</pre></td></tr>
1113
1114
1115<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>
1116<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1117
1118This matches many different places, including function call return value
1119eliding, as well as any type conversions.
1120</pre></td></tr>
1121
1122
1123<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>&gt;...</td></tr>
1124<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1125
1126Given
1127  point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1128implicitValueInitExpr()
1129  matches "[0].y" (implicitly)
1130</pre></td></tr>
1131
1132
1133<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>
1134<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1135
1136Given
1137  int a[] = { 1, 2 };
1138  struct B { int x, y; };
1139  B b = { 5, 6 };
1140initListExpr()
1141  matches "{ 1, 2 }" and "{ 5, 6 }"
1142</pre></td></tr>
1143
1144
1145<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>
1146<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g.
11471, 1L, 0x1 and 1U.
1148
1149Does not match character-encoded integers such as L'a'.
1150</pre></td></tr>
1151
1152
1153<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>
1154<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1155
1156Given
1157  goto FOO;
1158  FOO: bar();
1159labelStmt()
1160  matches 'FOO:'
1161</pre></td></tr>
1162
1163
1164<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>
1165<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1166
1167Example matches [&amp;](){return 5;}
1168  [&amp;](){return 5;}
1169</pre></td></tr>
1170
1171
1172<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>
1173<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1174
1175Example: Given
1176  struct T {void func();};
1177  T f();
1178  void g(T);
1179materializeTemporaryExpr() matches 'f()' in these statements
1180  T u(f());
1181  g(f());
1182but does not match
1183  f();
1184  f().func();
1185</pre></td></tr>
1186
1187
1188<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>
1189<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1190
1191Given
1192  class Y {
1193    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1194    int a; static int b;
1195  };
1196memberExpr()
1197  matches this-&gt;x, x, y.x, a, this-&gt;b
1198</pre></td></tr>
1199
1200
1201<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>
1202<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1203
1204  foo();;
1205nullStmt()
1206  matches the second ';'
1207</pre></td></tr>
1208
1209
1210<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;...</td></tr>
1211<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1212
1213The innermost message send invokes the "alloc" class method on the
1214NSString class, while the outermost message send invokes the
1215"initWithString" instance method on the object returned from
1216NSString's "alloc". This matcher should match both message sends.
1217  [[NSString alloc] initWithString:@"Hello"]
1218</pre></td></tr>
1219
1220
1221<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;...</td></tr>
1222<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
1223to reference another expressions and can be met
1224in BinaryConditionalOperators, for example.
1225
1226Example matches 'a'
1227  (a ?: c) + 42;
1228</pre></td></tr>
1229
1230
1231<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>&gt;...</td></tr>
1232<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
1233
1234Example matches (foo() + 1)
1235  int foo() { return 1; }
1236  int a = (foo() + 1);
1237</pre></td></tr>
1238
1239
1240<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>&gt;...</td></tr>
1241<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
1242ParenListExprs don't have a predefined type and are used for late parsing.
1243In the final AST, they can be met in template declarations.
1244
1245Given
1246  template&lt;typename T&gt; class X {
1247    void f() {
1248      X x(*this);
1249      int a = 0, b = 1; int i = (a, b);
1250    }
1251  };
1252parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
1253has a predefined type and is a ParenExpr, not a ParenListExpr.
1254</pre></td></tr>
1255
1256
1257<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>&gt;...</td></tr>
1258<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
1259
1260Example: Matches __func__
1261  printf("%s", __func__);
1262</pre></td></tr>
1263
1264
1265<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>
1266<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
1267
1268Given
1269  return 1;
1270returnStmt()
1271  matches 'return 1'
1272</pre></td></tr>
1273
1274
1275<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>
1276<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
1277
1278Given
1279  { ++a; }
1280stmt()
1281  matches both the compound statement '{ ++a; }' and '++a'.
1282</pre></td></tr>
1283
1284
1285<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;...</td></tr>
1286<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
1287
1288Example match: ({ int X = 4; X; })
1289  int C = ({ int X = 4; X; });
1290</pre></td></tr>
1291
1292
1293<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>
1294<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
1295
1296Example matches "abcd", L"abcd"
1297  char *s = "abcd";
1298  wchar_t *ws = L"abcd";
1299</pre></td></tr>
1300
1301
1302<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>
1303<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
1304
1305Given
1306  template &lt;int N&gt;
1307  struct A { static const int n = N; };
1308  struct B : public A&lt;42&gt; {};
1309substNonTypeTemplateParmExpr()
1310  matches "N" in the right-hand side of "static const int n = N;"
1311</pre></td></tr>
1312
1313
1314<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>
1315<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1316
1317Given
1318  switch(a) { case 42: break; default: break; }
1319switchCase()
1320  matches 'case 42: break;' and 'default: break;'.
1321</pre></td></tr>
1322
1323
1324<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>
1325<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1326
1327Given
1328  switch(a) { case 42: break; default: break; }
1329switchStmt()
1330  matches 'switch(a)'.
1331</pre></td></tr>
1332
1333
1334<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>
1335<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1336
1337Given
1338  Foo x = bar;
1339  int y = sizeof(x) + alignof(x);
1340unaryExprOrTypeTraitExpr()
1341  matches sizeof(x) and alignof(x)
1342</pre></td></tr>
1343
1344
1345<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>
1346<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1347
1348Example matches !a
1349  !a || b
1350</pre></td></tr>
1351
1352
1353<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>&gt;...</td></tr>
1354<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
1355but could not be resolved to a specific declaration.
1356
1357Given
1358  template&lt;typename T&gt;
1359  T foo() { T a; return a; }
1360  template&lt;typename T&gt;
1361  void bar() {
1362    foo&lt;T&gt;();
1363  }
1364unresolvedLookupExpr()
1365  matches foo&lt;T&gt;() </pre></td></tr>
1366
1367
1368<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>
1369<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1370
1371Example match: "foo"_suffix
1372</pre></td></tr>
1373
1374
1375<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>
1376<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1377
1378Given
1379  while (true) {}
1380whileStmt()
1381  matches 'while (true) {}'.
1382</pre></td></tr>
1383
1384
1385<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>
1386<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1387
1388Given
1389  template &lt;typename T&gt; struct C {};
1390  C&lt;int&gt; c;
1391templateArgument()
1392  matches 'int' in C&lt;int&gt;.
1393</pre></td></tr>
1394
1395
1396<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;</td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;...</td></tr>
1397<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
1398
1399Given
1400  template &lt;typename T&gt; class X { };
1401  X&lt;int&gt; xi;
1402templateName()
1403  matches 'X' in X&lt;int&gt;.
1404</pre></td></tr>
1405
1406
1407<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>
1408<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1409</pre></td></tr>
1410
1411
1412<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>
1413<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1414
1415Given
1416  int a[] = { 2, 3 };
1417  int b[4];
1418  void f() { int c[a[0]]; }
1419arrayType()
1420  matches "int a[]", "int b[4]" and "int c[a[0]]";
1421</pre></td></tr>
1422
1423
1424<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>
1425<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1426
1427Given
1428  _Atomic(int) i;
1429atomicType()
1430  matches "_Atomic(int) i"
1431</pre></td></tr>
1432
1433
1434<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>
1435<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1436
1437Given:
1438  auto n = 4;
1439  int v[] = { 2, 3 }
1440  for (auto i : v) { }
1441autoType()
1442  matches "auto n" and "auto i"
1443</pre></td></tr>
1444
1445
1446<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>
1447<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1448"void (^)(int)".
1449
1450The pointee is always required to be a FunctionType.
1451</pre></td></tr>
1452
1453
1454<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>
1455<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1456
1457Given
1458  struct A {};
1459  A a;
1460  int b;
1461  float c;
1462  bool d;
1463builtinType()
1464  matches "int b", "float c" and "bool d"
1465</pre></td></tr>
1466
1467
1468<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>
1469<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1470
1471Given
1472  _Complex float f;
1473complexType()
1474  matches "_Complex float f"
1475</pre></td></tr>
1476
1477
1478<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>
1479<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1480
1481Given
1482  void() {
1483    int a[2];
1484    int b[] = { 2, 3 };
1485    int c[b[0]];
1486  }
1487constantArrayType()
1488  matches "int a[2]"
1489</pre></td></tr>
1490
1491
1492<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;...</td></tr>
1493<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1494Example matches i[] in declaration of f.
1495    (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1496Example matches i[1].
1497    (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1498  void f(int i[]) {
1499    i[1] = 0;
1500  }
1501</pre></td></tr>
1502
1503
1504<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>
1505<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1506
1507Given
1508  template&lt;typename T, int Size&gt;
1509  class array {
1510    T data[Size];
1511  };
1512dependentSizedArrayType
1513  matches "T data[Size]"
1514</pre></td></tr>
1515
1516
1517<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>
1518<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1519qualified name.
1520
1521Given
1522  namespace N {
1523    namespace M {
1524      class D {};
1525    }
1526  }
1527  class C {};
1528
1529  class C c;
1530  N::M::D d;
1531
1532elaboratedType() matches the type of the variable declarations of both
1533c and d.
1534</pre></td></tr>
1535
1536
1537<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;...</td></tr>
1538<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
1539
1540Given
1541  enum C { Green };
1542  enum class S { Red };
1543
1544  C c;
1545  S s;
1546
1547enumType() matches the type of the variable declarations of both c and
1548s.
1549</pre></td></tr>
1550
1551
1552<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;...</td></tr>
1553<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1554
1555Given
1556  int (*f)(int);
1557  void g();
1558functionProtoType()
1559  matches "int (*f)(int)" and the type of "g" in C++ mode.
1560  In C mode, "g" is not matched because it does not contain a prototype.
1561</pre></td></tr>
1562
1563
1564<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>
1565<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1566
1567Given
1568  int (*f)(int);
1569  void g();
1570functionType()
1571  matches "int (*f)(int)" and the type of "g".
1572</pre></td></tr>
1573
1574
1575<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>
1576<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1577
1578Given
1579  int a[] = { 2, 3 };
1580  int b[42];
1581  void f(int c[]) { int d[a[0]]; };
1582incompleteArrayType()
1583  matches "int a[]" and "int c[]"
1584</pre></td></tr>
1585
1586
1587<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;...</td></tr>
1588<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1589
1590Example matches S s, but not S&lt;T&gt; s.
1591    (matcher = parmVarDecl(hasType(injectedClassNameType())))
1592  template &lt;typename T&gt; struct S {
1593    void f(S s);
1594    void g(S&lt;T&gt; s);
1595  };
1596</pre></td></tr>
1597
1598
1599<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>
1600<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1601
1602Given:
1603  int *a;
1604  int &amp;b = *a;
1605  int &amp;&amp;c = 1;
1606  auto &amp;d = b;
1607  auto &amp;&amp;e = c;
1608  auto &amp;&amp;f = 2;
1609  int g = 5;
1610
1611lValueReferenceType() matches the types of b, d, and e. e is
1612matched since the type is deduced as int&amp; by reference collapsing rules.
1613</pre></td></tr>
1614
1615
1616<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>
1617<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1618Given
1619  struct A { int i; }
1620  A::* ptr = A::i;
1621memberPointerType()
1622  matches "A::* ptr"
1623</pre></td></tr>
1624
1625
1626<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>&gt;...</td></tr>
1627<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1628a pointer type, despite being syntactically similar.
1629
1630Given
1631  int *a;
1632
1633  @interface Foo
1634  @end
1635  Foo *f;
1636pointerType()
1637  matches "Foo *f", but does not match "int *a".
1638</pre></td></tr>
1639
1640
1641<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>
1642<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1643
1644Given
1645  int (*ptr_to_array)[4];
1646  int *array_of_ptrs[4];
1647
1648varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1649array_of_ptrs.
1650</pre></td></tr>
1651
1652
1653<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>
1654<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1655types.
1656
1657Given
1658  int *a;
1659  int &amp;b = *a;
1660  int c = 5;
1661
1662  @interface Foo
1663  @end
1664  Foo *f;
1665pointerType()
1666  matches "int *a", but does not match "Foo *f".
1667</pre></td></tr>
1668
1669
1670<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>
1671<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1672
1673Given:
1674  int *a;
1675  int &amp;b = *a;
1676  int &amp;&amp;c = 1;
1677  auto &amp;d = b;
1678  auto &amp;&amp;e = c;
1679  auto &amp;&amp;f = 2;
1680  int g = 5;
1681
1682rValueReferenceType() matches the types of c and f. e is not
1683matched as it is deduced to int&amp; by reference collapsing rules.
1684</pre></td></tr>
1685
1686
1687<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>
1688<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1689
1690Given
1691  class C {};
1692  struct S {};
1693
1694  C c;
1695  S s;
1696
1697recordType() matches the type of the variable declarations of both c
1698and s.
1699</pre></td></tr>
1700
1701
1702<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>
1703<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1704
1705Given
1706  int *a;
1707  int &amp;b = *a;
1708  int &amp;&amp;c = 1;
1709  auto &amp;d = b;
1710  auto &amp;&amp;e = c;
1711  auto &amp;&amp;f = 2;
1712  int g = 5;
1713
1714referenceType() matches the types of b, c, d, e, and f.
1715</pre></td></tr>
1716
1717
1718<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;...</td></tr>
1719<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
1720template type parameter.
1721
1722Given
1723  template &lt;typename T&gt;
1724  void F(T t) {
1725    int i = 1 + t;
1726  }
1727
1728substTemplateTypeParmType() matches the type of 't' but not '1'
1729</pre></td></tr>
1730
1731
1732<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;...</td></tr>
1733<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
1734
1735Given
1736  enum E {};
1737  class C {};
1738
1739  E e;
1740  C c;
1741
1742tagType() matches the type of the variable declarations of both e
1743and c.
1744</pre></td></tr>
1745
1746
1747<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>
1748<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1749
1750Given
1751  template &lt;typename T&gt;
1752  class C { };
1753
1754  template class C&lt;int&gt;;  A
1755  C&lt;char&gt; var;            B
1756
1757templateSpecializationType() matches the type of the explicit
1758instantiation in A and the type of the variable declaration in B.
1759</pre></td></tr>
1760
1761
1762<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;...</td></tr>
1763<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
1764
1765Example matches T, but not int.
1766    (matcher = templateTypeParmType())
1767  template &lt;typename T&gt; void f(int i);
1768</pre></td></tr>
1769
1770
1771<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>
1772<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1773</pre></td></tr>
1774
1775
1776<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>
1777<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1778
1779Given
1780  typedef int X;
1781typedefType()
1782  matches "typedef int X"
1783</pre></td></tr>
1784
1785
1786<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>
1787<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1788
1789Given:
1790  typedef __underlying_type(T) type;
1791unaryTransformType()
1792  matches "__underlying_type(T)"
1793</pre></td></tr>
1794
1795
1796<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>
1797<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1798integer-constant-expression.
1799
1800Given
1801  void f() {
1802    int a[] = { 2, 3 }
1803    int b[42];
1804    int c[a[0]];
1805  }
1806variableArrayType()
1807  matches "int c[a[0]]"
1808</pre></td></tr>
1809
1810<!--END_DECL_MATCHERS -->
1811</table>
1812
1813<!-- ======================================================================= -->
1814<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1815<!-- ======================================================================= -->
1816
1817<p>Narrowing matchers match certain attributes on the current node, thus
1818narrowing down the set of nodes of the current type to match on.</p>
1819
1820<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1821which allow users to create more powerful match expressions.</p>
1822
1823<table>
1824<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1825<!-- START_NARROWING_MATCHERS -->
1826
1827<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>
1828<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1829
1830Usable as: Any Matcher
1831</pre></td></tr>
1832
1833
1834<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>
1835<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1836
1837Usable as: Any Matcher
1838</pre></td></tr>
1839
1840
1841<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1842<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1843
1844Useful when another matcher requires a child matcher, but there's no
1845additional constraint. This will often be used with an explicit conversion
1846to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1847
1848Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1849"int* p" and "void f()" in
1850  int* p;
1851  void f();
1852
1853Usable as: Any Matcher
1854</pre></td></tr>
1855
1856
1857<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
1858<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1859
1860Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
1861  class X {};
1862  class Y {};
1863
1864Usable as: Any Matcher
1865</pre></td></tr>
1866
1867
1868<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>
1869<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1870unary).
1871
1872Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1873  !(a || b)
1874</pre></td></tr>
1875
1876
1877<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT  Value</td></tr>
1878<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
1879
1880Given
1881  f('false, 3.14, 42);
1882characterLiteral(equals(0))
1883  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
1884  match false
1885floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
1886  match 3.14
1887integerLiteral(equals(42))
1888  matches 42
1889
1890Note that you cannot directly match a negative numeric literal because the
1891minus sign is not part of the literal: It is a unary operator whose operand
1892is the positive numeric literal. Instead, you must use a unaryOperator()
1893matcher to match the minus sign:
1894
1895unaryOperator(hasOperatorName("-"),
1896              hasUnaryOperand(integerLiteral(equals(13))))
1897
1898Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
1899           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;
1900</pre></td></tr>
1901
1902
1903<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr>
1904<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
1905
1906
1907<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr>
1908<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
1909
1910
1911<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr>
1912<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
1913
1914
1915<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;</td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr>
1916<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
1917
1918Given
1919  try {
1920    ...
1921  } catch (int) {
1922    ...
1923  } catch (...) {
1924    ...
1925  }
1926endcode
1927cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
1928</pre></td></tr>
1929
1930
1931<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>
1932<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1933a specific number of arguments (including absent default arguments).
1934
1935Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1936  void f(int x, int y);
1937  f(0, 0);
1938</pre></td></tr>
1939
1940
1941<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>
1942<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
1943</pre></td></tr>
1944
1945
1946<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr>
1947<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
1948zero initialization.
1949
1950Given
1951void foo() {
1952  struct point { double x; double y; };
1953  point pt[2] = { { 1.0, 2.0 } };
1954}
1955initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
1956will match the implicit array filler for pt[1].
1957</pre></td></tr>
1958
1959
1960<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr>
1961<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
1962
1963Given
1964  struct S {
1965    S(); #1
1966    S(const S &amp;); #2
1967    S(S &amp;&amp;); #3
1968  };
1969cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
1970</pre></td></tr>
1971
1972
1973<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr>
1974<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
1975
1976Given
1977  struct S {
1978    S(); #1
1979    S(const S &amp;); #2
1980    S(S &amp;&amp;); #3
1981  };
1982cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
1983</pre></td></tr>
1984
1985
1986<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr>
1987<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
1988
1989Given
1990  struct S {
1991    S(); #1
1992    S(int) {} #2
1993    S(S &amp;&amp;) : S() {} #3
1994  };
1995  S::S() : S(0) {} #4
1996cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
1997#1 or #2.
1998</pre></td></tr>
1999
2000
2001<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr>
2002<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with
2003the explicit keyword.
2004
2005Given
2006  struct S {
2007    S(int); #1
2008    explicit S(double); #2
2009    operator int(); #3
2010    explicit operator bool(); #4
2011  };
2012cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2013cxxConversionDecl(isExplicit()) will match #4, but not #3.
2014</pre></td></tr>
2015
2016
2017<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr>
2018<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
2019
2020Given
2021  struct S {
2022    S(); #1
2023    S(const S &amp;); #2
2024    S(S &amp;&amp;); #3
2025  };
2026cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
2027</pre></td></tr>
2028
2029
2030<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr>
2031<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with
2032the explicit keyword.
2033
2034Given
2035  struct S {
2036    S(int); #1
2037    explicit S(double); #2
2038    operator int(); #3
2039    explicit operator bool(); #4
2040  };
2041cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2042cxxConversionDecl(isExplicit()) will match #4, but not #3.
2043</pre></td></tr>
2044
2045
2046<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr>
2047<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
2048opposed to a member.
2049
2050Given
2051  struct B {};
2052  struct D : B {
2053    int I;
2054    D(int i) : I(i) {}
2055  };
2056  struct E : B {
2057    E() : B() {}
2058  };
2059cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
2060  will match E(), but not match D(int).
2061</pre></td></tr>
2062
2063
2064<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr>
2065<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
2066opposed to a base.
2067
2068Given
2069  struct B {};
2070  struct D : B {
2071    int I;
2072    D(int i) : I(i) {}
2073  };
2074  struct E : B {
2075    E() : B() {}
2076  };
2077cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
2078  will match D(int), but not match E().
2079</pre></td></tr>
2080
2081
2082<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>
2083<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
2084code (as opposed to implicitly added by the compiler).
2085
2086Given
2087  struct Foo {
2088    Foo() { }
2089    Foo(int) : foo_("A") { }
2090    string foo_;
2091  };
2092cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
2093  will match Foo(int), but not Foo()
2094</pre></td></tr>
2095
2096
2097<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>
2098<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
2099
2100Given
2101struct A {
2102  void foo() const;
2103  void bar();
2104};
2105
2106cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
2107</pre></td></tr>
2108
2109
2110<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr>
2111<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
2112operator.
2113
2114Given
2115struct A {
2116  A &amp;operator=(const A &amp;);
2117  A &amp;operator=(A &amp;&amp;);
2118};
2119
2120cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
2121the second one.
2122</pre></td></tr>
2123
2124
2125<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr>
2126<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
2127
2128Given:
2129  class A final {};
2130
2131  struct B {
2132    virtual void f();
2133  };
2134
2135  struct C : B {
2136    void f() final;
2137  };
2138matches A and C::f, but not B, C, or B::f
2139</pre></td></tr>
2140
2141
2142<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr>
2143<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2144operator.
2145
2146Given
2147struct A {
2148  A &amp;operator=(const A &amp;);
2149  A &amp;operator=(A &amp;&amp;);
2150};
2151
2152cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2153the first one.
2154</pre></td></tr>
2155
2156
2157<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>
2158<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2159
2160Given
2161  class A {
2162   public:
2163    virtual void x();
2164  };
2165  class B : public A {
2166   public:
2167    virtual void x();
2168  };
2169  matches B::x
2170</pre></td></tr>
2171
2172
2173<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>
2174<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2175
2176Given
2177  class A {
2178   public:
2179    virtual void x() = 0;
2180  };
2181  matches A::x
2182</pre></td></tr>
2183
2184
2185<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr>
2186<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2187
2188Given
2189  struct S {
2190    S(); #1
2191    S(const S &amp;) = default; #2
2192    S(S &amp;&amp;) = delete; #3
2193  };
2194cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2195</pre></td></tr>
2196
2197
2198<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>
2199<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
2200
2201Given
2202  class A {
2203   public:
2204    virtual void x();
2205  };
2206  matches A::x
2207</pre></td></tr>
2208
2209
2210<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr>
2211<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2212
2213Given
2214  class A {
2215   public:
2216    virtual void x();
2217  };
2218  class B : public A {
2219   public:
2220    void x();
2221  };
2222  matches A::x but not B::x
2223</pre></td></tr>
2224
2225
2226<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>
2227<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2228
2229Matches overloaded operator names specified in strings without the
2230"operator" prefix: e.g. "&lt;&lt;".
2231
2232Given:
2233  class A { int operator*(); };
2234  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2235  A a;
2236  a &lt;&lt; a;   &lt;-- This matches
2237
2238cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2239specified line and
2240cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2241matches the declaration of A.
2242
2243Usable 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;
2244</pre></td></tr>
2245
2246
2247<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>
2248<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2249</pre></td></tr>
2250
2251
2252<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>
2253<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2254static member variable template instantiations.
2255
2256Given
2257  template&lt;typename T&gt; void A(T t) { }
2258  template&lt;&gt; void A(int N) { }
2259functionDecl(isExplicitTemplateSpecialization())
2260  matches the specialization A&lt;int&gt;().
2261
2262Usable 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;
2263</pre></td></tr>
2264
2265
2266<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr>
2267<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2268
2269Given:
2270  class A final {};
2271
2272  struct B {
2273    virtual void f();
2274  };
2275
2276  struct C : B {
2277    void f() final;
2278  };
2279matches A and C::f, but not B, C, or B::f
2280</pre></td></tr>
2281
2282
2283<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr>
2284<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2285
2286Given:
2287  auto x = []{};
2288
2289cxxRecordDecl(isLambda()) matches the implicit class declaration of
2290decltype(x)
2291</pre></td></tr>
2292
2293
2294<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>
2295<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
2296isSameOrDerivedFrom(hasName(...)).
2297</pre></td></tr>
2298
2299
2300<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>
2301<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2302member variable template instantiations.
2303
2304Given
2305  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2306or
2307  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2308cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2309  matches the template instantiation of X&lt;A&gt;.
2310
2311But 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;
2314cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2315  does not match, as X&lt;A&gt; is an explicit template specialization.
2316
2317Usable 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;<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>
2322<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2323a specific number of arguments (including absent default arguments).
2324
2325Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2326  void f(int x, int y);
2327  f(0, 0);
2328</pre></td></tr>
2329
2330
2331<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr>
2332<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2333
2334Example: matches the implicit cast around 0
2335(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2336  int *p = 0;
2337</pre></td></tr>
2338
2339
2340<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>
2341<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
2342
2343Given
2344  f('false, 3.14, 42);
2345characterLiteral(equals(0))
2346  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2347  match false
2348floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2349  match 3.14
2350integerLiteral(equals(42))
2351  matches 42
2352
2353Note that you cannot directly match a negative numeric literal because the
2354minus sign is not part of the literal: It is a unary operator whose operand
2355is the positive numeric literal. Instead, you must use a unaryOperator()
2356matcher to match the minus sign:
2357
2358unaryOperator(hasOperatorName("-"),
2359              hasUnaryOperand(integerLiteral(equals(13))))
2360
2361Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
2362           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;
2363</pre></td></tr>
2364
2365
2366<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr>
2367<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2368
2369
2370<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr>
2371<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2372
2373
2374<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr>
2375<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2376
2377
2378<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>
2379<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2380
2381Given
2382  template&lt;typename T&gt; struct C {};
2383  C&lt;int&gt; c;
2384classTemplateSpecializationDecl(templateArgumentCountIs(1))
2385  matches C&lt;int&gt;.
2386</pre></td></tr>
2387
2388
2389<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>
2390<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2391child statements.
2392
2393Example: Given
2394  { for (;;) {} }
2395compoundStmt(statementCountIs(0)))
2396  matches '{}'
2397  but does not match the outer compound statement.
2398</pre></td></tr>
2399
2400
2401<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>
2402<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
2403
2404Given
2405  int a[42];
2406  int b[2 * 21];
2407  int c[41], d[43];
2408  char *s = "abcd";
2409  wchar_t *ws = L"abcd";
2410  char *w = "a";
2411constantArrayType(hasSize(42))
2412  matches "int a[42]" and "int b[2 * 21]"
2413stringLiteral(hasSize(4))
2414  matches "abcd", L"abcd"
2415</pre></td></tr>
2416
2417
2418<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>
2419<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2420declarations.
2421
2422Example: Given
2423  int a, b;
2424  int c;
2425  int d = 2, e;
2426declCountIs(2)
2427  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2428</pre></td></tr>
2429
2430
2431<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>
2432<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2433
2434Matches a node if it equals the node previously bound to ID.
2435
2436Given
2437  class X { int a; int b; };
2438cxxRecordDecl(
2439    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2440    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2441  matches the class X, as a and b have the same type.
2442
2443Note that when multiple matches are involved via forEach* matchers,
2444equalsBoundNodes acts as a filter.
2445For example:
2446compoundStmt(
2447    forEachDescendant(varDecl().bind("d")),
2448    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2449will trigger a match for each combination of variable declaration
2450and reference to that variable declaration within a compound statement.
2451</pre></td></tr>
2452
2453
2454<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr>
2455<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2456
2457Decl has pointer identity in the AST.
2458</pre></td></tr>
2459
2460
2461<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>
2462<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2463
2464Given
2465  __attribute__((device)) void f() { ... }
2466decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2467f. If the matcher is use from clang-query, attr::Kind parameter should be
2468passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2469</pre></td></tr>
2470
2471
2472<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>
2473<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2474partially matching a given regex.
2475
2476Example matches Y but not X
2477    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2478  #include "ASTMatcher.h"
2479  class X {};
2480ASTMatcher.h:
2481  class Y {};
2482
2483Usable 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;
2484</pre></td></tr>
2485
2486
2487<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>
2488<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2489
2490Example matches X but not Y
2491  (matcher = cxxRecordDecl(isExpansionInMainFile())
2492  #include &lt;Y.h&gt;
2493  class X {};
2494Y.h:
2495  class Y {};
2496
2497Usable 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;
2498</pre></td></tr>
2499
2500
2501<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>
2502<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2503
2504Example matches Y but not X
2505    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2506  #include &lt;SystemHeader.h&gt;
2507  class X {};
2508SystemHeader.h:
2509  class Y {};
2510
2511Usable 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;
2512</pre></td></tr>
2513
2514
2515<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>
2516<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2517by the compiler (eg. implicit defaultcopy constructors).
2518</pre></td></tr>
2519
2520
2521<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>
2522<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2523
2524Given
2525  class C {
2526  public:    int a;
2527  protected: int b;
2528  private:   int c;
2529  };
2530fieldDecl(isPrivate())
2531  matches 'int c;'
2532</pre></td></tr>
2533
2534
2535<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>
2536<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2537
2538Given
2539  class C {
2540  public:    int a;
2541  protected: int b;
2542  private:   int c;
2543  };
2544fieldDecl(isProtected())
2545  matches 'int b;'
2546</pre></td></tr>
2547
2548
2549<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>
2550<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2551
2552Given
2553  class C {
2554  public:    int a;
2555  protected: int b;
2556  private:   int c;
2557  };
2558fieldDecl(isPublic())
2559  matches 'int a;'
2560</pre></td></tr>
2561
2562
2563<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;</td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr>
2564<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2565a specific number of designators.
2566
2567Example: Given
2568  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2569  point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2570designatorCountIs(2)
2571  matches '{ [2].y = 1.0, [0].x = 1.0 }',
2572  but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2573</pre></td></tr>
2574
2575
2576<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr>
2577<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
2578bit width.
2579
2580Given
2581  class C {
2582    int a : 2;
2583    int b : 4;
2584    int c : 2;
2585  };
2586fieldDecl(hasBitWidth(2))
2587  matches 'int a;' and 'int c;' but not 'int b;'.
2588</pre></td></tr>
2589
2590
2591<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr>
2592<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
2593
2594Given
2595  class C {
2596    int a : 2;
2597    int b;
2598  };
2599fieldDecl(isBitField())
2600  matches 'int a;' but not 'int b;'.
2601</pre></td></tr>
2602
2603
2604<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>
2605<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
2606
2607Given
2608  f('false, 3.14, 42);
2609characterLiteral(equals(0))
2610  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2611  match false
2612floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2613  match 3.14
2614integerLiteral(equals(42))
2615  matches 42
2616
2617Note that you cannot directly match a negative numeric literal because the
2618minus sign is not part of the literal: It is a unary operator whose operand
2619is the positive numeric literal. Instead, you must use a unaryOperator()
2620matcher to match the minus sign:
2621
2622unaryOperator(hasOperatorName("-"),
2623              hasUnaryOperand(integerLiteral(equals(13))))
2624
2625Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
2626           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;
2627</pre></td></tr>
2628
2629
2630<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr>
2631<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
2632
2633
2634<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
2635<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
2636
2637Given:
2638  void f();
2639  void g() noexcept;
2640  void h() noexcept(true);
2641  void i() noexcept(false);
2642  void j() throw();
2643  void k() throw(int);
2644  void l() throw(...);
2645functionDecl(hasDynamicExceptionSpec()) and
2646  functionProtoType(hasDynamicExceptionSpec())
2647  match the declarations of j, k, and l, but not f, g, h, or i.
2648</pre></td></tr>
2649
2650
2651<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>
2652<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
2653
2654Matches overloaded operator names specified in strings without the
2655"operator" prefix: e.g. "&lt;&lt;".
2656
2657Given:
2658  class A { int operator*(); };
2659  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2660  A a;
2661  a &lt;&lt; a;   &lt;-- This matches
2662
2663cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2664specified line and
2665cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2666matches the declaration of A.
2667
2668Usable 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;
2669</pre></td></tr>
2670
2671
2672<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr>
2673<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations.
2674
2675Given:
2676  constexpr int foo = 42;
2677  constexpr int bar();
2678varDecl(isConstexpr())
2679  matches the declaration of foo.
2680functionDecl(isConstexpr())
2681  matches the declaration of bar.
2682</pre></td></tr>
2683
2684
2685<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr>
2686<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
2687
2688Given:
2689  class A { ~A(); };
2690  class B { ~B() = default; };
2691functionDecl(isDefaulted())
2692  matches the declaration of ~B, but not ~A.
2693</pre></td></tr>
2694
2695
2696<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>
2697<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
2698
2699Example matches A, va, fa
2700  class A {};
2701  class B;  Doesn't match, as it has no body.
2702  int va;
2703  extern int vb;  Doesn't match, as it doesn't define the variable.
2704  void fa() {}
2705  void fb();  Doesn't match, as it has no body.
2706
2707Usable 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;
2708</pre></td></tr>
2709
2710
2711<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>
2712<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
2713
2714Given:
2715  void Func();
2716  void DeletedFunc() = delete;
2717functionDecl(isDeleted())
2718  matches the declaration of DeletedFunc, but not Func.
2719</pre></td></tr>
2720
2721
2722<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>
2723<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
2724static member variable template instantiations.
2725
2726Given
2727  template&lt;typename T&gt; void A(T t) { }
2728  template&lt;&gt; void A(int N) { }
2729functionDecl(isExplicitTemplateSpecialization())
2730  matches the specialization A&lt;int&gt;().
2731
2732Usable 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;
2733</pre></td></tr>
2734
2735
2736<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>
2737<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
2738
2739Given:
2740  extern "C" void f() {}
2741  extern "C" { void g() {} }
2742  void h() {}
2743functionDecl(isExternC())
2744  matches the declaration of f and g, but not the declaration h
2745</pre></td></tr>
2746
2747
2748<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr>
2749<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2750the inline keyword.
2751
2752Given
2753  inline void f();
2754  void g();
2755  namespace n {
2756  inline namespace m {}
2757  }
2758functionDecl(isInline()) will match ::f().
2759namespaceDecl(isInline()) will match n::m.
2760</pre></td></tr>
2761
2762
2763<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr>
2764<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2765
2766Given:
2767  void f();
2768  void g() noexcept;
2769  void h() throw();
2770  void i() throw(int);
2771  void j() noexcept(false);
2772functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2773  match the declarations of g, and h, but not f, i or j.
2774</pre></td></tr>
2775
2776
2777<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr>
2778<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage
2779class specifier ("static" keyword) written in the source.
2780
2781Given:
2782  static void f() {}
2783  static int i = 0;
2784  extern int j;
2785  int k;
2786functionDecl(isStaticStorageClass())
2787  matches the function declaration f.
2788varDecl(isStaticStorageClass())
2789  matches the variable declaration i.
2790</pre></td></tr>
2791
2792
2793<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>
2794<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2795member variable template instantiations.
2796
2797Given
2798  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2799or
2800  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2801cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2802  matches the template instantiation of X&lt;A&gt;.
2803
2804But given
2805  template &lt;typename T&gt;  class X {}; class A {};
2806  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2807cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2808  does not match, as X&lt;A&gt; is an explicit template specialization.
2809
2810Usable 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;
2811</pre></td></tr>
2812
2813
2814<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr>
2815<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
2816
2817Example matches f, but not g or h. The function i will not match, even when
2818compiled in C mode.
2819  void f(...);
2820  void g(int);
2821  template &lt;typename... Ts&gt; void h(Ts...);
2822  void i();
2823</pre></td></tr>
2824
2825
2826<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>
2827<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2828specific parameter count.
2829
2830Given
2831  void f(int i) {}
2832  void g(int i, int j) {}
2833  void h(int i, int j);
2834  void j(int i);
2835  void k(int x, int y, int z, ...);
2836functionDecl(parameterCountIs(2))
2837  matches void g(int i, int j) {}
2838functionProtoType(parameterCountIs(2))
2839  matches void h(int i, int j)
2840functionProtoType(parameterCountIs(3))
2841  matches void k(int x, int y, int z, ...);
2842</pre></td></tr>
2843
2844
2845<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
2846<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
2847
2848Given:
2849  void f();
2850  void g() noexcept;
2851  void h() noexcept(true);
2852  void i() noexcept(false);
2853  void j() throw();
2854  void k() throw(int);
2855  void l() throw(...);
2856functionDecl(hasDynamicExceptionSpec()) and
2857  functionProtoType(hasDynamicExceptionSpec())
2858  match the declarations of j, k, and l, but not f, g, h, or i.
2859</pre></td></tr>
2860
2861
2862<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr>
2863<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
2864
2865Given:
2866  void f();
2867  void g() noexcept;
2868  void h() throw();
2869  void i() throw(int);
2870  void j() noexcept(false);
2871functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2872  match the declarations of g, and h, but not f, i or j.
2873</pre></td></tr>
2874
2875
2876<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
2877<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2878specific parameter count.
2879
2880Given
2881  void f(int i) {}
2882  void g(int i, int j) {}
2883  void h(int i, int j);
2884  void j(int i);
2885  void k(int x, int y, int z, ...);
2886functionDecl(parameterCountIs(2))
2887  matches void g(int i, int j) {}
2888functionProtoType(parameterCountIs(2))
2889  matches void h(int i, int j)
2890functionProtoType(parameterCountIs(3))
2891  matches void k(int x, int y, int z, ...);
2892</pre></td></tr>
2893
2894
2895<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>
2896<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
2897
2898Given
2899  f('false, 3.14, 42);
2900characterLiteral(equals(0))
2901  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2902  match false
2903floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2904  match 3.14
2905integerLiteral(equals(42))
2906  matches 42
2907
2908Note that you cannot directly match a negative numeric literal because the
2909minus sign is not part of the literal: It is a unary operator whose operand
2910is the positive numeric literal. Instead, you must use a unaryOperator()
2911matcher to match the minus sign:
2912
2913unaryOperator(hasOperatorName("-"),
2914              hasUnaryOperand(integerLiteral(equals(13))))
2915
2916Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
2917           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;
2918</pre></td></tr>
2919
2920
2921<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr>
2922<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
2923
2924
2925<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr>
2926<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
2927
2928
2929<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned Value</td></tr>
2930<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
2931
2932
2933<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>
2934<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
2935to '.'.
2936
2937Member calls on the implicit this pointer match as called with '-&gt;'.
2938
2939Given
2940  class Y {
2941    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2942    int a;
2943    static int b;
2944  };
2945memberExpr(isArrow())
2946  matches this-&gt;x, x, y.x, a, this-&gt;b
2947</pre></td></tr>
2948
2949
2950<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasExternalFormalLinkage0')"><a name="hasExternalFormalLinkage0Anchor">hasExternalFormalLinkage</a></td><td></td></tr>
2951<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
2952
2953Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
2954void f() {
2955  int x;
2956  static int y;
2957}
2958int z;
2959
2960Example matches f() because it has external formal linkage despite being
2961unique to the translation unit as though it has internal likage
2962(matcher = functionDecl(hasExternalFormalLinkage()))
2963
2964namespace {
2965void f() {}
2966}
2967</pre></td></tr>
2968
2969
2970<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>
2971<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
2972
2973Supports specifying enclosing namespaces or classes by prefixing the name
2974with '&lt;enclosing&gt;::'.
2975Does not match typedefs of an underlying type with the given name.
2976
2977Example matches X (Name == "X")
2978  class X;
2979
2980Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
2981  namespace a { namespace b { class X; } }
2982</pre></td></tr>
2983
2984
2985<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>
2986<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
2987a substring matched by the given RegExp.
2988
2989Supports specifying enclosing namespaces or classes by
2990prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
2991of an underlying type with the given name.
2992
2993Example matches X (regexp == "::X")
2994  class X;
2995
2996Example matches X (regexp is one of "::X", "^foo::.*X", among others)
2997  namespace foo { namespace bar { class X; } }
2998</pre></td></tr>
2999
3000
3001<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isAnonymous0')"><a name="isAnonymous0Anchor">isAnonymous</a></td><td></td></tr>
3002<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3003
3004Given
3005  namespace n {
3006  namespace {} #1
3007  }
3008namespaceDecl(isAnonymous()) will match #1 but not ::n.
3009</pre></td></tr>
3010
3011
3012<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr>
3013<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3014the inline keyword.
3015
3016Given
3017  inline void f();
3018  void g();
3019  namespace n {
3020  inline namespace m {}
3021  }
3022functionDecl(isInline()) will match ::f().
3023namespaceDecl(isInline()) will match n::m.
3024</pre></td></tr>
3025
3026
3027<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
3028<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3029a specific number of arguments (including absent default arguments).
3030
3031Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3032  void f(int x, int y);
3033  f(0, 0);
3034</pre></td></tr>
3035
3036
3037<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr>
3038<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3039
3040objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3041message expression in
3042
3043  UIWebView *webView = ...;
3044  CGRect bodyFrame = webView.frame;
3045  bodyFrame.size.height = self.bodyContentHeight;
3046  webView.frame = bodyFrame;
3047      ^---- matches here
3048</pre></td></tr>
3049
3050
3051<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr>
3052<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3053
3054Matches only when the selector of the objCMessageExpr is NULL. This may
3055represent an error condition in the tree!
3056</pre></td></tr>
3057
3058
3059<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasSelector0')"><a name="hasSelector0Anchor">hasSelector</a></td><td>std::string BaseName</td></tr>
3060<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3061
3062 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3063 matches the outer message expr in the code below, but NOT the message
3064 invocation for self.bodyView.
3065    [self.bodyView loadHTMLString:html baseURL:NULL];
3066</pre></td></tr>
3067
3068
3069<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasUnarySelector0')"><a name="hasUnarySelector0Anchor">hasUnarySelector</a></td><td></td></tr>
3070<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3071
3072 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3073 matches self.bodyView in the code below, but NOT the outer message
3074 invocation of "loadHTMLString:baseURL:".
3075    [self.bodyView loadHTMLString:html baseURL:NULL];
3076</pre></td></tr>
3077
3078
3079<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>std::string RegExp</td></tr>
3080<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3081a substring matched by the given RegExp.
3082 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3083 invocation for self.bodyView.
3084    [self.bodyView loadHTMLString:html baseURL:NULL];
3085</pre></td></tr>
3086
3087
3088<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr>
3089<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3090
3091 matcher = objCMessageExpr(numSelectorArgs(0));
3092 matches self.bodyView in the code below
3093
3094 matcher = objCMessageExpr(numSelectorArgs(2));
3095 matches the invocation of "loadHTMLString:baseURL:" but not that
3096 of self.bodyView
3097    [self.bodyView loadHTMLString:html baseURL:NULL];
3098</pre></td></tr>
3099
3100
3101<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>
3102<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3103
3104Given
3105  class Y { public: void x(); };
3106  void z() { Y* y; y-&gt;x(); }
3107cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3108  matches y-&gt;x()
3109</pre></td></tr>
3110
3111
3112<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>
3113<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3114
3115Matches a node if it equals the node previously bound to ID.
3116
3117Given
3118  class X { int a; int b; };
3119cxxRecordDecl(
3120    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3121    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3122  matches the class X, as a and b have the same type.
3123
3124Note that when multiple matches are involved via forEach* matchers,
3125equalsBoundNodes acts as a filter.
3126For example:
3127compoundStmt(
3128    forEachDescendant(varDecl().bind("d")),
3129    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3130will trigger a match for each combination of variable declaration
3131and reference to that variable declaration within a compound statement.
3132</pre></td></tr>
3133
3134
3135<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>
3136<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3137the node, not hidden within a typedef.
3138
3139Given
3140  typedef const int const_int;
3141  const_int i;
3142  int *const j;
3143  int *volatile k;
3144  int m;
3145varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3146i is const-qualified but the qualifier is not local.
3147</pre></td></tr>
3148
3149
3150<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr>
3151<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3152
3153Given
3154  void a(char);
3155  void b(wchar_t);
3156  void c(double);
3157functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3158matches "a(char)", "b(wchar_t)", but not "c(double)".
3159</pre></td></tr>
3160
3161
3162<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr>
3163<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3164the Objective-C object pointer type, which is different despite being
3165syntactically similar.
3166
3167Given
3168  int *i = nullptr;
3169
3170  @interface Foo
3171  @end
3172  Foo *f;
3173
3174  int j;
3175varDecl(hasType(isAnyPointer()))
3176  matches "int *i" and "Foo *f", but not "int j".
3177</pre></td></tr>
3178
3179
3180<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>
3181<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3182include "top-level" const.
3183
3184Given
3185  void a(int);
3186  void b(int const);
3187  void c(const int);
3188  void d(const int*);
3189  void e(int const) {};
3190functionDecl(hasAnyParameter(hasType(isConstQualified())))
3191  matches "void b(int const)", "void c(const int)" and
3192  "void e(int const) {}". It does not match d as there
3193  is no top-level const on the parameter type "const int *".
3194</pre></td></tr>
3195
3196
3197<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>
3198<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3199
3200Given
3201  void a(int);
3202  void b(long);
3203  void c(double);
3204functionDecl(hasAnyParameter(hasType(isInteger())))
3205matches "a(int)", "b(long)", but not "c(double)".
3206</pre></td></tr>
3207
3208
3209<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr>
3210<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3211
3212Given
3213  void a(int);
3214  void b(unsigned long);
3215  void c(double);
3216functionDecl(hasAnyParameter(hasType(isSignedInteger())))
3217matches "a(int)", but not "b(unsigned long)" and "c(double)".
3218</pre></td></tr>
3219
3220
3221<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr>
3222<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3223
3224Given
3225  void a(int);
3226  void b(unsigned long);
3227  void c(double);
3228functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
3229matches "b(unsigned long)", but not "a(int)" and "c(double)".
3230</pre></td></tr>
3231
3232
3233<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr>
3234<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3235include "top-level" volatile.
3236
3237Given
3238  void a(int);
3239  void b(int volatile);
3240  void c(volatile int);
3241  void d(volatile int*);
3242  void e(int volatile) {};
3243functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3244  matches "void b(int volatile)", "void c(volatile int)" and
3245  "void e(int volatile) {}". It does not match d as there
3246  is no top-level volatile on the parameter type "volatile int *".
3247</pre></td></tr>
3248
3249
3250<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr>
3251<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3252
3253Example matches C, but not S or U.
3254  struct S {};
3255  class C {};
3256  union U {};
3257</pre></td></tr>
3258
3259
3260<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr>
3261<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3262
3263Example matches S, but not C or U.
3264  struct S {};
3265  class C {};
3266  union U {};
3267</pre></td></tr>
3268
3269
3270<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr>
3271<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3272
3273Example matches U, but not C or S.
3274  struct S {};
3275  class C {};
3276  union U {};
3277</pre></td></tr>
3278
3279
3280<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>
3281<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3282
3283Matches a node if it equals the node previously bound to ID.
3284
3285Given
3286  class X { int a; int b; };
3287cxxRecordDecl(
3288    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3289    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3290  matches the class X, as a and b have the same type.
3291
3292Note that when multiple matches are involved via forEach* matchers,
3293equalsBoundNodes acts as a filter.
3294For example:
3295compoundStmt(
3296    forEachDescendant(varDecl().bind("d")),
3297    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3298will trigger a match for each combination of variable declaration
3299and reference to that variable declaration within a compound statement.
3300</pre></td></tr>
3301
3302
3303<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>const Stmt* Other</td></tr>
3304<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3305
3306Stmt has pointer identity in the AST.
3307</pre></td></tr>
3308
3309
3310<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>
3311<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3312partially matching a given regex.
3313
3314Example matches Y but not X
3315    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3316  #include "ASTMatcher.h"
3317  class X {};
3318ASTMatcher.h:
3319  class Y {};
3320
3321Usable 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;
3322</pre></td></tr>
3323
3324
3325<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>
3326<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3327
3328Example matches X but not Y
3329  (matcher = cxxRecordDecl(isExpansionInMainFile())
3330  #include &lt;Y.h&gt;
3331  class X {};
3332Y.h:
3333  class Y {};
3334
3335Usable 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;
3336</pre></td></tr>
3337
3338
3339<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>
3340<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3341
3342Example matches Y but not X
3343    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3344  #include &lt;SystemHeader.h&gt;
3345  class X {};
3346SystemHeader.h:
3347  class Y {};
3348
3349Usable 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;
3350</pre></td></tr>
3351
3352
3353<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;</td><td class="name" onclick="toggle('hasSize1')"><a name="hasSize1Anchor">hasSize</a></td><td>unsigned N</td></tr>
3354<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3355
3356Given
3357  int a[42];
3358  int b[2 * 21];
3359  int c[41], d[43];
3360  char *s = "abcd";
3361  wchar_t *ws = L"abcd";
3362  char *w = "a";
3363constantArrayType(hasSize(42))
3364  matches "int a[42]" and "int b[2 * 21]"
3365stringLiteral(hasSize(4))
3366  matches "abcd", L"abcd"
3367</pre></td></tr>
3368
3369
3370<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>
3371<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3372
3373Example matches A, va, fa
3374  class A {};
3375  class B;  Doesn't match, as it has no body.
3376  int va;
3377  extern int vb;  Doesn't match, as it doesn't define the variable.
3378  void fa() {}
3379  void fb();  Doesn't match, as it has no body.
3380
3381Usable 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;
3382</pre></td></tr>
3383
3384
3385<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>
3386<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3387
3388Note that 'Value' is a string as the template argument's value is
3389an arbitrary precision integer. 'Value' must be euqal to the canonical
3390representation of that integral value in base 10.
3391
3392Given
3393  template&lt;int T&gt; struct A {};
3394  C&lt;42&gt; c;
3395classTemplateSpecializationDecl(
3396  hasAnyTemplateArgument(equalsIntegralValue("42")))
3397  matches the implicit instantiation of C in C&lt;42&gt;.
3398</pre></td></tr>
3399
3400
3401<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>
3402<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3403
3404Given
3405  template&lt;int T&gt; struct A {};
3406  C&lt;42&gt; c;
3407classTemplateSpecializationDecl(
3408  hasAnyTemplateArgument(isIntegral()))
3409  matches the implicit instantiation of C in C&lt;42&gt;
3410  with isIntegral() matching 42.
3411</pre></td></tr>
3412
3413
3414<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>
3415<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3416
3417Given
3418  template&lt;typename T&gt; struct C {};
3419  C&lt;int&gt; c;
3420classTemplateSpecializationDecl(templateArgumentCountIs(1))
3421  matches C&lt;int&gt;.
3422</pre></td></tr>
3423
3424
3425<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>
3426<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3427partially matching a given regex.
3428
3429Example matches Y but not X
3430    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3431  #include "ASTMatcher.h"
3432  class X {};
3433ASTMatcher.h:
3434  class Y {};
3435
3436Usable 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;
3437</pre></td></tr>
3438
3439
3440<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>
3441<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3442
3443Example matches X but not Y
3444  (matcher = cxxRecordDecl(isExpansionInMainFile())
3445  #include &lt;Y.h&gt;
3446  class X {};
3447Y.h:
3448  class Y {};
3449
3450Usable 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;
3451</pre></td></tr>
3452
3453
3454<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>
3455<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
3456
3457Example matches Y but not X
3458    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3459  #include &lt;SystemHeader.h&gt;
3460  class X {};
3461SystemHeader.h:
3462  class Y {};
3463
3464Usable 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;
3465</pre></td></tr>
3466
3467
3468<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr>
3469<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
3470
3471Given
3472 struct S { bool func(); };
3473functionDecl(returns(booleanType()))
3474  matches "bool func();"
3475</pre></td></tr>
3476
3477
3478<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>
3479<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
3480
3481Matches a node if it equals the node previously bound to ID.
3482
3483Given
3484  class X { int a; int b; };
3485cxxRecordDecl(
3486    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3487    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3488  matches the class X, as a and b have the same type.
3489
3490Note that when multiple matches are involved via forEach* matchers,
3491equalsBoundNodes acts as a filter.
3492For example:
3493compoundStmt(
3494    forEachDescendant(varDecl().bind("d")),
3495    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3496will trigger a match for each combination of variable declaration
3497and reference to that variable declaration within a compound statement.
3498</pre></td></tr>
3499
3500
3501<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('equalsNode2')"><a name="equalsNode2Anchor">equalsNode</a></td><td>const Type* Other</td></tr>
3502<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
3503
3504Type has pointer identity in the AST.
3505</pre></td></tr>
3506
3507
3508<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr>
3509<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
3510
3511Given
3512  int i;
3513  float f;
3514realFloatingPointType()
3515  matches "float f" but not "int i"
3516</pre></td></tr>
3517
3518
3519<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>
3520<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
3521
3522Given
3523 struct S { void func(); };
3524functionDecl(returns(voidType()))
3525  matches "void func();"
3526</pre></td></tr>
3527
3528
3529<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>
3530<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
3531
3532Given
3533  int x;
3534  int s = sizeof(x) + alignof(x)
3535unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
3536  matches sizeof(x)
3537</pre></td></tr>
3538
3539
3540<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>
3541<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3542unary).
3543
3544Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3545  !(a || b)
3546</pre></td></tr>
3547
3548
3549<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr>
3550<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
3551
3552Example matches x, but not y, z, or a.
3553(matcher = varDecl(hasAutomaticStorageDuration())
3554void f() {
3555  int x;
3556  static int y;
3557  thread_local int z;
3558}
3559int a;
3560</pre></td></tr>
3561
3562
3563<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>
3564<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
3565
3566Example matches y and z (matcher = varDecl(hasGlobalStorage())
3567void f() {
3568  int x;
3569  static int y;
3570}
3571int z;
3572</pre></td></tr>
3573
3574
3575<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>
3576<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
3577non-static local variable.
3578
3579Example matches x (matcher = varDecl(hasLocalStorage())
3580void f() {
3581  int x;
3582  static int y;
3583}
3584int z;
3585</pre></td></tr>
3586
3587
3588<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr>
3589<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
3590It includes the variable declared at namespace scope and those declared
3591with "static" and "extern" storage class specifiers.
3592
3593void f() {
3594  int x;
3595  static int y;
3596  thread_local int z;
3597}
3598int a;
3599static int b;
3600extern int c;
3601varDecl(hasStaticStorageDuration())
3602  matches the function declaration y, a, b and c.
3603</pre></td></tr>
3604
3605
3606<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr>
3607<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
3608
3609Example matches z, but not x, z, or a.
3610(matcher = varDecl(hasThreadStorageDuration())
3611void f() {
3612  int x;
3613  static int y;
3614  thread_local int z;
3615}
3616int a;
3617</pre></td></tr>
3618
3619
3620<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr>
3621<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations.
3622
3623Given:
3624  constexpr int foo = 42;
3625  constexpr int bar();
3626varDecl(isConstexpr())
3627  matches the declaration of foo.
3628functionDecl(isConstexpr())
3629  matches the declaration of bar.
3630</pre></td></tr>
3631
3632
3633<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>
3634<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3635
3636Example matches A, va, fa
3637  class A {};
3638  class B;  Doesn't match, as it has no body.
3639  int va;
3640  extern int vb;  Doesn't match, as it doesn't define the variable.
3641  void fa() {}
3642  void fb();  Doesn't match, as it has no body.
3643
3644Usable 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;
3645</pre></td></tr>
3646
3647
3648<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr>
3649<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3650a C++ catch block, or an Objective-C statement.
3651
3652Example matches x (matcher = varDecl(isExceptionVariable())
3653void f(int y) {
3654  try {
3655  } catch (int x) {
3656  }
3657}
3658</pre></td></tr>
3659
3660
3661<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>
3662<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3663static member variable template instantiations.
3664
3665Given
3666  template&lt;typename T&gt; void A(T t) { }
3667  template&lt;&gt; void A(int N) { }
3668functionDecl(isExplicitTemplateSpecialization())
3669  matches the specialization A&lt;int&gt;().
3670
3671Usable 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;
3672</pre></td></tr>
3673
3674
3675<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr>
3676<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function declarations.
3677
3678Given:
3679  extern "C" void f() {}
3680  extern "C" { void g() {} }
3681  void h() {}
3682functionDecl(isExternC())
3683  matches the declaration of f and g, but not the declaration h
3684</pre></td></tr>
3685
3686
3687<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr>
3688<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage
3689class specifier ("static" keyword) written in the source.
3690
3691Given:
3692  static void f() {}
3693  static int i = 0;
3694  extern int j;
3695  int k;
3696functionDecl(isStaticStorageClass())
3697  matches the function declaration f.
3698varDecl(isStaticStorageClass())
3699  matches the variable declaration i.
3700</pre></td></tr>
3701
3702
3703<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>
3704<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3705member variable template instantiations.
3706
3707Given
3708  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3709or
3710  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3711cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3712  matches the template instantiation of X&lt;A&gt;.
3713
3714But given
3715  template &lt;typename T&gt;  class X {}; class A {};
3716  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3717cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3718  does not match, as X&lt;A&gt; is an explicit template specialization.
3719
3720Usable 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;
3721</pre></td></tr>
3722
3723
3724<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>
3725<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3726template instantiations.
3727
3728Given
3729  template&lt;typename T&gt; void A(T t) { T i; }
3730  A(0);
3731  A(0U);
3732functionDecl(isInstantiated())
3733  matches 'A(int) {...};' and 'A(unsigned) {...}'.
3734</pre></td></tr>
3735
3736
3737<tr><td>Matcher&lt;internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;&gt;</td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr>
3738<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3739GNU's __null, C++11's nullptr, or C's NULL macro.
3740
3741Given:
3742  void *v1 = NULL;
3743  void *v2 = nullptr;
3744  void *v3 = __null; GNU extension
3745  char *cp = (char *)0;
3746  int *ip = 0;
3747  int i = 0;
3748expr(nullPointerConstant())
3749  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3750  initializer for i.
3751</pre></td></tr>
3752
3753
3754<tr><td>Matcher&lt;internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;&gt;</td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr>
3755<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3756
3757This matcher is only provided as a performance optimization of hasName.
3758    hasAnyName(a, b, c)
3759 is equivalent to, but faster than
3760    anyOf(hasName(a), hasName(b), hasName(c))
3761</pre></td></tr>
3762
3763
3764<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>
3765<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
3766
3767Given
3768  int j;
3769  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
3770  A(0);
3771  A(0U);
3772declStmt(isInTemplateInstantiation())
3773  matches 'int i;' and 'unsigned i'.
3774unless(stmt(isInTemplateInstantiation()))
3775  will NOT match j += 42; as it's shared between the template definition and
3776  instantiation.
3777</pre></td></tr>
3778
3779<!--END_NARROWING_MATCHERS -->
3780</table>
3781
3782<!-- ======================================================================= -->
3783<h2 id="traversal-matchers">AST Traversal Matchers</h2>
3784<!-- ======================================================================= -->
3785
3786<p>Traversal matchers specify the relationship to other nodes that are
3787reachable from the current node.</p>
3788
3789<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
3790forEachDescendant) which work on all nodes and allow users to write more generic
3791match expressions.</p>
3792
3793<table>
3794<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
3795<!-- START_TRAVERSAL_MATCHERS -->
3796
3797<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>
3798<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
3799
3800Unlike anyOf, eachOf will generate a match result for each
3801matching submatcher.
3802
3803For example, in:
3804  class A { int a; int b; };
3805The matcher:
3806  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
3807                       has(fieldDecl(hasName("b")).bind("v"))))
3808will generate two results binding "v", the first of which binds
3809the field declaration of a, the second the field declaration of
3810b.
3811
3812Usable as: Any Matcher
3813</pre></td></tr>
3814
3815
3816<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3817<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3818provided matcher.
3819
3820Example matches X, A, B, C
3821  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
3822  class X {};  Matches X, because X::X is a class of name X inside X.
3823  class A { class X {}; };
3824  class B { class C { class X {}; }; };
3825
3826DescendantT must be an AST base type.
3827
3828As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
3829each result that matches instead of only on the first one.
3830
3831Note: Recursively combined ForEachDescendant can cause many matches:
3832  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
3833    forEachDescendant(cxxRecordDecl())
3834  )))
3835will match 10 times (plus injected class name matches) on:
3836  class A { class B { class C { class D { class E {}; }; }; }; };
3837
3838Usable as: Any Matcher
3839</pre></td></tr>
3840
3841
3842<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
3843<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
3844provided matcher.
3845
3846Example matches X, Y
3847  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
3848  class X {};  Matches X, because X::X is a class of name X inside X.
3849  class Y { class X {}; };
3850  class Z { class Y { class X {}; }; };  Does not match Z.
3851
3852ChildT must be an AST base type.
3853
3854As opposed to 'has', 'forEach' will cause a match for each result that
3855matches instead of only on the first one.
3856
3857Usable as: Any Matcher
3858</pre></td></tr>
3859
3860
3861<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
3862<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
3863matcher.
3864
3865Given
3866void f() { if (true) { int x = 42; } }
3867void g() { for (;;) { int x = 43; } }
3868expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
3869
3870Usable as: Any Matcher
3871</pre></td></tr>
3872
3873
3874<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3875<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3876provided matcher.
3877
3878Example matches X, Y, Z
3879    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
3880  class X {};  Matches X, because X::X is a class of name X inside X.
3881  class Y { class X {}; };
3882  class Z { class Y { class X {}; }; };
3883
3884DescendantT must be an AST base type.
3885
3886Usable as: Any Matcher
3887</pre></td></tr>
3888
3889
3890<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
3891<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
3892provided matcher.
3893
3894Example matches X, Y
3895  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
3896  class X {};  Matches X, because X::X is a class of name X inside X.
3897  class Y { class X {}; };
3898  class Z { class Y { class X {}; }; };  Does not match Z.
3899
3900ChildT must be an AST base type.
3901
3902Usable as: Any Matcher
3903Note that has is direct matcher, so it also matches things like implicit
3904casts and paren casts. If you are matching with expr then you should
3905probably consider using ignoringParenImpCasts like:
3906has(ignoringParenImpCasts(expr())).
3907</pre></td></tr>
3908
3909
3910<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
3911<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
3912matcher.
3913
3914Given
3915void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
3916compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
3917
3918Usable as: Any Matcher
3919</pre></td></tr>
3920
3921
3922<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasCondition5')"><a name="hasCondition5Anchor">hasCondition</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3923<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
3924switch statement or conditional operator.
3925
3926Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
3927  if (true) {}
3928</pre></td></tr>
3929
3930
3931<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</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>
3932<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
3933(binary or ternary).
3934
3935Example matches b
3936  condition ? a : b
3937  condition ?: b
3938</pre></td></tr>
3939
3940
3941<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</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>
3942<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
3943
3944Example 1 (conditional ternary operator): matches a
3945  condition ? a : b
3946
3947Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
3948  condition ?: b
3949</pre></td></tr>
3950
3951
3952<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
3953<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
3954matches the given matcher.
3955
3956The associated declaration is:
3957- for type nodes, the declaration of the underlying type
3958- for CallExpr, the declaration of the callee
3959- for MemberExpr, the declaration of the referenced member
3960- for CXXConstructExpr, the declaration of the constructor
3961- for CXXNewExpr, the declaration of the operator new
3962
3963Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3964function. e.g. various subtypes of clang::Type and various expressions.
3965
3966Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
3967  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
3968  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
3969  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
3970  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
3971  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
3972  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3973</pre></td></tr>
3974
3975
3976<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>
3977<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
3978
3979Given
3980  int i[5];
3981  void f() { i[1] = 42; }
3982arraySubscriptExpression(hasBase(implicitCastExpr(
3983    hasSourceExpression(declRefExpr()))))
3984  matches i[1] with the declRefExpr() matching i
3985</pre></td></tr>
3986
3987
3988<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>
3989<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
3990
3991Given
3992  int i[5];
3993  void f() { i[1] = 42; }
3994arraySubscriptExpression(hasIndex(integerLiteral()))
3995  matches i[1] with the integerLiteral() matching 1
3996</pre></td></tr>
3997
3998
3999<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasLHS1')"><a name="hasLHS1Anchor">hasLHS</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4000<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
4001
4002Example matches a (matcher = binaryOperator(hasLHS()))
4003  a || b
4004</pre></td></tr>
4005
4006
4007<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasRHS1')"><a name="hasRHS1Anchor">hasRHS</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4008<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
4009
4010Example matches b (matcher = binaryOperator(hasRHS()))
4011  a || b
4012</pre></td></tr>
4013
4014
4015<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>
4016<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
4017type.
4018
4019Given
4020  struct A {};
4021  A a[7];
4022  int b[7];
4023arrayType(hasElementType(builtinType()))
4024  matches "int b[7]"
4025
4026Usable 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;
4027</pre></td></tr>
4028
4029
4030<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>
4031<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
4032type.
4033
4034Given
4035  struct A {};
4036  A a[7];
4037  int b[7];
4038arrayType(hasElementType(builtinType()))
4039  matches "int b[7]"
4040
4041Usable 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;
4042</pre></td></tr>
4043
4044
4045<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>
4046<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
4047
4048Given
4049  _Atomic(int) i;
4050  _Atomic(float) f;
4051atomicType(hasValueType(isInteger()))
4052 matches "_Atomic(int) i"
4053
4054Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
4055</pre></td></tr>
4056
4057
4058<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>
4059<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4060
4061Given
4062  _Atomic(int) i;
4063  _Atomic(float) f;
4064atomicType(hasValueType(isInteger()))
4065 matches "_Atomic(int) i"
4066
4067Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
4068</pre></td></tr>
4069
4070
4071<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>
4072<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4073
4074Note: There is no TypeLoc for the deduced type and thus no
4075getDeducedLoc() matcher.
4076
4077Given
4078  auto a = 1;
4079  auto b = 2.0;
4080autoType(hasDeducedType(isInteger()))
4081  matches "auto a"
4082
4083Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
4084</pre></td></tr>
4085
4086
4087<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>
4088<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4089binary operator matches.
4090</pre></td></tr>
4091
4092
4093<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>
4094<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
4095
4096Example matches a (matcher = binaryOperator(hasLHS()))
4097  a || b
4098</pre></td></tr>
4099
4100
4101<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>
4102<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
4103
4104Example matches b (matcher = binaryOperator(hasRHS()))
4105  a || b
4106</pre></td></tr>
4107
4108
4109<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>
4110<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
4111pointee matches a given matcher.
4112
4113Given
4114  int *a;
4115  int const *b;
4116  float const *f;
4117pointerType(pointee(isConstQualified(), isInteger()))
4118  matches "int const *b"
4119
4120Usable 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;,
4121  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;
4122</pre></td></tr>
4123
4124
4125<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>
4126<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4127pointee matches a given matcher.
4128
4129Given
4130  int *a;
4131  int const *b;
4132  float const *f;
4133pointerType(pointee(isConstQualified(), isInteger()))
4134  matches "int const *b"
4135
4136Usable 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;,
4137  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;
4138</pre></td></tr>
4139
4140
4141<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParam1')"><a name="forEachArgumentWithParam1Anchor">forEachArgumentWithParam</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; ParamMatcher</td></tr>
4142<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4143
4144Given
4145  void f(int i);
4146  int y;
4147  f(y);
4148callExpr(
4149  forEachArgumentWithParam(
4150    declRefExpr(to(varDecl(hasName("y")))),
4151    parmVarDecl(hasType(isInteger()))
4152))
4153  matches f(y);
4154with declRefExpr(...)
4155  matching int y
4156and parmVarDecl(...)
4157  matching int i
4158</pre></td></tr>
4159
4160
4161<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>
4162<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
4163expression.
4164
4165Given
4166  void x(int, int, int) { int y; x(1, y, 42); }
4167callExpr(hasAnyArgument(declRefExpr()))
4168  matches x(1, y, 42)
4169with hasAnyArgument(...)
4170  matching y
4171</pre></td></tr>
4172
4173
4174<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>
4175<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4176call expression.
4177
4178Example matches y in x(y)
4179    (matcher = callExpr(hasArgument(0, declRefExpr())))
4180  void x(int) { int y; x(y); }
4181</pre></td></tr>
4182
4183
4184<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</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>
4185<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
4186matches the given matcher.
4187
4188The associated declaration is:
4189- for type nodes, the declaration of the underlying type
4190- for CallExpr, the declaration of the callee
4191- for MemberExpr, the declaration of the referenced member
4192- for CXXConstructExpr, the declaration of the constructor
4193- for CXXNewExpr, the declaration of the operator new
4194
4195Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4196function. e.g. various subtypes of clang::Type and various expressions.
4197
4198Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
4199  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4200  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4201  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4202  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4203  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4204  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4205</pre></td></tr>
4206
4207
4208<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>
4209<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4210
4211Given
4212  class A { A() : i(42), j(42) {} int i; int j; };
4213cxxConstructorDecl(forEachConstructorInitializer(
4214  forField(decl().bind("x"))
4215))
4216  will trigger two matches, binding for 'i' and 'j' respectively.
4217</pre></td></tr>
4218
4219
4220<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>
4221<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4222
4223Given
4224  struct Foo {
4225    Foo() : foo_(1) { }
4226    int foo_;
4227  };
4228cxxRecordDecl(has(cxxConstructorDecl(
4229  hasAnyConstructorInitializer(anything())
4230)))
4231  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
4232</pre></td></tr>
4233
4234
4235<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>
4236<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
4237
4238Given
4239  struct Foo {
4240    Foo() : foo_(1) { }
4241    int foo_;
4242  };
4243cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4244    forField(hasName("foo_"))))))
4245  matches Foo
4246with forField matching foo_
4247</pre></td></tr>
4248
4249
4250<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>
4251<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
4252
4253Given
4254  struct Foo {
4255    Foo() : foo_(1) { }
4256    int foo_;
4257  };
4258cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4259    withInitializer(integerLiteral(equals(1)))))))
4260  matches Foo
4261with withInitializer matching (1)
4262</pre></td></tr>
4263
4264
4265<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>
4266<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
4267definition that has a given body.
4268
4269Given
4270  for (;;) {}
4271hasBody(compoundStmt())
4272  matches 'for (;;) {}'
4273with compoundStmt()
4274  matching '{}'
4275</pre></td></tr>
4276
4277
4278<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>
4279<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
4280
4281Example:
4282    forStmt(hasLoopVariable(anything()))
4283matches 'int x' in
4284    for (int x : a) { }
4285</pre></td></tr>
4286
4287
4288<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>
4289<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
4290
4291Example:
4292    forStmt(hasRangeInit(anything()))
4293matches 'a' in
4294    for (int x : a) { }
4295</pre></td></tr>
4296
4297
4298<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>
4299<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
4300
4301
4302<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>
4303<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
4304
4305Example matches y.x()
4306  (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
4307  class Y { public: void x(); };
4308  void z() { Y y; y.x(); }",
4309
4310FIXME: Overload to allow directly matching types?
4311</pre></td></tr>
4312
4313
4314<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>
4315<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
4316</pre></td></tr>
4317
4318
4319<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>
4320<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
4321matcher, or is a pointer to a type that matches the InnerMatcher.
4322</pre></td></tr>
4323
4324
4325<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('forEachOverridden0')"><a name="forEachOverridden0Anchor">forEachOverridden</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt; InnerMatcher</td></tr>
4326<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overriden by the given method. This matcher may
4327produce multiple matches.
4328
4329Given
4330  class A { virtual void f(); };
4331  class B : public A { void f(); };
4332  class C : public B { void f(); };
4333cxxMethodDecl(ofClass(hasName("C")),
4334              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4335  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
4336  that B::f is not overridden by C::f).
4337
4338The check can produce multiple matches in case of multiple inheritance, e.g.
4339  class A1 { virtual void f(); };
4340  class A2 { virtual void f(); };
4341  class C : public A1, public A2 { void f(); };
4342cxxMethodDecl(ofClass(hasName("C")),
4343              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4344  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
4345  once with "b" binding "A2::f" and "d" binding "C::f".
4346</pre></td></tr>
4347
4348
4349<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>
4350<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
4351belongs to.
4352
4353FIXME: Generalize this for other kinds of declarations.
4354FIXME: What other kind of declarations would we need to generalize
4355this to?
4356
4357Example matches A() in the last line
4358    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
4359        ofClass(hasName("A"))))))
4360  class A {
4361   public:
4362    A();
4363  };
4364  A a = A();
4365</pre></td></tr>
4366
4367
4368<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</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>
4369<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
4370matches the given matcher.
4371
4372The associated declaration is:
4373- for type nodes, the declaration of the underlying type
4374- for CallExpr, the declaration of the callee
4375- for MemberExpr, the declaration of the referenced member
4376- for CXXConstructExpr, the declaration of the constructor
4377- for CXXNewExpr, the declaration of the operator new
4378
4379Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4380function. e.g. various subtypes of clang::Type and various expressions.
4381
4382Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
4383  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4384  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4385  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4386  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4387  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4388  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4389</pre></td></tr>
4390
4391
4392<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>
4393<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
4394
4395Given:
4396  class A { void func(); };
4397  class B { void member(); };
4398
4399cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
4400A but not B.
4401</pre></td></tr>
4402
4403
4404<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>
4405<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
4406a class matching Base.
4407
4408Note that a class is not considered to be derived from itself.
4409
4410Example matches Y, Z, C (Base == hasName("X"))
4411  class X;
4412  class Y : public X {};  directly derived
4413  class Z : public Y {};  indirectly derived
4414  typedef X A;
4415  typedef A B;
4416  class C : public B {};  derived from a typedef of X
4417
4418In the following example, Bar matches isDerivedFrom(hasName("X")):
4419  class Foo;
4420  typedef Foo X;
4421  class Bar : public Foo {};  derived from a type that X is a typedef of
4422</pre></td></tr>
4423
4424
4425<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>
4426<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
4427match Base.
4428</pre></td></tr>
4429
4430
4431<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>
4432<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
4433given matcher.
4434
4435Example matches y.x() (matcher = callExpr(callee(
4436                                   cxxMethodDecl(hasName("x")))))
4437  class Y { public: void x(); };
4438  void z() { Y y; y.x(); }
4439</pre></td></tr>
4440
4441
4442<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>
4443<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
4444
4445Given
4446  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
4447  void f() { f(); }
4448callExpr(callee(expr()))
4449  matches this-&gt;x(), x(), y.x(), f()
4450with callee(...)
4451  matching this-&gt;x, x, y.x, f respectively
4452
4453Note: Callee cannot take the more general internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
4454because this introduces ambiguous overloads with calls to Callee taking a
4455internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
4456implemented in terms of implicit casts.
4457</pre></td></tr>
4458
4459
4460<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParam0')"><a name="forEachArgumentWithParam0Anchor">forEachArgumentWithParam</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; ParamMatcher</td></tr>
4461<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
4462
4463Given
4464  void f(int i);
4465  int y;
4466  f(y);
4467callExpr(
4468  forEachArgumentWithParam(
4469    declRefExpr(to(varDecl(hasName("y")))),
4470    parmVarDecl(hasType(isInteger()))
4471))
4472  matches f(y);
4473with declRefExpr(...)
4474  matching int y
4475and parmVarDecl(...)
4476  matching int i
4477</pre></td></tr>
4478
4479
4480<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>
4481<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
4482expression.
4483
4484Given
4485  void x(int, int, int) { int y; x(1, y, 42); }
4486callExpr(hasAnyArgument(declRefExpr()))
4487  matches x(1, y, 42)
4488with hasAnyArgument(...)
4489  matching y
4490</pre></td></tr>
4491
4492
4493<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>
4494<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
4495call expression.
4496
4497Example matches y in x(y)
4498    (matcher = callExpr(hasArgument(0, declRefExpr())))
4499  void x(int) { int y; x(y); }
4500</pre></td></tr>
4501
4502
4503<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
4504<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
4505matches the given matcher.
4506
4507The associated declaration is:
4508- for type nodes, the declaration of the underlying type
4509- for CallExpr, the declaration of the callee
4510- for MemberExpr, the declaration of the referenced member
4511- for CXXConstructExpr, the declaration of the constructor
4512- for CXXNewExpr, the declaration of the operator new
4513
4514Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4515function. e.g. various subtypes of clang::Type and various expressions.
4516
4517Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
4518  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4519  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4520  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4521  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4522  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4523  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4524</pre></td></tr>
4525
4526
4527<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>
4528<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
4529extension, matches the constant given in the statement.
4530
4531Given
4532  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
4533caseStmt(hasCaseConstant(integerLiteral()))
4534  matches "case 1:"
4535</pre></td></tr>
4536
4537
4538<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>
4539<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre></pre></td></tr>
4540
4541
4542<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>
4543<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4544functionDecl that have at least one TemplateArgument matching the given
4545InnerMatcher.
4546
4547Given
4548  template&lt;typename T&gt; class A {};
4549  template&lt;&gt; class A&lt;double&gt; {};
4550  A&lt;int&gt; a;
4551
4552  template&lt;typename T&gt; f() {};
4553  void func() { f&lt;int&gt;(); };
4554
4555classTemplateSpecializationDecl(hasAnyTemplateArgument(
4556    refersToType(asString("int"))))
4557  matches the specialization A&lt;int&gt;
4558
4559functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
4560  matches the specialization f&lt;int&gt;
4561</pre></td></tr>
4562
4563
4564<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasSpecializedTemplate0')"><a name="hasSpecializedTemplate0Anchor">hasSpecializedTemplate</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt; InnerMatcher</td></tr>
4565<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
4566
4567Given
4568  tempalate&lt;typename T&gt; class A {};
4569  typedef A&lt;int&gt; B;
4570classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
4571  matches 'B' with classTemplateDecl() matching the class template
4572  declaration of 'A'.
4573</pre></td></tr>
4574
4575
4576<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>
4577<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4578functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
4579
4580Given
4581  template&lt;typename T, typename U&gt; class A {};
4582  A&lt;bool, int&gt; b;
4583  A&lt;int, bool&gt; c;
4584
4585  template&lt;typename T&gt; f() {};
4586  void func() { f&lt;int&gt;(); };
4587classTemplateSpecializationDecl(hasTemplateArgument(
4588    1, refersToType(asString("int"))))
4589  matches the specialization A&lt;bool, int&gt;
4590
4591functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
4592  matches the specialization f&lt;int&gt;
4593</pre></td></tr>
4594
4595
4596<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>
4597<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
4598type.
4599
4600Given
4601  struct A {};
4602  A a[7];
4603  int b[7];
4604arrayType(hasElementType(builtinType()))
4605  matches "int b[7]"
4606
4607Usable 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;
4608</pre></td></tr>
4609
4610
4611<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>
4612<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
4613type.
4614
4615Given
4616  struct A {};
4617  A a[7];
4618  int b[7];
4619arrayType(hasElementType(builtinType()))
4620  matches "int b[7]"
4621
4622Usable 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;
4623</pre></td></tr>
4624
4625
4626<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>
4627<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
4628a given matcher. Also matches StmtExprs that have CompoundStmt as children.
4629
4630Given
4631  { {}; 1+2; }
4632hasAnySubstatement(compoundStmt())
4633  matches '{ {}; 1+2; }'
4634with compoundStmt()
4635  matching '{}'
4636</pre></td></tr>
4637
4638
4639<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;</td><td class="name" onclick="toggle('hasDecayedType0')"><a name="hasDecayedType0Anchor">hasDecayedType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerType</td></tr>
4640<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
4641</pre></td></tr>
4642
4643
4644<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>
4645<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
4646matches the given matcher.
4647
4648The associated declaration is:
4649- for type nodes, the declaration of the underlying type
4650- for CallExpr, the declaration of the callee
4651- for MemberExpr, the declaration of the referenced member
4652- for CXXConstructExpr, the declaration of the constructor
4653- for CXXNewExpr, the declaration of the operator new
4654
4655Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4656function. e.g. various subtypes of clang::Type and various expressions.
4657
4658Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
4659  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4660  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4661  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4662  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4663  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4664  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4665</pre></td></tr>
4666
4667
4668<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>
4669<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
4670specific using shadow declaration.
4671
4672Given
4673  namespace a { void f() {} }
4674  using a::f;
4675  void g() {
4676    f();     Matches this ..
4677    a::f();  .. but not this.
4678  }
4679declRefExpr(throughUsingDecl(anything()))
4680  matches f()
4681</pre></td></tr>
4682
4683
4684<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>
4685<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
4686specified matcher.
4687
4688Example matches x in if(x)
4689    (matcher = declRefExpr(to(varDecl(hasName("x")))))
4690  bool x;
4691  if (x) {}
4692</pre></td></tr>
4693
4694
4695<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>
4696<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
4697
4698Note that this does not work for global declarations because the AST
4699breaks up multiple-declaration DeclStmt's into multiple single-declaration
4700DeclStmt's.
4701Example: Given non-global declarations
4702  int a, b = 0;
4703  int c;
4704  int d = 2, e;
4705declStmt(containsDeclaration(
4706      0, varDecl(hasInitializer(anything()))))
4707  matches only 'int d = 2, e;', and
4708declStmt(containsDeclaration(1, varDecl()))
4709  matches 'int a, b = 0' as well as 'int d = 2, e;'
4710  but 'int c;' is not matched.
4711</pre></td></tr>
4712
4713
4714<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>
4715<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
4716
4717Given
4718  int a, b;
4719  int c;
4720declStmt(hasSingleDecl(anything()))
4721  matches 'int c;' but not 'int a, b;'.
4722</pre></td></tr>
4723
4724
4725<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>
4726<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
4727the inner matcher.
4728
4729Given
4730  int x;
4731declaratorDecl(hasTypeLoc(loc(asString("int"))))
4732  matches int x
4733</pre></td></tr>
4734
4735
4736<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>
4737<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
4738Decl, matches InnerMatcher.
4739
4740Given
4741  namespace N {
4742    namespace M {
4743      class D {};
4744    }
4745  }
4746
4747cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
4748declaration of class D.
4749</pre></td></tr>
4750
4751
4752<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>
4753<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
4754definition that has a given body.
4755
4756Given
4757  for (;;) {}
4758hasBody(compoundStmt())
4759  matches 'for (;;) {}'
4760with compoundStmt()
4761  matching '{}'
4762</pre></td></tr>
4763
4764
4765<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>
4766<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
4767switch statement or conditional operator.
4768
4769Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4770  if (true) {}
4771</pre></td></tr>
4772
4773
4774<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>
4775<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
4776matches InnerMatcher if the qualifier exists.
4777
4778Given
4779  namespace N {
4780    namespace M {
4781      class D {};
4782    }
4783  }
4784  N::M::D d;
4785
4786elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
4787matches the type of the variable declaration of d.
4788</pre></td></tr>
4789
4790
4791<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>
4792<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
4793
4794Given
4795  namespace N {
4796    namespace M {
4797      class D {};
4798    }
4799  }
4800  N::M::D d;
4801
4802elaboratedType(namesType(recordType(
4803hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
4804declaration of d.
4805</pre></td></tr>
4806
4807
4808<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>
4809<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
4810matches the given matcher.
4811
4812The associated declaration is:
4813- for type nodes, the declaration of the underlying type
4814- for CallExpr, the declaration of the callee
4815- for MemberExpr, the declaration of the referenced member
4816- for CXXConstructExpr, the declaration of the constructor
4817- for CXXNewExpr, the declaration of the operator new
4818
4819Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4820function. e.g. various subtypes of clang::Type and various expressions.
4821
4822Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
4823  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4824  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4825  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4826  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4827  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4828  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4829</pre></td></tr>
4830
4831
4832<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>
4833<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
4834
4835(Note: Clang's AST refers to other conversions as "casts" too, and calls
4836actual casts "explicit" casts.)
4837</pre></td></tr>
4838
4839
4840<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</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>
4841<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
4842declaration's type.
4843
4844In case of a value declaration (for example a variable declaration),
4845this resolves one layer of indirection. For example, in the value
4846declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
4847X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
4848declaration of x.
4849
4850Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4851            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4852 class X {};
4853 void y(X &amp;x) { x; X z; }
4854
4855Usable 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;
4856</pre></td></tr>
4857
4858
4859<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>
4860<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
4861matcher.
4862
4863Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4864            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4865            and U (matcher = typedefDecl(hasType(asString("int")))
4866 class X {};
4867 void y(X &amp;x) { x; X z; }
4868 typedef int U;
4869</pre></td></tr>
4870
4871
4872<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>
4873<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
4874are stripped off.
4875
4876Parentheses and explicit casts are not discarded.
4877Given
4878  int arr[5];
4879  int a = 0;
4880  char b = 0;
4881  const int c = a;
4882  int *d = arr;
4883  long e = (long) 0l;
4884The matchers
4885   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
4886   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
4887would match the declarations for a, b, c, and d, but not e.
4888While
4889   varDecl(hasInitializer(integerLiteral()))
4890   varDecl(hasInitializer(declRefExpr()))
4891only match the declarations for b, c, and d.
4892</pre></td></tr>
4893
4894
4895<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringImplicit0')"><a name="ignoringImplicit0Anchor">ignoringImplicit</a></td><td>ast_matchers::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4896<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
4897nodes are stripped off.
4898
4899Parentheses and explicit casts are not discarded.
4900Given
4901  class C {};
4902  C a = C();
4903  C b;
4904  C c = b;
4905The matchers
4906   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
4907would match the declarations for a, b, and c.
4908While
4909   varDecl(hasInitializer(cxxConstructExpr()))
4910only match the declarations for b and c.
4911</pre></td></tr>
4912
4913
4914<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>
4915<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
4916casts are stripped off.
4917
4918Implicit and non-C Style casts are also discarded.
4919Given
4920  int a = 0;
4921  char b = (0);
4922  void* c = reinterpret_cast&lt;char*&gt;(0);
4923  char d = char(0);
4924The matcher
4925   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
4926would match the declarations for a, b, c, and d.
4927while
4928   varDecl(hasInitializer(integerLiteral()))
4929only match the declaration for a.
4930</pre></td></tr>
4931
4932
4933<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>
4934<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
4935parentheses are stripped off.
4936
4937Explicit casts are not discarded.
4938Given
4939  int arr[5];
4940  int a = 0;
4941  char b = (0);
4942  const int c = a;
4943  int *d = (arr);
4944  long e = ((long) 0l);
4945The matchers
4946   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
4947   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
4948would match the declarations for a, b, c, and d, but not e.
4949while
4950   varDecl(hasInitializer(integerLiteral()))
4951   varDecl(hasInitializer(declRefExpr()))
4952would only match the declaration for a.
4953</pre></td></tr>
4954
4955
4956<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('hasInClassInitializer0')"><a name="hasInClassInitializer0Anchor">hasInClassInitializer</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4957<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
4958
4959Given
4960  class C {
4961    int a = 2;
4962    int b = 3;
4963    int c;
4964  };
4965fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
4966  matches 'int a;' but not 'int b;'.
4967fieldDecl(hasInClassInitializer(anything()))
4968  matches 'int a;' and 'int b;' but not 'int c;'.
4969</pre></td></tr>
4970
4971
4972<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>
4973<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
4974definition that has a given body.
4975
4976Given
4977  for (;;) {}
4978hasBody(compoundStmt())
4979  matches 'for (;;) {}'
4980with compoundStmt()
4981  matching '{}'
4982</pre></td></tr>
4983
4984
4985<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>
4986<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
4987switch statement or conditional operator.
4988
4989Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4990  if (true) {}
4991</pre></td></tr>
4992
4993
4994<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>
4995<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
4996
4997Example:
4998    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
4999matches '++x' in
5000    for (x; x &lt; N; ++x) { }
5001</pre></td></tr>
5002
5003
5004<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>
5005<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
5006
5007Example:
5008    forStmt(hasLoopInit(declStmt()))
5009matches 'int x = 0' in
5010    for (int x = 0; x &lt; N; ++x) { }
5011</pre></td></tr>
5012
5013
5014<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>
5015<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
5016
5017Does not match the 'this' parameter of a method.
5018
5019Given
5020  class X { void f(int x, int y, int z) {} };
5021cxxMethodDecl(hasAnyParameter(hasName("y")))
5022  matches f(int x, int y, int z) {}
5023with hasAnyParameter(...)
5024  matching int y
5025</pre></td></tr>
5026
5027
5028<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument2')"><a name="hasAnyTemplateArgument2Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
5029<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5030functionDecl that have at least one TemplateArgument matching the given
5031InnerMatcher.
5032
5033Given
5034  template&lt;typename T&gt; class A {};
5035  template&lt;&gt; class A&lt;double&gt; {};
5036  A&lt;int&gt; a;
5037
5038  template&lt;typename T&gt; f() {};
5039  void func() { f&lt;int&gt;(); };
5040
5041classTemplateSpecializationDecl(hasAnyTemplateArgument(
5042    refersToType(asString("int"))))
5043  matches the specialization A&lt;int&gt;
5044
5045functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5046  matches the specialization f&lt;int&gt;
5047</pre></td></tr>
5048
5049
5050<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasBody4')"><a name="hasBody4Anchor">hasBody</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
5051<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
5052definition that has a given body.
5053
5054Given
5055  for (;;) {}
5056hasBody(compoundStmt())
5057  matches 'for (;;) {}'
5058with compoundStmt()
5059  matching '{}'
5060</pre></td></tr>
5061
5062
5063<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>
5064<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
5065
5066Given
5067  class X { void f(int x) {} };
5068cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5069  matches f(int x) {}
5070with hasParameter(...)
5071  matching int x
5072</pre></td></tr>
5073
5074
5075<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgument2')"><a name="hasTemplateArgument2Anchor">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>
5076<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5077functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5078
5079Given
5080  template&lt;typename T, typename U&gt; class A {};
5081  A&lt;bool, int&gt; b;
5082  A&lt;int, bool&gt; c;
5083
5084  template&lt;typename T&gt; f() {};
5085  void func() { f&lt;int&gt;(); };
5086classTemplateSpecializationDecl(hasTemplateArgument(
5087    1, refersToType(asString("int"))))
5088  matches the specialization A&lt;bool, int&gt;
5089
5090functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5091  matches the specialization f&lt;int&gt;
5092</pre></td></tr>
5093
5094
5095<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>
5096<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
5097
5098Given:
5099  class X { int f() { return 1; } };
5100cxxMethodDecl(returns(asString("int")))
5101  matches int f() { return 1; }
5102</pre></td></tr>
5103
5104
5105<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>
5106<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
5107switch statement or conditional operator.
5108
5109Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5110  if (true) {}
5111</pre></td></tr>
5112
5113
5114<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>
5115<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
5116
5117Given
5118  if (A* a = GetAPointer()) {}
5119hasConditionVariableStatement(...)
5120  matches 'A* a = GetAPointer()'.
5121</pre></td></tr>
5122
5123
5124<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>
5125<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
5126
5127Examples matches the if statement
5128  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
5129  if (false) false; else true;
5130</pre></td></tr>
5131
5132
5133<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>
5134<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
5135
5136Examples matches the if statement
5137  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
5138  if (false) true; else false;
5139</pre></td></tr>
5140
5141
5142<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>
5143<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
5144matcher.
5145
5146FIXME: Unit test this matcher
5147</pre></td></tr>
5148
5149
5150<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;</td><td class="name" onclick="toggle('hasSyntacticForm0')"><a name="hasSyntacticForm0Anchor">hasSyntacticForm</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5151<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
5152(if expression have it).
5153</pre></td></tr>
5154
5155
5156<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>
5157<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
5158matches the given matcher.
5159
5160The associated declaration is:
5161- for type nodes, the declaration of the underlying type
5162- for CallExpr, the declaration of the callee
5163- for MemberExpr, the declaration of the referenced member
5164- for CXXConstructExpr, the declaration of the constructor
5165- for CXXNewExpr, the declaration of the operator new
5166
5167Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5168function. e.g. various subtypes of clang::Type and various expressions.
5169
5170Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5171  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5172  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5173  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5174  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5175  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5176  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5177</pre></td></tr>
5178
5179
5180<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>
5181<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
5182matches the given matcher.
5183
5184The associated declaration is:
5185- for type nodes, the declaration of the underlying type
5186- for CallExpr, the declaration of the callee
5187- for MemberExpr, the declaration of the referenced member
5188- for CXXConstructExpr, the declaration of the constructor
5189- for CXXNewExpr, the declaration of the operator new
5190
5191Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5192function. e.g. various subtypes of clang::Type and various expressions.
5193
5194Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5195  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5196  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5197  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5198  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5199  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5200  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5201</pre></td></tr>
5202
5203
5204<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>
5205<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
5206matches the given matcher.
5207
5208The associated declaration is:
5209- for type nodes, the declaration of the underlying type
5210- for CallExpr, the declaration of the callee
5211- for MemberExpr, the declaration of the referenced member
5212- for CXXConstructExpr, the declaration of the constructor
5213- for CXXNewExpr, the declaration of the operator new
5214
5215Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5216function. e.g. various subtypes of clang::Type and various expressions.
5217
5218Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5219  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5220  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5221  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5222  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5223  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5224  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5225</pre></td></tr>
5226
5227
5228<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>
5229<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
5230matched by a given matcher.
5231
5232Given
5233  struct X { int m; };
5234  void f(X x) { x.m; m; }
5235memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
5236  matches "x.m" and "m"
5237with hasObjectExpression(...)
5238  matching "x" and the implicit object expression of "m" which has type X*.
5239</pre></td></tr>
5240
5241
5242<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>
5243<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
5244given matcher.
5245
5246Given
5247  struct { int first, second; } first, second;
5248  int i(second.first);
5249  int j(first.second);
5250memberExpr(member(hasName("first")))
5251  matches second.first
5252  but not first.second (because the member name there is "second").
5253</pre></td></tr>
5254
5255
5256<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>
5257<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
5258pointee matches a given matcher.
5259
5260Given
5261  int *a;
5262  int const *b;
5263  float const *f;
5264pointerType(pointee(isConstQualified(), isInteger()))
5265  matches "int const *b"
5266
5267Usable 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;,
5268  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;
5269</pre></td></tr>
5270
5271
5272<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>
5273<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
5274pointee matches a given matcher.
5275
5276Given
5277  int *a;
5278  int const *b;
5279  float const *f;
5280pointerType(pointee(isConstQualified(), isInteger()))
5281  matches "int const *b"
5282
5283Usable 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;,
5284  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;
5285</pre></td></tr>
5286
5287
5288<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasUnderlyingDecl0')"><a name="hasUnderlyingDecl0Anchor">hasUnderlyingDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; InnerMatcher</td></tr>
5289<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
5290matcher.
5291
5292Given
5293  namespace N { template&lt;class T&gt; void f(T t); }
5294  template &lt;class T&gt; void g() { using N::f; f(T()); }
5295unresolvedLookupExpr(hasAnyDeclaration(
5296    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
5297  matches the use of f in g() .
5298</pre></td></tr>
5299
5300
5301<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>
5302<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
5303
5304Given
5305  struct A { struct B { struct C {}; }; };
5306  A::B::C c;
5307nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
5308  matches "A::"
5309</pre></td></tr>
5310
5311
5312<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>
5313<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
5314given TypeLoc.
5315
5316Given
5317  struct A { struct B { struct C {}; }; };
5318  A::B::C c;
5319nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
5320  hasDeclaration(cxxRecordDecl(hasName("A")))))))
5321  matches "A::"
5322</pre></td></tr>
5323
5324
5325<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>
5326<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
5327
5328Given
5329  struct A { struct B { struct C {}; }; };
5330  A::B::C c;
5331nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
5332  matches "A::"
5333</pre></td></tr>
5334
5335
5336<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>
5337<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
5338given namespace matcher.
5339
5340Given
5341  namespace ns { struct A {}; }
5342  ns::A a;
5343nestedNameSpecifier(specifiesNamespace(hasName("ns")))
5344  matches "ns::"
5345</pre></td></tr>
5346
5347
5348<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>
5349<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
5350given QualType matcher without qualifiers.
5351
5352Given
5353  struct A { struct B { struct C {}; }; };
5354  A::B::C c;
5355nestedNameSpecifier(specifiesType(
5356  hasDeclaration(cxxRecordDecl(hasName("A")))
5357))
5358  matches "A::"
5359</pre></td></tr>
5360
5361
5362<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument2')"><a name="hasArgument2Anchor">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>
5363<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
5364call expression.
5365
5366Example matches y in x(y)
5367    (matcher = callExpr(hasArgument(0, declRefExpr())))
5368  void x(int) { int y; x(y); }
5369</pre></td></tr>
5370
5371
5372<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasReceiverType0')"><a name="hasReceiverType0Anchor">hasReceiverType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
5373<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
5374
5375Example
5376matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
5377matches the [webView ...] message invocation.
5378  NSString *webViewJavaScript = ...
5379  UIWebView *webView = ...
5380  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
5381</pre></td></tr>
5382
5383
5384<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;</td><td class="name" onclick="toggle('hasSourceExpression1')"><a name="hasSourceExpression1Anchor">hasSourceExpression</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5385<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre></pre></td></tr>
5386
5387
5388<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1OverloadExpr.html">OverloadExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyDeclaration0')"><a name="hasAnyDeclaration0Anchor">hasAnyDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
5389<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
5390overloads matches the given matcher.
5391
5392Given
5393  template &lt;typename T&gt; void foo(T);
5394  template &lt;typename T&gt; void bar(T);
5395  template &lt;typename T&gt; void baz(T t) {
5396    foo(t);
5397    bar(t);
5398  }
5399unresolvedLookupExpr(hasAnyDeclaration(
5400    functionTemplateDecl(hasName("foo"))))
5401  matches foo in foo(t); but not bar in bar(t);
5402</pre></td></tr>
5403
5404
5405<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>
5406<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
5407
5408Given
5409  int (*ptr_to_array)[4];
5410  int (*ptr_to_func)(int);
5411
5412varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
5413ptr_to_func but not ptr_to_array.
5414
5415Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
5416</pre></td></tr>
5417
5418
5419<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>
5420<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
5421pointee matches a given matcher.
5422
5423Given
5424  int *a;
5425  int const *b;
5426  float const *f;
5427pointerType(pointee(isConstQualified(), isInteger()))
5428  matches "int const *b"
5429
5430Usable 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;,
5431  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;
5432</pre></td></tr>
5433
5434
5435<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>
5436<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
5437pointee matches a given matcher.
5438
5439Given
5440  int *a;
5441  int const *b;
5442  float const *f;
5443pointerType(pointee(isConstQualified(), isInteger()))
5444  matches "int const *b"
5445
5446Usable 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;,
5447  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;
5448</pre></td></tr>
5449
5450
5451<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>
5452<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
5453
5454Given:
5455  typedef int &amp;int_ref;
5456  int a;
5457  int_ref b = a;
5458
5459varDecl(hasType(qualType(referenceType()))))) will not match the
5460declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
5461</pre></td></tr>
5462
5463
5464<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>
5465<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
5466matches the given matcher.
5467
5468The associated declaration is:
5469- for type nodes, the declaration of the underlying type
5470- for CallExpr, the declaration of the callee
5471- for MemberExpr, the declaration of the referenced member
5472- for CXXConstructExpr, the declaration of the constructor
5473- for CXXNewExpr, the declaration of the operator new
5474
5475Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5476function. e.g. various subtypes of clang::Type and various expressions.
5477
5478Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5479  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5480  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5481  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5482  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5483  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5484  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5485</pre></td></tr>
5486
5487
5488<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('ignoringParens0')"><a name="ignoringParens0Anchor">ignoringParens</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
5489<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
5490
5491Given
5492  void (*fp)(void);
5493The matcher
5494  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
5495would match the declaration for fp.
5496</pre></td></tr>
5497
5498
5499<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>
5500<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
5501</pre></td></tr>
5502
5503
5504<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>
5505<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
5506matches the specified matcher.
5507
5508Example matches y-&gt;x()
5509  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
5510     cxxRecordDecl(hasName("Y")))))))
5511  class Y { public: void x(); };
5512  void z() { Y *y; y-&gt;x(); }
5513</pre></td></tr>
5514
5515
5516<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>
5517<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
5518</pre></td></tr>
5519
5520
5521<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>
5522<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
5523type matches the specified matcher.
5524
5525Example matches X &amp;x and const X &amp;y
5526    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
5527  class X {
5528    void a(X b) {
5529      X &amp;x = b;
5530      const X &amp;y = b;
5531    }
5532  };
5533</pre></td></tr>
5534
5535
5536<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>
5537<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
5538matches the given matcher.
5539
5540The associated declaration is:
5541- for type nodes, the declaration of the underlying type
5542- for CallExpr, the declaration of the callee
5543- for MemberExpr, the declaration of the referenced member
5544- for CXXConstructExpr, the declaration of the constructor
5545- for CXXNewExpr, the declaration of the operator new
5546
5547Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5548function. e.g. various subtypes of clang::Type and various expressions.
5549
5550Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5551  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5552  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5553  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5554  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5555  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5556  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5557</pre></td></tr>
5558
5559
5560<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>
5561<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
5562pointee matches a given matcher.
5563
5564Given
5565  int *a;
5566  int const *b;
5567  float const *f;
5568pointerType(pointee(isConstQualified(), isInteger()))
5569  matches "int const *b"
5570
5571Usable 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;,
5572  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;
5573</pre></td></tr>
5574
5575
5576<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>
5577<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
5578pointee matches a given matcher.
5579
5580Given
5581  int *a;
5582  int const *b;
5583  float const *f;
5584pointerType(pointee(isConstQualified(), isInteger()))
5585  matches "int const *b"
5586
5587Usable 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;,
5588  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;
5589</pre></td></tr>
5590
5591
5592<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;</td><td class="name" onclick="toggle('hasReturnValue0')"><a name="hasReturnValue0Anchor">hasReturnValue</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5593<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
5594
5595Given
5596  return a + b;
5597hasReturnValue(binaryOperator())
5598  matches 'return a + b'
5599with binaryOperator()
5600  matching 'a + b'
5601</pre></td></tr>
5602
5603
5604<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnySubstatement1')"><a name="hasAnySubstatement1Anchor">hasAnySubstatement</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
5605<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
5606a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5607
5608Given
5609  { {}; 1+2; }
5610hasAnySubstatement(compoundStmt())
5611  matches '{ {}; 1+2; }'
5612with compoundStmt()
5613  matching '{}'
5614</pre></td></tr>
5615
5616
5617<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>
5618<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5619alignof.
5620</pre></td></tr>
5621
5622
5623<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forFunction0')"><a name="forFunction0Anchor">forFunction</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt; InnerMatcher</td></tr>
5624<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to
5625
5626Given:
5627F&amp; operator=(const F&amp; o) {
5628  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
5629  return *this;
5630}
5631returnStmt(forFunction(hasName("operator=")))
5632  matches 'return *this'
5633  but does match 'return &gt; 0'
5634</pre></td></tr>
5635
5636
5637<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>
5638<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5639sizeof.
5640</pre></td></tr>
5641
5642
5643<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasReplacementType0')"><a name="hasReplacementType0Anchor">hasReplacementType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
5644<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
5645type that matches the provided matcher.
5646
5647Given
5648  template &lt;typename T&gt;
5649  double F(T t);
5650  int i;
5651  double j = F(i);
5652
5653substTemplateTypeParmType(hasReplacementType(type())) matches int
5654</pre></td></tr>
5655
5656
5657<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>
5658<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
5659statement. This matcher may produce multiple matches.
5660
5661Given
5662  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
5663switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
5664  matches four times, with "c" binding each of "case 1:", "case 2:",
5665"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
5666"switch (1)", "switch (2)" and "switch (2)".
5667</pre></td></tr>
5668
5669
5670<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</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>
5671<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
5672switch statement or conditional operator.
5673
5674Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5675  if (true) {}
5676</pre></td></tr>
5677
5678
5679<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>
5680<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
5681matches the given matcher.
5682
5683The associated declaration is:
5684- for type nodes, the declaration of the underlying type
5685- for CallExpr, the declaration of the callee
5686- for MemberExpr, the declaration of the referenced member
5687- for CXXConstructExpr, the declaration of the constructor
5688- for CXXNewExpr, the declaration of the operator new
5689
5690Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5691function. e.g. various subtypes of clang::Type and various expressions.
5692
5693Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5694  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5695  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5696  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5697  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5698  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5699  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5700</pre></td></tr>
5701
5702
5703<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>
5704<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
5705
5706Given
5707  template&lt;typename T&gt; struct A {};
5708  struct B { B* next; };
5709  A&lt;&amp;B::next&gt; a;
5710templateSpecializationType(hasAnyTemplateArgument(
5711  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
5712  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5713    B::next
5714</pre></td></tr>
5715
5716
5717<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>
5718<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
5719declaration.
5720
5721Given
5722  template&lt;typename T&gt; struct A {};
5723  struct B { B* next; };
5724  A&lt;&amp;B::next&gt; a;
5725classTemplateSpecializationDecl(hasAnyTemplateArgument(
5726    refersToDeclaration(fieldDecl(hasName("next"))))
5727  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5728    B::next
5729</pre></td></tr>
5730
5731
5732<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>
5733<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
5734
5735Given
5736  template&lt;int T&gt; struct A {};
5737  C&lt;42&gt; c;
5738classTemplateSpecializationDecl(
5739  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
5740  matches the implicit instantiation of C in C&lt;42&gt;.
5741</pre></td></tr>
5742
5743
5744<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToTemplate0')"><a name="refersToTemplate0Anchor">refersToTemplate</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt; InnerMatcher</td></tr>
5745<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
5746
5747Given
5748  template&lt;template &lt;typename&gt; class S&gt; class X {};
5749  template&lt;typename T&gt; class Y {};"
5750  X&lt;Y&gt; xi;
5751classTemplateSpecializationDecl(hasAnyTemplateArgument(
5752    refersToTemplate(templateName())))
5753  matches the specialization X&lt;Y&gt;
5754</pre></td></tr>
5755
5756
5757<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>
5758<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
5759
5760Given
5761  struct X {};
5762  template&lt;typename T&gt; struct A {};
5763  A&lt;X&gt; a;
5764classTemplateSpecializationDecl(hasAnyTemplateArgument(
5765    refersToType(class(hasName("X")))))
5766  matches the specialization A&lt;X&gt;
5767</pre></td></tr>
5768
5769
5770<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>
5771<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5772functionDecl that have at least one TemplateArgument matching the given
5773InnerMatcher.
5774
5775Given
5776  template&lt;typename T&gt; class A {};
5777  template&lt;&gt; class A&lt;double&gt; {};
5778  A&lt;int&gt; a;
5779
5780  template&lt;typename T&gt; f() {};
5781  void func() { f&lt;int&gt;(); };
5782
5783classTemplateSpecializationDecl(hasAnyTemplateArgument(
5784    refersToType(asString("int"))))
5785  matches the specialization A&lt;int&gt;
5786
5787functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5788  matches the specialization f&lt;int&gt;
5789</pre></td></tr>
5790
5791
5792<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>
5793<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
5794matches the given matcher.
5795
5796The associated declaration is:
5797- for type nodes, the declaration of the underlying type
5798- for CallExpr, the declaration of the callee
5799- for MemberExpr, the declaration of the referenced member
5800- for CXXConstructExpr, the declaration of the constructor
5801- for CXXNewExpr, the declaration of the operator new
5802
5803Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5804function. e.g. various subtypes of clang::Type and various expressions.
5805
5806Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5807  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5808  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5809  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5810  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5811  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5812  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5813</pre></td></tr>
5814
5815
5816<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>
5817<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5818functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5819
5820Given
5821  template&lt;typename T, typename U&gt; class A {};
5822  A&lt;bool, int&gt; b;
5823  A&lt;int, bool&gt; c;
5824
5825  template&lt;typename T&gt; f() {};
5826  void func() { f&lt;int&gt;(); };
5827classTemplateSpecializationDecl(hasTemplateArgument(
5828    1, refersToType(asString("int"))))
5829  matches the specialization A&lt;bool, int&gt;
5830
5831functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5832  matches the specialization f&lt;int&gt;
5833</pre></td></tr>
5834
5835
5836<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>
5837<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
5838matches the given matcher.
5839
5840The associated declaration is:
5841- for type nodes, the declaration of the underlying type
5842- for CallExpr, the declaration of the callee
5843- for MemberExpr, the declaration of the referenced member
5844- for CXXConstructExpr, the declaration of the constructor
5845- for CXXNewExpr, the declaration of the operator new
5846
5847Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5848function. e.g. various subtypes of clang::Type and various expressions.
5849
5850Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5851  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5852  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5853  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5854  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5855  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5856  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5857</pre></td></tr>
5858
5859
5860<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>
5861<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5862
5863Generates results for each match.
5864
5865For example, in:
5866  class A { class B {}; class C {}; };
5867The matcher:
5868  cxxRecordDecl(hasName("::A"),
5869                findAll(cxxRecordDecl(isDefinition()).bind("m")))
5870will generate results for A, B and C.
5871
5872Usable as: Any Matcher
5873</pre></td></tr>
5874
5875
5876<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</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>
5877<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
5878matcher.
5879
5880Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5881            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5882            and U (matcher = typedefDecl(hasType(asString("int")))
5883 class X {};
5884 void y(X &amp;x) { x; X z; }
5885 typedef int U;
5886</pre></td></tr>
5887
5888
5889<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>
5890<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
5891matches the given matcher.
5892
5893The associated declaration is:
5894- for type nodes, the declaration of the underlying type
5895- for CallExpr, the declaration of the callee
5896- for MemberExpr, the declaration of the referenced member
5897- for CXXConstructExpr, the declaration of the constructor
5898- for CXXNewExpr, the declaration of the operator new
5899
5900Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5901function. e.g. various subtypes of clang::Type and various expressions.
5902
5903Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5904  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5905  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5906  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5907  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5908  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5909  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5910</pre></td></tr>
5911
5912
5913<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('hasUnqualifiedDesugaredType0')"><a name="hasUnqualifiedDesugaredType0Anchor">hasUnqualifiedDesugaredType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt; InnerMatcher</td></tr>
5914<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
5915type of the matched node.
5916
5917For example, in:
5918  class A {};
5919  using B = A;
5920The matcher type(hasUniqualifeidDesugaredType(recordType())) matches
5921both B and A.
5922</pre></td></tr>
5923
5924
5925<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>
5926<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
5927
5928Given
5929  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
5930unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
5931  matches sizeof(a) and alignof(c)
5932</pre></td></tr>
5933
5934
5935<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>
5936<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
5937
5938Example matches true (matcher = hasUnaryOperand(
5939                                  cxxBoolLiteral(equals(true))))
5940  !true
5941</pre></td></tr>
5942
5943
5944<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>
5945<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
5946matches the given matcher.
5947
5948The associated declaration is:
5949- for type nodes, the declaration of the underlying type
5950- for CallExpr, the declaration of the callee
5951- for MemberExpr, the declaration of the referenced member
5952- for CXXConstructExpr, the declaration of the constructor
5953- for CXXNewExpr, the declaration of the operator new
5954
5955Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5956function. e.g. various subtypes of clang::Type and various expressions.
5957
5958Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5959  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5960  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5961  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5962  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5963  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5964  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5965</pre></td></tr>
5966
5967
5968<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>
5969<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
5970
5971Given
5972  namespace X { void b(); }
5973  using X::b;
5974usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
5975  matches using X::b </pre></td></tr>
5976
5977
5978<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>
5979<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
5980matched by the given matcher.
5981
5982Given
5983  namespace X { int a; void b(); }
5984  using X::a;
5985  using X::b;
5986usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
5987  matches using X::b but not using X::a </pre></td></tr>
5988
5989
5990<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
5991<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
5992declaration's type.
5993
5994In case of a value declaration (for example a variable declaration),
5995this resolves one layer of indirection. For example, in the value
5996declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5997X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5998declaration of x.
5999
6000Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6001            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6002 class X {};
6003 void y(X &amp;x) { x; X z; }
6004
6005Usable 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;
6006</pre></td></tr>
6007
6008
6009<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</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_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
6010<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
6011matcher.
6012
6013Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6014            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6015            and U (matcher = typedefDecl(hasType(asString("int")))
6016 class X {};
6017 void y(X &amp;x) { x; X z; }
6018 typedef int U;
6019</pre></td></tr>
6020
6021
6022<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>
6023<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
6024that matches the given matcher.
6025
6026Example matches x (matcher = varDecl(hasInitializer(callExpr())))
6027  bool y() { return true; }
6028  bool x = y();
6029</pre></td></tr>
6030
6031
6032<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>
6033<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
6034expression.
6035
6036Given
6037  void f(int b) {
6038    int a[b];
6039  }
6040variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
6041  varDecl(hasName("b")))))))
6042  matches "int a[b]"
6043</pre></td></tr>
6044
6045
6046<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>
6047<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
6048definition that has a given body.
6049
6050Given
6051  for (;;) {}
6052hasBody(compoundStmt())
6053  matches 'for (;;) {}'
6054with compoundStmt()
6055  matching '{}'
6056</pre></td></tr>
6057
6058
6059<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>
6060<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
6061switch statement or conditional operator.
6062
6063Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6064  if (true) {}
6065</pre></td></tr>
6066
6067
6068<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>
6069<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
6070NestedNameSpecifier-matcher matches.
6071</pre></td></tr>
6072
6073
6074<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>
6075<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
6076QualType-matcher matches.
6077</pre></td></tr>
6078
6079<!--END_TRAVERSAL_MATCHERS -->
6080</table>
6081
6082</div>
6083</body>
6084</html>
6085
6086
6087