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<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>
2745<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
2746
2747Given:
2748  extern "C" void f() {}
2749  extern "C" { void g() {} }
2750  void h() {}
2751  extern "C" int x = 1;
2752  extern "C" int y = 2;
2753  int z = 3;
2754functionDecl(isExternC())
2755  matches the declaration of f and g, but not the declaration of h.
2756varDecl(isExternC())
2757  matches the declaration of x and y, but not the declaration of z.
2758</pre></td></tr>
2759
2760<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>
2761<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2762the inline keyword.
2763
2764Given
2765  inline void f();
2766  void g();
2767  namespace n {
2768  inline namespace m {}
2769  }
2770functionDecl(isInline()) will match ::f().
2771namespaceDecl(isInline()) will match n::m.
2772</pre></td></tr>
2773
2774
2775<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>
2776<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2777
2778Given:
2779  void f();
2780  void g() noexcept;
2781  void h() throw();
2782  void i() throw(int);
2783  void j() noexcept(false);
2784functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2785  match the declarations of g, and h, but not f, i or j.
2786</pre></td></tr>
2787
2788
2789<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>
2790<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage
2791class specifier ("static" keyword) written in the source.
2792
2793Given:
2794  static void f() {}
2795  static int i = 0;
2796  extern int j;
2797  int k;
2798functionDecl(isStaticStorageClass())
2799  matches the function declaration f.
2800varDecl(isStaticStorageClass())
2801  matches the variable declaration i.
2802</pre></td></tr>
2803
2804
2805<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>
2806<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2807member variable template instantiations.
2808
2809Given
2810  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2811or
2812  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2813cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2814  matches the template instantiation of X&lt;A&gt;.
2815
2816But given
2817  template &lt;typename T&gt;  class X {}; class A {};
2818  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2819cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2820  does not match, as X&lt;A&gt; is an explicit template specialization.
2821
2822Usable 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;
2823</pre></td></tr>
2824
2825
2826<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr>
2827<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
2828
2829Example matches f, but not g or h. The function i will not match, even when
2830compiled in C mode.
2831  void f(...);
2832  void g(int);
2833  template &lt;typename... Ts&gt; void h(Ts...);
2834  void i();
2835</pre></td></tr>
2836
2837
2838<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>
2839<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2840specific parameter count.
2841
2842Given
2843  void f(int i) {}
2844  void g(int i, int j) {}
2845  void h(int i, int j);
2846  void j(int i);
2847  void k(int x, int y, int z, ...);
2848functionDecl(parameterCountIs(2))
2849  matches void g(int i, int j) {}
2850functionProtoType(parameterCountIs(2))
2851  matches void h(int i, int j)
2852functionProtoType(parameterCountIs(3))
2853  matches void k(int x, int y, int z, ...);
2854</pre></td></tr>
2855
2856
2857<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>
2858<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
2859
2860Given:
2861  void f();
2862  void g() noexcept;
2863  void h() noexcept(true);
2864  void i() noexcept(false);
2865  void j() throw();
2866  void k() throw(int);
2867  void l() throw(...);
2868functionDecl(hasDynamicExceptionSpec()) and
2869  functionProtoType(hasDynamicExceptionSpec())
2870  match the declarations of j, k, and l, but not f, g, h, or i.
2871</pre></td></tr>
2872
2873
2874<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>
2875<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
2876
2877Given:
2878  void f();
2879  void g() noexcept;
2880  void h() throw();
2881  void i() throw(int);
2882  void j() noexcept(false);
2883functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2884  match the declarations of g, and h, but not f, i or j.
2885</pre></td></tr>
2886
2887
2888<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>
2889<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2890specific parameter count.
2891
2892Given
2893  void f(int i) {}
2894  void g(int i, int j) {}
2895  void h(int i, int j);
2896  void j(int i);
2897  void k(int x, int y, int z, ...);
2898functionDecl(parameterCountIs(2))
2899  matches void g(int i, int j) {}
2900functionProtoType(parameterCountIs(2))
2901  matches void h(int i, int j)
2902functionProtoType(parameterCountIs(3))
2903  matches void k(int x, int y, int z, ...);
2904</pre></td></tr>
2905
2906
2907<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>
2908<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
2909
2910Given
2911  f('false, 3.14, 42);
2912characterLiteral(equals(0))
2913  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2914  match false
2915floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2916  match 3.14
2917integerLiteral(equals(42))
2918  matches 42
2919
2920Note that you cannot directly match a negative numeric literal because the
2921minus sign is not part of the literal: It is a unary operator whose operand
2922is the positive numeric literal. Instead, you must use a unaryOperator()
2923matcher to match the minus sign:
2924
2925unaryOperator(hasOperatorName("-"),
2926              hasUnaryOperand(integerLiteral(equals(13))))
2927
2928Usable 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;,
2929           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;
2930</pre></td></tr>
2931
2932
2933<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>
2934<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
2935
2936
2937<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>
2938<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
2939
2940
2941<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>
2942<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
2943
2944
2945<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>
2946<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
2947to '.'.
2948
2949Member calls on the implicit this pointer match as called with '-&gt;'.
2950
2951Given
2952  class Y {
2953    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2954    int a;
2955    static int b;
2956  };
2957memberExpr(isArrow())
2958  matches this-&gt;x, x, y.x, a, this-&gt;b
2959</pre></td></tr>
2960
2961
2962<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>
2963<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
2964
2965Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
2966void f() {
2967  int x;
2968  static int y;
2969}
2970int z;
2971
2972Example matches f() because it has external formal linkage despite being
2973unique to the translation unit as though it has internal likage
2974(matcher = functionDecl(hasExternalFormalLinkage()))
2975
2976namespace {
2977void f() {}
2978}
2979</pre></td></tr>
2980
2981
2982<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>
2983<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
2984
2985Supports specifying enclosing namespaces or classes by prefixing the name
2986with '&lt;enclosing&gt;::'.
2987Does not match typedefs of an underlying type with the given name.
2988
2989Example matches X (Name == "X")
2990  class X;
2991
2992Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
2993  namespace a { namespace b { class X; } }
2994</pre></td></tr>
2995
2996
2997<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>
2998<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
2999a substring matched by the given RegExp.
3000
3001Supports specifying enclosing namespaces or classes by
3002prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
3003of an underlying type with the given name.
3004
3005Example matches X (regexp == "::X")
3006  class X;
3007
3008Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3009  namespace foo { namespace bar { class X; } }
3010</pre></td></tr>
3011
3012
3013<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>
3014<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3015
3016Given
3017  namespace n {
3018  namespace {} #1
3019  }
3020namespaceDecl(isAnonymous()) will match #1 but not ::n.
3021</pre></td></tr>
3022
3023
3024<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>
3025<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3026the inline keyword.
3027
3028Given
3029  inline void f();
3030  void g();
3031  namespace n {
3032  inline namespace m {}
3033  }
3034functionDecl(isInline()) will match ::f().
3035namespaceDecl(isInline()) will match n::m.
3036</pre></td></tr>
3037
3038
3039<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>
3040<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3041a specific number of arguments (including absent default arguments).
3042
3043Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3044  void f(int x, int y);
3045  f(0, 0);
3046</pre></td></tr>
3047
3048
3049<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>
3050<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3051
3052objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3053message expression in
3054
3055  UIWebView *webView = ...;
3056  CGRect bodyFrame = webView.frame;
3057  bodyFrame.size.height = self.bodyContentHeight;
3058  webView.frame = bodyFrame;
3059      ^---- matches here
3060</pre></td></tr>
3061
3062
3063<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>
3064<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3065
3066Matches only when the selector of the objCMessageExpr is NULL. This may
3067represent an error condition in the tree!
3068</pre></td></tr>
3069
3070
3071<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>
3072<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3073
3074 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3075 matches the outer message expr in the code below, but NOT the message
3076 invocation for self.bodyView.
3077    [self.bodyView loadHTMLString:html baseURL:NULL];
3078</pre></td></tr>
3079
3080
3081<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>
3082<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3083
3084 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3085 matches self.bodyView in the code below, but NOT the outer message
3086 invocation of "loadHTMLString:baseURL:".
3087    [self.bodyView loadHTMLString:html baseURL:NULL];
3088</pre></td></tr>
3089
3090
3091<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>
3092<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3093a substring matched by the given RegExp.
3094 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3095 invocation for self.bodyView.
3096    [self.bodyView loadHTMLString:html baseURL:NULL];
3097</pre></td></tr>
3098
3099
3100<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>
3101<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3102
3103 matcher = objCMessageExpr(numSelectorArgs(0));
3104 matches self.bodyView in the code below
3105
3106 matcher = objCMessageExpr(numSelectorArgs(2));
3107 matches the invocation of "loadHTMLString:baseURL:" but not that
3108 of self.bodyView
3109    [self.bodyView loadHTMLString:html baseURL:NULL];
3110</pre></td></tr>
3111
3112
3113<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>
3114<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3115
3116Given
3117  class Y { public: void x(); };
3118  void z() { Y* y; y-&gt;x(); }
3119cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3120  matches y-&gt;x()
3121</pre></td></tr>
3122
3123
3124<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>
3125<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3126
3127Matches a node if it equals the node previously bound to ID.
3128
3129Given
3130  class X { int a; int b; };
3131cxxRecordDecl(
3132    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3133    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3134  matches the class X, as a and b have the same type.
3135
3136Note that when multiple matches are involved via forEach* matchers,
3137equalsBoundNodes acts as a filter.
3138For example:
3139compoundStmt(
3140    forEachDescendant(varDecl().bind("d")),
3141    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3142will trigger a match for each combination of variable declaration
3143and reference to that variable declaration within a compound statement.
3144</pre></td></tr>
3145
3146
3147<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasLocalQualifiers0')"><a name="hasLocalQualifiers0Anchor">hasLocalQualifiers</a></td><td></td></tr>
3148<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3149the node, not hidden within a typedef.
3150
3151Given
3152  typedef const int const_int;
3153  const_int i;
3154  int *const j;
3155  int *volatile k;
3156  int m;
3157varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3158i is const-qualified but the qualifier is not local.
3159</pre></td></tr>
3160
3161
3162<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr>
3163<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3164
3165Given
3166  void a(char);
3167  void b(wchar_t);
3168  void c(double);
3169functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3170matches "a(char)", "b(wchar_t)", but not "c(double)".
3171</pre></td></tr>
3172
3173
3174<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>
3175<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3176the Objective-C object pointer type, which is different despite being
3177syntactically similar.
3178
3179Given
3180  int *i = nullptr;
3181
3182  @interface Foo
3183  @end
3184  Foo *f;
3185
3186  int j;
3187varDecl(hasType(isAnyPointer()))
3188  matches "int *i" and "Foo *f", but not "int j".
3189</pre></td></tr>
3190
3191
3192<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>
3193<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3194include "top-level" const.
3195
3196Given
3197  void a(int);
3198  void b(int const);
3199  void c(const int);
3200  void d(const int*);
3201  void e(int const) {};
3202functionDecl(hasAnyParameter(hasType(isConstQualified())))
3203  matches "void b(int const)", "void c(const int)" and
3204  "void e(int const) {}". It does not match d as there
3205  is no top-level const on the parameter type "const int *".
3206</pre></td></tr>
3207
3208
3209<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isInteger0')"><a name="isInteger0Anchor">isInteger</a></td><td></td></tr>
3210<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3211
3212Given
3213  void a(int);
3214  void b(long);
3215  void c(double);
3216functionDecl(hasAnyParameter(hasType(isInteger())))
3217matches "a(int)", "b(long)", but not "c(double)".
3218</pre></td></tr>
3219
3220
3221<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr>
3222<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3223
3224Given
3225  void a(int);
3226  void b(unsigned long);
3227  void c(double);
3228functionDecl(hasAnyParameter(hasType(isSignedInteger())))
3229matches "a(int)", but not "b(unsigned long)" and "c(double)".
3230</pre></td></tr>
3231
3232
3233<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr>
3234<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3235
3236Given
3237  void a(int);
3238  void b(unsigned long);
3239  void c(double);
3240functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
3241matches "b(unsigned long)", but not "a(int)" and "c(double)".
3242</pre></td></tr>
3243
3244
3245<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>
3246<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3247include "top-level" volatile.
3248
3249Given
3250  void a(int);
3251  void b(int volatile);
3252  void c(volatile int);
3253  void d(volatile int*);
3254  void e(int volatile) {};
3255functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3256  matches "void b(int volatile)", "void c(volatile int)" and
3257  "void e(int volatile) {}". It does not match d as there
3258  is no top-level volatile on the parameter type "volatile int *".
3259</pre></td></tr>
3260
3261
3262<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>
3263<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3264
3265Example matches C, but not S or U.
3266  struct S {};
3267  class C {};
3268  union U {};
3269</pre></td></tr>
3270
3271
3272<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>
3273<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3274
3275Example matches S, but not C or U.
3276  struct S {};
3277  class C {};
3278  union U {};
3279</pre></td></tr>
3280
3281
3282<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>
3283<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3284
3285Example matches U, but not C or S.
3286  struct S {};
3287  class C {};
3288  union U {};
3289</pre></td></tr>
3290
3291
3292<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>
3293<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3294
3295Matches a node if it equals the node previously bound to ID.
3296
3297Given
3298  class X { int a; int b; };
3299cxxRecordDecl(
3300    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3301    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3302  matches the class X, as a and b have the same type.
3303
3304Note that when multiple matches are involved via forEach* matchers,
3305equalsBoundNodes acts as a filter.
3306For example:
3307compoundStmt(
3308    forEachDescendant(varDecl().bind("d")),
3309    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3310will trigger a match for each combination of variable declaration
3311and reference to that variable declaration within a compound statement.
3312</pre></td></tr>
3313
3314
3315<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>
3316<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3317
3318Stmt has pointer identity in the AST.
3319</pre></td></tr>
3320
3321
3322<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>
3323<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3324partially matching a given regex.
3325
3326Example matches Y but not X
3327    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3328  #include "ASTMatcher.h"
3329  class X {};
3330ASTMatcher.h:
3331  class Y {};
3332
3333Usable 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;
3334</pre></td></tr>
3335
3336
3337<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>
3338<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3339
3340Example matches X but not Y
3341  (matcher = cxxRecordDecl(isExpansionInMainFile())
3342  #include &lt;Y.h&gt;
3343  class X {};
3344Y.h:
3345  class Y {};
3346
3347Usable 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;
3348</pre></td></tr>
3349
3350
3351<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>
3352<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3353
3354Example matches Y but not X
3355    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3356  #include &lt;SystemHeader.h&gt;
3357  class X {};
3358SystemHeader.h:
3359  class Y {};
3360
3361Usable 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;
3362</pre></td></tr>
3363
3364
3365<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>
3366<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3367
3368Given
3369  int a[42];
3370  int b[2 * 21];
3371  int c[41], d[43];
3372  char *s = "abcd";
3373  wchar_t *ws = L"abcd";
3374  char *w = "a";
3375constantArrayType(hasSize(42))
3376  matches "int a[42]" and "int b[2 * 21]"
3377stringLiteral(hasSize(4))
3378  matches "abcd", L"abcd"
3379</pre></td></tr>
3380
3381
3382<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>
3383<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3384
3385Example matches A, va, fa
3386  class A {};
3387  class B;  Doesn't match, as it has no body.
3388  int va;
3389  extern int vb;  Doesn't match, as it doesn't define the variable.
3390  void fa() {}
3391  void fb();  Doesn't match, as it has no body.
3392
3393Usable 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;
3394</pre></td></tr>
3395
3396
3397<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>
3398<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3399
3400Note that 'Value' is a string as the template argument's value is
3401an arbitrary precision integer. 'Value' must be euqal to the canonical
3402representation of that integral value in base 10.
3403
3404Given
3405  template&lt;int T&gt; struct A {};
3406  C&lt;42&gt; c;
3407classTemplateSpecializationDecl(
3408  hasAnyTemplateArgument(equalsIntegralValue("42")))
3409  matches the implicit instantiation of C in C&lt;42&gt;.
3410</pre></td></tr>
3411
3412
3413<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>
3414<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3415
3416Given
3417  template&lt;int T&gt; struct A {};
3418  C&lt;42&gt; c;
3419classTemplateSpecializationDecl(
3420  hasAnyTemplateArgument(isIntegral()))
3421  matches the implicit instantiation of C in C&lt;42&gt;
3422  with isIntegral() matching 42.
3423</pre></td></tr>
3424
3425
3426<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>
3427<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3428
3429Given
3430  template&lt;typename T&gt; struct C {};
3431  C&lt;int&gt; c;
3432classTemplateSpecializationDecl(templateArgumentCountIs(1))
3433  matches C&lt;int&gt;.
3434</pre></td></tr>
3435
3436
3437<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>
3438<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3439partially matching a given regex.
3440
3441Example matches Y but not X
3442    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3443  #include "ASTMatcher.h"
3444  class X {};
3445ASTMatcher.h:
3446  class Y {};
3447
3448Usable 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;
3449</pre></td></tr>
3450
3451
3452<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>
3453<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3454
3455Example matches X but not Y
3456  (matcher = cxxRecordDecl(isExpansionInMainFile())
3457  #include &lt;Y.h&gt;
3458  class X {};
3459Y.h:
3460  class Y {};
3461
3462Usable 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;
3463</pre></td></tr>
3464
3465
3466<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>
3467<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
3468
3469Example matches Y but not X
3470    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3471  #include &lt;SystemHeader.h&gt;
3472  class X {};
3473SystemHeader.h:
3474  class Y {};
3475
3476Usable 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;
3477</pre></td></tr>
3478
3479
3480<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>
3481<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
3482
3483Given
3484 struct S { bool func(); };
3485functionDecl(returns(booleanType()))
3486  matches "bool func();"
3487</pre></td></tr>
3488
3489
3490<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>
3491<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
3492
3493Matches a node if it equals the node previously bound to ID.
3494
3495Given
3496  class X { int a; int b; };
3497cxxRecordDecl(
3498    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3499    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3500  matches the class X, as a and b have the same type.
3501
3502Note that when multiple matches are involved via forEach* matchers,
3503equalsBoundNodes acts as a filter.
3504For example:
3505compoundStmt(
3506    forEachDescendant(varDecl().bind("d")),
3507    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3508will trigger a match for each combination of variable declaration
3509and reference to that variable declaration within a compound statement.
3510</pre></td></tr>
3511
3512
3513<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>
3514<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
3515
3516Type has pointer identity in the AST.
3517</pre></td></tr>
3518
3519
3520<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>
3521<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
3522
3523Given
3524  int i;
3525  float f;
3526realFloatingPointType()
3527  matches "float f" but not "int i"
3528</pre></td></tr>
3529
3530
3531<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>
3532<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
3533
3534Given
3535 struct S { void func(); };
3536functionDecl(returns(voidType()))
3537  matches "void func();"
3538</pre></td></tr>
3539
3540
3541<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>
3542<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
3543
3544Given
3545  int x;
3546  int s = sizeof(x) + alignof(x)
3547unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
3548  matches sizeof(x)
3549</pre></td></tr>
3550
3551
3552<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>
3553<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3554unary).
3555
3556Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3557  !(a || b)
3558</pre></td></tr>
3559
3560
3561<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>
3562<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
3563
3564Example matches x, but not y, z, or a.
3565(matcher = varDecl(hasAutomaticStorageDuration())
3566void f() {
3567  int x;
3568  static int y;
3569  thread_local int z;
3570}
3571int a;
3572</pre></td></tr>
3573
3574
3575<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr>
3576<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
3577
3578Example matches y and z (matcher = varDecl(hasGlobalStorage())
3579void f() {
3580  int x;
3581  static int y;
3582}
3583int z;
3584</pre></td></tr>
3585
3586
3587<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>
3588<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
3589non-static local variable.
3590
3591Example matches x (matcher = varDecl(hasLocalStorage())
3592void f() {
3593  int x;
3594  static int y;
3595}
3596int z;
3597</pre></td></tr>
3598
3599
3600<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>
3601<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
3602It includes the variable declared at namespace scope and those declared
3603with "static" and "extern" storage class specifiers.
3604
3605void f() {
3606  int x;
3607  static int y;
3608  thread_local int z;
3609}
3610int a;
3611static int b;
3612extern int c;
3613varDecl(hasStaticStorageDuration())
3614  matches the function declaration y, a, b and c.
3615</pre></td></tr>
3616
3617
3618<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr>
3619<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
3620
3621Example matches z, but not x, z, or a.
3622(matcher = varDecl(hasThreadStorageDuration())
3623void f() {
3624  int x;
3625  static int y;
3626  thread_local int z;
3627}
3628int a;
3629</pre></td></tr>
3630
3631
3632<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>
3633<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations.
3634
3635Given:
3636  constexpr int foo = 42;
3637  constexpr int bar();
3638varDecl(isConstexpr())
3639  matches the declaration of foo.
3640functionDecl(isConstexpr())
3641  matches the declaration of bar.
3642</pre></td></tr>
3643
3644
3645<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>
3646<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3647
3648Example matches A, va, fa
3649  class A {};
3650  class B;  Doesn't match, as it has no body.
3651  int va;
3652  extern int vb;  Doesn't match, as it doesn't define the variable.
3653  void fa() {}
3654  void fb();  Doesn't match, as it has no body.
3655
3656Usable 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;
3657</pre></td></tr>
3658
3659
3660<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr>
3661<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3662a C++ catch block, or an Objective-C statement.
3663
3664Example matches x (matcher = varDecl(isExceptionVariable())
3665void f(int y) {
3666  try {
3667  } catch (int x) {
3668  }
3669}
3670</pre></td></tr>
3671
3672
3673<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>
3674<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3675static member variable template instantiations.
3676
3677Given
3678  template&lt;typename T&gt; void A(T t) { }
3679  template&lt;&gt; void A(int N) { }
3680functionDecl(isExplicitTemplateSpecialization())
3681  matches the specialization A&lt;int&gt;().
3682
3683Usable 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;
3684</pre></td></tr>
3685
3686<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>
3687<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
3688
3689Given:
3690  extern "C" void f() {}
3691  extern "C" { void g() {} }
3692  void h() {}
3693  extern "C" int x = 1;
3694  extern "C" int y = 2;
3695  int z = 3;
3696functionDecl(isExternC())
3697  matches the declaration of f and g, but not the declaration of h.
3698varDecl(isExternC())
3699  matches the declaration of x and y, but not the declaration of z.
3700</pre></td></tr>
3701
3702<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>
3703<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage
3704class specifier ("static" keyword) written in the source.
3705
3706Given:
3707  static void f() {}
3708  static int i = 0;
3709  extern int j;
3710  int k;
3711functionDecl(isStaticStorageClass())
3712  matches the function declaration f.
3713varDecl(isStaticStorageClass())
3714  matches the variable declaration i.
3715</pre></td></tr>
3716
3717
3718<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>
3719<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3720member variable template instantiations.
3721
3722Given
3723  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3724or
3725  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3726cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3727  matches the template instantiation of X&lt;A&gt;.
3728
3729But given
3730  template &lt;typename T&gt;  class X {}; class A {};
3731  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3732cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3733  does not match, as X&lt;A&gt; is an explicit template specialization.
3734
3735Usable 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;
3736</pre></td></tr>
3737
3738
3739<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>
3740<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3741template instantiations.
3742
3743Given
3744  template&lt;typename T&gt; void A(T t) { T i; }
3745  A(0);
3746  A(0U);
3747functionDecl(isInstantiated())
3748  matches 'A(int) {...};' and 'A(unsigned) {...}'.
3749</pre></td></tr>
3750
3751
3752<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>
3753<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3754GNU's __null, C++11's nullptr, or C's NULL macro.
3755
3756Given:
3757  void *v1 = NULL;
3758  void *v2 = nullptr;
3759  void *v3 = __null; GNU extension
3760  char *cp = (char *)0;
3761  int *ip = 0;
3762  int i = 0;
3763expr(nullPointerConstant())
3764  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3765  initializer for i.
3766</pre></td></tr>
3767
3768
3769<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>
3770<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3771
3772This matcher is only provided as a performance optimization of hasName.
3773    hasAnyName(a, b, c)
3774 is equivalent to, but faster than
3775    anyOf(hasName(a), hasName(b), hasName(c))
3776</pre></td></tr>
3777
3778
3779<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>
3780<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
3781
3782Given
3783  int j;
3784  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
3785  A(0);
3786  A(0U);
3787declStmt(isInTemplateInstantiation())
3788  matches 'int i;' and 'unsigned i'.
3789unless(stmt(isInTemplateInstantiation()))
3790  will NOT match j += 42; as it's shared between the template definition and
3791  instantiation.
3792</pre></td></tr>
3793
3794<!--END_NARROWING_MATCHERS -->
3795</table>
3796
3797<!-- ======================================================================= -->
3798<h2 id="traversal-matchers">AST Traversal Matchers</h2>
3799<!-- ======================================================================= -->
3800
3801<p>Traversal matchers specify the relationship to other nodes that are
3802reachable from the current node.</p>
3803
3804<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
3805forEachDescendant) which work on all nodes and allow users to write more generic
3806match expressions.</p>
3807
3808<table>
3809<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
3810<!-- START_TRAVERSAL_MATCHERS -->
3811
3812<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>
3813<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
3814
3815Unlike anyOf, eachOf will generate a match result for each
3816matching submatcher.
3817
3818For example, in:
3819  class A { int a; int b; };
3820The matcher:
3821  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
3822                       has(fieldDecl(hasName("b")).bind("v"))))
3823will generate two results binding "v", the first of which binds
3824the field declaration of a, the second the field declaration of
3825b.
3826
3827Usable as: Any Matcher
3828</pre></td></tr>
3829
3830
3831<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3832<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3833provided matcher.
3834
3835Example matches X, A, B, C
3836  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
3837  class X {};  Matches X, because X::X is a class of name X inside X.
3838  class A { class X {}; };
3839  class B { class C { class X {}; }; };
3840
3841DescendantT must be an AST base type.
3842
3843As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
3844each result that matches instead of only on the first one.
3845
3846Note: Recursively combined ForEachDescendant can cause many matches:
3847  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
3848    forEachDescendant(cxxRecordDecl())
3849  )))
3850will match 10 times (plus injected class name matches) on:
3851  class A { class B { class C { class D { class E {}; }; }; }; };
3852
3853Usable as: Any Matcher
3854</pre></td></tr>
3855
3856
3857<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
3858<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
3859provided matcher.
3860
3861Example matches X, Y
3862  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
3863  class X {};  Matches X, because X::X is a class of name X inside X.
3864  class Y { class X {}; };
3865  class Z { class Y { class X {}; }; };  Does not match Z.
3866
3867ChildT must be an AST base type.
3868
3869As opposed to 'has', 'forEach' will cause a match for each result that
3870matches instead of only on the first one.
3871
3872Usable as: Any Matcher
3873</pre></td></tr>
3874
3875
3876<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
3877<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
3878matcher.
3879
3880Given
3881void f() { if (true) { int x = 42; } }
3882void g() { for (;;) { int x = 43; } }
3883expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
3884
3885Usable as: Any Matcher
3886</pre></td></tr>
3887
3888
3889<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3890<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3891provided matcher.
3892
3893Example matches X, Y, Z
3894    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
3895  class X {};  Matches X, because X::X is a class of name X inside X.
3896  class Y { class X {}; };
3897  class Z { class Y { class X {}; }; };
3898
3899DescendantT must be an AST base type.
3900
3901Usable as: Any Matcher
3902</pre></td></tr>
3903
3904
3905<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
3906<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
3907provided matcher.
3908
3909Example matches X, Y
3910  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
3911  class X {};  Matches X, because X::X is a class of name X inside X.
3912  class Y { class X {}; };
3913  class Z { class Y { class X {}; }; };  Does not match Z.
3914
3915ChildT must be an AST base type.
3916
3917Usable as: Any Matcher
3918Note that has is direct matcher, so it also matches things like implicit
3919casts and paren casts. If you are matching with expr then you should
3920probably consider using ignoringParenImpCasts like:
3921has(ignoringParenImpCasts(expr())).
3922</pre></td></tr>
3923
3924
3925<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
3926<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
3927matcher.
3928
3929Given
3930void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
3931compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
3932
3933Usable as: Any Matcher
3934</pre></td></tr>
3935
3936
3937<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>
3938<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
3939switch statement or conditional operator.
3940
3941Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
3942  if (true) {}
3943</pre></td></tr>
3944
3945
3946<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>
3947<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
3948(binary or ternary).
3949
3950Example matches b
3951  condition ? a : b
3952  condition ?: b
3953</pre></td></tr>
3954
3955
3956<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>
3957<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
3958
3959Example 1 (conditional ternary operator): matches a
3960  condition ? a : b
3961
3962Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
3963  condition ?: b
3964</pre></td></tr>
3965
3966
3967<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>
3968<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
3969matches the given matcher.
3970
3971The associated declaration is:
3972- for type nodes, the declaration of the underlying type
3973- for CallExpr, the declaration of the callee
3974- for MemberExpr, the declaration of the referenced member
3975- for CXXConstructExpr, the declaration of the constructor
3976- for CXXNewExpr, the declaration of the operator new
3977
3978Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3979function. e.g. various subtypes of clang::Type and various expressions.
3980
3981Usable 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;,
3982  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;,
3983  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;,
3984  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;,
3985  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;,
3986  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;,
3987  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3988</pre></td></tr>
3989
3990
3991<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>
3992<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
3993
3994Given
3995  int i[5];
3996  void f() { i[1] = 42; }
3997arraySubscriptExpression(hasBase(implicitCastExpr(
3998    hasSourceExpression(declRefExpr()))))
3999  matches i[1] with the declRefExpr() matching i
4000</pre></td></tr>
4001
4002
4003<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>
4004<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
4005
4006Given
4007  int i[5];
4008  void f() { i[1] = 42; }
4009arraySubscriptExpression(hasIndex(integerLiteral()))
4010  matches i[1] with the integerLiteral() matching 1
4011</pre></td></tr>
4012
4013
4014<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>
4015<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
4016
4017Example matches a (matcher = binaryOperator(hasLHS()))
4018  a || b
4019</pre></td></tr>
4020
4021
4022<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>
4023<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
4024
4025Example matches b (matcher = binaryOperator(hasRHS()))
4026  a || b
4027</pre></td></tr>
4028
4029
4030<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>
4031<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
4032type.
4033
4034Given
4035  struct A {};
4036  A a[7];
4037  int b[7];
4038arrayType(hasElementType(builtinType()))
4039  matches "int b[7]"
4040
4041Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
4042</pre></td></tr>
4043
4044
4045<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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>
4046<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
4047type.
4048
4049Given
4050  struct A {};
4051  A a[7];
4052  int b[7];
4053arrayType(hasElementType(builtinType()))
4054  matches "int b[7]"
4055
4056Usable 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;
4057</pre></td></tr>
4058
4059
4060<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>
4061<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
4062
4063Given
4064  _Atomic(int) i;
4065  _Atomic(float) f;
4066atomicType(hasValueType(isInteger()))
4067 matches "_Atomic(int) i"
4068
4069Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
4070</pre></td></tr>
4071
4072
4073<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>
4074<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4075
4076Given
4077  _Atomic(int) i;
4078  _Atomic(float) f;
4079atomicType(hasValueType(isInteger()))
4080 matches "_Atomic(int) i"
4081
4082Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
4083</pre></td></tr>
4084
4085
4086<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>
4087<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4088
4089Note: There is no TypeLoc for the deduced type and thus no
4090getDeducedLoc() matcher.
4091
4092Given
4093  auto a = 1;
4094  auto b = 2.0;
4095autoType(hasDeducedType(isInteger()))
4096  matches "auto a"
4097
4098Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
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('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>
4103<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4104binary operator matches.
4105</pre></td></tr>
4106
4107
4108<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>
4109<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
4110
4111Example matches a (matcher = binaryOperator(hasLHS()))
4112  a || b
4113</pre></td></tr>
4114
4115
4116<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>
4117<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
4118
4119Example matches b (matcher = binaryOperator(hasRHS()))
4120  a || b
4121</pre></td></tr>
4122
4123
4124<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>
4125<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
4126pointee matches a given matcher.
4127
4128Given
4129  int *a;
4130  int const *b;
4131  float const *f;
4132pointerType(pointee(isConstQualified(), isInteger()))
4133  matches "int const *b"
4134
4135Usable 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;,
4136  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;
4137</pre></td></tr>
4138
4139
4140<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>
4141<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4142pointee matches a given matcher.
4143
4144Given
4145  int *a;
4146  int const *b;
4147  float const *f;
4148pointerType(pointee(isConstQualified(), isInteger()))
4149  matches "int const *b"
4150
4151Usable 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;,
4152  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;
4153</pre></td></tr>
4154
4155
4156<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>
4157<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4158
4159Given
4160  void f(int i);
4161  int y;
4162  f(y);
4163callExpr(
4164  forEachArgumentWithParam(
4165    declRefExpr(to(varDecl(hasName("y")))),
4166    parmVarDecl(hasType(isInteger()))
4167))
4168  matches f(y);
4169with declRefExpr(...)
4170  matching int y
4171and parmVarDecl(...)
4172  matching int i
4173</pre></td></tr>
4174
4175
4176<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>
4177<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
4178expression.
4179
4180Given
4181  void x(int, int, int) { int y; x(1, y, 42); }
4182callExpr(hasAnyArgument(declRefExpr()))
4183  matches x(1, y, 42)
4184with hasAnyArgument(...)
4185  matching y
4186</pre></td></tr>
4187
4188
4189<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>
4190<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4191call expression.
4192
4193Example matches y in x(y)
4194    (matcher = callExpr(hasArgument(0, declRefExpr())))
4195  void x(int) { int y; x(y); }
4196</pre></td></tr>
4197
4198
4199<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>
4200<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
4201matches the given matcher.
4202
4203The associated declaration is:
4204- for type nodes, the declaration of the underlying type
4205- for CallExpr, the declaration of the callee
4206- for MemberExpr, the declaration of the referenced member
4207- for CXXConstructExpr, the declaration of the constructor
4208- for CXXNewExpr, the declaration of the operator new
4209
4210Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4211function. e.g. various subtypes of clang::Type and various expressions.
4212
4213Usable 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;,
4214  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;,
4215  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;,
4216  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;,
4217  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;,
4218  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;,
4219  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4220</pre></td></tr>
4221
4222
4223<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>
4224<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4225
4226Given
4227  class A { A() : i(42), j(42) {} int i; int j; };
4228cxxConstructorDecl(forEachConstructorInitializer(
4229  forField(decl().bind("x"))
4230))
4231  will trigger two matches, binding for 'i' and 'j' respectively.
4232</pre></td></tr>
4233
4234
4235<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>
4236<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4237
4238Given
4239  struct Foo {
4240    Foo() : foo_(1) { }
4241    int foo_;
4242  };
4243cxxRecordDecl(has(cxxConstructorDecl(
4244  hasAnyConstructorInitializer(anything())
4245)))
4246  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
4247</pre></td></tr>
4248
4249
4250<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('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>
4251<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
4252
4253Given
4254  struct Foo {
4255    Foo() : foo_(1) { }
4256    int foo_;
4257  };
4258cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4259    forField(hasName("foo_"))))))
4260  matches Foo
4261with forField matching foo_
4262</pre></td></tr>
4263
4264
4265<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>
4266<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
4267
4268Given
4269  struct Foo {
4270    Foo() : foo_(1) { }
4271    int foo_;
4272  };
4273cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4274    withInitializer(integerLiteral(equals(1)))))))
4275  matches Foo
4276with withInitializer matching (1)
4277</pre></td></tr>
4278
4279
4280<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>
4281<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
4282definition that has a given body.
4283
4284Given
4285  for (;;) {}
4286hasBody(compoundStmt())
4287  matches 'for (;;) {}'
4288with compoundStmt()
4289  matching '{}'
4290</pre></td></tr>
4291
4292
4293<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>
4294<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
4295
4296Example:
4297    forStmt(hasLoopVariable(anything()))
4298matches 'int x' in
4299    for (int x : a) { }
4300</pre></td></tr>
4301
4302
4303<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>
4304<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
4305
4306Example:
4307    forStmt(hasRangeInit(anything()))
4308matches 'a' in
4309    for (int x : a) { }
4310</pre></td></tr>
4311
4312
4313<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>
4314<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
4315
4316
4317<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>
4318<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
4319
4320Example matches y.x()
4321  (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
4322  class Y { public: void x(); };
4323  void z() { Y y; y.x(); }",
4324
4325FIXME: Overload to allow directly matching types?
4326</pre></td></tr>
4327
4328
4329<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>
4330<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
4331</pre></td></tr>
4332
4333
4334<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>
4335<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
4336matcher, or is a pointer to a type that matches the InnerMatcher.
4337</pre></td></tr>
4338
4339
4340<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>
4341<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overriden by the given method. This matcher may
4342produce multiple matches.
4343
4344Given
4345  class A { virtual void f(); };
4346  class B : public A { void f(); };
4347  class C : public B { void f(); };
4348cxxMethodDecl(ofClass(hasName("C")),
4349              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4350  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
4351  that B::f is not overridden by C::f).
4352
4353The check can produce multiple matches in case of multiple inheritance, e.g.
4354  class A1 { virtual void f(); };
4355  class A2 { virtual void f(); };
4356  class C : public A1, public A2 { void f(); };
4357cxxMethodDecl(ofClass(hasName("C")),
4358              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4359  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
4360  once with "b" binding "A2::f" and "d" binding "C::f".
4361</pre></td></tr>
4362
4363
4364<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>
4365<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
4366belongs to.
4367
4368FIXME: Generalize this for other kinds of declarations.
4369FIXME: What other kind of declarations would we need to generalize
4370this to?
4371
4372Example matches A() in the last line
4373    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
4374        ofClass(hasName("A"))))))
4375  class A {
4376   public:
4377    A();
4378  };
4379  A a = A();
4380</pre></td></tr>
4381
4382
4383<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>
4384<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
4385matches the given matcher.
4386
4387The associated declaration is:
4388- for type nodes, the declaration of the underlying type
4389- for CallExpr, the declaration of the callee
4390- for MemberExpr, the declaration of the referenced member
4391- for CXXConstructExpr, the declaration of the constructor
4392- for CXXNewExpr, the declaration of the operator new
4393
4394Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4395function. e.g. various subtypes of clang::Type and various expressions.
4396
4397Usable 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;,
4398  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;,
4399  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;,
4400  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;,
4401  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;,
4402  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;,
4403  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4404</pre></td></tr>
4405
4406
4407<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>
4408<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
4409
4410Given:
4411  class A { void func(); };
4412  class B { void member(); };
4413
4414cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
4415A but not B.
4416</pre></td></tr>
4417
4418
4419<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>
4420<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
4421a class matching Base.
4422
4423Note that a class is not considered to be derived from itself.
4424
4425Example matches Y, Z, C (Base == hasName("X"))
4426  class X;
4427  class Y : public X {};  directly derived
4428  class Z : public Y {};  indirectly derived
4429  typedef X A;
4430  typedef A B;
4431  class C : public B {};  derived from a typedef of X
4432
4433In the following example, Bar matches isDerivedFrom(hasName("X")):
4434  class Foo;
4435  typedef Foo X;
4436  class Bar : public Foo {};  derived from a type that X is a typedef of
4437</pre></td></tr>
4438
4439
4440<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>
4441<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
4442match Base.
4443</pre></td></tr>
4444
4445
4446<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>
4447<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
4448given matcher.
4449
4450Example matches y.x() (matcher = callExpr(callee(
4451                                   cxxMethodDecl(hasName("x")))))
4452  class Y { public: void x(); };
4453  void z() { Y y; y.x(); }
4454</pre></td></tr>
4455
4456
4457<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>
4458<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
4459
4460Given
4461  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
4462  void f() { f(); }
4463callExpr(callee(expr()))
4464  matches this-&gt;x(), x(), y.x(), f()
4465with callee(...)
4466  matching this-&gt;x, x, y.x, f respectively
4467
4468Note: Callee cannot take the more general internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
4469because this introduces ambiguous overloads with calls to Callee taking a
4470internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
4471implemented in terms of implicit casts.
4472</pre></td></tr>
4473
4474
4475<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>
4476<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
4477
4478Given
4479  void f(int i);
4480  int y;
4481  f(y);
4482callExpr(
4483  forEachArgumentWithParam(
4484    declRefExpr(to(varDecl(hasName("y")))),
4485    parmVarDecl(hasType(isInteger()))
4486))
4487  matches f(y);
4488with declRefExpr(...)
4489  matching int y
4490and parmVarDecl(...)
4491  matching int i
4492</pre></td></tr>
4493
4494
4495<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>
4496<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
4497expression.
4498
4499Given
4500  void x(int, int, int) { int y; x(1, y, 42); }
4501callExpr(hasAnyArgument(declRefExpr()))
4502  matches x(1, y, 42)
4503with hasAnyArgument(...)
4504  matching y
4505</pre></td></tr>
4506
4507
4508<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>
4509<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
4510call expression.
4511
4512Example matches y in x(y)
4513    (matcher = callExpr(hasArgument(0, declRefExpr())))
4514  void x(int) { int y; x(y); }
4515</pre></td></tr>
4516
4517
4518<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>
4519<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
4520matches the given matcher.
4521
4522The associated declaration is:
4523- for type nodes, the declaration of the underlying type
4524- for CallExpr, the declaration of the callee
4525- for MemberExpr, the declaration of the referenced member
4526- for CXXConstructExpr, the declaration of the constructor
4527- for CXXNewExpr, the declaration of the operator new
4528
4529Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4530function. e.g. various subtypes of clang::Type and various expressions.
4531
4532Usable 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;,
4533  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;,
4534  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;,
4535  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;,
4536  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;,
4537  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;,
4538  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4539</pre></td></tr>
4540
4541
4542<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>
4543<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
4544extension, matches the constant given in the statement.
4545
4546Given
4547  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
4548caseStmt(hasCaseConstant(integerLiteral()))
4549  matches "case 1:"
4550</pre></td></tr>
4551
4552
4553<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>
4554<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre></pre></td></tr>
4555
4556
4557<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>
4558<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4559functionDecl that have at least one TemplateArgument matching the given
4560InnerMatcher.
4561
4562Given
4563  template&lt;typename T&gt; class A {};
4564  template&lt;&gt; class A&lt;double&gt; {};
4565  A&lt;int&gt; a;
4566
4567  template&lt;typename T&gt; f() {};
4568  void func() { f&lt;int&gt;(); };
4569
4570classTemplateSpecializationDecl(hasAnyTemplateArgument(
4571    refersToType(asString("int"))))
4572  matches the specialization A&lt;int&gt;
4573
4574functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
4575  matches the specialization f&lt;int&gt;
4576</pre></td></tr>
4577
4578
4579<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>
4580<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
4581
4582Given
4583  tempalate&lt;typename T&gt; class A {};
4584  typedef A&lt;int&gt; B;
4585classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
4586  matches 'B' with classTemplateDecl() matching the class template
4587  declaration of 'A'.
4588</pre></td></tr>
4589
4590
4591<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>
4592<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4593functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
4594
4595Given
4596  template&lt;typename T, typename U&gt; class A {};
4597  A&lt;bool, int&gt; b;
4598  A&lt;int, bool&gt; c;
4599
4600  template&lt;typename T&gt; f() {};
4601  void func() { f&lt;int&gt;(); };
4602classTemplateSpecializationDecl(hasTemplateArgument(
4603    1, refersToType(asString("int"))))
4604  matches the specialization A&lt;bool, int&gt;
4605
4606functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
4607  matches the specialization f&lt;int&gt;
4608</pre></td></tr>
4609
4610
4611<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>
4612<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
4613type.
4614
4615Given
4616  struct A {};
4617  A a[7];
4618  int b[7];
4619arrayType(hasElementType(builtinType()))
4620  matches "int b[7]"
4621
4622Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
4623</pre></td></tr>
4624
4625
4626<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_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>
4627<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
4628type.
4629
4630Given
4631  struct A {};
4632  A a[7];
4633  int b[7];
4634arrayType(hasElementType(builtinType()))
4635  matches "int b[7]"
4636
4637Usable 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;
4638</pre></td></tr>
4639
4640
4641<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>
4642<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
4643a given matcher. Also matches StmtExprs that have CompoundStmt as children.
4644
4645Given
4646  { {}; 1+2; }
4647hasAnySubstatement(compoundStmt())
4648  matches '{ {}; 1+2; }'
4649with compoundStmt()
4650  matching '{}'
4651</pre></td></tr>
4652
4653
4654<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>
4655<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
4656</pre></td></tr>
4657
4658
4659<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>
4660<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
4661matches the given matcher.
4662
4663The associated declaration is:
4664- for type nodes, the declaration of the underlying type
4665- for CallExpr, the declaration of the callee
4666- for MemberExpr, the declaration of the referenced member
4667- for CXXConstructExpr, the declaration of the constructor
4668- for CXXNewExpr, the declaration of the operator new
4669
4670Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4671function. e.g. various subtypes of clang::Type and various expressions.
4672
4673Usable 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;,
4674  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;,
4675  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;,
4676  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;,
4677  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;,
4678  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;,
4679  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4680</pre></td></tr>
4681
4682
4683<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>
4684<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
4685specific using shadow declaration.
4686
4687Given
4688  namespace a { void f() {} }
4689  using a::f;
4690  void g() {
4691    f();     Matches this ..
4692    a::f();  .. but not this.
4693  }
4694declRefExpr(throughUsingDecl(anything()))
4695  matches f()
4696</pre></td></tr>
4697
4698
4699<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>
4700<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
4701specified matcher.
4702
4703Example matches x in if(x)
4704    (matcher = declRefExpr(to(varDecl(hasName("x")))))
4705  bool x;
4706  if (x) {}
4707</pre></td></tr>
4708
4709
4710<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>
4711<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
4712
4713Note that this does not work for global declarations because the AST
4714breaks up multiple-declaration DeclStmt's into multiple single-declaration
4715DeclStmt's.
4716Example: Given non-global declarations
4717  int a, b = 0;
4718  int c;
4719  int d = 2, e;
4720declStmt(containsDeclaration(
4721      0, varDecl(hasInitializer(anything()))))
4722  matches only 'int d = 2, e;', and
4723declStmt(containsDeclaration(1, varDecl()))
4724  matches 'int a, b = 0' as well as 'int d = 2, e;'
4725  but 'int c;' is not matched.
4726</pre></td></tr>
4727
4728
4729<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>
4730<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
4731
4732Given
4733  int a, b;
4734  int c;
4735declStmt(hasSingleDecl(anything()))
4736  matches 'int c;' but not 'int a, b;'.
4737</pre></td></tr>
4738
4739
4740<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>
4741<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
4742the inner matcher.
4743
4744Given
4745  int x;
4746declaratorDecl(hasTypeLoc(loc(asString("int"))))
4747  matches int x
4748</pre></td></tr>
4749
4750
4751<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>
4752<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
4753Decl, matches InnerMatcher.
4754
4755Given
4756  namespace N {
4757    namespace M {
4758      class D {};
4759    }
4760  }
4761
4762cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
4763declaration of class D.
4764</pre></td></tr>
4765
4766
4767<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>
4768<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
4769definition that has a given body.
4770
4771Given
4772  for (;;) {}
4773hasBody(compoundStmt())
4774  matches 'for (;;) {}'
4775with compoundStmt()
4776  matching '{}'
4777</pre></td></tr>
4778
4779
4780<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>
4781<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
4782switch statement or conditional operator.
4783
4784Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4785  if (true) {}
4786</pre></td></tr>
4787
4788
4789<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>
4790<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
4791matches InnerMatcher if the qualifier exists.
4792
4793Given
4794  namespace N {
4795    namespace M {
4796      class D {};
4797    }
4798  }
4799  N::M::D d;
4800
4801elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
4802matches the type of the variable declaration of d.
4803</pre></td></tr>
4804
4805
4806<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>
4807<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
4808
4809Given
4810  namespace N {
4811    namespace M {
4812      class D {};
4813    }
4814  }
4815  N::M::D d;
4816
4817elaboratedType(namesType(recordType(
4818hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
4819declaration of d.
4820</pre></td></tr>
4821
4822
4823<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>
4824<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
4825matches the given matcher.
4826
4827The associated declaration is:
4828- for type nodes, the declaration of the underlying type
4829- for CallExpr, the declaration of the callee
4830- for MemberExpr, the declaration of the referenced member
4831- for CXXConstructExpr, the declaration of the constructor
4832- for CXXNewExpr, the declaration of the operator new
4833
4834Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4835function. e.g. various subtypes of clang::Type and various expressions.
4836
4837Usable 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;,
4838  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;,
4839  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;,
4840  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;,
4841  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;,
4842  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;,
4843  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4844</pre></td></tr>
4845
4846
4847<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>
4848<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
4849
4850(Note: Clang's AST refers to other conversions as "casts" too, and calls
4851actual casts "explicit" casts.)
4852</pre></td></tr>
4853
4854
4855<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>
4856<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
4857declaration's type.
4858
4859In case of a value declaration (for example a variable declaration),
4860this resolves one layer of indirection. For example, in the value
4861declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
4862X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
4863declaration of x.
4864
4865Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4866            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4867 class X {};
4868 void y(X &amp;x) { x; X z; }
4869
4870Usable 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;
4871</pre></td></tr>
4872
4873
4874<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>
4875<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
4876matcher.
4877
4878Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4879            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4880            and U (matcher = typedefDecl(hasType(asString("int")))
4881 class X {};
4882 void y(X &amp;x) { x; X z; }
4883 typedef int U;
4884</pre></td></tr>
4885
4886
4887<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('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>
4888<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
4889are stripped off.
4890
4891Parentheses and explicit casts are not discarded.
4892Given
4893  int arr[5];
4894  int a = 0;
4895  char b = 0;
4896  const int c = a;
4897  int *d = arr;
4898  long e = (long) 0l;
4899The matchers
4900   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
4901   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
4902would match the declarations for a, b, c, and d, but not e.
4903While
4904   varDecl(hasInitializer(integerLiteral()))
4905   varDecl(hasInitializer(declRefExpr()))
4906only match the declarations for b, c, and d.
4907</pre></td></tr>
4908
4909
4910<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>
4911<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
4912nodes are stripped off.
4913
4914Parentheses and explicit casts are not discarded.
4915Given
4916  class C {};
4917  C a = C();
4918  C b;
4919  C c = b;
4920The matchers
4921   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
4922would match the declarations for a, b, and c.
4923While
4924   varDecl(hasInitializer(cxxConstructExpr()))
4925only match the declarations for b and c.
4926</pre></td></tr>
4927
4928
4929<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>
4930<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
4931casts are stripped off.
4932
4933Implicit and non-C Style casts are also discarded.
4934Given
4935  int a = 0;
4936  char b = (0);
4937  void* c = reinterpret_cast&lt;char*&gt;(0);
4938  char d = char(0);
4939The matcher
4940   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
4941would match the declarations for a, b, c, and d.
4942while
4943   varDecl(hasInitializer(integerLiteral()))
4944only match the declaration for a.
4945</pre></td></tr>
4946
4947
4948<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>
4949<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
4950parentheses are stripped off.
4951
4952Explicit casts are not discarded.
4953Given
4954  int arr[5];
4955  int a = 0;
4956  char b = (0);
4957  const int c = a;
4958  int *d = (arr);
4959  long e = ((long) 0l);
4960The matchers
4961   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
4962   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
4963would match the declarations for a, b, c, and d, but not e.
4964while
4965   varDecl(hasInitializer(integerLiteral()))
4966   varDecl(hasInitializer(declRefExpr()))
4967would only match the declaration for a.
4968</pre></td></tr>
4969
4970
4971<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>
4972<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
4973
4974Given
4975  class C {
4976    int a = 2;
4977    int b = 3;
4978    int c;
4979  };
4980fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
4981  matches 'int a;' but not 'int b;'.
4982fieldDecl(hasInClassInitializer(anything()))
4983  matches 'int a;' and 'int b;' but not 'int c;'.
4984</pre></td></tr>
4985
4986
4987<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>
4988<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
4989definition that has a given body.
4990
4991Given
4992  for (;;) {}
4993hasBody(compoundStmt())
4994  matches 'for (;;) {}'
4995with compoundStmt()
4996  matching '{}'
4997</pre></td></tr>
4998
4999
5000<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>
5001<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
5002switch statement or conditional operator.
5003
5004Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5005  if (true) {}
5006</pre></td></tr>
5007
5008
5009<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>
5010<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
5011
5012Example:
5013    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
5014matches '++x' in
5015    for (x; x &lt; N; ++x) { }
5016</pre></td></tr>
5017
5018
5019<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>
5020<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
5021
5022Example:
5023    forStmt(hasLoopInit(declStmt()))
5024matches 'int x = 0' in
5025    for (int x = 0; x &lt; N; ++x) { }
5026</pre></td></tr>
5027
5028
5029<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>
5030<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
5031
5032Does not match the 'this' parameter of a method.
5033
5034Given
5035  class X { void f(int x, int y, int z) {} };
5036cxxMethodDecl(hasAnyParameter(hasName("y")))
5037  matches f(int x, int y, int z) {}
5038with hasAnyParameter(...)
5039  matching int y
5040</pre></td></tr>
5041
5042
5043<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>
5044<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5045functionDecl that have at least one TemplateArgument matching the given
5046InnerMatcher.
5047
5048Given
5049  template&lt;typename T&gt; class A {};
5050  template&lt;&gt; class A&lt;double&gt; {};
5051  A&lt;int&gt; a;
5052
5053  template&lt;typename T&gt; f() {};
5054  void func() { f&lt;int&gt;(); };
5055
5056classTemplateSpecializationDecl(hasAnyTemplateArgument(
5057    refersToType(asString("int"))))
5058  matches the specialization A&lt;int&gt;
5059
5060functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5061  matches the specialization f&lt;int&gt;
5062</pre></td></tr>
5063
5064
5065<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>
5066<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
5067definition that has a given body.
5068
5069Given
5070  for (;;) {}
5071hasBody(compoundStmt())
5072  matches 'for (;;) {}'
5073with compoundStmt()
5074  matching '{}'
5075</pre></td></tr>
5076
5077
5078<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>
5079<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
5080
5081Given
5082  class X { void f(int x) {} };
5083cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5084  matches f(int x) {}
5085with hasParameter(...)
5086  matching int x
5087</pre></td></tr>
5088
5089
5090<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>
5091<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5092functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5093
5094Given
5095  template&lt;typename T, typename U&gt; class A {};
5096  A&lt;bool, int&gt; b;
5097  A&lt;int, bool&gt; c;
5098
5099  template&lt;typename T&gt; f() {};
5100  void func() { f&lt;int&gt;(); };
5101classTemplateSpecializationDecl(hasTemplateArgument(
5102    1, refersToType(asString("int"))))
5103  matches the specialization A&lt;bool, int&gt;
5104
5105functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5106  matches the specialization f&lt;int&gt;
5107</pre></td></tr>
5108
5109
5110<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>
5111<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
5112
5113Given:
5114  class X { int f() { return 1; } };
5115cxxMethodDecl(returns(asString("int")))
5116  matches int f() { return 1; }
5117</pre></td></tr>
5118
5119
5120<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>
5121<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
5122switch statement or conditional operator.
5123
5124Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5125  if (true) {}
5126</pre></td></tr>
5127
5128
5129<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>
5130<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
5131
5132Given
5133  if (A* a = GetAPointer()) {}
5134hasConditionVariableStatement(...)
5135  matches 'A* a = GetAPointer()'.
5136</pre></td></tr>
5137
5138
5139<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>
5140<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
5141
5142Examples matches the if statement
5143  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
5144  if (false) false; else true;
5145</pre></td></tr>
5146
5147
5148<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>
5149<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
5150
5151Examples matches the if statement
5152  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
5153  if (false) true; else false;
5154</pre></td></tr>
5155
5156
5157<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>
5158<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
5159matcher.
5160
5161FIXME: Unit test this matcher
5162</pre></td></tr>
5163
5164
5165<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>
5166<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
5167(if expression have it).
5168</pre></td></tr>
5169
5170
5171<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>
5172<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
5173matches the given matcher.
5174
5175The associated declaration is:
5176- for type nodes, the declaration of the underlying type
5177- for CallExpr, the declaration of the callee
5178- for MemberExpr, the declaration of the referenced member
5179- for CXXConstructExpr, the declaration of the constructor
5180- for CXXNewExpr, the declaration of the operator new
5181
5182Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5183function. e.g. various subtypes of clang::Type and various expressions.
5184
5185Usable 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;,
5186  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;,
5187  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;,
5188  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;,
5189  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;,
5190  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;,
5191  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5192</pre></td></tr>
5193
5194
5195<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>
5196<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
5197matches the given matcher.
5198
5199The associated declaration is:
5200- for type nodes, the declaration of the underlying type
5201- for CallExpr, the declaration of the callee
5202- for MemberExpr, the declaration of the referenced member
5203- for CXXConstructExpr, the declaration of the constructor
5204- for CXXNewExpr, the declaration of the operator new
5205
5206Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5207function. e.g. various subtypes of clang::Type and various expressions.
5208
5209Usable 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;,
5210  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;,
5211  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;,
5212  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;,
5213  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;,
5214  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;,
5215  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5216</pre></td></tr>
5217
5218
5219<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>
5220<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
5221matches the given matcher.
5222
5223The associated declaration is:
5224- for type nodes, the declaration of the underlying type
5225- for CallExpr, the declaration of the callee
5226- for MemberExpr, the declaration of the referenced member
5227- for CXXConstructExpr, the declaration of the constructor
5228- for CXXNewExpr, the declaration of the operator new
5229
5230Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5231function. e.g. various subtypes of clang::Type and various expressions.
5232
5233Usable 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;,
5234  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;,
5235  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;,
5236  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;,
5237  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;,
5238  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;,
5239  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5240</pre></td></tr>
5241
5242
5243<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>
5244<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
5245matched by a given matcher.
5246
5247Given
5248  struct X { int m; };
5249  void f(X x) { x.m; m; }
5250memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
5251  matches "x.m" and "m"
5252with hasObjectExpression(...)
5253  matching "x" and the implicit object expression of "m" which has type X*.
5254</pre></td></tr>
5255
5256
5257<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>
5258<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
5259given matcher.
5260
5261Given
5262  struct { int first, second; } first, second;
5263  int i(second.first);
5264  int j(first.second);
5265memberExpr(member(hasName("first")))
5266  matches second.first
5267  but not first.second (because the member name there is "second").
5268</pre></td></tr>
5269
5270
5271<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>
5272<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
5273pointee matches a given matcher.
5274
5275Given
5276  int *a;
5277  int const *b;
5278  float const *f;
5279pointerType(pointee(isConstQualified(), isInteger()))
5280  matches "int const *b"
5281
5282Usable 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;,
5283  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;
5284</pre></td></tr>
5285
5286
5287<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>
5288<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
5289pointee matches a given matcher.
5290
5291Given
5292  int *a;
5293  int const *b;
5294  float const *f;
5295pointerType(pointee(isConstQualified(), isInteger()))
5296  matches "int const *b"
5297
5298Usable 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;,
5299  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;
5300</pre></td></tr>
5301
5302
5303<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>
5304<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
5305matcher.
5306
5307Given
5308  namespace N { template&lt;class T&gt; void f(T t); }
5309  template &lt;class T&gt; void g() { using N::f; f(T()); }
5310unresolvedLookupExpr(hasAnyDeclaration(
5311    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
5312  matches the use of f in g() .
5313</pre></td></tr>
5314
5315
5316<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>
5317<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
5318
5319Given
5320  struct A { struct B { struct C {}; }; };
5321  A::B::C c;
5322nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
5323  matches "A::"
5324</pre></td></tr>
5325
5326
5327<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>
5328<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
5329given TypeLoc.
5330
5331Given
5332  struct A { struct B { struct C {}; }; };
5333  A::B::C c;
5334nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
5335  hasDeclaration(cxxRecordDecl(hasName("A")))))))
5336  matches "A::"
5337</pre></td></tr>
5338
5339
5340<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>
5341<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
5342
5343Given
5344  struct A { struct B { struct C {}; }; };
5345  A::B::C c;
5346nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
5347  matches "A::"
5348</pre></td></tr>
5349
5350
5351<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>
5352<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
5353given namespace matcher.
5354
5355Given
5356  namespace ns { struct A {}; }
5357  ns::A a;
5358nestedNameSpecifier(specifiesNamespace(hasName("ns")))
5359  matches "ns::"
5360</pre></td></tr>
5361
5362
5363<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>
5364<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
5365given QualType matcher without qualifiers.
5366
5367Given
5368  struct A { struct B { struct C {}; }; };
5369  A::B::C c;
5370nestedNameSpecifier(specifiesType(
5371  hasDeclaration(cxxRecordDecl(hasName("A")))
5372))
5373  matches "A::"
5374</pre></td></tr>
5375
5376
5377<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>
5378<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
5379call expression.
5380
5381Example matches y in x(y)
5382    (matcher = callExpr(hasArgument(0, declRefExpr())))
5383  void x(int) { int y; x(y); }
5384</pre></td></tr>
5385
5386
5387<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>
5388<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
5389
5390Example
5391matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
5392matches the [webView ...] message invocation.
5393  NSString *webViewJavaScript = ...
5394  UIWebView *webView = ...
5395  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
5396</pre></td></tr>
5397
5398
5399<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>
5400<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre></pre></td></tr>
5401
5402
5403<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>
5404<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
5405overloads matches the given matcher.
5406
5407Given
5408  template &lt;typename T&gt; void foo(T);
5409  template &lt;typename T&gt; void bar(T);
5410  template &lt;typename T&gt; void baz(T t) {
5411    foo(t);
5412    bar(t);
5413  }
5414unresolvedLookupExpr(hasAnyDeclaration(
5415    functionTemplateDecl(hasName("foo"))))
5416  matches foo in foo(t); but not bar in bar(t);
5417</pre></td></tr>
5418
5419
5420<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>
5421<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
5422
5423Given
5424  int (*ptr_to_array)[4];
5425  int (*ptr_to_func)(int);
5426
5427varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
5428ptr_to_func but not ptr_to_array.
5429
5430Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
5431</pre></td></tr>
5432
5433
5434<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>
5435<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
5436pointee matches a given matcher.
5437
5438Given
5439  int *a;
5440  int const *b;
5441  float const *f;
5442pointerType(pointee(isConstQualified(), isInteger()))
5443  matches "int const *b"
5444
5445Usable 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;,
5446  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;
5447</pre></td></tr>
5448
5449
5450<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>
5451<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
5452pointee matches a given matcher.
5453
5454Given
5455  int *a;
5456  int const *b;
5457  float const *f;
5458pointerType(pointee(isConstQualified(), isInteger()))
5459  matches "int const *b"
5460
5461Usable 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;,
5462  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;
5463</pre></td></tr>
5464
5465
5466<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>
5467<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
5468
5469Given:
5470  typedef int &amp;int_ref;
5471  int a;
5472  int_ref b = a;
5473
5474varDecl(hasType(qualType(referenceType()))))) will not match the
5475declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
5476</pre></td></tr>
5477
5478
5479<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>
5480<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
5481matches the given matcher.
5482
5483The associated declaration is:
5484- for type nodes, the declaration of the underlying type
5485- for CallExpr, the declaration of the callee
5486- for MemberExpr, the declaration of the referenced member
5487- for CXXConstructExpr, the declaration of the constructor
5488- for CXXNewExpr, the declaration of the operator new
5489
5490Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5491function. e.g. various subtypes of clang::Type and various expressions.
5492
5493Usable 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;,
5494  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;,
5495  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;,
5496  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;,
5497  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;,
5498  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;,
5499  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5500</pre></td></tr>
5501
5502
5503<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>
5504<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
5505
5506Given
5507  void (*fp)(void);
5508The matcher
5509  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
5510would match the declaration for fp.
5511</pre></td></tr>
5512
5513
5514<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>
5515<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
5516</pre></td></tr>
5517
5518
5519<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>
5520<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
5521matches the specified matcher.
5522
5523Example matches y-&gt;x()
5524  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
5525     cxxRecordDecl(hasName("Y")))))))
5526  class Y { public: void x(); };
5527  void z() { Y *y; y-&gt;x(); }
5528</pre></td></tr>
5529
5530
5531<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>
5532<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
5533</pre></td></tr>
5534
5535
5536<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>
5537<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
5538type matches the specified matcher.
5539
5540Example matches X &amp;x and const X &amp;y
5541    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
5542  class X {
5543    void a(X b) {
5544      X &amp;x = b;
5545      const X &amp;y = b;
5546    }
5547  };
5548</pre></td></tr>
5549
5550
5551<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>
5552<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
5553matches the given matcher.
5554
5555The associated declaration is:
5556- for type nodes, the declaration of the underlying type
5557- for CallExpr, the declaration of the callee
5558- for MemberExpr, the declaration of the referenced member
5559- for CXXConstructExpr, the declaration of the constructor
5560- for CXXNewExpr, the declaration of the operator new
5561
5562Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5563function. e.g. various subtypes of clang::Type and various expressions.
5564
5565Usable 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;,
5566  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;,
5567  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;,
5568  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;,
5569  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;,
5570  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;,
5571  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5572</pre></td></tr>
5573
5574
5575<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>
5576<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
5577pointee matches a given matcher.
5578
5579Given
5580  int *a;
5581  int const *b;
5582  float const *f;
5583pointerType(pointee(isConstQualified(), isInteger()))
5584  matches "int const *b"
5585
5586Usable 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;,
5587  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;
5588</pre></td></tr>
5589
5590
5591<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>
5592<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
5593pointee matches a given matcher.
5594
5595Given
5596  int *a;
5597  int const *b;
5598  float const *f;
5599pointerType(pointee(isConstQualified(), isInteger()))
5600  matches "int const *b"
5601
5602Usable 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;,
5603  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;
5604</pre></td></tr>
5605
5606
5607<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>
5608<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
5609
5610Given
5611  return a + b;
5612hasReturnValue(binaryOperator())
5613  matches 'return a + b'
5614with binaryOperator()
5615  matching 'a + b'
5616</pre></td></tr>
5617
5618
5619<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>
5620<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
5621a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5622
5623Given
5624  { {}; 1+2; }
5625hasAnySubstatement(compoundStmt())
5626  matches '{ {}; 1+2; }'
5627with compoundStmt()
5628  matching '{}'
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('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>
5633<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5634alignof.
5635</pre></td></tr>
5636
5637
5638<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>
5639<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to
5640
5641Given:
5642F&amp; operator=(const F&amp; o) {
5643  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
5644  return *this;
5645}
5646returnStmt(forFunction(hasName("operator=")))
5647  matches 'return *this'
5648  but does match 'return &gt; 0'
5649</pre></td></tr>
5650
5651
5652<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>
5653<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5654sizeof.
5655</pre></td></tr>
5656
5657
5658<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>
5659<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
5660type that matches the provided matcher.
5661
5662Given
5663  template &lt;typename T&gt;
5664  double F(T t);
5665  int i;
5666  double j = F(i);
5667
5668substTemplateTypeParmType(hasReplacementType(type())) matches int
5669</pre></td></tr>
5670
5671
5672<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>
5673<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
5674statement. This matcher may produce multiple matches.
5675
5676Given
5677  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
5678switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
5679  matches four times, with "c" binding each of "case 1:", "case 2:",
5680"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
5681"switch (1)", "switch (2)" and "switch (2)".
5682</pre></td></tr>
5683
5684
5685<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>
5686<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
5687switch statement or conditional operator.
5688
5689Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5690  if (true) {}
5691</pre></td></tr>
5692
5693
5694<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>
5695<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
5696matches the given matcher.
5697
5698The associated declaration is:
5699- for type nodes, the declaration of the underlying type
5700- for CallExpr, the declaration of the callee
5701- for MemberExpr, the declaration of the referenced member
5702- for CXXConstructExpr, the declaration of the constructor
5703- for CXXNewExpr, the declaration of the operator new
5704
5705Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5706function. e.g. various subtypes of clang::Type and various expressions.
5707
5708Usable 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;,
5709  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;,
5710  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;,
5711  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;,
5712  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;,
5713  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;,
5714  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5715</pre></td></tr>
5716
5717
5718<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>
5719<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
5720
5721Given
5722  template&lt;typename T&gt; struct A {};
5723  struct B { B* next; };
5724  A&lt;&amp;B::next&gt; a;
5725templateSpecializationType(hasAnyTemplateArgument(
5726  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
5727  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5728    B::next
5729</pre></td></tr>
5730
5731
5732<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('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>
5733<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
5734declaration.
5735
5736Given
5737  template&lt;typename T&gt; struct A {};
5738  struct B { B* next; };
5739  A&lt;&amp;B::next&gt; a;
5740classTemplateSpecializationDecl(hasAnyTemplateArgument(
5741    refersToDeclaration(fieldDecl(hasName("next"))))
5742  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5743    B::next
5744</pre></td></tr>
5745
5746
5747<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>
5748<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
5749
5750Given
5751  template&lt;int T&gt; struct A {};
5752  C&lt;42&gt; c;
5753classTemplateSpecializationDecl(
5754  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
5755  matches the implicit instantiation of C in C&lt;42&gt;.
5756</pre></td></tr>
5757
5758
5759<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>
5760<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
5761
5762Given
5763  template&lt;template &lt;typename&gt; class S&gt; class X {};
5764  template&lt;typename T&gt; class Y {};"
5765  X&lt;Y&gt; xi;
5766classTemplateSpecializationDecl(hasAnyTemplateArgument(
5767    refersToTemplate(templateName())))
5768  matches the specialization X&lt;Y&gt;
5769</pre></td></tr>
5770
5771
5772<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>
5773<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
5774
5775Given
5776  struct X {};
5777  template&lt;typename T&gt; struct A {};
5778  A&lt;X&gt; a;
5779classTemplateSpecializationDecl(hasAnyTemplateArgument(
5780    refersToType(class(hasName("X")))))
5781  matches the specialization A&lt;X&gt;
5782</pre></td></tr>
5783
5784
5785<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>
5786<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5787functionDecl that have at least one TemplateArgument matching the given
5788InnerMatcher.
5789
5790Given
5791  template&lt;typename T&gt; class A {};
5792  template&lt;&gt; class A&lt;double&gt; {};
5793  A&lt;int&gt; a;
5794
5795  template&lt;typename T&gt; f() {};
5796  void func() { f&lt;int&gt;(); };
5797
5798classTemplateSpecializationDecl(hasAnyTemplateArgument(
5799    refersToType(asString("int"))))
5800  matches the specialization A&lt;int&gt;
5801
5802functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5803  matches the specialization f&lt;int&gt;
5804</pre></td></tr>
5805
5806
5807<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>
5808<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
5809matches the given matcher.
5810
5811The associated declaration is:
5812- for type nodes, the declaration of the underlying type
5813- for CallExpr, the declaration of the callee
5814- for MemberExpr, the declaration of the referenced member
5815- for CXXConstructExpr, the declaration of the constructor
5816- for CXXNewExpr, the declaration of the operator new
5817
5818Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5819function. e.g. various subtypes of clang::Type and various expressions.
5820
5821Usable 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;,
5822  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;,
5823  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;,
5824  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;,
5825  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;,
5826  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;,
5827  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5828</pre></td></tr>
5829
5830
5831<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>
5832<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5833functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5834
5835Given
5836  template&lt;typename T, typename U&gt; class A {};
5837  A&lt;bool, int&gt; b;
5838  A&lt;int, bool&gt; c;
5839
5840  template&lt;typename T&gt; f() {};
5841  void func() { f&lt;int&gt;(); };
5842classTemplateSpecializationDecl(hasTemplateArgument(
5843    1, refersToType(asString("int"))))
5844  matches the specialization A&lt;bool, int&gt;
5845
5846functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5847  matches the specialization f&lt;int&gt;
5848</pre></td></tr>
5849
5850
5851<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>
5852<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
5853matches the given matcher.
5854
5855The associated declaration is:
5856- for type nodes, the declaration of the underlying type
5857- for CallExpr, the declaration of the callee
5858- for MemberExpr, the declaration of the referenced member
5859- for CXXConstructExpr, the declaration of the constructor
5860- for CXXNewExpr, the declaration of the operator new
5861
5862Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5863function. e.g. various subtypes of clang::Type and various expressions.
5864
5865Usable 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;,
5866  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;,
5867  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;,
5868  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;,
5869  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;,
5870  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;,
5871  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5872</pre></td></tr>
5873
5874
5875<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>
5876<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5877
5878Generates results for each match.
5879
5880For example, in:
5881  class A { class B {}; class C {}; };
5882The matcher:
5883  cxxRecordDecl(hasName("::A"),
5884                findAll(cxxRecordDecl(isDefinition()).bind("m")))
5885will generate results for A, B and C.
5886
5887Usable as: Any Matcher
5888</pre></td></tr>
5889
5890
5891<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>
5892<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
5893matcher.
5894
5895Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5896            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5897            and U (matcher = typedefDecl(hasType(asString("int")))
5898 class X {};
5899 void y(X &amp;x) { x; X z; }
5900 typedef int U;
5901</pre></td></tr>
5902
5903
5904<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>
5905<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
5906matches the given matcher.
5907
5908The associated declaration is:
5909- for type nodes, the declaration of the underlying type
5910- for CallExpr, the declaration of the callee
5911- for MemberExpr, the declaration of the referenced member
5912- for CXXConstructExpr, the declaration of the constructor
5913- for CXXNewExpr, the declaration of the operator new
5914
5915Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5916function. e.g. various subtypes of clang::Type and various expressions.
5917
5918Usable 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;,
5919  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;,
5920  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;,
5921  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;,
5922  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;,
5923  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;,
5924  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5925</pre></td></tr>
5926
5927
5928<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>
5929<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
5930type of the matched node.
5931
5932For example, in:
5933  class A {};
5934  using B = A;
5935The matcher type(hasUniqualifeidDesugaredType(recordType())) matches
5936both B and A.
5937</pre></td></tr>
5938
5939
5940<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>
5941<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
5942
5943Given
5944  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
5945unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
5946  matches sizeof(a) and alignof(c)
5947</pre></td></tr>
5948
5949
5950<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>
5951<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
5952
5953Example matches true (matcher = hasUnaryOperand(
5954                                  cxxBoolLiteral(equals(true))))
5955  !true
5956</pre></td></tr>
5957
5958
5959<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>
5960<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
5961matches the given matcher.
5962
5963The associated declaration is:
5964- for type nodes, the declaration of the underlying type
5965- for CallExpr, the declaration of the callee
5966- for MemberExpr, the declaration of the referenced member
5967- for CXXConstructExpr, the declaration of the constructor
5968- for CXXNewExpr, the declaration of the operator new
5969
5970Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5971function. e.g. various subtypes of clang::Type and various expressions.
5972
5973Usable 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;,
5974  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;,
5975  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;,
5976  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;,
5977  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;,
5978  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;,
5979  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5980</pre></td></tr>
5981
5982
5983<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>
5984<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
5985
5986Given
5987  namespace X { void b(); }
5988  using X::b;
5989usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
5990  matches using X::b </pre></td></tr>
5991
5992
5993<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>
5994<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
5995matched by the given matcher.
5996
5997Given
5998  namespace X { int a; void b(); }
5999  using X::a;
6000  using X::b;
6001usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
6002  matches using X::b but not using X::a </pre></td></tr>
6003
6004
6005<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>
6006<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
6007declaration's type.
6008
6009In case of a value declaration (for example a variable declaration),
6010this resolves one layer of indirection. For example, in the value
6011declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6012X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6013declaration of x.
6014
6015Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6016            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6017 class X {};
6018 void y(X &amp;x) { x; X z; }
6019
6020Usable 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;
6021</pre></td></tr>
6022
6023
6024<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>
6025<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
6026matcher.
6027
6028Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6029            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6030            and U (matcher = typedefDecl(hasType(asString("int")))
6031 class X {};
6032 void y(X &amp;x) { x; X z; }
6033 typedef int U;
6034</pre></td></tr>
6035
6036
6037<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>
6038<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
6039that matches the given matcher.
6040
6041Example matches x (matcher = varDecl(hasInitializer(callExpr())))
6042  bool y() { return true; }
6043  bool x = y();
6044</pre></td></tr>
6045
6046
6047<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>
6048<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
6049expression.
6050
6051Given
6052  void f(int b) {
6053    int a[b];
6054  }
6055variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
6056  varDecl(hasName("b")))))))
6057  matches "int a[b]"
6058</pre></td></tr>
6059
6060
6061<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>
6062<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
6063definition that has a given body.
6064
6065Given
6066  for (;;) {}
6067hasBody(compoundStmt())
6068  matches 'for (;;) {}'
6069with compoundStmt()
6070  matching '{}'
6071</pre></td></tr>
6072
6073
6074<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>
6075<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
6076switch statement or conditional operator.
6077
6078Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6079  if (true) {}
6080</pre></td></tr>
6081
6082
6083<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>
6084<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
6085NestedNameSpecifier-matcher matches.
6086</pre></td></tr>
6087
6088
6089<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>
6090<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
6091QualType-matcher matches.
6092</pre></td></tr>
6093
6094<!--END_TRAVERSAL_MATCHERS -->
6095</table>
6096
6097</div>
6098</body>
6099</html>
6100
6101
6102