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