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