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('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>
1733<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1734
1735Given
1736  template &lt;typename T&gt;
1737  class C { };
1738
1739  template class C&lt;int&gt;;  A
1740  C&lt;char&gt; var;            B
1741
1742templateSpecializationType() matches the type of the explicit
1743instantiation in A and the type of the variable declaration in B.
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('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>
1748<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
1749
1750Example matches T, but not int.
1751    (matcher = templateTypeParmType())
1752  template &lt;typename T&gt; void f(int i);
1753</pre></td></tr>
1754
1755
1756<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>
1757<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1758</pre></td></tr>
1759
1760
1761<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>
1762<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1763
1764Given
1765  typedef int X;
1766typedefType()
1767  matches "typedef int X"
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('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>
1772<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1773
1774Given:
1775  typedef __underlying_type(T) type;
1776unaryTransformType()
1777  matches "__underlying_type(T)"
1778</pre></td></tr>
1779
1780
1781<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>
1782<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1783integer-constant-expression.
1784
1785Given
1786  void f() {
1787    int a[] = { 2, 3 }
1788    int b[42];
1789    int c[a[0]];
1790  }
1791variableArrayType()
1792  matches "int c[a[0]]"
1793</pre></td></tr>
1794
1795<!--END_DECL_MATCHERS -->
1796</table>
1797
1798<!-- ======================================================================= -->
1799<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1800<!-- ======================================================================= -->
1801
1802<p>Narrowing matchers match certain attributes on the current node, thus
1803narrowing down the set of nodes of the current type to match on.</p>
1804
1805<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1806which allow users to create more powerful match expressions.</p>
1807
1808<table>
1809<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1810<!-- START_NARROWING_MATCHERS -->
1811
1812<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>
1813<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1814
1815Usable as: Any Matcher
1816</pre></td></tr>
1817
1818
1819<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>
1820<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1821
1822Usable as: Any Matcher
1823</pre></td></tr>
1824
1825
1826<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1827<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1828
1829Useful when another matcher requires a child matcher, but there's no
1830additional constraint. This will often be used with an explicit conversion
1831to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1832
1833Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1834"int* p" and "void f()" in
1835  int* p;
1836  void f();
1837
1838Usable as: Any Matcher
1839</pre></td></tr>
1840
1841
1842<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
1843<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1844
1845Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
1846  class X {};
1847  class Y {};
1848
1849Usable as: Any Matcher
1850</pre></td></tr>
1851
1852
1853<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>
1854<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1855unary).
1856
1857Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1858  !(a || b)
1859</pre></td></tr>
1860
1861
1862<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>
1863<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
1864
1865Given
1866  f('false, 3.14, 42);
1867characterLiteral(equals(0))
1868  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
1869  match false
1870floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
1871  match 3.14
1872integerLiteral(equals(42))
1873  matches 42
1874
1875Note that you cannot directly match a negative numeric literal because the
1876minus sign is not part of the literal: It is a unary operator whose operand
1877is the positive numeric literal. Instead, you must use a unaryOperator()
1878matcher to match the minus sign:
1879
1880unaryOperator(hasOperatorName("-"),
1881              hasUnaryOperand(integerLiteral(equals(13))))
1882
1883Usable 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;,
1884           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;
1885</pre></td></tr>
1886
1887
1888<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>
1889<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
1890
1891
1892<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>
1893<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
1894
1895
1896<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>
1897<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
1898
1899
1900<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>
1901<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
1902
1903Given
1904  try {
1905    ...
1906  } catch (int) {
1907    ...
1908  } catch (...) {
1909    ...
1910  }
1911endcode
1912cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
1913</pre></td></tr>
1914
1915
1916<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>
1917<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1918a specific number of arguments (including absent default arguments).
1919
1920Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1921  void f(int x, int y);
1922  f(0, 0);
1923</pre></td></tr>
1924
1925
1926<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>
1927<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
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('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr>
1932<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
1933zero initialization.
1934
1935Given
1936void foo() {
1937  struct point { double x; double y; };
1938  point pt[2] = { { 1.0, 2.0 } };
1939}
1940initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
1941will match the implicit array filler for pt[1].
1942</pre></td></tr>
1943
1944
1945<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>
1946<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
1947
1948Given
1949  struct S {
1950    S(); #1
1951    S(const S &amp;); #2
1952    S(S &amp;&amp;); #3
1953  };
1954cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
1955</pre></td></tr>
1956
1957
1958<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>
1959<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
1960
1961Given
1962  struct S {
1963    S(); #1
1964    S(const S &amp;); #2
1965    S(S &amp;&amp;); #3
1966  };
1967cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
1968</pre></td></tr>
1969
1970
1971<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>
1972<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
1973
1974Given
1975  struct S {
1976    S(); #1
1977    S(int) {} #2
1978    S(S &amp;&amp;) : S() {} #3
1979  };
1980  S::S() : S(0) {} #4
1981cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
1982#1 or #2.
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('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr>
1987<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with
1988the explicit keyword.
1989
1990Given
1991  struct S {
1992    S(int); #1
1993    explicit S(double); #2
1994    operator int(); #3
1995    explicit operator bool(); #4
1996  };
1997cxxConstructorDecl(isExplicit()) will match #2, but not #1.
1998cxxConversionDecl(isExplicit()) will match #4, but not #3.
1999</pre></td></tr>
2000
2001
2002<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>
2003<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
2004
2005Given
2006  struct S {
2007    S(); #1
2008    S(const S &amp;); #2
2009    S(S &amp;&amp;); #3
2010  };
2011cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
2012</pre></td></tr>
2013
2014
2015<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>
2016<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with
2017the explicit keyword.
2018
2019Given
2020  struct S {
2021    S(int); #1
2022    explicit S(double); #2
2023    operator int(); #3
2024    explicit operator bool(); #4
2025  };
2026cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2027cxxConversionDecl(isExplicit()) will match #4, but not #3.
2028</pre></td></tr>
2029
2030
2031<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>
2032<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
2033opposed to a member.
2034
2035Given
2036  struct B {};
2037  struct D : B {
2038    int I;
2039    D(int i) : I(i) {}
2040  };
2041  struct E : B {
2042    E() : B() {}
2043  };
2044cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
2045  will match E(), but not match D(int).
2046</pre></td></tr>
2047
2048
2049<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>
2050<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
2051opposed to a base.
2052
2053Given
2054  struct B {};
2055  struct D : B {
2056    int I;
2057    D(int i) : I(i) {}
2058  };
2059  struct E : B {
2060    E() : B() {}
2061  };
2062cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
2063  will match D(int), but not match E().
2064</pre></td></tr>
2065
2066
2067<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>
2068<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
2069code (as opposed to implicitly added by the compiler).
2070
2071Given
2072  struct Foo {
2073    Foo() { }
2074    Foo(int) : foo_("A") { }
2075    string foo_;
2076  };
2077cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
2078  will match Foo(int), but not Foo()
2079</pre></td></tr>
2080
2081
2082<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>
2083<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
2084
2085Given
2086struct A {
2087  void foo() const;
2088  void bar();
2089};
2090
2091cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
2092</pre></td></tr>
2093
2094
2095<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>
2096<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
2097operator.
2098
2099Given
2100struct A {
2101  A &amp;operator=(const A &amp;);
2102  A &amp;operator=(A &amp;&amp;);
2103};
2104
2105cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
2106the second one.
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('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr>
2111<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
2112
2113Given:
2114  class A final {};
2115
2116  struct B {
2117    virtual void f();
2118  };
2119
2120  struct C : B {
2121    void f() final;
2122  };
2123matches A and C::f, but not B, C, or B::f
2124</pre></td></tr>
2125
2126
2127<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>
2128<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2129operator.
2130
2131Given
2132struct A {
2133  A &amp;operator=(const A &amp;);
2134  A &amp;operator=(A &amp;&amp;);
2135};
2136
2137cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2138the first one.
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('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr>
2143<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2144
2145Given
2146  class A {
2147   public:
2148    virtual void x();
2149  };
2150  class B : public A {
2151   public:
2152    virtual void x();
2153  };
2154  matches B::x
2155</pre></td></tr>
2156
2157
2158<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>
2159<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2160
2161Given
2162  class A {
2163   public:
2164    virtual void x() = 0;
2165  };
2166  matches A::x
2167</pre></td></tr>
2168
2169
2170<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>
2171<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2172
2173Given
2174  struct S {
2175    S(); #1
2176    S(const S &amp;) = default; #2
2177    S(S &amp;&amp;) = delete; #3
2178  };
2179cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2180</pre></td></tr>
2181
2182
2183<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>
2184<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
2185
2186Given
2187  class A {
2188   public:
2189    virtual void x();
2190  };
2191  matches A::x
2192</pre></td></tr>
2193
2194
2195<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>
2196<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2197
2198Given
2199  class A {
2200   public:
2201    virtual void x();
2202  };
2203  class B : public A {
2204   public:
2205    void x();
2206  };
2207  matches A::x but not B::x
2208</pre></td></tr>
2209
2210
2211<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>
2212<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2213
2214Matches overloaded operator names specified in strings without the
2215"operator" prefix: e.g. "&lt;&lt;".
2216
2217Given:
2218  class A { int operator*(); };
2219  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2220  A a;
2221  a &lt;&lt; a;   &lt;-- This matches
2222
2223cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2224specified line and
2225cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2226matches the declaration of A.
2227
2228Usable 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;
2229</pre></td></tr>
2230
2231
2232<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>
2233<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2234</pre></td></tr>
2235
2236
2237<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>
2238<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2239static member variable template instantiations.
2240
2241Given
2242  template&lt;typename T&gt; void A(T t) { }
2243  template&lt;&gt; void A(int N) { }
2244functionDecl(isExplicitTemplateSpecialization())
2245  matches the specialization A&lt;int&gt;().
2246
2247Usable 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;
2248</pre></td></tr>
2249
2250
2251<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>
2252<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2253
2254Given:
2255  class A final {};
2256
2257  struct B {
2258    virtual void f();
2259  };
2260
2261  struct C : B {
2262    void f() final;
2263  };
2264matches A and C::f, but not B, C, or B::f
2265</pre></td></tr>
2266
2267
2268<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>
2269<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2270
2271Given:
2272  auto x = []{};
2273
2274cxxRecordDecl(isLambda()) matches the implicit class declaration of
2275decltype(x)
2276</pre></td></tr>
2277
2278
2279<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>
2280<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
2281isSameOrDerivedFrom(hasName(...)).
2282</pre></td></tr>
2283
2284
2285<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>
2286<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2287member variable template instantiations.
2288
2289Given
2290  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2291or
2292  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2293cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2294  matches the template instantiation of X&lt;A&gt;.
2295
2296But given
2297  template &lt;typename T&gt;  class X {}; class A {};
2298  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2299cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2300  does not match, as X&lt;A&gt; is an explicit template specialization.
2301
2302Usable 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;
2303</pre></td></tr>
2304
2305
2306<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>
2307<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2308a specific number of arguments (including absent default arguments).
2309
2310Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2311  void f(int x, int y);
2312  f(0, 0);
2313</pre></td></tr>
2314
2315
2316<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>
2317<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2318
2319Example: matches the implicit cast around 0
2320(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2321  int *p = 0;
2322</pre></td></tr>
2323
2324
2325<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>
2326<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
2327
2328Given
2329  f('false, 3.14, 42);
2330characterLiteral(equals(0))
2331  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2332  match false
2333floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2334  match 3.14
2335integerLiteral(equals(42))
2336  matches 42
2337
2338Note that you cannot directly match a negative numeric literal because the
2339minus sign is not part of the literal: It is a unary operator whose operand
2340is the positive numeric literal. Instead, you must use a unaryOperator()
2341matcher to match the minus sign:
2342
2343unaryOperator(hasOperatorName("-"),
2344              hasUnaryOperand(integerLiteral(equals(13))))
2345
2346Usable 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;,
2347           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;
2348</pre></td></tr>
2349
2350
2351<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>
2352<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2353
2354
2355<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>
2356<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2357
2358
2359<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>
2360<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2361
2362
2363<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>
2364<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2365
2366Given
2367  template&lt;typename T&gt; struct C {};
2368  C&lt;int&gt; c;
2369classTemplateSpecializationDecl(templateArgumentCountIs(1))
2370  matches C&lt;int&gt;.
2371</pre></td></tr>
2372
2373
2374<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>
2375<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2376child statements.
2377
2378Example: Given
2379  { for (;;) {} }
2380compoundStmt(statementCountIs(0)))
2381  matches '{}'
2382  but does not match the outer compound statement.
2383</pre></td></tr>
2384
2385
2386<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>
2387<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
2388
2389Given
2390  int a[42];
2391  int b[2 * 21];
2392  int c[41], d[43];
2393  char *s = "abcd";
2394  wchar_t *ws = L"abcd";
2395  char *w = "a";
2396constantArrayType(hasSize(42))
2397  matches "int a[42]" and "int b[2 * 21]"
2398stringLiteral(hasSize(4))
2399  matches "abcd", L"abcd"
2400</pre></td></tr>
2401
2402
2403<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>
2404<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2405declarations.
2406
2407Example: Given
2408  int a, b;
2409  int c;
2410  int d = 2, e;
2411declCountIs(2)
2412  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2413</pre></td></tr>
2414
2415
2416<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>
2417<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2418
2419Matches a node if it equals the node previously bound to ID.
2420
2421Given
2422  class X { int a; int b; };
2423cxxRecordDecl(
2424    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2425    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2426  matches the class X, as a and b have the same type.
2427
2428Note that when multiple matches are involved via forEach* matchers,
2429equalsBoundNodes acts as a filter.
2430For example:
2431compoundStmt(
2432    forEachDescendant(varDecl().bind("d")),
2433    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2434will trigger a match for each combination of variable declaration
2435and reference to that variable declaration within a compound statement.
2436</pre></td></tr>
2437
2438
2439<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>
2440<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2441
2442Decl has pointer identity in the AST.
2443</pre></td></tr>
2444
2445
2446<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>
2447<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2448
2449Given
2450  __attribute__((device)) void f() { ... }
2451decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2452f. If the matcher is use from clang-query, attr::Kind parameter should be
2453passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2454</pre></td></tr>
2455
2456
2457<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>
2458<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2459partially matching a given regex.
2460
2461Example matches Y but not X
2462    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2463  #include "ASTMatcher.h"
2464  class X {};
2465ASTMatcher.h:
2466  class Y {};
2467
2468Usable 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;
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('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr>
2473<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2474
2475Example matches X but not Y
2476  (matcher = cxxRecordDecl(isExpansionInMainFile())
2477  #include &lt;Y.h&gt;
2478  class X {};
2479Y.h:
2480  class Y {};
2481
2482Usable 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;
2483</pre></td></tr>
2484
2485
2486<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>
2487<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2488
2489Example matches Y but not X
2490    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2491  #include &lt;SystemHeader.h&gt;
2492  class X {};
2493SystemHeader.h:
2494  class Y {};
2495
2496Usable 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;
2497</pre></td></tr>
2498
2499
2500<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>
2501<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2502by the compiler (eg. implicit defaultcopy constructors).
2503</pre></td></tr>
2504
2505
2506<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>
2507<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2508
2509Given
2510  class C {
2511  public:    int a;
2512  protected: int b;
2513  private:   int c;
2514  };
2515fieldDecl(isPrivate())
2516  matches 'int c;'
2517</pre></td></tr>
2518
2519
2520<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>
2521<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2522
2523Given
2524  class C {
2525  public:    int a;
2526  protected: int b;
2527  private:   int c;
2528  };
2529fieldDecl(isProtected())
2530  matches 'int b;'
2531</pre></td></tr>
2532
2533
2534<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>
2535<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2536
2537Given
2538  class C {
2539  public:    int a;
2540  protected: int b;
2541  private:   int c;
2542  };
2543fieldDecl(isPublic())
2544  matches 'int a;'
2545</pre></td></tr>
2546
2547
2548<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>
2549<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2550a specific number of designators.
2551
2552Example: Given
2553  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2554  point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2555designatorCountIs(2)
2556  matches '{ [2].y = 1.0, [0].x = 1.0 }',
2557  but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2558</pre></td></tr>
2559
2560
2561<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>
2562<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
2563bit width.
2564
2565Given
2566  class C {
2567    int a : 2;
2568    int b : 4;
2569    int c : 2;
2570  };
2571fieldDecl(hasBitWidth(2))
2572  matches 'int a;' and 'int c;' but not 'int b;'.
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('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr>
2577<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
2578
2579Given
2580  class C {
2581    int a : 2;
2582    int b;
2583  };
2584fieldDecl(isBitField())
2585  matches 'int a;' but not 'int b;'.
2586</pre></td></tr>
2587
2588
2589<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>
2590<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
2591
2592Given
2593  f('false, 3.14, 42);
2594characterLiteral(equals(0))
2595  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2596  match false
2597floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2598  match 3.14
2599integerLiteral(equals(42))
2600  matches 42
2601
2602Note that you cannot directly match a negative numeric literal because the
2603minus sign is not part of the literal: It is a unary operator whose operand
2604is the positive numeric literal. Instead, you must use a unaryOperator()
2605matcher to match the minus sign:
2606
2607unaryOperator(hasOperatorName("-"),
2608              hasUnaryOperand(integerLiteral(equals(13))))
2609
2610Usable 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;,
2611           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;
2612</pre></td></tr>
2613
2614
2615<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>
2616<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
2617
2618
2619<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>
2620<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
2621
2622Given:
2623  void f();
2624  void g() noexcept;
2625  void h() noexcept(true);
2626  void i() noexcept(false);
2627  void j() throw();
2628  void k() throw(int);
2629  void l() throw(...);
2630functionDecl(hasDynamicExceptionSpec()) and
2631  functionProtoType(hasDynamicExceptionSpec())
2632  match the declarations of j, k, and l, but not f, g, h, or i.
2633</pre></td></tr>
2634
2635
2636<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>
2637<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
2638
2639Matches overloaded operator names specified in strings without the
2640"operator" prefix: e.g. "&lt;&lt;".
2641
2642Given:
2643  class A { int operator*(); };
2644  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2645  A a;
2646  a &lt;&lt; a;   &lt;-- This matches
2647
2648cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2649specified line and
2650cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2651matches the declaration of A.
2652
2653Usable 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;
2654</pre></td></tr>
2655
2656
2657<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>
2658<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations.
2659
2660Given:
2661  constexpr int foo = 42;
2662  constexpr int bar();
2663varDecl(isConstexpr())
2664  matches the declaration of foo.
2665functionDecl(isConstexpr())
2666  matches the declaration of bar.
2667</pre></td></tr>
2668
2669
2670<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>
2671<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
2672
2673Given:
2674  class A { ~A(); };
2675  class B { ~B() = default; };
2676functionDecl(isDefaulted())
2677  matches the declaration of ~B, but not ~A.
2678</pre></td></tr>
2679
2680
2681<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>
2682<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
2683
2684Example matches A, va, fa
2685  class A {};
2686  class B;  Doesn't match, as it has no body.
2687  int va;
2688  extern int vb;  Doesn't match, as it doesn't define the variable.
2689  void fa() {}
2690  void fb();  Doesn't match, as it has no body.
2691
2692Usable 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;
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('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr>
2697<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
2698
2699Given:
2700  void Func();
2701  void DeletedFunc() = delete;
2702functionDecl(isDeleted())
2703  matches the declaration of DeletedFunc, but not Func.
2704</pre></td></tr>
2705
2706
2707<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>
2708<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
2709static member variable template instantiations.
2710
2711Given
2712  template&lt;typename T&gt; void A(T t) { }
2713  template&lt;&gt; void A(int N) { }
2714functionDecl(isExplicitTemplateSpecialization())
2715  matches the specialization A&lt;int&gt;().
2716
2717Usable 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;
2718</pre></td></tr>
2719
2720
2721<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>
2722<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
2723
2724Given:
2725  extern "C" void f() {}
2726  extern "C" { void g() {} }
2727  void h() {}
2728functionDecl(isExternC())
2729  matches the declaration of f and g, but not the declaration h
2730</pre></td></tr>
2731
2732
2733<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>
2734<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2735the inline keyword.
2736
2737Given
2738  inline void f();
2739  void g();
2740  namespace n {
2741  inline namespace m {}
2742  }
2743functionDecl(isInline()) will match ::f().
2744namespaceDecl(isInline()) will match n::m.
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('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr>
2749<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2750
2751Given:
2752  void f();
2753  void g() noexcept;
2754  void h() throw();
2755  void i() throw(int);
2756  void j() noexcept(false);
2757functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2758  match the declarations of g, and h, but not f, i or j.
2759</pre></td></tr>
2760
2761
2762<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>
2763<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage
2764class specifier ("static" keyword) written in the source.
2765
2766Given:
2767  static void f() {}
2768  static int i = 0;
2769  extern int j;
2770  int k;
2771functionDecl(isStaticStorageClass())
2772  matches the function declaration f.
2773varDecl(isStaticStorageClass())
2774  matches the variable declaration i.
2775</pre></td></tr>
2776
2777
2778<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>
2779<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2780member variable template instantiations.
2781
2782Given
2783  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2784or
2785  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2786cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2787  matches the template instantiation of X&lt;A&gt;.
2788
2789But given
2790  template &lt;typename T&gt;  class X {}; class A {};
2791  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2792cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2793  does not match, as X&lt;A&gt; is an explicit template specialization.
2794
2795Usable 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;
2796</pre></td></tr>
2797
2798
2799<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>
2800<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
2801
2802Example matches f, but not g or h. The function i will not match, even when
2803compiled in C mode.
2804  void f(...);
2805  void g(int);
2806  template &lt;typename... Ts&gt; void h(Ts...);
2807  void i();
2808</pre></td></tr>
2809
2810
2811<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>
2812<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2813specific parameter count.
2814
2815Given
2816  void f(int i) {}
2817  void g(int i, int j) {}
2818  void h(int i, int j);
2819  void j(int i);
2820  void k(int x, int y, int z, ...);
2821functionDecl(parameterCountIs(2))
2822  matches void g(int i, int j) {}
2823functionProtoType(parameterCountIs(2))
2824  matches void h(int i, int j)
2825functionProtoType(parameterCountIs(3))
2826  matches void k(int x, int y, int z, ...);
2827</pre></td></tr>
2828
2829
2830<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>
2831<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
2832
2833Given:
2834  void f();
2835  void g() noexcept;
2836  void h() noexcept(true);
2837  void i() noexcept(false);
2838  void j() throw();
2839  void k() throw(int);
2840  void l() throw(...);
2841functionDecl(hasDynamicExceptionSpec()) and
2842  functionProtoType(hasDynamicExceptionSpec())
2843  match the declarations of j, k, and l, but not f, g, h, or i.
2844</pre></td></tr>
2845
2846
2847<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>
2848<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
2849
2850Given:
2851  void f();
2852  void g() noexcept;
2853  void h() throw();
2854  void i() throw(int);
2855  void j() noexcept(false);
2856functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2857  match the declarations of g, and h, but not f, i or j.
2858</pre></td></tr>
2859
2860
2861<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>
2862<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2863specific parameter count.
2864
2865Given
2866  void f(int i) {}
2867  void g(int i, int j) {}
2868  void h(int i, int j);
2869  void j(int i);
2870  void k(int x, int y, int z, ...);
2871functionDecl(parameterCountIs(2))
2872  matches void g(int i, int j) {}
2873functionProtoType(parameterCountIs(2))
2874  matches void h(int i, int j)
2875functionProtoType(parameterCountIs(3))
2876  matches void k(int x, int y, int z, ...);
2877</pre></td></tr>
2878
2879
2880<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>
2881<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
2882
2883Given
2884  f('false, 3.14, 42);
2885characterLiteral(equals(0))
2886  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2887  match false
2888floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2889  match 3.14
2890integerLiteral(equals(42))
2891  matches 42
2892
2893Note that you cannot directly match a negative numeric literal because the
2894minus sign is not part of the literal: It is a unary operator whose operand
2895is the positive numeric literal. Instead, you must use a unaryOperator()
2896matcher to match the minus sign:
2897
2898unaryOperator(hasOperatorName("-"),
2899              hasUnaryOperand(integerLiteral(equals(13))))
2900
2901Usable 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;,
2902           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;
2903</pre></td></tr>
2904
2905
2906<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>
2907<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
2908
2909
2910<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>
2911<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
2912
2913
2914<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>
2915<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
2916
2917
2918<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>
2919<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
2920to '.'.
2921
2922Member calls on the implicit this pointer match as called with '-&gt;'.
2923
2924Given
2925  class Y {
2926    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2927    int a;
2928    static int b;
2929  };
2930memberExpr(isArrow())
2931  matches this-&gt;x, x, y.x, a, this-&gt;b
2932</pre></td></tr>
2933
2934
2935<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>
2936<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
2937
2938Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
2939void f() {
2940  int x;
2941  static int y;
2942}
2943int z;
2944
2945Example matches f() because it has external formal linkage despite being
2946unique to the translation unit as though it has internal likage
2947(matcher = functionDecl(hasExternalFormalLinkage()))
2948
2949namespace {
2950void f() {}
2951}
2952</pre></td></tr>
2953
2954
2955<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>
2956<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
2957
2958Supports specifying enclosing namespaces or classes by prefixing the name
2959with '&lt;enclosing&gt;::'.
2960Does not match typedefs of an underlying type with the given name.
2961
2962Example matches X (Name == "X")
2963  class X;
2964
2965Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
2966  namespace a { namespace b { class X; } }
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('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>std::string RegExp</td></tr>
2971<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
2972a substring matched by the given RegExp.
2973
2974Supports specifying enclosing namespaces or classes by
2975prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
2976of an underlying type with the given name.
2977
2978Example matches X (regexp == "::X")
2979  class X;
2980
2981Example matches X (regexp is one of "::X", "^foo::.*X", among others)
2982  namespace foo { namespace bar { class X; } }
2983</pre></td></tr>
2984
2985
2986<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>
2987<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
2988
2989Given
2990  namespace n {
2991  namespace {} #1
2992  }
2993namespaceDecl(isAnonymous()) will match #1 but not ::n.
2994</pre></td></tr>
2995
2996
2997<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>
2998<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
2999the inline keyword.
3000
3001Given
3002  inline void f();
3003  void g();
3004  namespace n {
3005  inline namespace m {}
3006  }
3007functionDecl(isInline()) will match ::f().
3008namespaceDecl(isInline()) will match n::m.
3009</pre></td></tr>
3010
3011
3012<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>
3013<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3014a specific number of arguments (including absent default arguments).
3015
3016Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3017  void f(int x, int y);
3018  f(0, 0);
3019</pre></td></tr>
3020
3021
3022<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>
3023<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3024
3025objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3026message expression in
3027
3028  UIWebView *webView = ...;
3029  CGRect bodyFrame = webView.frame;
3030  bodyFrame.size.height = self.bodyContentHeight;
3031  webView.frame = bodyFrame;
3032      ^---- matches here
3033</pre></td></tr>
3034
3035
3036<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>
3037<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3038
3039Matches only when the selector of the objCMessageExpr is NULL. This may
3040represent an error condition in the tree!
3041</pre></td></tr>
3042
3043
3044<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>
3045<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3046
3047 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3048 matches the outer message expr in the code below, but NOT the message
3049 invocation for self.bodyView.
3050    [self.bodyView loadHTMLString:html baseURL:NULL];
3051</pre></td></tr>
3052
3053
3054<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>
3055<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3056
3057 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3058 matches self.bodyView in the code below, but NOT the outer message
3059 invocation of "loadHTMLString:baseURL:".
3060    [self.bodyView loadHTMLString:html baseURL:NULL];
3061</pre></td></tr>
3062
3063
3064<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>
3065<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3066a substring matched by the given RegExp.
3067 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3068 invocation for self.bodyView.
3069    [self.bodyView loadHTMLString:html baseURL:NULL];
3070</pre></td></tr>
3071
3072
3073<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>
3074<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3075
3076 matcher = objCMessageExpr(numSelectorArgs(0));
3077 matches self.bodyView in the code below
3078
3079 matcher = objCMessageExpr(numSelectorArgs(2));
3080 matches the invocation of "loadHTMLString:baseURL:" but not that
3081 of self.bodyView
3082    [self.bodyView loadHTMLString:html baseURL:NULL];
3083</pre></td></tr>
3084
3085
3086<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>
3087<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3088
3089Given
3090  class Y { public: void x(); };
3091  void z() { Y* y; y-&gt;x(); }
3092cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3093  matches y-&gt;x()
3094</pre></td></tr>
3095
3096
3097<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>
3098<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3099
3100Matches a node if it equals the node previously bound to ID.
3101
3102Given
3103  class X { int a; int b; };
3104cxxRecordDecl(
3105    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3106    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3107  matches the class X, as a and b have the same type.
3108
3109Note that when multiple matches are involved via forEach* matchers,
3110equalsBoundNodes acts as a filter.
3111For example:
3112compoundStmt(
3113    forEachDescendant(varDecl().bind("d")),
3114    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3115will trigger a match for each combination of variable declaration
3116and reference to that variable declaration within a compound statement.
3117</pre></td></tr>
3118
3119
3120<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>
3121<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3122the node, not hidden within a typedef.
3123
3124Given
3125  typedef const int const_int;
3126  const_int i;
3127  int *const j;
3128  int *volatile k;
3129  int m;
3130varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3131i is const-qualified but the qualifier is not local.
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('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr>
3136<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3137
3138Given
3139  void a(char);
3140  void b(wchar_t);
3141  void c(double);
3142functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3143matches "a(char)", "b(wchar_t)", but not "c(double)".
3144</pre></td></tr>
3145
3146
3147<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>
3148<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3149the Objective-C object pointer type, which is different despite being
3150syntactically similar.
3151
3152Given
3153  int *i = nullptr;
3154
3155  @interface Foo
3156  @end
3157  Foo *f;
3158
3159  int j;
3160varDecl(hasType(isAnyPointer()))
3161  matches "int *i" and "Foo *f", but not "int j".
3162</pre></td></tr>
3163
3164
3165<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>
3166<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3167include "top-level" const.
3168
3169Given
3170  void a(int);
3171  void b(int const);
3172  void c(const int);
3173  void d(const int*);
3174  void e(int const) {};
3175functionDecl(hasAnyParameter(hasType(isConstQualified())))
3176  matches "void b(int const)", "void c(const int)" and
3177  "void e(int const) {}". It does not match d as there
3178  is no top-level const on the parameter type "const int *".
3179</pre></td></tr>
3180
3181
3182<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>
3183<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3184
3185Given
3186  void a(int);
3187  void b(long);
3188  void c(double);
3189functionDecl(hasAnyParameter(hasType(isInteger())))
3190matches "a(int)", "b(long)", but not "c(double)".
3191</pre></td></tr>
3192
3193
3194<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>
3195<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3196
3197Given
3198  void a(int);
3199  void b(unsigned long);
3200  void c(double);
3201functionDecl(hasAnyParameter(hasType(isSignedInteger())))
3202matches "a(int)", but not "b(unsigned long)" and "c(double)".
3203</pre></td></tr>
3204
3205
3206<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>
3207<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3208
3209Given
3210  void a(int);
3211  void b(unsigned long);
3212  void c(double);
3213functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
3214matches "b(unsigned long)", but not "a(int)" and "c(double)".
3215</pre></td></tr>
3216
3217
3218<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>
3219<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3220include "top-level" volatile.
3221
3222Given
3223  void a(int);
3224  void b(int volatile);
3225  void c(volatile int);
3226  void d(volatile int*);
3227  void e(int volatile) {};
3228functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3229  matches "void b(int volatile)", "void c(volatile int)" and
3230  "void e(int volatile) {}". It does not match d as there
3231  is no top-level volatile on the parameter type "volatile int *".
3232</pre></td></tr>
3233
3234
3235<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>
3236<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3237
3238Example matches C, but not S or U.
3239  struct S {};
3240  class C {};
3241  union U {};
3242</pre></td></tr>
3243
3244
3245<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>
3246<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3247
3248Example matches S, but not C or U.
3249  struct S {};
3250  class C {};
3251  union U {};
3252</pre></td></tr>
3253
3254
3255<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>
3256<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3257
3258Example matches U, but not C or S.
3259  struct S {};
3260  class C {};
3261  union U {};
3262</pre></td></tr>
3263
3264
3265<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>
3266<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3267
3268Matches a node if it equals the node previously bound to ID.
3269
3270Given
3271  class X { int a; int b; };
3272cxxRecordDecl(
3273    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3274    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3275  matches the class X, as a and b have the same type.
3276
3277Note that when multiple matches are involved via forEach* matchers,
3278equalsBoundNodes acts as a filter.
3279For example:
3280compoundStmt(
3281    forEachDescendant(varDecl().bind("d")),
3282    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3283will trigger a match for each combination of variable declaration
3284and reference to that variable declaration within a compound statement.
3285</pre></td></tr>
3286
3287
3288<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>
3289<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3290
3291Stmt has pointer identity in the AST.
3292</pre></td></tr>
3293
3294
3295<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>
3296<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3297partially matching a given regex.
3298
3299Example matches Y but not X
3300    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3301  #include "ASTMatcher.h"
3302  class X {};
3303ASTMatcher.h:
3304  class Y {};
3305
3306Usable 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;
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('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr>
3311<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3312
3313Example matches X but not Y
3314  (matcher = cxxRecordDecl(isExpansionInMainFile())
3315  #include &lt;Y.h&gt;
3316  class X {};
3317Y.h:
3318  class Y {};
3319
3320Usable 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;
3321</pre></td></tr>
3322
3323
3324<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>
3325<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3326
3327Example matches Y but not X
3328    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3329  #include &lt;SystemHeader.h&gt;
3330  class X {};
3331SystemHeader.h:
3332  class Y {};
3333
3334Usable 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;
3335</pre></td></tr>
3336
3337
3338<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>
3339<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3340
3341Given
3342  int a[42];
3343  int b[2 * 21];
3344  int c[41], d[43];
3345  char *s = "abcd";
3346  wchar_t *ws = L"abcd";
3347  char *w = "a";
3348constantArrayType(hasSize(42))
3349  matches "int a[42]" and "int b[2 * 21]"
3350stringLiteral(hasSize(4))
3351  matches "abcd", L"abcd"
3352</pre></td></tr>
3353
3354
3355<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>
3356<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3357
3358Example matches A, va, fa
3359  class A {};
3360  class B;  Doesn't match, as it has no body.
3361  int va;
3362  extern int vb;  Doesn't match, as it doesn't define the variable.
3363  void fa() {}
3364  void fb();  Doesn't match, as it has no body.
3365
3366Usable 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;
3367</pre></td></tr>
3368
3369
3370<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>
3371<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3372
3373Note that 'Value' is a string as the template argument's value is
3374an arbitrary precision integer. 'Value' must be euqal to the canonical
3375representation of that integral value in base 10.
3376
3377Given
3378  template&lt;int T&gt; struct A {};
3379  C&lt;42&gt; c;
3380classTemplateSpecializationDecl(
3381  hasAnyTemplateArgument(equalsIntegralValue("42")))
3382  matches the implicit instantiation of C in C&lt;42&gt;.
3383</pre></td></tr>
3384
3385
3386<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>
3387<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3388
3389Given
3390  template&lt;int T&gt; struct A {};
3391  C&lt;42&gt; c;
3392classTemplateSpecializationDecl(
3393  hasAnyTemplateArgument(isIntegral()))
3394  matches the implicit instantiation of C in C&lt;42&gt;
3395  with isIntegral() matching 42.
3396</pre></td></tr>
3397
3398
3399<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>
3400<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3401
3402Given
3403  template&lt;typename T&gt; struct C {};
3404  C&lt;int&gt; c;
3405classTemplateSpecializationDecl(templateArgumentCountIs(1))
3406  matches C&lt;int&gt;.
3407</pre></td></tr>
3408
3409
3410<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>
3411<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3412partially matching a given regex.
3413
3414Example matches Y but not X
3415    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3416  #include "ASTMatcher.h"
3417  class X {};
3418ASTMatcher.h:
3419  class Y {};
3420
3421Usable 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;
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('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr>
3426<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3427
3428Example matches X but not Y
3429  (matcher = cxxRecordDecl(isExpansionInMainFile())
3430  #include &lt;Y.h&gt;
3431  class X {};
3432Y.h:
3433  class Y {};
3434
3435Usable 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;
3436</pre></td></tr>
3437
3438
3439<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>
3440<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
3441
3442Example matches Y but not X
3443    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3444  #include &lt;SystemHeader.h&gt;
3445  class X {};
3446SystemHeader.h:
3447  class Y {};
3448
3449Usable 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;
3450</pre></td></tr>
3451
3452
3453<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>
3454<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
3455
3456Given
3457 struct S { bool func(); };
3458functionDecl(returns(booleanType()))
3459  matches "bool func();"
3460</pre></td></tr>
3461
3462
3463<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>
3464<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
3465
3466Matches a node if it equals the node previously bound to ID.
3467
3468Given
3469  class X { int a; int b; };
3470cxxRecordDecl(
3471    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3472    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3473  matches the class X, as a and b have the same type.
3474
3475Note that when multiple matches are involved via forEach* matchers,
3476equalsBoundNodes acts as a filter.
3477For example:
3478compoundStmt(
3479    forEachDescendant(varDecl().bind("d")),
3480    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3481will trigger a match for each combination of variable declaration
3482and reference to that variable declaration within a compound statement.
3483</pre></td></tr>
3484
3485
3486<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>
3487<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
3488
3489Type has pointer identity in the AST.
3490</pre></td></tr>
3491
3492
3493<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>
3494<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
3495
3496Given
3497  int i;
3498  float f;
3499realFloatingPointType()
3500  matches "float f" but not "int i"
3501</pre></td></tr>
3502
3503
3504<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>
3505<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
3506
3507Given
3508 struct S { void func(); };
3509functionDecl(returns(voidType()))
3510  matches "void func();"
3511</pre></td></tr>
3512
3513
3514<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>
3515<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
3516
3517Given
3518  int x;
3519  int s = sizeof(x) + alignof(x)
3520unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
3521  matches sizeof(x)
3522</pre></td></tr>
3523
3524
3525<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>
3526<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3527unary).
3528
3529Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3530  !(a || b)
3531</pre></td></tr>
3532
3533
3534<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>
3535<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
3536
3537Example matches x, but not y, z, or a.
3538(matcher = varDecl(hasAutomaticStorageDuration())
3539void f() {
3540  int x;
3541  static int y;
3542  thread_local int z;
3543}
3544int a;
3545</pre></td></tr>
3546
3547
3548<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>
3549<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
3550
3551Example matches y and z (matcher = varDecl(hasGlobalStorage())
3552void f() {
3553  int x;
3554  static int y;
3555}
3556int z;
3557</pre></td></tr>
3558
3559
3560<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>
3561<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
3562non-static local variable.
3563
3564Example matches x (matcher = varDecl(hasLocalStorage())
3565void f() {
3566  int x;
3567  static int y;
3568}
3569int z;
3570</pre></td></tr>
3571
3572
3573<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>
3574<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
3575It includes the variable declared at namespace scope and those declared
3576with "static" and "extern" storage class specifiers.
3577
3578void f() {
3579  int x;
3580  static int y;
3581  thread_local int z;
3582}
3583int a;
3584static int b;
3585extern int c;
3586varDecl(hasStaticStorageDuration())
3587  matches the function declaration y, a, b and c.
3588</pre></td></tr>
3589
3590
3591<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>
3592<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
3593
3594Example matches z, but not x, z, or a.
3595(matcher = varDecl(hasThreadStorageDuration())
3596void f() {
3597  int x;
3598  static int y;
3599  thread_local int z;
3600}
3601int a;
3602</pre></td></tr>
3603
3604
3605<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>
3606<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations.
3607
3608Given:
3609  constexpr int foo = 42;
3610  constexpr int bar();
3611varDecl(isConstexpr())
3612  matches the declaration of foo.
3613functionDecl(isConstexpr())
3614  matches the declaration of bar.
3615</pre></td></tr>
3616
3617
3618<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>
3619<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3620
3621Example matches A, va, fa
3622  class A {};
3623  class B;  Doesn't match, as it has no body.
3624  int va;
3625  extern int vb;  Doesn't match, as it doesn't define the variable.
3626  void fa() {}
3627  void fb();  Doesn't match, as it has no body.
3628
3629Usable 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;
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('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr>
3634<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3635a C++ catch block, or an Objective-C statement.
3636
3637Example matches x (matcher = varDecl(isExceptionVariable())
3638void f(int y) {
3639  try {
3640  } catch (int x) {
3641  }
3642}
3643</pre></td></tr>
3644
3645
3646<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>
3647<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3648static member variable template instantiations.
3649
3650Given
3651  template&lt;typename T&gt; void A(T t) { }
3652  template&lt;&gt; void A(int N) { }
3653functionDecl(isExplicitTemplateSpecialization())
3654  matches the specialization A&lt;int&gt;().
3655
3656Usable 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;
3657</pre></td></tr>
3658
3659
3660<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>
3661<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function declarations.
3662
3663Given:
3664  extern "C" void f() {}
3665  extern "C" { void g() {} }
3666  void h() {}
3667functionDecl(isExternC())
3668  matches the declaration of f and g, but not the declaration h
3669</pre></td></tr>
3670
3671
3672<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>
3673<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage
3674class specifier ("static" keyword) written in the source.
3675
3676Given:
3677  static void f() {}
3678  static int i = 0;
3679  extern int j;
3680  int k;
3681functionDecl(isStaticStorageClass())
3682  matches the function declaration f.
3683varDecl(isStaticStorageClass())
3684  matches the variable declaration i.
3685</pre></td></tr>
3686
3687
3688<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>
3689<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3690member variable template instantiations.
3691
3692Given
3693  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3694or
3695  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3696cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3697  matches the template instantiation of X&lt;A&gt;.
3698
3699But given
3700  template &lt;typename T&gt;  class X {}; class A {};
3701  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3702cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3703  does not match, as X&lt;A&gt; is an explicit template specialization.
3704
3705Usable 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;
3706</pre></td></tr>
3707
3708
3709<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>
3710<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3711template instantiations.
3712
3713Given
3714  template&lt;typename T&gt; void A(T t) { T i; }
3715  A(0);
3716  A(0U);
3717functionDecl(isInstantiated())
3718  matches 'A(int) {...};' and 'A(unsigned) {...}'.
3719</pre></td></tr>
3720
3721
3722<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>
3723<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3724GNU's __null, C++11's nullptr, or C's NULL macro.
3725
3726Given:
3727  void *v1 = NULL;
3728  void *v2 = nullptr;
3729  void *v3 = __null; GNU extension
3730  char *cp = (char *)0;
3731  int *ip = 0;
3732  int i = 0;
3733expr(nullPointerConstant())
3734  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3735  initializer for i.
3736</pre></td></tr>
3737
3738
3739<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>
3740<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3741
3742This matcher is only provided as a performance optimization of hasName.
3743    hasAnyName(a, b, c)
3744 is equivalent to, but faster than
3745    anyOf(hasName(a), hasName(b), hasName(c))
3746</pre></td></tr>
3747
3748
3749<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>
3750<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
3751
3752Given
3753  int j;
3754  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
3755  A(0);
3756  A(0U);
3757declStmt(isInTemplateInstantiation())
3758  matches 'int i;' and 'unsigned i'.
3759unless(stmt(isInTemplateInstantiation()))
3760  will NOT match j += 42; as it's shared between the template definition and
3761  instantiation.
3762</pre></td></tr>
3763
3764<!--END_NARROWING_MATCHERS -->
3765</table>
3766
3767<!-- ======================================================================= -->
3768<h2 id="traversal-matchers">AST Traversal Matchers</h2>
3769<!-- ======================================================================= -->
3770
3771<p>Traversal matchers specify the relationship to other nodes that are
3772reachable from the current node.</p>
3773
3774<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
3775forEachDescendant) which work on all nodes and allow users to write more generic
3776match expressions.</p>
3777
3778<table>
3779<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
3780<!-- START_TRAVERSAL_MATCHERS -->
3781
3782<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>
3783<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
3784
3785Unlike anyOf, eachOf will generate a match result for each
3786matching submatcher.
3787
3788For example, in:
3789  class A { int a; int b; };
3790The matcher:
3791  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
3792                       has(fieldDecl(hasName("b")).bind("v"))))
3793will generate two results binding "v", the first of which binds
3794the field declaration of a, the second the field declaration of
3795b.
3796
3797Usable as: Any Matcher
3798</pre></td></tr>
3799
3800
3801<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3802<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3803provided matcher.
3804
3805Example matches X, A, B, C
3806  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
3807  class X {};  Matches X, because X::X is a class of name X inside X.
3808  class A { class X {}; };
3809  class B { class C { class X {}; }; };
3810
3811DescendantT must be an AST base type.
3812
3813As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
3814each result that matches instead of only on the first one.
3815
3816Note: Recursively combined ForEachDescendant can cause many matches:
3817  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
3818    forEachDescendant(cxxRecordDecl())
3819  )))
3820will match 10 times (plus injected class name matches) on:
3821  class A { class B { class C { class D { class E {}; }; }; }; };
3822
3823Usable as: Any Matcher
3824</pre></td></tr>
3825
3826
3827<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
3828<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
3829provided matcher.
3830
3831Example matches X, Y
3832  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
3833  class X {};  Matches X, because X::X is a class of name X inside X.
3834  class Y { class X {}; };
3835  class Z { class Y { class X {}; }; };  Does not match Z.
3836
3837ChildT must be an AST base type.
3838
3839As opposed to 'has', 'forEach' will cause a match for each result that
3840matches instead of only on the first one.
3841
3842Usable as: Any Matcher
3843</pre></td></tr>
3844
3845
3846<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
3847<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
3848matcher.
3849
3850Given
3851void f() { if (true) { int x = 42; } }
3852void g() { for (;;) { int x = 43; } }
3853expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
3854
3855Usable as: Any Matcher
3856</pre></td></tr>
3857
3858
3859<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3860<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3861provided matcher.
3862
3863Example matches X, Y, Z
3864    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
3865  class X {};  Matches X, because X::X is a class of name X inside X.
3866  class Y { class X {}; };
3867  class Z { class Y { class X {}; }; };
3868
3869DescendantT must be an AST base type.
3870
3871Usable as: Any Matcher
3872</pre></td></tr>
3873
3874
3875<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
3876<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
3877provided matcher.
3878
3879Example matches X, Y
3880  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
3881  class X {};  Matches X, because X::X is a class of name X inside X.
3882  class Y { class X {}; };
3883  class Z { class Y { class X {}; }; };  Does not match Z.
3884
3885ChildT must be an AST base type.
3886
3887Usable as: Any Matcher
3888Note that has is direct matcher, so it also matches things like implicit
3889casts and paren casts. If you are matching with expr then you should
3890probably consider using ignoringParenImpCasts like:
3891has(ignoringParenImpCasts(expr())).
3892</pre></td></tr>
3893
3894
3895<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
3896<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
3897matcher.
3898
3899Given
3900void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
3901compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
3902
3903Usable as: Any Matcher
3904</pre></td></tr>
3905
3906
3907<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>
3908<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
3909switch statement or conditional operator.
3910
3911Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
3912  if (true) {}
3913</pre></td></tr>
3914
3915
3916<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>
3917<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
3918(binary or ternary).
3919
3920Example matches b
3921  condition ? a : b
3922  condition ?: b
3923</pre></td></tr>
3924
3925
3926<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>
3927<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
3928
3929Example 1 (conditional ternary operator): matches a
3930  condition ? a : b
3931
3932Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
3933  condition ?: b
3934</pre></td></tr>
3935
3936
3937<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>
3938<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
3939matches the given matcher.
3940
3941The associated declaration is:
3942- for type nodes, the declaration of the underlying type
3943- for CallExpr, the declaration of the callee
3944- for MemberExpr, the declaration of the referenced member
3945- for CXXConstructExpr, the declaration of the constructor
3946- for CXXNewExpr, the declaration of the operator new
3947
3948Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3949function. e.g. various subtypes of clang::Type and various expressions.
3950
3951Usable 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;,
3952  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;,
3953  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;,
3954  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;,
3955  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;,
3956  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;,
3957  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3958</pre></td></tr>
3959
3960
3961<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>
3962<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
3963
3964Given
3965  int i[5];
3966  void f() { i[1] = 42; }
3967arraySubscriptExpression(hasBase(implicitCastExpr(
3968    hasSourceExpression(declRefExpr()))))
3969  matches i[1] with the declRefExpr() matching i
3970</pre></td></tr>
3971
3972
3973<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>
3974<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
3975
3976Given
3977  int i[5];
3978  void f() { i[1] = 42; }
3979arraySubscriptExpression(hasIndex(integerLiteral()))
3980  matches i[1] with the integerLiteral() matching 1
3981</pre></td></tr>
3982
3983
3984<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>
3985<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
3986
3987Example matches a (matcher = binaryOperator(hasLHS()))
3988  a || b
3989</pre></td></tr>
3990
3991
3992<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>
3993<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
3994
3995Example matches b (matcher = binaryOperator(hasRHS()))
3996  a || b
3997</pre></td></tr>
3998
3999
4000<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>
4001<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
4002type.
4003
4004Given
4005  struct A {};
4006  A a[7];
4007  int b[7];
4008arrayType(hasElementType(builtinType()))
4009  matches "int b[7]"
4010
4011Usable 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;
4012</pre></td></tr>
4013
4014
4015<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>
4016<tr><td colspan="4" class="doc" id="hasElementType0"><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_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>
4031<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
4032
4033Given
4034  _Atomic(int) i;
4035  _Atomic(float) f;
4036atomicType(hasValueType(isInteger()))
4037 matches "_Atomic(int) i"
4038
4039Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
4040</pre></td></tr>
4041
4042
4043<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>
4044<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4045
4046Given
4047  _Atomic(int) i;
4048  _Atomic(float) f;
4049atomicType(hasValueType(isInteger()))
4050 matches "_Atomic(int) i"
4051
4052Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
4053</pre></td></tr>
4054
4055
4056<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>
4057<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4058
4059Note: There is no TypeLoc for the deduced type and thus no
4060getDeducedLoc() matcher.
4061
4062Given
4063  auto a = 1;
4064  auto b = 2.0;
4065autoType(hasDeducedType(isInteger()))
4066  matches "auto a"
4067
4068Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
4069</pre></td></tr>
4070
4071
4072<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>
4073<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4074binary operator matches.
4075</pre></td></tr>
4076
4077
4078<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>
4079<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
4080
4081Example matches a (matcher = binaryOperator(hasLHS()))
4082  a || b
4083</pre></td></tr>
4084
4085
4086<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>
4087<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
4088
4089Example matches b (matcher = binaryOperator(hasRHS()))
4090  a || b
4091</pre></td></tr>
4092
4093
4094<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>
4095<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
4096pointee matches a given matcher.
4097
4098Given
4099  int *a;
4100  int const *b;
4101  float const *f;
4102pointerType(pointee(isConstQualified(), isInteger()))
4103  matches "int const *b"
4104
4105Usable 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;,
4106  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;
4107</pre></td></tr>
4108
4109
4110<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>
4111<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4112pointee matches a given matcher.
4113
4114Given
4115  int *a;
4116  int const *b;
4117  float const *f;
4118pointerType(pointee(isConstQualified(), isInteger()))
4119  matches "int const *b"
4120
4121Usable 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;,
4122  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;
4123</pre></td></tr>
4124
4125
4126<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>
4127<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4128
4129Given
4130  void f(int i);
4131  int y;
4132  f(y);
4133callExpr(
4134  forEachArgumentWithParam(
4135    declRefExpr(to(varDecl(hasName("y")))),
4136    parmVarDecl(hasType(isInteger()))
4137))
4138  matches f(y);
4139with declRefExpr(...)
4140  matching int y
4141and parmVarDecl(...)
4142  matching int i
4143</pre></td></tr>
4144
4145
4146<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>
4147<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
4148expression.
4149
4150Given
4151  void x(int, int, int) { int y; x(1, y, 42); }
4152callExpr(hasAnyArgument(declRefExpr()))
4153  matches x(1, y, 42)
4154with hasAnyArgument(...)
4155  matching y
4156</pre></td></tr>
4157
4158
4159<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>
4160<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4161call expression.
4162
4163Example matches y in x(y)
4164    (matcher = callExpr(hasArgument(0, declRefExpr())))
4165  void x(int) { int y; x(y); }
4166</pre></td></tr>
4167
4168
4169<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>
4170<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
4171matches the given matcher.
4172
4173The associated declaration is:
4174- for type nodes, the declaration of the underlying type
4175- for CallExpr, the declaration of the callee
4176- for MemberExpr, the declaration of the referenced member
4177- for CXXConstructExpr, the declaration of the constructor
4178- for CXXNewExpr, the declaration of the operator new
4179
4180Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4181function. e.g. various subtypes of clang::Type and various expressions.
4182
4183Usable 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;,
4184  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;,
4185  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;,
4186  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;,
4187  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;,
4188  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;,
4189  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4190</pre></td></tr>
4191
4192
4193<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>
4194<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4195
4196Given
4197  class A { A() : i(42), j(42) {} int i; int j; };
4198cxxConstructorDecl(forEachConstructorInitializer(
4199  forField(decl().bind("x"))
4200))
4201  will trigger two matches, binding for 'i' and 'j' respectively.
4202</pre></td></tr>
4203
4204
4205<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>
4206<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4207
4208Given
4209  struct Foo {
4210    Foo() : foo_(1) { }
4211    int foo_;
4212  };
4213cxxRecordDecl(has(cxxConstructorDecl(
4214  hasAnyConstructorInitializer(anything())
4215)))
4216  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
4217</pre></td></tr>
4218
4219
4220<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>
4221<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
4222
4223Given
4224  struct Foo {
4225    Foo() : foo_(1) { }
4226    int foo_;
4227  };
4228cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4229    forField(hasName("foo_"))))))
4230  matches Foo
4231with forField matching foo_
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('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>
4236<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
4237
4238Given
4239  struct Foo {
4240    Foo() : foo_(1) { }
4241    int foo_;
4242  };
4243cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4244    withInitializer(integerLiteral(equals(1)))))))
4245  matches Foo
4246with withInitializer matching (1)
4247</pre></td></tr>
4248
4249
4250<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>
4251<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
4252definition that has a given body.
4253
4254Given
4255  for (;;) {}
4256hasBody(compoundStmt())
4257  matches 'for (;;) {}'
4258with compoundStmt()
4259  matching '{}'
4260</pre></td></tr>
4261
4262
4263<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>
4264<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
4265
4266Example:
4267    forStmt(hasLoopVariable(anything()))
4268matches 'int x' in
4269    for (int x : a) { }
4270</pre></td></tr>
4271
4272
4273<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>
4274<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
4275
4276Example:
4277    forStmt(hasRangeInit(anything()))
4278matches 'a' in
4279    for (int x : a) { }
4280</pre></td></tr>
4281
4282
4283<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>
4284<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
4285
4286
4287<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>
4288<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
4289
4290Example matches y.x()
4291  (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
4292  class Y { public: void x(); };
4293  void z() { Y y; y.x(); }",
4294
4295FIXME: Overload to allow directly matching types?
4296</pre></td></tr>
4297
4298
4299<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>
4300<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
4301</pre></td></tr>
4302
4303
4304<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>
4305<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
4306matcher, or is a pointer to a type that matches the InnerMatcher.
4307</pre></td></tr>
4308
4309
4310<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>
4311<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overriden by the given method. This matcher may
4312produce multiple matches.
4313
4314Given
4315  class A { virtual void f(); };
4316  class B : public A { void f(); };
4317  class C : public B { void f(); };
4318cxxMethodDecl(ofClass(hasName("C")),
4319              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4320  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
4321  that B::f is not overridden by C::f).
4322
4323The check can produce multiple matches in case of multiple inheritance, e.g.
4324  class A1 { virtual void f(); };
4325  class A2 { virtual void f(); };
4326  class C : public A1, public A2 { void f(); };
4327cxxMethodDecl(ofClass(hasName("C")),
4328              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4329  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
4330  once with "b" binding "A2::f" and "d" binding "C::f".
4331</pre></td></tr>
4332
4333
4334<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>
4335<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
4336belongs to.
4337
4338FIXME: Generalize this for other kinds of declarations.
4339FIXME: What other kind of declarations would we need to generalize
4340this to?
4341
4342Example matches A() in the last line
4343    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
4344        ofClass(hasName("A"))))))
4345  class A {
4346   public:
4347    A();
4348  };
4349  A a = A();
4350</pre></td></tr>
4351
4352
4353<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>
4354<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
4355matches the given matcher.
4356
4357The associated declaration is:
4358- for type nodes, the declaration of the underlying type
4359- for CallExpr, the declaration of the callee
4360- for MemberExpr, the declaration of the referenced member
4361- for CXXConstructExpr, the declaration of the constructor
4362- for CXXNewExpr, the declaration of the operator new
4363
4364Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4365function. e.g. various subtypes of clang::Type and various expressions.
4366
4367Usable 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;,
4368  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;,
4369  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;,
4370  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;,
4371  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;,
4372  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;,
4373  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4374</pre></td></tr>
4375
4376
4377<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>
4378<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
4379
4380Given:
4381  class A { void func(); };
4382  class B { void member(); };
4383
4384cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
4385A but not B.
4386</pre></td></tr>
4387
4388
4389<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>
4390<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
4391a class matching Base.
4392
4393Note that a class is not considered to be derived from itself.
4394
4395Example matches Y, Z, C (Base == hasName("X"))
4396  class X;
4397  class Y : public X {};  directly derived
4398  class Z : public Y {};  indirectly derived
4399  typedef X A;
4400  typedef A B;
4401  class C : public B {};  derived from a typedef of X
4402
4403In the following example, Bar matches isDerivedFrom(hasName("X")):
4404  class Foo;
4405  typedef Foo X;
4406  class Bar : public Foo {};  derived from a type that X is a typedef of
4407</pre></td></tr>
4408
4409
4410<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>
4411<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
4412match Base.
4413</pre></td></tr>
4414
4415
4416<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>
4417<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
4418given matcher.
4419
4420Example matches y.x() (matcher = callExpr(callee(
4421                                   cxxMethodDecl(hasName("x")))))
4422  class Y { public: void x(); };
4423  void z() { Y y; y.x(); }
4424</pre></td></tr>
4425
4426
4427<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>
4428<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
4429
4430Given
4431  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
4432  void f() { f(); }
4433callExpr(callee(expr()))
4434  matches this-&gt;x(), x(), y.x(), f()
4435with callee(...)
4436  matching this-&gt;x, x, y.x, f respectively
4437
4438Note: Callee cannot take the more general internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
4439because this introduces ambiguous overloads with calls to Callee taking a
4440internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
4441implemented in terms of implicit casts.
4442</pre></td></tr>
4443
4444
4445<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>
4446<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
4447
4448Given
4449  void f(int i);
4450  int y;
4451  f(y);
4452callExpr(
4453  forEachArgumentWithParam(
4454    declRefExpr(to(varDecl(hasName("y")))),
4455    parmVarDecl(hasType(isInteger()))
4456))
4457  matches f(y);
4458with declRefExpr(...)
4459  matching int y
4460and parmVarDecl(...)
4461  matching int i
4462</pre></td></tr>
4463
4464
4465<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>
4466<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
4467expression.
4468
4469Given
4470  void x(int, int, int) { int y; x(1, y, 42); }
4471callExpr(hasAnyArgument(declRefExpr()))
4472  matches x(1, y, 42)
4473with hasAnyArgument(...)
4474  matching y
4475</pre></td></tr>
4476
4477
4478<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>
4479<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
4480call expression.
4481
4482Example matches y in x(y)
4483    (matcher = callExpr(hasArgument(0, declRefExpr())))
4484  void x(int) { int y; x(y); }
4485</pre></td></tr>
4486
4487
4488<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>
4489<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
4490matches the given matcher.
4491
4492The associated declaration is:
4493- for type nodes, the declaration of the underlying type
4494- for CallExpr, the declaration of the callee
4495- for MemberExpr, the declaration of the referenced member
4496- for CXXConstructExpr, the declaration of the constructor
4497- for CXXNewExpr, the declaration of the operator new
4498
4499Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4500function. e.g. various subtypes of clang::Type and various expressions.
4501
4502Usable 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;,
4503  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;,
4504  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;,
4505  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;,
4506  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;,
4507  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;,
4508  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4509</pre></td></tr>
4510
4511
4512<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>
4513<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
4514extension, matches the constant given in the statement.
4515
4516Given
4517  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
4518caseStmt(hasCaseConstant(integerLiteral()))
4519  matches "case 1:"
4520</pre></td></tr>
4521
4522
4523<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>
4524<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre></pre></td></tr>
4525
4526
4527<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>
4528<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4529functionDecl that have at least one TemplateArgument matching the given
4530InnerMatcher.
4531
4532Given
4533  template&lt;typename T&gt; class A {};
4534  template&lt;&gt; class A&lt;double&gt; {};
4535  A&lt;int&gt; a;
4536
4537  template&lt;typename T&gt; f() {};
4538  void func() { f&lt;int&gt;(); };
4539
4540classTemplateSpecializationDecl(hasAnyTemplateArgument(
4541    refersToType(asString("int"))))
4542  matches the specialization A&lt;int&gt;
4543
4544functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
4545  matches the specialization f&lt;int&gt;
4546</pre></td></tr>
4547
4548
4549<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>
4550<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4551functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
4552
4553Given
4554  template&lt;typename T, typename U&gt; class A {};
4555  A&lt;bool, int&gt; b;
4556  A&lt;int, bool&gt; c;
4557
4558  template&lt;typename T&gt; f() {};
4559  void func() { f&lt;int&gt;(); };
4560classTemplateSpecializationDecl(hasTemplateArgument(
4561    1, refersToType(asString("int"))))
4562  matches the specialization A&lt;bool, int&gt;
4563
4564functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
4565  matches the specialization f&lt;int&gt;
4566</pre></td></tr>
4567
4568
4569<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>
4570<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
4571type.
4572
4573Given
4574  struct A {};
4575  A a[7];
4576  int b[7];
4577arrayType(hasElementType(builtinType()))
4578  matches "int b[7]"
4579
4580Usable 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;
4581</pre></td></tr>
4582
4583
4584<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>
4585<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
4586type.
4587
4588Given
4589  struct A {};
4590  A a[7];
4591  int b[7];
4592arrayType(hasElementType(builtinType()))
4593  matches "int b[7]"
4594
4595Usable 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;
4596</pre></td></tr>
4597
4598
4599<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>
4600<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
4601a given matcher. Also matches StmtExprs that have CompoundStmt as children.
4602
4603Given
4604  { {}; 1+2; }
4605hasAnySubstatement(compoundStmt())
4606  matches '{ {}; 1+2; }'
4607with compoundStmt()
4608  matching '{}'
4609</pre></td></tr>
4610
4611
4612<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>
4613<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
4614</pre></td></tr>
4615
4616
4617<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>
4618<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
4619matches the given matcher.
4620
4621The associated declaration is:
4622- for type nodes, the declaration of the underlying type
4623- for CallExpr, the declaration of the callee
4624- for MemberExpr, the declaration of the referenced member
4625- for CXXConstructExpr, the declaration of the constructor
4626- for CXXNewExpr, the declaration of the operator new
4627
4628Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4629function. e.g. various subtypes of clang::Type and various expressions.
4630
4631Usable 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;,
4632  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;,
4633  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;,
4634  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;,
4635  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;,
4636  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;,
4637  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4638</pre></td></tr>
4639
4640
4641<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>
4642<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
4643specific using shadow declaration.
4644
4645Given
4646  namespace a { void f() {} }
4647  using a::f;
4648  void g() {
4649    f();     Matches this ..
4650    a::f();  .. but not this.
4651  }
4652declRefExpr(throughUsingDecl(anything()))
4653  matches f()
4654</pre></td></tr>
4655
4656
4657<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>
4658<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
4659specified matcher.
4660
4661Example matches x in if(x)
4662    (matcher = declRefExpr(to(varDecl(hasName("x")))))
4663  bool x;
4664  if (x) {}
4665</pre></td></tr>
4666
4667
4668<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>
4669<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
4670
4671Note that this does not work for global declarations because the AST
4672breaks up multiple-declaration DeclStmt's into multiple single-declaration
4673DeclStmt's.
4674Example: Given non-global declarations
4675  int a, b = 0;
4676  int c;
4677  int d = 2, e;
4678declStmt(containsDeclaration(
4679      0, varDecl(hasInitializer(anything()))))
4680  matches only 'int d = 2, e;', and
4681declStmt(containsDeclaration(1, varDecl()))
4682  matches 'int a, b = 0' as well as 'int d = 2, e;'
4683  but 'int c;' is not matched.
4684</pre></td></tr>
4685
4686
4687<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>
4688<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
4689
4690Given
4691  int a, b;
4692  int c;
4693declStmt(hasSingleDecl(anything()))
4694  matches 'int c;' but not 'int a, b;'.
4695</pre></td></tr>
4696
4697
4698<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>
4699<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
4700the inner matcher.
4701
4702Given
4703  int x;
4704declaratorDecl(hasTypeLoc(loc(asString("int"))))
4705  matches int x
4706</pre></td></tr>
4707
4708
4709<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>
4710<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
4711Decl, matches InnerMatcher.
4712
4713Given
4714  namespace N {
4715    namespace M {
4716      class D {};
4717    }
4718  }
4719
4720cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
4721declaration of class D.
4722</pre></td></tr>
4723
4724
4725<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>
4726<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
4727definition that has a given body.
4728
4729Given
4730  for (;;) {}
4731hasBody(compoundStmt())
4732  matches 'for (;;) {}'
4733with compoundStmt()
4734  matching '{}'
4735</pre></td></tr>
4736
4737
4738<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>
4739<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
4740switch statement or conditional operator.
4741
4742Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4743  if (true) {}
4744</pre></td></tr>
4745
4746
4747<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>
4748<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
4749matches InnerMatcher if the qualifier exists.
4750
4751Given
4752  namespace N {
4753    namespace M {
4754      class D {};
4755    }
4756  }
4757  N::M::D d;
4758
4759elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
4760matches the type of the variable declaration of d.
4761</pre></td></tr>
4762
4763
4764<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>
4765<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
4766
4767Given
4768  namespace N {
4769    namespace M {
4770      class D {};
4771    }
4772  }
4773  N::M::D d;
4774
4775elaboratedType(namesType(recordType(
4776hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
4777declaration of d.
4778</pre></td></tr>
4779
4780
4781<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>
4782<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
4783matches the given matcher.
4784
4785The associated declaration is:
4786- for type nodes, the declaration of the underlying type
4787- for CallExpr, the declaration of the callee
4788- for MemberExpr, the declaration of the referenced member
4789- for CXXConstructExpr, the declaration of the constructor
4790- for CXXNewExpr, the declaration of the operator new
4791
4792Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4793function. e.g. various subtypes of clang::Type and various expressions.
4794
4795Usable 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;,
4796  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;,
4797  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;,
4798  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;,
4799  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;,
4800  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;,
4801  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4802</pre></td></tr>
4803
4804
4805<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>
4806<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
4807
4808(Note: Clang's AST refers to other conversions as "casts" too, and calls
4809actual casts "explicit" casts.)
4810</pre></td></tr>
4811
4812
4813<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>
4814<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
4815declaration's type.
4816
4817In case of a value declaration (for example a variable declaration),
4818this resolves one layer of indirection. For example, in the value
4819declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
4820X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
4821declaration of x.
4822
4823Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4824            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4825 class X {};
4826 void y(X &amp;x) { x; X z; }
4827
4828Usable 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;
4829</pre></td></tr>
4830
4831
4832<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>
4833<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
4834matcher.
4835
4836Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4837            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4838            and U (matcher = typedefDecl(hasType(asString("int")))
4839 class X {};
4840 void y(X &amp;x) { x; X z; }
4841 typedef int U;
4842</pre></td></tr>
4843
4844
4845<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>
4846<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
4847are stripped off.
4848
4849Parentheses and explicit casts are not discarded.
4850Given
4851  int arr[5];
4852  int a = 0;
4853  char b = 0;
4854  const int c = a;
4855  int *d = arr;
4856  long e = (long) 0l;
4857The matchers
4858   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
4859   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
4860would match the declarations for a, b, c, and d, but not e.
4861While
4862   varDecl(hasInitializer(integerLiteral()))
4863   varDecl(hasInitializer(declRefExpr()))
4864only match the declarations for b, c, and d.
4865</pre></td></tr>
4866
4867
4868<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>
4869<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
4870nodes are stripped off.
4871
4872Parentheses and explicit casts are not discarded.
4873Given
4874  class C {};
4875  C a = C();
4876  C b;
4877  C c = b;
4878The matchers
4879   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
4880would match the declarations for a, b, and c.
4881While
4882   varDecl(hasInitializer(cxxConstructExpr()))
4883only match the declarations for b and c.
4884</pre></td></tr>
4885
4886
4887<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>
4888<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
4889casts are stripped off.
4890
4891Implicit and non-C Style casts are also discarded.
4892Given
4893  int a = 0;
4894  char b = (0);
4895  void* c = reinterpret_cast&lt;char*&gt;(0);
4896  char d = char(0);
4897The matcher
4898   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
4899would match the declarations for a, b, c, and d.
4900while
4901   varDecl(hasInitializer(integerLiteral()))
4902only match the declaration for a.
4903</pre></td></tr>
4904
4905
4906<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>
4907<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
4908parentheses are stripped off.
4909
4910Explicit casts are not discarded.
4911Given
4912  int arr[5];
4913  int a = 0;
4914  char b = (0);
4915  const int c = a;
4916  int *d = (arr);
4917  long e = ((long) 0l);
4918The matchers
4919   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
4920   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
4921would match the declarations for a, b, c, and d, but not e.
4922while
4923   varDecl(hasInitializer(integerLiteral()))
4924   varDecl(hasInitializer(declRefExpr()))
4925would only match the declaration for a.
4926</pre></td></tr>
4927
4928
4929<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>
4930<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
4931
4932Given
4933  class C {
4934    int a = 2;
4935    int b = 3;
4936    int c;
4937  };
4938fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
4939  matches 'int a;' but not 'int b;'.
4940fieldDecl(hasInClassInitializer(anything()))
4941  matches 'int a;' and 'int b;' but not 'int c;'.
4942</pre></td></tr>
4943
4944
4945<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>
4946<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
4947definition that has a given body.
4948
4949Given
4950  for (;;) {}
4951hasBody(compoundStmt())
4952  matches 'for (;;) {}'
4953with compoundStmt()
4954  matching '{}'
4955</pre></td></tr>
4956
4957
4958<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>
4959<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
4960switch statement or conditional operator.
4961
4962Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4963  if (true) {}
4964</pre></td></tr>
4965
4966
4967<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>
4968<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
4969
4970Example:
4971    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
4972matches '++x' in
4973    for (x; x &lt; N; ++x) { }
4974</pre></td></tr>
4975
4976
4977<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>
4978<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
4979
4980Example:
4981    forStmt(hasLoopInit(declStmt()))
4982matches 'int x = 0' in
4983    for (int x = 0; x &lt; N; ++x) { }
4984</pre></td></tr>
4985
4986
4987<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>
4988<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
4989
4990Does not match the 'this' parameter of a method.
4991
4992Given
4993  class X { void f(int x, int y, int z) {} };
4994cxxMethodDecl(hasAnyParameter(hasName("y")))
4995  matches f(int x, int y, int z) {}
4996with hasAnyParameter(...)
4997  matching int y
4998</pre></td></tr>
4999
5000
5001<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>
5002<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5003functionDecl that have at least one TemplateArgument matching the given
5004InnerMatcher.
5005
5006Given
5007  template&lt;typename T&gt; class A {};
5008  template&lt;&gt; class A&lt;double&gt; {};
5009  A&lt;int&gt; a;
5010
5011  template&lt;typename T&gt; f() {};
5012  void func() { f&lt;int&gt;(); };
5013
5014classTemplateSpecializationDecl(hasAnyTemplateArgument(
5015    refersToType(asString("int"))))
5016  matches the specialization A&lt;int&gt;
5017
5018functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5019  matches the specialization f&lt;int&gt;
5020</pre></td></tr>
5021
5022
5023<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>
5024<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
5025definition that has a given body.
5026
5027Given
5028  for (;;) {}
5029hasBody(compoundStmt())
5030  matches 'for (;;) {}'
5031with compoundStmt()
5032  matching '{}'
5033</pre></td></tr>
5034
5035
5036<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>
5037<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
5038
5039Given
5040  class X { void f(int x) {} };
5041cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5042  matches f(int x) {}
5043with hasParameter(...)
5044  matching int x
5045</pre></td></tr>
5046
5047
5048<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>
5049<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5050functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5051
5052Given
5053  template&lt;typename T, typename U&gt; class A {};
5054  A&lt;bool, int&gt; b;
5055  A&lt;int, bool&gt; c;
5056
5057  template&lt;typename T&gt; f() {};
5058  void func() { f&lt;int&gt;(); };
5059classTemplateSpecializationDecl(hasTemplateArgument(
5060    1, refersToType(asString("int"))))
5061  matches the specialization A&lt;bool, int&gt;
5062
5063functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5064  matches the specialization f&lt;int&gt;
5065</pre></td></tr>
5066
5067
5068<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>
5069<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
5070
5071Given:
5072  class X { int f() { return 1; } };
5073cxxMethodDecl(returns(asString("int")))
5074  matches int f() { return 1; }
5075</pre></td></tr>
5076
5077
5078<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>
5079<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
5080switch statement or conditional operator.
5081
5082Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5083  if (true) {}
5084</pre></td></tr>
5085
5086
5087<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>
5088<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
5089
5090Given
5091  if (A* a = GetAPointer()) {}
5092hasConditionVariableStatement(...)
5093  matches 'A* a = GetAPointer()'.
5094</pre></td></tr>
5095
5096
5097<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>
5098<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
5099
5100Examples matches the if statement
5101  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
5102  if (false) false; else true;
5103</pre></td></tr>
5104
5105
5106<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>
5107<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
5108
5109Examples matches the if statement
5110  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
5111  if (false) true; else false;
5112</pre></td></tr>
5113
5114
5115<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>
5116<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
5117matcher.
5118
5119FIXME: Unit test this matcher
5120</pre></td></tr>
5121
5122
5123<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>
5124<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
5125(if expression have it).
5126</pre></td></tr>
5127
5128
5129<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>
5130<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
5131matches the given matcher.
5132
5133The associated declaration is:
5134- for type nodes, the declaration of the underlying type
5135- for CallExpr, the declaration of the callee
5136- for MemberExpr, the declaration of the referenced member
5137- for CXXConstructExpr, the declaration of the constructor
5138- for CXXNewExpr, the declaration of the operator new
5139
5140Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5141function. e.g. various subtypes of clang::Type and various expressions.
5142
5143Usable 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;,
5144  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;,
5145  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;,
5146  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;,
5147  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;,
5148  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;,
5149  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5150</pre></td></tr>
5151
5152
5153<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>
5154<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
5155matches the given matcher.
5156
5157The associated declaration is:
5158- for type nodes, the declaration of the underlying type
5159- for CallExpr, the declaration of the callee
5160- for MemberExpr, the declaration of the referenced member
5161- for CXXConstructExpr, the declaration of the constructor
5162- for CXXNewExpr, the declaration of the operator new
5163
5164Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5165function. e.g. various subtypes of clang::Type and various expressions.
5166
5167Usable 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;,
5168  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;,
5169  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;,
5170  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;,
5171  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;,
5172  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;,
5173  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5174</pre></td></tr>
5175
5176
5177<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>
5178<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
5179matches the given matcher.
5180
5181The associated declaration is:
5182- for type nodes, the declaration of the underlying type
5183- for CallExpr, the declaration of the callee
5184- for MemberExpr, the declaration of the referenced member
5185- for CXXConstructExpr, the declaration of the constructor
5186- for CXXNewExpr, the declaration of the operator new
5187
5188Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5189function. e.g. various subtypes of clang::Type and various expressions.
5190
5191Usable 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;,
5192  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;,
5193  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;,
5194  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;,
5195  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;,
5196  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;,
5197  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5198</pre></td></tr>
5199
5200
5201<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>
5202<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
5203matched by a given matcher.
5204
5205Given
5206  struct X { int m; };
5207  void f(X x) { x.m; m; }
5208memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
5209  matches "x.m" and "m"
5210with hasObjectExpression(...)
5211  matching "x" and the implicit object expression of "m" which has type X*.
5212</pre></td></tr>
5213
5214
5215<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>
5216<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
5217given matcher.
5218
5219Given
5220  struct { int first, second; } first, second;
5221  int i(second.first);
5222  int j(first.second);
5223memberExpr(member(hasName("first")))
5224  matches second.first
5225  but not first.second (because the member name there is "second").
5226</pre></td></tr>
5227
5228
5229<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>
5230<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
5231pointee matches a given matcher.
5232
5233Given
5234  int *a;
5235  int const *b;
5236  float const *f;
5237pointerType(pointee(isConstQualified(), isInteger()))
5238  matches "int const *b"
5239
5240Usable 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;,
5241  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;
5242</pre></td></tr>
5243
5244
5245<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>
5246<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
5247pointee matches a given matcher.
5248
5249Given
5250  int *a;
5251  int const *b;
5252  float const *f;
5253pointerType(pointee(isConstQualified(), isInteger()))
5254  matches "int const *b"
5255
5256Usable 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;,
5257  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;
5258</pre></td></tr>
5259
5260
5261<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>
5262<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
5263matcher.
5264
5265Given
5266  namespace N { template&lt;class T&gt; void f(T t); }
5267  template &lt;class T&gt; void g() { using N::f; f(T()); }
5268unresolvedLookupExpr(hasAnyDeclaration(
5269    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
5270  matches the use of f in g() .
5271</pre></td></tr>
5272
5273
5274<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>
5275<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
5276
5277Given
5278  struct A { struct B { struct C {}; }; };
5279  A::B::C c;
5280nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
5281  matches "A::"
5282</pre></td></tr>
5283
5284
5285<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>
5286<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
5287given TypeLoc.
5288
5289Given
5290  struct A { struct B { struct C {}; }; };
5291  A::B::C c;
5292nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
5293  hasDeclaration(cxxRecordDecl(hasName("A")))))))
5294  matches "A::"
5295</pre></td></tr>
5296
5297
5298<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>
5299<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
5300
5301Given
5302  struct A { struct B { struct C {}; }; };
5303  A::B::C c;
5304nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
5305  matches "A::"
5306</pre></td></tr>
5307
5308
5309<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>
5310<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
5311given namespace matcher.
5312
5313Given
5314  namespace ns { struct A {}; }
5315  ns::A a;
5316nestedNameSpecifier(specifiesNamespace(hasName("ns")))
5317  matches "ns::"
5318</pre></td></tr>
5319
5320
5321<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>
5322<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
5323given QualType matcher without qualifiers.
5324
5325Given
5326  struct A { struct B { struct C {}; }; };
5327  A::B::C c;
5328nestedNameSpecifier(specifiesType(
5329  hasDeclaration(cxxRecordDecl(hasName("A")))
5330))
5331  matches "A::"
5332</pre></td></tr>
5333
5334
5335<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>
5336<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
5337call expression.
5338
5339Example matches y in x(y)
5340    (matcher = callExpr(hasArgument(0, declRefExpr())))
5341  void x(int) { int y; x(y); }
5342</pre></td></tr>
5343
5344
5345<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>
5346<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
5347
5348Example
5349matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
5350matches the [webView ...] message invocation.
5351  NSString *webViewJavaScript = ...
5352  UIWebView *webView = ...
5353  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
5354</pre></td></tr>
5355
5356
5357<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>
5358<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre></pre></td></tr>
5359
5360
5361<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>
5362<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
5363overloads matches the given matcher.
5364
5365Given
5366  template &lt;typename T&gt; void foo(T);
5367  template &lt;typename T&gt; void bar(T);
5368  template &lt;typename T&gt; void baz(T t) {
5369    foo(t);
5370    bar(t);
5371  }
5372unresolvedLookupExpr(hasAnyDeclaration(
5373    functionTemplateDecl(hasName("foo"))))
5374  matches foo in foo(t); but not bar in bar(t);
5375</pre></td></tr>
5376
5377
5378<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>
5379<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
5380
5381Given
5382  int (*ptr_to_array)[4];
5383  int (*ptr_to_func)(int);
5384
5385varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
5386ptr_to_func but not ptr_to_array.
5387
5388Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
5389</pre></td></tr>
5390
5391
5392<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>
5393<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
5394pointee matches a given matcher.
5395
5396Given
5397  int *a;
5398  int const *b;
5399  float const *f;
5400pointerType(pointee(isConstQualified(), isInteger()))
5401  matches "int const *b"
5402
5403Usable 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;,
5404  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;
5405</pre></td></tr>
5406
5407
5408<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>
5409<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
5410pointee matches a given matcher.
5411
5412Given
5413  int *a;
5414  int const *b;
5415  float const *f;
5416pointerType(pointee(isConstQualified(), isInteger()))
5417  matches "int const *b"
5418
5419Usable 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;,
5420  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;
5421</pre></td></tr>
5422
5423
5424<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>
5425<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
5426
5427Given:
5428  typedef int &amp;int_ref;
5429  int a;
5430  int_ref b = a;
5431
5432varDecl(hasType(qualType(referenceType()))))) will not match the
5433declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
5434</pre></td></tr>
5435
5436
5437<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>
5438<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
5439matches the given matcher.
5440
5441The associated declaration is:
5442- for type nodes, the declaration of the underlying type
5443- for CallExpr, the declaration of the callee
5444- for MemberExpr, the declaration of the referenced member
5445- for CXXConstructExpr, the declaration of the constructor
5446- for CXXNewExpr, the declaration of the operator new
5447
5448Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5449function. e.g. various subtypes of clang::Type and various expressions.
5450
5451Usable 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;,
5452  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;,
5453  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;,
5454  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;,
5455  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;,
5456  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;,
5457  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5458</pre></td></tr>
5459
5460
5461<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>
5462<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
5463
5464Given
5465  void (*fp)(void);
5466The matcher
5467  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
5468would match the declaration for fp.
5469</pre></td></tr>
5470
5471
5472<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>
5473<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
5474</pre></td></tr>
5475
5476
5477<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>
5478<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
5479matches the specified matcher.
5480
5481Example matches y-&gt;x()
5482  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
5483     cxxRecordDecl(hasName("Y")))))))
5484  class Y { public: void x(); };
5485  void z() { Y *y; y-&gt;x(); }
5486</pre></td></tr>
5487
5488
5489<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>
5490<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
5491</pre></td></tr>
5492
5493
5494<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>
5495<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
5496type matches the specified matcher.
5497
5498Example matches X &amp;x and const X &amp;y
5499    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
5500  class X {
5501    void a(X b) {
5502      X &amp;x = b;
5503      const X &amp;y = b;
5504    }
5505  };
5506</pre></td></tr>
5507
5508
5509<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>
5510<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
5511matches the given matcher.
5512
5513The associated declaration is:
5514- for type nodes, the declaration of the underlying type
5515- for CallExpr, the declaration of the callee
5516- for MemberExpr, the declaration of the referenced member
5517- for CXXConstructExpr, the declaration of the constructor
5518- for CXXNewExpr, the declaration of the operator new
5519
5520Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5521function. e.g. various subtypes of clang::Type and various expressions.
5522
5523Usable 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;,
5524  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;,
5525  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;,
5526  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;,
5527  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;,
5528  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;,
5529  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5530</pre></td></tr>
5531
5532
5533<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>
5534<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
5535pointee matches a given matcher.
5536
5537Given
5538  int *a;
5539  int const *b;
5540  float const *f;
5541pointerType(pointee(isConstQualified(), isInteger()))
5542  matches "int const *b"
5543
5544Usable 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;,
5545  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;
5546</pre></td></tr>
5547
5548
5549<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>
5550<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
5551pointee matches a given matcher.
5552
5553Given
5554  int *a;
5555  int const *b;
5556  float const *f;
5557pointerType(pointee(isConstQualified(), isInteger()))
5558  matches "int const *b"
5559
5560Usable 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;,
5561  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;
5562</pre></td></tr>
5563
5564
5565<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>
5566<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
5567
5568Given
5569  return a + b;
5570hasReturnValue(binaryOperator())
5571  matches 'return a + b'
5572with binaryOperator()
5573  matching 'a + b'
5574</pre></td></tr>
5575
5576
5577<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>
5578<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
5579a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5580
5581Given
5582  { {}; 1+2; }
5583hasAnySubstatement(compoundStmt())
5584  matches '{ {}; 1+2; }'
5585with compoundStmt()
5586  matching '{}'
5587</pre></td></tr>
5588
5589
5590<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>
5591<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5592alignof.
5593</pre></td></tr>
5594
5595
5596<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>
5597<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to
5598
5599Given:
5600F&amp; operator=(const F&amp; o) {
5601  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
5602  return *this;
5603}
5604returnStmt(forFunction(hasName("operator=")))
5605  matches 'return *this'
5606  but does match 'return &gt; 0'
5607</pre></td></tr>
5608
5609
5610<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>
5611<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5612sizeof.
5613</pre></td></tr>
5614
5615
5616<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>
5617<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
5618type that matches the provided matcher.
5619
5620Given
5621  template &lt;typename T&gt;
5622  double F(T t);
5623  int i;
5624  double j = F(i);
5625
5626substTemplateTypeParmType(hasReplacementType(type())) matches int
5627</pre></td></tr>
5628
5629
5630<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>
5631<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
5632statement. This matcher may produce multiple matches.
5633
5634Given
5635  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
5636switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
5637  matches four times, with "c" binding each of "case 1:", "case 2:",
5638"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
5639"switch (1)", "switch (2)" and "switch (2)".
5640</pre></td></tr>
5641
5642
5643<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>
5644<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
5645switch statement or conditional operator.
5646
5647Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5648  if (true) {}
5649</pre></td></tr>
5650
5651
5652<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>
5653<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
5654matches the given matcher.
5655
5656The associated declaration is:
5657- for type nodes, the declaration of the underlying type
5658- for CallExpr, the declaration of the callee
5659- for MemberExpr, the declaration of the referenced member
5660- for CXXConstructExpr, the declaration of the constructor
5661- for CXXNewExpr, the declaration of the operator new
5662
5663Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5664function. e.g. various subtypes of clang::Type and various expressions.
5665
5666Usable 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;,
5667  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;,
5668  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;,
5669  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;,
5670  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;,
5671  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;,
5672  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5673</pre></td></tr>
5674
5675
5676<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>
5677<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
5678
5679Given
5680  template&lt;typename T&gt; struct A {};
5681  struct B { B* next; };
5682  A&lt;&amp;B::next&gt; a;
5683templateSpecializationType(hasAnyTemplateArgument(
5684  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
5685  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5686    B::next
5687</pre></td></tr>
5688
5689
5690<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>
5691<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
5692declaration.
5693
5694Given
5695  template&lt;typename T&gt; struct A {};
5696  struct B { B* next; };
5697  A&lt;&amp;B::next&gt; a;
5698classTemplateSpecializationDecl(hasAnyTemplateArgument(
5699    refersToDeclaration(fieldDecl(hasName("next"))))
5700  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5701    B::next
5702</pre></td></tr>
5703
5704
5705<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>
5706<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
5707
5708Given
5709  template&lt;int T&gt; struct A {};
5710  C&lt;42&gt; c;
5711classTemplateSpecializationDecl(
5712  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
5713  matches the implicit instantiation of C in C&lt;42&gt;.
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('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>
5718<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
5719
5720Given
5721  template&lt;template &lt;typename&gt; class S&gt; class X {};
5722  template&lt;typename T&gt; class Y {};"
5723  X&lt;Y&gt; xi;
5724classTemplateSpecializationDecl(hasAnyTemplateArgument(
5725    refersToTemplate(templateName())))
5726  matches the specialization X&lt;Y&gt;
5727</pre></td></tr>
5728
5729
5730<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>
5731<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
5732
5733Given
5734  struct X {};
5735  template&lt;typename T&gt; struct A {};
5736  A&lt;X&gt; a;
5737classTemplateSpecializationDecl(hasAnyTemplateArgument(
5738    refersToType(class(hasName("X")))))
5739  matches the specialization A&lt;X&gt;
5740</pre></td></tr>
5741
5742
5743<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>
5744<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5745functionDecl that have at least one TemplateArgument matching the given
5746InnerMatcher.
5747
5748Given
5749  template&lt;typename T&gt; class A {};
5750  template&lt;&gt; class A&lt;double&gt; {};
5751  A&lt;int&gt; a;
5752
5753  template&lt;typename T&gt; f() {};
5754  void func() { f&lt;int&gt;(); };
5755
5756classTemplateSpecializationDecl(hasAnyTemplateArgument(
5757    refersToType(asString("int"))))
5758  matches the specialization A&lt;int&gt;
5759
5760functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5761  matches the specialization f&lt;int&gt;
5762</pre></td></tr>
5763
5764
5765<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>
5766<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
5767matches the given matcher.
5768
5769The associated declaration is:
5770- for type nodes, the declaration of the underlying type
5771- for CallExpr, the declaration of the callee
5772- for MemberExpr, the declaration of the referenced member
5773- for CXXConstructExpr, the declaration of the constructor
5774- for CXXNewExpr, the declaration of the operator new
5775
5776Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5777function. e.g. various subtypes of clang::Type and various expressions.
5778
5779Usable 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;,
5780  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;,
5781  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;,
5782  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;,
5783  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;,
5784  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;,
5785  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5786</pre></td></tr>
5787
5788
5789<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>
5790<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5791functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5792
5793Given
5794  template&lt;typename T, typename U&gt; class A {};
5795  A&lt;bool, int&gt; b;
5796  A&lt;int, bool&gt; c;
5797
5798  template&lt;typename T&gt; f() {};
5799  void func() { f&lt;int&gt;(); };
5800classTemplateSpecializationDecl(hasTemplateArgument(
5801    1, refersToType(asString("int"))))
5802  matches the specialization A&lt;bool, int&gt;
5803
5804functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5805  matches the specialization f&lt;int&gt;
5806</pre></td></tr>
5807
5808
5809<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>
5810<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
5811matches the given matcher.
5812
5813The associated declaration is:
5814- for type nodes, the declaration of the underlying type
5815- for CallExpr, the declaration of the callee
5816- for MemberExpr, the declaration of the referenced member
5817- for CXXConstructExpr, the declaration of the constructor
5818- for CXXNewExpr, the declaration of the operator new
5819
5820Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5821function. e.g. various subtypes of clang::Type and various expressions.
5822
5823Usable 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;,
5824  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;,
5825  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;,
5826  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;,
5827  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;,
5828  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;,
5829  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5830</pre></td></tr>
5831
5832
5833<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>
5834<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5835
5836Generates results for each match.
5837
5838For example, in:
5839  class A { class B {}; class C {}; };
5840The matcher:
5841  cxxRecordDecl(hasName("::A"),
5842                findAll(cxxRecordDecl(isDefinition()).bind("m")))
5843will generate results for A, B and C.
5844
5845Usable as: Any Matcher
5846</pre></td></tr>
5847
5848
5849<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>
5850<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
5851matcher.
5852
5853Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5854            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5855            and U (matcher = typedefDecl(hasType(asString("int")))
5856 class X {};
5857 void y(X &amp;x) { x; X z; }
5858 typedef int U;
5859</pre></td></tr>
5860
5861
5862<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>
5863<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
5864matches the given matcher.
5865
5866The associated declaration is:
5867- for type nodes, the declaration of the underlying type
5868- for CallExpr, the declaration of the callee
5869- for MemberExpr, the declaration of the referenced member
5870- for CXXConstructExpr, the declaration of the constructor
5871- for CXXNewExpr, the declaration of the operator new
5872
5873Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5874function. e.g. various subtypes of clang::Type and various expressions.
5875
5876Usable 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;,
5877  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;,
5878  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;,
5879  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;,
5880  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;,
5881  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;,
5882  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5883</pre></td></tr>
5884
5885
5886<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>
5887<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
5888type of the matched node.
5889
5890For example, in:
5891  class A {};
5892  using B = A;
5893The matcher type(hasUniqualifeidDesugaredType(recordType())) matches
5894both B and A.
5895</pre></td></tr>
5896
5897
5898<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>
5899<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
5900
5901Given
5902  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
5903unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
5904  matches sizeof(a) and alignof(c)
5905</pre></td></tr>
5906
5907
5908<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>
5909<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
5910
5911Example matches true (matcher = hasUnaryOperand(
5912                                  cxxBoolLiteral(equals(true))))
5913  !true
5914</pre></td></tr>
5915
5916
5917<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>
5918<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
5919matches the given matcher.
5920
5921The associated declaration is:
5922- for type nodes, the declaration of the underlying type
5923- for CallExpr, the declaration of the callee
5924- for MemberExpr, the declaration of the referenced member
5925- for CXXConstructExpr, the declaration of the constructor
5926- for CXXNewExpr, the declaration of the operator new
5927
5928Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5929function. e.g. various subtypes of clang::Type and various expressions.
5930
5931Usable 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;,
5932  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;,
5933  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;,
5934  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;,
5935  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;,
5936  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;,
5937  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5938</pre></td></tr>
5939
5940
5941<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>
5942<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
5943
5944Given
5945  namespace X { void b(); }
5946  using X::b;
5947usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
5948  matches using X::b </pre></td></tr>
5949
5950
5951<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>
5952<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
5953matched by the given matcher.
5954
5955Given
5956  namespace X { int a; void b(); }
5957  using X::a;
5958  using X::b;
5959usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
5960  matches using X::b but not using X::a </pre></td></tr>
5961
5962
5963<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>
5964<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
5965declaration's type.
5966
5967In case of a value declaration (for example a variable declaration),
5968this resolves one layer of indirection. For example, in the value
5969declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5970X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5971declaration of x.
5972
5973Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5974            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5975 class X {};
5976 void y(X &amp;x) { x; X z; }
5977
5978Usable 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;
5979</pre></td></tr>
5980
5981
5982<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>
5983<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
5984matcher.
5985
5986Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5987            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5988            and U (matcher = typedefDecl(hasType(asString("int")))
5989 class X {};
5990 void y(X &amp;x) { x; X z; }
5991 typedef int U;
5992</pre></td></tr>
5993
5994
5995<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>
5996<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
5997that matches the given matcher.
5998
5999Example matches x (matcher = varDecl(hasInitializer(callExpr())))
6000  bool y() { return true; }
6001  bool x = y();
6002</pre></td></tr>
6003
6004
6005<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>
6006<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
6007expression.
6008
6009Given
6010  void f(int b) {
6011    int a[b];
6012  }
6013variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
6014  varDecl(hasName("b")))))))
6015  matches "int a[b]"
6016</pre></td></tr>
6017
6018
6019<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>
6020<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
6021definition that has a given body.
6022
6023Given
6024  for (;;) {}
6025hasBody(compoundStmt())
6026  matches 'for (;;) {}'
6027with compoundStmt()
6028  matching '{}'
6029</pre></td></tr>
6030
6031
6032<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>
6033<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
6034switch statement or conditional operator.
6035
6036Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6037  if (true) {}
6038</pre></td></tr>
6039
6040
6041<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>
6042<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
6043NestedNameSpecifier-matcher matches.
6044</pre></td></tr>
6045
6046
6047<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>
6048<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
6049QualType-matcher matches.
6050</pre></td></tr>
6051
6052<!--END_TRAVERSAL_MATCHERS -->
6053</table>
6054
6055</div>
6056</body>
6057</html>
6058
6059
6060