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