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