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