• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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('ctorInitializer0')"><a name="ctorInitializer0Anchor">ctorInitializer</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="ctorInitializer0"><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('constructorDecl0')"><a name="constructorDecl0Anchor">constructorDecl</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="constructorDecl0"><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('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>
161<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
162
163Examples matches X, C, and the friend declaration inside C;
164  void X();
165  class C {
166    friend X;
167  };
168</pre></td></tr>
169
170
171<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>
172<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
173and non-type template parameter declarations).
174
175Given
176  class X { int y; };
177declaratorDecl()
178  matches int y.
179</pre></td></tr>
180
181
182<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('destructorDecl0')"><a name="destructorDecl0Anchor">destructorDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
183<tr><td colspan="4" class="doc" id="destructorDecl0"><pre>Matches explicit C++ destructor declarations.
184
185Example matches Foo::~Foo()
186  class Foo {
187   public:
188    virtual ~Foo();
189  };
190</pre></td></tr>
191
192
193<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>
194<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
195
196Example matches A, B, C
197  enum X {
198    A, B, C
199  };
200</pre></td></tr>
201
202
203<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>
204<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
205
206Example matches X
207  enum X {
208    A, B, C
209  };
210</pre></td></tr>
211
212
213<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>
214<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
215
216Given
217  class X { int m; };
218fieldDecl()
219  matches 'm'.
220</pre></td></tr>
221
222
223<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>
224<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
225
226Given
227  class X { friend void foo(); };
228friendDecl()
229  matches 'friend void foo()'.
230</pre></td></tr>
231
232
233<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>
234<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
235
236Example matches f
237  void f();
238</pre></td></tr>
239
240
241<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>
242<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
243
244Example matches f
245  template&lt;class T&gt; void f(T t) {}
246</pre></td></tr>
247
248
249<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>
250<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
251
252Given
253  extern "C" {}
254linkageSpecDecl()
255  matches "extern "C" {}"
256</pre></td></tr>
257
258
259<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('methodDecl0')"><a name="methodDecl0Anchor">methodDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
260<tr><td colspan="4" class="doc" id="methodDecl0"><pre>Matches method declarations.
261
262Example matches y
263  class X { void y(); };
264</pre></td></tr>
265
266
267<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>
268<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
269
270Example matches X, S, the anonymous union type, i, and U;
271  typedef int X;
272  struct S {
273    union {
274      int i;
275    } U;
276  };
277</pre></td></tr>
278
279
280<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>
281<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
282
283Given
284  namespace {}
285  namespace test {}
286namespaceDecl()
287  matches "namespace {}" and "namespace test {}"
288</pre></td></tr>
289
290
291<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>
292<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
293
294Given
295  void f(int x);
296parmVarDecl()
297  matches int x.
298</pre></td></tr>
299
300
301<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_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
302<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches C++ class declarations.
303
304Example matches X, Z
305  class X;
306  template&lt;class T&gt; class Z {};
307</pre></td></tr>
308
309
310<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>
311<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
312
313Given
314  int X;
315  namespace NS {
316  int Y;
317  }  namespace NS
318decl(hasDeclContext(translationUnitDecl()))
319  matches "int X", but not "int Y".
320</pre></td></tr>
321
322
323<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>
324<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
325
326Given
327  typedef int X;
328typedefDecl()
329  matches "typedef int X"
330</pre></td></tr>
331
332
333<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>
334<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
335
336Given
337  template&lt;typename X&gt;
338  class C : private X {
339    using X::x;
340  };
341unresolvedUsingValueDecl()
342  matches using X::x </pre></td></tr>
343
344
345<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>
346<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
347
348Given
349  namespace X { int x; }
350  using X::x;
351usingDecl()
352  matches using X::x </pre></td></tr>
353
354
355<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>
356<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
357
358Given
359  namespace X { int x; }
360  using namespace X;
361usingDirectiveDecl()
362  matches using namespace X </pre></td></tr>
363
364
365<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>
366<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
367
368Example matches A, B, C and F
369  enum X { A, B, C };
370  void F();
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('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>
375<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
376
377Note: this does not match declarations of member variables, which are
378"field" declarations in Clang parlance.
379
380Example matches a
381  int a;
382</pre></td></tr>
383
384
385<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>
386<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
387</pre></td></tr>
388
389
390<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>
391<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
392
393Given
394  namespace ns {
395    struct A { static void f(); };
396    void A::f() {}
397    void g() { A::f(); }
398  }
399  ns::A a;
400nestedNameSpecifier()
401  matches "ns::" and both "A::"
402</pre></td></tr>
403
404
405<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>
406<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
407</pre></td></tr>
408
409
410<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>
411<tr><td colspan="4" class="doc" id="CUDAKernelCallExpr0"><pre>Matches CUDA kernel call expression.
412
413Example matches,
414  kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
415</pre></td></tr>
416
417
418<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>
419<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
420
421Given
422  int i = a[1];
423arraySubscriptExpr()
424  matches "a[1]"
425</pre></td></tr>
426
427
428<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>
429<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
430
431 int i = 100;
432  __asm("mov al, 2");
433asmStmt()
434  matches '__asm("mov al, 2")'
435</pre></td></tr>
436
437
438<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>
439<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
440
441Example matches a || b
442  !(a || b)
443</pre></td></tr>
444
445
446<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('bindTemporaryExpr0')"><a name="bindTemporaryExpr0Anchor">bindTemporaryExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
447<tr><td colspan="4" class="doc" id="bindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
448
449Example matches FunctionTakesString(GetStringByValue())
450    (matcher = bindTemporaryExpr())
451  FunctionTakesString(GetStringByValue());
452  FunctionTakesStringByPointer(GetStringPointer());
453</pre></td></tr>
454
455
456<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('boolLiteral0')"><a name="boolLiteral0Anchor">boolLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
457<tr><td colspan="4" class="doc" id="boolLiteral0"><pre>Matches bool literals.
458
459Example matches true
460  true
461</pre></td></tr>
462
463
464<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>
465<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
466
467Given
468  while (true) { break; }
469breakStmt()
470  matches 'break'
471</pre></td></tr>
472
473
474<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>
475<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
476
477Example: Matches (int*) 2.2f in
478  int i = (int) 2.2f;
479</pre></td></tr>
480
481
482<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>
483<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
484
485Example matches x.y() and y()
486  X x;
487  x.y();
488  y();
489</pre></td></tr>
490
491
492<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>
493<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
494
495Given
496  switch(a) { case 42: break; default: break; }
497caseStmt()
498  matches 'case 42: break;'.
499</pre></td></tr>
500
501
502<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>
503<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
504
505Example: castExpr() matches each of the following:
506  (int) 3;
507  const_cast&lt;Expr *&gt;(SubExpr);
508  char c = 0;
509but does not match
510  int i = (0);
511  int k = 0;
512</pre></td></tr>
513
514
515<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('catchStmt0')"><a name="catchStmt0Anchor">catchStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
516<tr><td colspan="4" class="doc" id="catchStmt0"><pre>Matches catch statements.
517
518  try {} catch(int i) {}
519catchStmt()
520  matches 'catch(int i)'
521</pre></td></tr>
522
523
524<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>
525<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
526
527Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
528though.
529
530Example matches 'a', L'a'
531  char ch = 'a'; wchar_t chw = L'a';
532</pre></td></tr>
533
534
535<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>
536<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
537
538Example match: {1}, (1, 2)
539  int array[4] = {1}; vector int myvec = (vector int)(1, 2);
540</pre></td></tr>
541
542
543<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
544<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
545
546Example matches '{}' and '{{}}'in 'for (;;) {{}}'
547  for (;;) {{}}
548</pre></td></tr>
549
550
551<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>
552<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
553
554Example matches a ? b : c
555  (a ? b : c) + 42
556</pre></td></tr>
557
558
559<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constCastExpr0')"><a name="constCastExpr0Anchor">constCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
560<tr><td colspan="4" class="doc" id="constCastExpr0"><pre>Matches a const_cast expression.
561
562Example: Matches const_cast&lt;int*&gt;(&amp;r) in
563  int n = 42;
564  const int &amp;r(n);
565  int* p = const_cast&lt;int*&gt;(&amp;r);
566</pre></td></tr>
567
568
569<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constructExpr0')"><a name="constructExpr0Anchor">constructExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
570<tr><td colspan="4" class="doc" id="constructExpr0"><pre>Matches constructor call expressions (including implicit ones).
571
572Example matches string(ptr, n) and ptr within arguments of f
573    (matcher = constructExpr())
574  void f(const string &amp;a, const string &amp;b);
575  char *ptr;
576  int n;
577  f(string(ptr, n), ptr);
578</pre></td></tr>
579
580
581<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
582<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
583
584Given
585  while (true) { continue; }
586continueStmt()
587  matches 'continue'
588</pre></td></tr>
589
590
591<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>
592<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
593
594Example matches x in if (x)
595  bool x;
596  if (x) {}
597</pre></td></tr>
598
599
600<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>
601<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
602
603Given
604  int a;
605declStmt()
606  matches 'int a'.
607</pre></td></tr>
608
609
610<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultArgExpr0')"><a name="defaultArgExpr0Anchor">defaultArgExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
611<tr><td colspan="4" class="doc" id="defaultArgExpr0"><pre>Matches the value of a default argument at the call site.
612
613Example matches the CXXDefaultArgExpr placeholder inserted for the
614    default value of the second parameter in the call expression f(42)
615    (matcher = defaultArgExpr())
616  void f(int x, int y = 0);
617  f(42);
618</pre></td></tr>
619
620
621<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>
622<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
623
624Given
625  switch(a) { case 42: break; default: break; }
626defaultStmt()
627  matches 'default: break;'.
628</pre></td></tr>
629
630
631<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('deleteExpr0')"><a name="deleteExpr0Anchor">deleteExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
632<tr><td colspan="4" class="doc" id="deleteExpr0"><pre>Matches delete expressions.
633
634Given
635  delete X;
636deleteExpr()
637  matches 'delete X'.
638</pre></td></tr>
639
640
641<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>
642<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
643
644Given
645  do {} while (true);
646doStmt()
647  matches 'do {} while(true)'
648</pre></td></tr>
649
650
651<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('dynamicCastExpr0')"><a name="dynamicCastExpr0Anchor">dynamicCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
652<tr><td colspan="4" class="doc" id="dynamicCastExpr0"><pre>Matches a dynamic_cast expression.
653
654Example:
655  dynamicCastExpr()
656matches
657  dynamic_cast&lt;D*&gt;(&amp;b);
658in
659  struct B { virtual ~B() {} }; struct D : B {};
660  B b;
661  D* p = dynamic_cast&lt;D*&gt;(&amp;b);
662</pre></td></tr>
663
664
665<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>
666<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
667
668Matches any cast expression written in user code, whether it be a
669C-style cast, a functional-style cast, or a keyword cast.
670
671Does not match implicit conversions.
672
673Note: the name "explicitCast" is chosen to match Clang's terminology, as
674Clang uses the term "cast" to apply to implicit conversions as well as to
675actual cast expressions.
676
677hasDestinationType.
678
679Example: matches all five of the casts in
680  int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
681but does not match the implicit conversion in
682  long ell = 42;
683</pre></td></tr>
684
685
686<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>
687<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
688
689Example matches x()
690  void f() { x(); }
691</pre></td></tr>
692
693
694<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>
695<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
696of the sub-expression's evaluation.
697
698Example matches std::string()
699  const std::string str = std::string();
700</pre></td></tr>
701
702
703<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>
704<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g.
7051.0, 1.0f, 1.0L and 1e10.
706
707Does not match implicit conversions such as
708  float a = 10;
709</pre></td></tr>
710
711
712<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forRangeStmt0')"><a name="forRangeStmt0Anchor">forRangeStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
713<tr><td colspan="4" class="doc" id="forRangeStmt0"><pre>Matches range-based for statements.
714
715forRangeStmt() matches 'for (auto a : i)'
716  int i[] =  {1, 2, 3}; for (auto a : i);
717  for(int j = 0; j &lt; 5; ++j);
718</pre></td></tr>
719
720
721<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>
722<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
723
724Example matches 'for (;;) {}'
725  for (;;) {}
726  int i[] =  {1, 2, 3}; for (auto a : i);
727</pre></td></tr>
728
729
730<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('functionalCastExpr0')"><a name="functionalCastExpr0Anchor">functionalCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
731<tr><td colspan="4" class="doc" id="functionalCastExpr0"><pre>Matches functional cast expressions
732
733Example: Matches Foo(bar);
734  Foo f = bar;
735  Foo g = (Foo) bar;
736  Foo h = Foo(bar);
737</pre></td></tr>
738
739
740<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
741<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
742
743Given
744  goto FOO;
745  FOO: bar();
746gotoStmt()
747  matches 'goto FOO'
748</pre></td></tr>
749
750
751<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>
752<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
753
754Example matches 'if (x) {}'
755  if (x) {}
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('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>
760<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
761
762This matches many different places, including function call return value
763eliding, as well as any type conversions.
764</pre></td></tr>
765
766
767<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
768<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
769
770Given
771  int a[] = { 1, 2 };
772  struct B { int x, y; };
773  B b = { 5, 6 };
774initListExpr()
775  matches "{ 1, 2 }" and "{ 5, 6 }"
776</pre></td></tr>
777
778
779<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
780<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g.
7811, 1L, 0x1 and 1U.
782
783Does not match character-encoded integers such as L'a'.
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('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>
788<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
789
790Given
791  goto FOO;
792  FOO: bar();
793labelStmt()
794  matches 'FOO:'
795</pre></td></tr>
796
797
798<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
799<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
800
801Example matches [&amp;](){return 5;}
802  [&amp;](){return 5;}
803</pre></td></tr>
804
805
806<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>
807<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
808
809Example: Given
810  struct T {void func()};
811  T f();
812  void g(T);
813materializeTemporaryExpr() matches 'f()' in these statements
814  T u(f());
815  g(f());
816but does not match
817  f();
818  f().func();
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('memberCallExpr0')"><a name="memberCallExpr0Anchor">memberCallExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
823<tr><td colspan="4" class="doc" id="memberCallExpr0"><pre>Matches member call expressions.
824
825Example matches x.y()
826  X x;
827  x.y();
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('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>
832<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
833
834Given
835  class Y {
836    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
837    int a; static int b;
838  };
839memberExpr()
840  matches this-&gt;x, x, y.x, a, this-&gt;b
841</pre></td></tr>
842
843
844<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('newExpr0')"><a name="newExpr0Anchor">newExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
845<tr><td colspan="4" class="doc" id="newExpr0"><pre>Matches new expressions.
846
847Given
848  new X;
849newExpr()
850  matches 'new X'.
851</pre></td></tr>
852
853
854<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('nullPtrLiteralExpr0')"><a name="nullPtrLiteralExpr0Anchor">nullPtrLiteralExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
855<tr><td colspan="4" class="doc" id="nullPtrLiteralExpr0"><pre>Matches nullptr literal.
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('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>
860<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
861
862  foo();;
863nullStmt()
864  matches the second ';'
865</pre></td></tr>
866
867
868<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('operatorCallExpr0')"><a name="operatorCallExpr0Anchor">operatorCallExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
869<tr><td colspan="4" class="doc" id="operatorCallExpr0"><pre>Matches overloaded operator calls.
870
871Note that if an operator isn't overloaded, it won't match. Instead, use
872binaryOperator matcher.
873Currently it does not match operators such as new delete.
874FIXME: figure out why these do not match?
875
876Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
877    (matcher = operatorCallExpr())
878  ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
879  ostream &amp;o; int b = 1, c = 1;
880  o &lt;&lt; b &lt;&lt; c;
881</pre></td></tr>
882
883
884<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('reinterpretCastExpr0')"><a name="reinterpretCastExpr0Anchor">reinterpretCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
885<tr><td colspan="4" class="doc" id="reinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
886
887Either the source expression or the destination type can be matched
888using has(), but hasDestinationType() is more specific and can be
889more readable.
890
891Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
892  void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
893</pre></td></tr>
894
895
896<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>
897<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
898
899Given
900  return 1;
901returnStmt()
902  matches 'return 1'
903</pre></td></tr>
904
905
906<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('staticCastExpr0')"><a name="staticCastExpr0Anchor">staticCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
907<tr><td colspan="4" class="doc" id="staticCastExpr0"><pre>Matches a C++ static_cast expression.
908
909hasDestinationType
910reinterpretCast
911
912Example:
913  staticCastExpr()
914matches
915  static_cast&lt;long&gt;(8)
916in
917  long eight(static_cast&lt;long&gt;(8));
918</pre></td></tr>
919
920
921<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
922<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
923
924Given
925  { ++a; }
926stmt()
927  matches both the compound statement '{ ++a; }' and '++a'.
928</pre></td></tr>
929
930
931<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>
932<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
933
934Example matches "abcd", L"abcd"
935  char *s = "abcd"; wchar_t *ws = L"abcd"
936</pre></td></tr>
937
938
939<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>
940<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
941
942Given
943  template &lt;int N&gt;
944  struct A { static const int n = N; };
945  struct B : public A&lt;42&gt; {};
946substNonTypeTemplateParmExpr()
947  matches "N" in the right-hand side of "static const int n = N;"
948</pre></td></tr>
949
950
951<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>
952<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
953
954Given
955  switch(a) { case 42: break; default: break; }
956switchCase()
957  matches 'case 42: break;' and 'default: break;'.
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('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>
962<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
963
964Given
965  switch(a) { case 42: break; default: break; }
966switchStmt()
967  matches 'switch(a)'.
968</pre></td></tr>
969
970
971<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('temporaryObjectExpr0')"><a name="temporaryObjectExpr0Anchor">temporaryObjectExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
972<tr><td colspan="4" class="doc" id="temporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
973
974Example: Matches Foo(bar, bar)
975  Foo h = Foo(bar, bar);
976</pre></td></tr>
977
978
979<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('thisExpr0')"><a name="thisExpr0Anchor">thisExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
980<tr><td colspan="4" class="doc" id="thisExpr0"><pre>Matches implicit and explicit this expressions.
981
982Example matches the implicit this expression in "return i".
983    (matcher = thisExpr())
984struct foo {
985  int i;
986  int f() { return i; }
987};
988</pre></td></tr>
989
990
991<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('throwExpr0')"><a name="throwExpr0Anchor">throwExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
992<tr><td colspan="4" class="doc" id="throwExpr0"><pre>Matches throw expressions.
993
994  try { throw 5; } catch(int i) {}
995throwExpr()
996  matches 'throw 5'
997</pre></td></tr>
998
999
1000<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('tryStmt0')"><a name="tryStmt0Anchor">tryStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
1001<tr><td colspan="4" class="doc" id="tryStmt0"><pre>Matches try statements.
1002
1003  try {} catch(int i) {}
1004tryStmt()
1005  matches 'try {}'
1006</pre></td></tr>
1007
1008
1009<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>
1010<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1011
1012Given
1013  Foo x = bar;
1014  int y = sizeof(x) + alignof(x);
1015unaryExprOrTypeTraitExpr()
1016  matches sizeof(x) and alignof(x)
1017</pre></td></tr>
1018
1019
1020<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>
1021<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1022
1023Example matches !a
1024  !a || b
1025</pre></td></tr>
1026
1027
1028<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedConstructExpr0')"><a name="unresolvedConstructExpr0Anchor">unresolvedConstructExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
1029<tr><td colspan="4" class="doc" id="unresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1030
1031Example matches T(t) in return statement of f
1032    (matcher = unresolvedConstructExpr())
1033  template &lt;typename T&gt;
1034  void f(const T&amp; t) { return T(t); }
1035</pre></td></tr>
1036
1037
1038<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>
1039<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1040
1041Example match: "foo"_suffix
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('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>
1046<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1047
1048Given
1049  while (true) {}
1050whileStmt()
1051  matches 'while (true) {}'.
1052</pre></td></tr>
1053
1054
1055<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>
1056<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1057
1058Given
1059  template &lt;typename T&gt; struct C {};
1060  C&lt;int&gt; c;
1061templateArgument()
1062  matches 'int' in C&lt;int&gt;.
1063</pre></td></tr>
1064
1065
1066<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>
1067<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1068</pre></td></tr>
1069
1070
1071<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>
1072<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1073
1074Given
1075  int a[] = { 2, 3 };
1076  int b[4];
1077  void f() { int c[a[0]]; }
1078arrayType()
1079  matches "int a[]", "int b[4]" and "int c[a[0]]";
1080</pre></td></tr>
1081
1082
1083<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>
1084<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1085
1086Given
1087  _Atomic(int) i;
1088atomicType()
1089  matches "_Atomic(int) i"
1090</pre></td></tr>
1091
1092
1093<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>
1094<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1095
1096Given:
1097  auto n = 4;
1098  int v[] = { 2, 3 }
1099  for (auto i : v) { }
1100autoType()
1101  matches "auto n" and "auto i"
1102</pre></td></tr>
1103
1104
1105<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>
1106<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1107"void (^)(int)".
1108
1109The pointee is always required to be a FunctionType.
1110</pre></td></tr>
1111
1112
1113<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>
1114<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1115
1116Given
1117  struct A {};
1118  A a;
1119  int b;
1120  float c;
1121  bool d;
1122builtinType()
1123  matches "int b", "float c" and "bool d"
1124</pre></td></tr>
1125
1126
1127<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>
1128<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1129
1130Given
1131  _Complex float f;
1132complexType()
1133  matches "_Complex float f"
1134</pre></td></tr>
1135
1136
1137<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>
1138<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1139
1140Given
1141  void() {
1142    int a[2];
1143    int b[] = { 2, 3 };
1144    int c[b[0]];
1145  }
1146constantArrayType()
1147  matches "int a[2]"
1148</pre></td></tr>
1149
1150
1151<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>
1152<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1153
1154Given
1155  template&lt;typename T, int Size&gt;
1156  class array {
1157    T data[Size];
1158  };
1159dependentSizedArrayType
1160  matches "T data[Size]"
1161</pre></td></tr>
1162
1163
1164<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>
1165<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1166qualified name.
1167
1168Given
1169  namespace N {
1170    namespace M {
1171      class D {};
1172    }
1173  }
1174  class C {};
1175
1176  class C c;
1177  N::M::D d;
1178
1179elaboratedType() matches the type of the variable declarations of both
1180c and d.
1181</pre></td></tr>
1182
1183
1184<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>
1185<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1186
1187Given
1188  int (*f)(int);
1189  void g();
1190functionType()
1191  matches "int (*f)(int)" and the type of "g".
1192</pre></td></tr>
1193
1194
1195<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>
1196<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1197
1198Given
1199  int a[] = { 2, 3 };
1200  int b[42];
1201  void f(int c[]) { int d[a[0]]; };
1202incompleteArrayType()
1203  matches "int a[]" and "int c[]"
1204</pre></td></tr>
1205
1206
1207<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>
1208<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1209
1210Given:
1211  int *a;
1212  int &amp;b = *a;
1213  int &amp;&amp;c = 1;
1214  auto &amp;d = b;
1215  auto &amp;&amp;e = c;
1216  auto &amp;&amp;f = 2;
1217  int g = 5;
1218
1219lValueReferenceType() matches the types of b, d, and e. e is
1220matched since the type is deduced as int&amp; by reference collapsing rules.
1221</pre></td></tr>
1222
1223
1224<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>
1225<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1226Given
1227  struct A { int i; }
1228  A::* ptr = A::i;
1229memberPointerType()
1230  matches "A::* ptr"
1231</pre></td></tr>
1232
1233
1234<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>
1235<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1236
1237Given
1238  int (*ptr_to_array)[4];
1239  int *array_of_ptrs[4];
1240
1241varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1242array_of_ptrs.
1243</pre></td></tr>
1244
1245
1246<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>
1247<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types.
1248
1249Given
1250  int *a;
1251  int &amp;b = *a;
1252  int c = 5;
1253pointerType()
1254  matches "int *a"
1255</pre></td></tr>
1256
1257
1258<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>
1259<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1260
1261Given:
1262  int *a;
1263  int &amp;b = *a;
1264  int &amp;&amp;c = 1;
1265  auto &amp;d = b;
1266  auto &amp;&amp;e = c;
1267  auto &amp;&amp;f = 2;
1268  int g = 5;
1269
1270rValueReferenceType() matches the types of c and f. e is not
1271matched as it is deduced to int&amp; by reference collapsing rules.
1272</pre></td></tr>
1273
1274
1275<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>
1276<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1277
1278Given
1279  class C {};
1280  struct S {};
1281
1282  C c;
1283  S s;
1284
1285recordType() matches the type of the variable declarations of both c
1286and s.
1287</pre></td></tr>
1288
1289
1290<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>
1291<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1292
1293Given
1294  int *a;
1295  int &amp;b = *a;
1296  int &amp;&amp;c = 1;
1297  auto &amp;d = b;
1298  auto &amp;&amp;e = c;
1299  auto &amp;&amp;f = 2;
1300  int g = 5;
1301
1302referenceType() matches the types of b, c, d, e, and f.
1303</pre></td></tr>
1304
1305
1306<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>
1307<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1308
1309Given
1310  template &lt;typename T&gt;
1311  class C { };
1312
1313  template class C&lt;int&gt;;  A
1314  C&lt;char&gt; var;            B
1315
1316templateSpecializationType() matches the type of the explicit
1317instantiation in A and the type of the variable declaration in B.
1318</pre></td></tr>
1319
1320
1321<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>
1322<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1323</pre></td></tr>
1324
1325
1326<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>
1327<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1328
1329Given
1330  typedef int X;
1331typedefType()
1332  matches "typedef int X"
1333</pre></td></tr>
1334
1335
1336<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>
1337<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1338
1339Given:
1340  typedef __underlying_type(T) type;
1341unaryTransformType()
1342  matches "__underlying_type(T)"
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('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>
1347<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1348integer-constant-expression.
1349
1350Given
1351  void f() {
1352    int a[] = { 2, 3 }
1353    int b[42];
1354    int c[a[0]];
1355  }
1356variableArrayType()
1357  matches "int c[a[0]]"
1358</pre></td></tr>
1359
1360<!--END_DECL_MATCHERS -->
1361</table>
1362
1363<!-- ======================================================================= -->
1364<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1365<!-- ======================================================================= -->
1366
1367<p>Narrowing matchers match certain attributes on the current node, thus
1368narrowing down the set of nodes of the current type to match on.</p>
1369
1370<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1371which allow users to create more powerful match expressions.</p>
1372
1373<table>
1374<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1375<!-- START_NARROWING_MATCHERS -->
1376
1377<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>
1378<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1379
1380Usable as: Any Matcher
1381</pre></td></tr>
1382
1383
1384<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>
1385<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1386
1387Usable as: Any Matcher
1388</pre></td></tr>
1389
1390
1391<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1392<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1393
1394Useful when another matcher requires a child matcher, but there's no
1395additional constraint. This will often be used with an explicit conversion
1396to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1397
1398Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1399"int* p" and "void f()" in
1400  int* p;
1401  void f();
1402
1403Usable as: Any Matcher
1404</pre></td></tr>
1405
1406
1407<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
1408<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1409
1410Example matches Y (matcher = recordDecl(unless(hasName("X"))))
1411  class X {};
1412  class Y {};
1413
1414Usable as: Any Matcher
1415</pre></td></tr>
1416
1417
1418<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>
1419<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1420unary).
1421
1422Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1423  !(a || b)
1424</pre></td></tr>
1425
1426
1427<tr><td>Matcher&lt;CXXBoolLiteral&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT  Value</td></tr>
1428<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1429
1430Example matches true (matcher = boolLiteral(equals(true)))
1431  true
1432
1433Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1434           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;
1435</pre></td></tr>
1436
1437
1438<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>
1439<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1440a specific number of arguments (including absent default arguments).
1441
1442Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1443  void f(int x, int y);
1444  f(0, 0);
1445</pre></td></tr>
1446
1447
1448<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>
1449<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
1450</pre></td></tr>
1451
1452
1453<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>
1454<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
1455code (as opposed to implicitly added by the compiler).
1456
1457Given
1458  struct Foo {
1459    Foo() { }
1460    Foo(int) : foo_("A") { }
1461    string foo_;
1462  };
1463constructorDecl(hasAnyConstructorInitializer(isWritten()))
1464  will match Foo(int), but not Foo()
1465</pre></td></tr>
1466
1467
1468<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>
1469<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
1470
1471Given
1472struct A {
1473  void foo() const;
1474  void bar();
1475};
1476
1477methodDecl(isConst()) matches A::foo() but not A::bar()
1478</pre></td></tr>
1479
1480
1481<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>
1482<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
1483
1484Given
1485  class A {
1486   public:
1487    virtual void x();
1488  };
1489  class B : public A {
1490   public:
1491    virtual void x();
1492  };
1493  matches B::x
1494</pre></td></tr>
1495
1496
1497<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>
1498<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
1499
1500Given
1501  class A {
1502   public:
1503    virtual void x() = 0;
1504  };
1505  matches A::x
1506</pre></td></tr>
1507
1508
1509<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>
1510<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
1511
1512Given
1513  class A {
1514   public:
1515    virtual void x();
1516  };
1517  matches A::x
1518</pre></td></tr>
1519
1520
1521<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>
1522<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
1523
1524Matches overloaded operator names specified in strings without the
1525"operator" prefix: e.g. "&lt;&lt;".
1526
1527Given:
1528  class A { int operator*(); };
1529  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1530  A a;
1531  a &lt;&lt; a;   &lt;-- This matches
1532
1533operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1534line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1535the declaration of A.
1536
1537Usable 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;
1538</pre></td></tr>
1539
1540
1541<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>
1542<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
1543</pre></td></tr>
1544
1545
1546<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>
1547<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
1548static member variable template instantiations.
1549
1550Given
1551  template&lt;typename T&gt; void A(T t) { }
1552  template&lt;&gt; void A(int N) { }
1553functionDecl(isExplicitTemplateSpecialization())
1554  matches the specialization A&lt;int&gt;().
1555
1556Usable 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;
1557</pre></td></tr>
1558
1559
1560<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>
1561<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
1562isSameOrDerivedFrom(hasName(...)).
1563</pre></td></tr>
1564
1565
1566<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>
1567<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
1568member variable template instantiations.
1569
1570Given
1571  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1572or
1573  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
1574recordDecl(hasName("::X"), isTemplateInstantiation())
1575  matches the template instantiation of X&lt;A&gt;.
1576
1577But given
1578  template &lt;typename T&gt;  class X {}; class A {};
1579  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
1580recordDecl(hasName("::X"), isTemplateInstantiation())
1581  does not match, as X&lt;A&gt; is an explicit template specialization.
1582
1583Usable 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;
1584</pre></td></tr>
1585
1586
1587<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>
1588<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
1589a specific number of arguments (including absent default arguments).
1590
1591Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1592  void f(int x, int y);
1593  f(0, 0);
1594</pre></td></tr>
1595
1596
1597<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>
1598<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
1599
1600Example matches true (matcher = boolLiteral(equals(true)))
1601  true
1602
1603Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1604           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;
1605</pre></td></tr>
1606
1607
1608<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>
1609<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
1610
1611Given
1612  template&lt;typename T&gt; struct C {};
1613  C&lt;int&gt; c;
1614classTemplateSpecializationDecl(templateArgumentCountIs(1))
1615  matches C&lt;int&gt;.
1616</pre></td></tr>
1617
1618
1619<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>
1620<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
1621child statements.
1622
1623Example: Given
1624  { for (;;) {} }
1625compoundStmt(statementCountIs(0)))
1626  matches '{}'
1627  but does not match the outer compound statement.
1628</pre></td></tr>
1629
1630
1631<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>
1632<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size.
1633
1634Given
1635  int a[42];
1636  int b[2 * 21];
1637  int c[41], d[43];
1638constantArrayType(hasSize(42))
1639  matches "int a[42]" and "int b[2 * 21]"
1640</pre></td></tr>
1641
1642
1643<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>
1644<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
1645declarations.
1646
1647Example: Given
1648  int a, b;
1649  int c;
1650  int d = 2, e;
1651declCountIs(2)
1652  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
1653</pre></td></tr>
1654
1655
1656<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>
1657<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
1658
1659Matches a node if it equals the node previously bound to ID.
1660
1661Given
1662  class X { int a; int b; };
1663recordDecl(
1664    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1665    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1666  matches the class X, as a and b have the same type.
1667
1668Note that when multiple matches are involved via forEach* matchers,
1669equalsBoundNodes acts as a filter.
1670For example:
1671compoundStmt(
1672    forEachDescendant(varDecl().bind("d")),
1673    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1674will trigger a match for each combination of variable declaration
1675and reference to that variable declaration within a compound statement.
1676</pre></td></tr>
1677
1678
1679<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>
1680<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
1681
1682Given
1683  __attribute__((device)) void f() { ... }
1684decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
1685f.
1686</pre></td></tr>
1687
1688
1689<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>
1690<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
1691partially matching a given regex.
1692
1693Example matches Y but not X
1694    (matcher = recordDecl(isExpansionInFileMatching("AST.*"))
1695  #include "ASTMatcher.h"
1696  class X {};
1697ASTMatcher.h:
1698  class Y {};
1699
1700Usable 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;
1701</pre></td></tr>
1702
1703
1704<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>
1705<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
1706
1707Example matches X but not Y (matcher = recordDecl(isExpansionInMainFile())
1708  #include &lt;Y.h&gt;
1709  class X {};
1710Y.h:
1711  class Y {};
1712
1713Usable 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;
1714</pre></td></tr>
1715
1716
1717<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>
1718<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
1719
1720Example matches Y but not X
1721    (matcher = recordDecl(isExpansionInSystemHeader())
1722  #include &lt;SystemHeader.h&gt;
1723  class X {};
1724SystemHeader.h:
1725  class Y {};
1726
1727Usable 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;
1728</pre></td></tr>
1729
1730
1731<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>
1732<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
1733by the compiler (eg. implicit defaultcopy constructors).
1734</pre></td></tr>
1735
1736
1737<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>
1738<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
1739
1740Given
1741  class C {
1742  public:    int a;
1743  protected: int b;
1744  private:   int c;
1745  };
1746fieldDecl(isPrivate())
1747  matches 'int c;'
1748</pre></td></tr>
1749
1750
1751<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>
1752<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
1753
1754Given
1755  class C {
1756  public:    int a;
1757  protected: int b;
1758  private:   int c;
1759  };
1760fieldDecl(isProtected())
1761  matches 'int b;'
1762</pre></td></tr>
1763
1764
1765<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>
1766<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
1767
1768Given
1769  class C {
1770  public:    int a;
1771  protected: int b;
1772  private:   int c;
1773  };
1774fieldDecl(isPublic())
1775  matches 'int a;'
1776</pre></td></tr>
1777
1778
1779<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>
1780<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
1781
1782Example matches true (matcher = boolLiteral(equals(true)))
1783  true
1784
1785Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1786           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;
1787</pre></td></tr>
1788
1789
1790<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>
1791<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
1792
1793Matches overloaded operator names specified in strings without the
1794"operator" prefix: e.g. "&lt;&lt;".
1795
1796Given:
1797  class A { int operator*(); };
1798  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1799  A a;
1800  a &lt;&lt; a;   &lt;-- This matches
1801
1802operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1803line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1804the declaration of A.
1805
1806Usable 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;
1807</pre></td></tr>
1808
1809
1810<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>
1811<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
1812
1813Example matches A, va, fa
1814  class A {};
1815  class B;  Doesn't match, as it has no body.
1816  int va;
1817  extern int vb;  Doesn't match, as it doesn't define the variable.
1818  void fa() {}
1819  void fb();  Doesn't match, as it has no body.
1820
1821Usable 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;
1822</pre></td></tr>
1823
1824
1825<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>
1826<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
1827
1828Given:
1829  void Func();
1830  void DeletedFunc() = delete;
1831functionDecl(isDeleted())
1832  matches the declaration of DeletedFunc, but not Func.
1833</pre></td></tr>
1834
1835
1836<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>
1837<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
1838static member variable template instantiations.
1839
1840Given
1841  template&lt;typename T&gt; void A(T t) { }
1842  template&lt;&gt; void A(int N) { }
1843functionDecl(isExplicitTemplateSpecialization())
1844  matches the specialization A&lt;int&gt;().
1845
1846Usable 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;
1847</pre></td></tr>
1848
1849
1850<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>
1851<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
1852
1853Given:
1854  extern "C" void f() {}
1855  extern "C" { void g() {} }
1856  void h() {}
1857functionDecl(isExternC())
1858  matches the declaration of f and g, but not the declaration h
1859</pre></td></tr>
1860
1861
1862<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>
1863<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
1864member variable template instantiations.
1865
1866Given
1867  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1868or
1869  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
1870recordDecl(hasName("::X"), isTemplateInstantiation())
1871  matches the template instantiation of X&lt;A&gt;.
1872
1873But given
1874  template &lt;typename T&gt;  class X {}; class A {};
1875  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
1876recordDecl(hasName("::X"), isTemplateInstantiation())
1877  does not match, as X&lt;A&gt; is an explicit template specialization.
1878
1879Usable 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;
1880</pre></td></tr>
1881
1882
1883<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>
1884<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls that have a specific parameter count.
1885
1886Given
1887  void f(int i) {}
1888  void g(int i, int j) {}
1889functionDecl(parameterCountIs(2))
1890  matches g(int i, int j) {}
1891</pre></td></tr>
1892
1893
1894<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>
1895<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
1896
1897Example matches true (matcher = boolLiteral(equals(true)))
1898  true
1899
1900Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1901           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;
1902</pre></td></tr>
1903
1904
1905<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>
1906<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
1907to '.'.
1908
1909Member calls on the implicit this pointer match as called with '-&gt;'.
1910
1911Given
1912  class Y {
1913    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1914    int a;
1915    static int b;
1916  };
1917memberExpr(isArrow())
1918  matches this-&gt;x, x, y.x, a, this-&gt;b
1919</pre></td></tr>
1920
1921
1922<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>
1923<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
1924
1925Supports specifying enclosing namespaces or classes by prefixing the name
1926with '&lt;enclosing&gt;::'.
1927Does not match typedefs of an underlying type with the given name.
1928
1929Example matches X (Name == "X")
1930  class X;
1931
1932Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
1933  namespace a { namespace b { class X; } }
1934</pre></td></tr>
1935
1936
1937<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>
1938<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
1939a substring matched by the given RegExp.
1940
1941Supports specifying enclosing namespaces or classes by
1942prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
1943of an underlying type with the given name.
1944
1945Example matches X (regexp == "::X")
1946  class X;
1947
1948Example matches X (regexp is one of "::X", "^foo::.*X", among others)
1949  namespace foo { namespace bar { class X; } }
1950</pre></td></tr>
1951
1952
1953<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>
1954<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
1955
1956Given
1957  class Y { public: void x(); };
1958  void z() { Y* y; y-&gt;x(); }
1959callExpr(on(hasType(asString("class Y *"))))
1960  matches y-&gt;x()
1961</pre></td></tr>
1962
1963
1964<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>
1965<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
1966
1967Matches a node if it equals the node previously bound to ID.
1968
1969Given
1970  class X { int a; int b; };
1971recordDecl(
1972    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1973    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1974  matches the class X, as a and b have the same type.
1975
1976Note that when multiple matches are involved via forEach* matchers,
1977equalsBoundNodes acts as a filter.
1978For example:
1979compoundStmt(
1980    forEachDescendant(varDecl().bind("d")),
1981    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1982will trigger a match for each combination of variable declaration
1983and reference to that variable declaration within a compound statement.
1984</pre></td></tr>
1985
1986
1987<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>
1988<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
1989the node, not hidden within a typedef.
1990
1991Given
1992  typedef const int const_int;
1993  const_int i;
1994  int *const j;
1995  int *volatile k;
1996  int m;
1997varDecl(hasType(hasLocalQualifiers())) matches only j and k.
1998i is const-qualified but the qualifier is not local.
1999</pre></td></tr>
2000
2001
2002<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>
2003<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
2004include "top-level" const.
2005
2006Given
2007  void a(int);
2008  void b(int const);
2009  void c(const int);
2010  void d(const int*);
2011  void e(int const) {};
2012functionDecl(hasAnyParameter(hasType(isConstQualified())))
2013  matches "void b(int const)", "void c(const int)" and
2014  "void e(int const) {}". It does not match d as there
2015  is no top-level const on the parameter type "const int *".
2016</pre></td></tr>
2017
2018
2019<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>
2020<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
2021
2022Given
2023  void a(int);
2024  void b(long);
2025  void c(double);
2026functionDecl(hasAnyParameter(hasType(isInteger())))
2027matches "a(int)", "b(long)", but not "c(double)".
2028</pre></td></tr>
2029
2030
2031<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>
2032<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
2033
2034Matches a node if it equals the node previously bound to ID.
2035
2036Given
2037  class X { int a; int b; };
2038recordDecl(
2039    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2040    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2041  matches the class X, as a and b have the same type.
2042
2043Note that when multiple matches are involved via forEach* matchers,
2044equalsBoundNodes acts as a filter.
2045For example:
2046compoundStmt(
2047    forEachDescendant(varDecl().bind("d")),
2048    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2049will trigger a match for each combination of variable declaration
2050and reference to that variable declaration within a compound statement.
2051</pre></td></tr>
2052
2053
2054<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>
2055<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
2056partially matching a given regex.
2057
2058Example matches Y but not X
2059    (matcher = recordDecl(isExpansionInFileMatching("AST.*"))
2060  #include "ASTMatcher.h"
2061  class X {};
2062ASTMatcher.h:
2063  class Y {};
2064
2065Usable 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;
2066</pre></td></tr>
2067
2068
2069<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>
2070<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
2071
2072Example matches X but not Y (matcher = recordDecl(isExpansionInMainFile())
2073  #include &lt;Y.h&gt;
2074  class X {};
2075Y.h:
2076  class Y {};
2077
2078Usable 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;
2079</pre></td></tr>
2080
2081
2082<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>
2083<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
2084
2085Example matches Y but not X
2086    (matcher = recordDecl(isExpansionInSystemHeader())
2087  #include &lt;SystemHeader.h&gt;
2088  class X {};
2089SystemHeader.h:
2090  class Y {};
2091
2092Usable 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;
2093</pre></td></tr>
2094
2095
2096<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>
2097<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
2098
2099Example matches A, va, fa
2100  class A {};
2101  class B;  Doesn't match, as it has no body.
2102  int va;
2103  extern int vb;  Doesn't match, as it doesn't define the variable.
2104  void fa() {}
2105  void fb();  Doesn't match, as it has no body.
2106
2107Usable 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;
2108</pre></td></tr>
2109
2110
2111<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>
2112<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
2113
2114Note that 'Value' is a string as the template argument's value is
2115an arbitrary precision integer. 'Value' must be euqal to the canonical
2116representation of that integral value in base 10.
2117
2118Given
2119  template&lt;int T&gt; struct A {};
2120  C&lt;42&gt; c;
2121classTemplateSpecializationDecl(
2122  hasAnyTemplateArgument(equalsIntegralValue("42")))
2123  matches the implicit instantiation of C in C&lt;42&gt;.
2124</pre></td></tr>
2125
2126
2127<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>
2128<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
2129
2130Given
2131  template&lt;int T&gt; struct A {};
2132  C&lt;42&gt; c;
2133classTemplateSpecializationDecl(
2134  hasAnyTemplateArgument(isIntegral()))
2135  matches the implicit instantiation of C in C&lt;42&gt;
2136  with isIntegral() matching 42.
2137</pre></td></tr>
2138
2139
2140<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>
2141<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
2142
2143Given
2144  template&lt;typename T&gt; struct C {};
2145  C&lt;int&gt; c;
2146classTemplateSpecializationDecl(templateArgumentCountIs(1))
2147  matches C&lt;int&gt;.
2148</pre></td></tr>
2149
2150
2151<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>
2152<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
2153partially matching a given regex.
2154
2155Example matches Y but not X
2156    (matcher = recordDecl(isExpansionInFileMatching("AST.*"))
2157  #include "ASTMatcher.h"
2158  class X {};
2159ASTMatcher.h:
2160  class Y {};
2161
2162Usable 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;
2163</pre></td></tr>
2164
2165
2166<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>
2167<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
2168
2169Example matches X but not Y (matcher = recordDecl(isExpansionInMainFile())
2170  #include &lt;Y.h&gt;
2171  class X {};
2172Y.h:
2173  class Y {};
2174
2175Usable 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;
2176</pre></td></tr>
2177
2178
2179<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>
2180<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
2181
2182Example matches Y but not X
2183    (matcher = recordDecl(isExpansionInSystemHeader())
2184  #include &lt;SystemHeader.h&gt;
2185  class X {};
2186SystemHeader.h:
2187  class Y {};
2188
2189Usable 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;
2190</pre></td></tr>
2191
2192
2193<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>
2194<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
2195
2196Matches a node if it equals the node previously bound to ID.
2197
2198Given
2199  class X { int a; int b; };
2200recordDecl(
2201    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2202    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2203  matches the class X, as a and b have the same type.
2204
2205Note that when multiple matches are involved via forEach* matchers,
2206equalsBoundNodes acts as a filter.
2207For example:
2208compoundStmt(
2209    forEachDescendant(varDecl().bind("d")),
2210    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2211will trigger a match for each combination of variable declaration
2212and reference to that variable declaration within a compound statement.
2213</pre></td></tr>
2214
2215
2216<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>
2217<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
2218
2219Given
2220 struct S { void func(); };
2221functionDecl(returns(voidType()))
2222  matches "void func();"
2223</pre></td></tr>
2224
2225
2226<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>
2227<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
2228
2229Given
2230  int x;
2231  int s = sizeof(x) + alignof(x)
2232unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
2233  matches sizeof(x)
2234</pre></td></tr>
2235
2236
2237<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>
2238<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
2239unary).
2240
2241Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2242  !(a || b)
2243</pre></td></tr>
2244
2245
2246<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>
2247<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
2248
2249Example matches y and z (matcher = varDecl(hasGlobalStorage())
2250void f() {
2251  int x;
2252  static int y;
2253}
2254int z;
2255</pre></td></tr>
2256
2257
2258<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>
2259<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
2260non-static local variable.
2261
2262Example matches x (matcher = varDecl(hasLocalStorage())
2263void f() {
2264  int x;
2265  static int y;
2266}
2267int z;
2268</pre></td></tr>
2269
2270
2271<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>
2272<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
2273
2274Example matches A, va, fa
2275  class A {};
2276  class B;  Doesn't match, as it has no body.
2277  int va;
2278  extern int vb;  Doesn't match, as it doesn't define the variable.
2279  void fa() {}
2280  void fb();  Doesn't match, as it has no body.
2281
2282Usable 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;
2283</pre></td></tr>
2284
2285
2286<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>
2287<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
2288static member variable template instantiations.
2289
2290Given
2291  template&lt;typename T&gt; void A(T t) { }
2292  template&lt;&gt; void A(int N) { }
2293functionDecl(isExplicitTemplateSpecialization())
2294  matches the specialization A&lt;int&gt;().
2295
2296Usable 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;
2297</pre></td></tr>
2298
2299
2300<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>
2301<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
2302member variable template instantiations.
2303
2304Given
2305  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2306or
2307  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2308recordDecl(hasName("::X"), isTemplateInstantiation())
2309  matches the template instantiation of X&lt;A&gt;.
2310
2311But given
2312  template &lt;typename T&gt;  class X {}; class A {};
2313  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2314recordDecl(hasName("::X"), isTemplateInstantiation())
2315  does not match, as X&lt;A&gt; is an explicit template specialization.
2316
2317Usable 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;
2318</pre></td></tr>
2319
2320
2321<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>
2322<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
2323template instantiations.
2324
2325Given
2326  template&lt;typename T&gt; void A(T t) { T i; }
2327  A(0);
2328  A(0U);
2329functionDecl(isInstantiated())
2330  matches 'A(int) {...};' and 'A(unsigned) {...}'.
2331</pre></td></tr>
2332
2333
2334<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>
2335<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
2336
2337Given
2338  int j;
2339  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
2340  A(0);
2341  A(0U);
2342declStmt(isInTemplateInstantiation())
2343  matches 'int i;' and 'unsigned i'.
2344unless(stmt(isInTemplateInstantiation()))
2345  will NOT match j += 42; as it's shared between the template definition and
2346  instantiation.
2347</pre></td></tr>
2348
2349<!--END_NARROWING_MATCHERS -->
2350</table>
2351
2352<!-- ======================================================================= -->
2353<h2 id="traversal-matchers">AST Traversal Matchers</h2>
2354<!-- ======================================================================= -->
2355
2356<p>Traversal matchers specify the relationship to other nodes that are
2357reachable from the current node.</p>
2358
2359<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
2360forEachDescendant) which work on all nodes and allow users to write more generic
2361match expressions.</p>
2362
2363<table>
2364<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2365<!-- START_TRAVERSAL_MATCHERS -->
2366
2367<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>
2368<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
2369
2370Unlike anyOf, eachOf will generate a match result for each
2371matching submatcher.
2372
2373For example, in:
2374  class A { int a; int b; };
2375The matcher:
2376  recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
2377                    has(fieldDecl(hasName("b")).bind("v"))))
2378will generate two results binding "v", the first of which binds
2379the field declaration of a, the second the field declaration of
2380b.
2381
2382Usable as: Any Matcher
2383</pre></td></tr>
2384
2385
2386<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
2387<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2388provided matcher.
2389
2390Example matches X, A, B, C
2391    (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
2392  class X {};  Matches X, because X::X is a class of name X inside X.
2393  class A { class X {}; };
2394  class B { class C { class X {}; }; };
2395
2396DescendantT must be an AST base type.
2397
2398As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
2399each result that matches instead of only on the first one.
2400
2401Note: Recursively combined ForEachDescendant can cause many matches:
2402  recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
2403will match 10 times (plus injected class name matches) on:
2404  class A { class B { class C { class D { class E {}; }; }; }; };
2405
2406Usable as: Any Matcher
2407</pre></td></tr>
2408
2409
2410<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
2411<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
2412provided matcher.
2413
2414Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
2415  class X {};  Matches X, because X::X is a class of name X inside X.
2416  class Y { class X {}; };
2417  class Z { class Y { class X {}; }; };  Does not match Z.
2418
2419ChildT must be an AST base type.
2420
2421As opposed to 'has', 'forEach' will cause a match for each result that
2422matches instead of only on the first one.
2423
2424Usable as: Any Matcher
2425</pre></td></tr>
2426
2427
2428<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
2429<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
2430matcher.
2431
2432Given
2433void f() { if (true) { int x = 42; } }
2434void g() { for (;;) { int x = 43; } }
2435expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
2436
2437Usable as: Any Matcher
2438</pre></td></tr>
2439
2440
2441<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
2442<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2443provided matcher.
2444
2445Example matches X, Y, Z
2446    (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
2447  class X {};  Matches X, because X::X is a class of name X inside X.
2448  class Y { class X {}; };
2449  class Z { class Y { class X {}; }; };
2450
2451DescendantT must be an AST base type.
2452
2453Usable as: Any Matcher
2454</pre></td></tr>
2455
2456
2457<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
2458<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
2459provided matcher.
2460
2461Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
2462  class X {};  Matches X, because X::X is a class of name X inside X.
2463  class Y { class X {}; };
2464  class Z { class Y { class X {}; }; };  Does not match Z.
2465
2466ChildT must be an AST base type.
2467
2468Usable as: Any Matcher
2469</pre></td></tr>
2470
2471
2472<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
2473<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
2474matcher.
2475
2476Given
2477void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
2478compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
2479
2480Usable as: Any Matcher
2481</pre></td></tr>
2482
2483
2484<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>
2485<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
2486
2487Given
2488  int i[5];
2489  void f() { i[1] = 42; }
2490arraySubscriptExpression(hasBase(implicitCastExpr(
2491    hasSourceExpression(declRefExpr()))))
2492  matches i[1] with the declRefExpr() matching i
2493</pre></td></tr>
2494
2495
2496<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>
2497<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
2498
2499Given
2500  int i[5];
2501  void f() { i[1] = 42; }
2502arraySubscriptExpression(hasIndex(integerLiteral()))
2503  matches i[1] with the integerLiteral() matching 1
2504</pre></td></tr>
2505
2506
2507<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>
2508<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
2509type.
2510
2511Given
2512  struct A {};
2513  A a[7];
2514  int b[7];
2515arrayType(hasElementType(builtinType()))
2516  matches "int b[7]"
2517
2518Usable 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;
2519</pre></td></tr>
2520
2521
2522<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>
2523<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
2524type.
2525
2526Given
2527  struct A {};
2528  A a[7];
2529  int b[7];
2530arrayType(hasElementType(builtinType()))
2531  matches "int b[7]"
2532
2533Usable 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;
2534</pre></td></tr>
2535
2536
2537<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>
2538<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
2539
2540Given
2541  _Atomic(int) i;
2542  _Atomic(float) f;
2543atomicType(hasValueType(isInteger()))
2544 matches "_Atomic(int) i"
2545
2546Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2547</pre></td></tr>
2548
2549
2550<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>
2551<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
2552
2553Given
2554  _Atomic(int) i;
2555  _Atomic(float) f;
2556atomicType(hasValueType(isInteger()))
2557 matches "_Atomic(int) i"
2558
2559Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2560</pre></td></tr>
2561
2562
2563<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>
2564<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
2565
2566Note: There is no TypeLoc for the deduced type and thus no
2567getDeducedLoc() matcher.
2568
2569Given
2570  auto a = 1;
2571  auto b = 2.0;
2572autoType(hasDeducedType(isInteger()))
2573  matches "auto a"
2574
2575Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
2576</pre></td></tr>
2577
2578
2579<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>
2580<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
2581binary operator matches.
2582</pre></td></tr>
2583
2584
2585<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>
2586<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
2587
2588Example matches a (matcher = binaryOperator(hasLHS()))
2589  a || b
2590</pre></td></tr>
2591
2592
2593<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>
2594<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
2595
2596Example matches b (matcher = binaryOperator(hasRHS()))
2597  a || b
2598</pre></td></tr>
2599
2600
2601<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>
2602<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
2603pointee matches a given matcher.
2604
2605Given
2606  int *a;
2607  int const *b;
2608  float const *f;
2609pointerType(pointee(isConstQualified(), isInteger()))
2610  matches "int const *b"
2611
2612Usable 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;,
2613  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;
2614</pre></td></tr>
2615
2616
2617<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>
2618<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
2619pointee matches a given matcher.
2620
2621Given
2622  int *a;
2623  int const *b;
2624  float const *f;
2625pointerType(pointee(isConstQualified(), isInteger()))
2626  matches "int const *b"
2627
2628Usable 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;,
2629  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;
2630</pre></td></tr>
2631
2632
2633<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>
2634<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
2635expression.
2636
2637Given
2638  void x(int, int, int) { int y; x(1, y, 42); }
2639callExpr(hasAnyArgument(declRefExpr()))
2640  matches x(1, y, 42)
2641with hasAnyArgument(...)
2642  matching y
2643
2644FIXME: Currently this will ignore parentheses and implicit casts on
2645the argument before applying the inner matcher. We'll want to remove
2646this to allow for greater control by the user once ignoreImplicit()
2647has been implemented.
2648</pre></td></tr>
2649
2650
2651<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>
2652<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
2653call expression.
2654
2655Example matches y in x(y)
2656    (matcher = callExpr(hasArgument(0, declRefExpr())))
2657  void x(int) { int y; x(y); }
2658</pre></td></tr>
2659
2660
2661<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>
2662<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
2663matches the given matcher.
2664
2665The associated declaration is:
2666- for type nodes, the declaration of the underlying type
2667- for CallExpr, the declaration of the callee
2668- for MemberExpr, the declaration of the referenced member
2669- for CXXConstructExpr, the declaration of the constructor
2670
2671Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2672function. e.g. various subtypes of clang::Type and various expressions.
2673
2674Usable 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;,
2675  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;,
2676  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;,
2677  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;,
2678  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;,
2679  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;
2680</pre></td></tr>
2681
2682
2683<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>
2684<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
2685
2686Given
2687  class A { A() : i(42), j(42) {} int i; int j; };
2688constructorDecl(forEachConstructorInitializer(forField(decl().bind("x"))))
2689  will trigger two matches, binding for 'i' and 'j' respectively.
2690</pre></td></tr>
2691
2692
2693<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>
2694<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
2695
2696Given
2697  struct Foo {
2698    Foo() : foo_(1) { }
2699    int foo_;
2700  };
2701recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
2702  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
2703</pre></td></tr>
2704
2705
2706<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>
2707<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
2708
2709Given
2710  struct Foo {
2711    Foo() : foo_(1) { }
2712    int foo_;
2713  };
2714recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
2715    forField(hasName("foo_"))))))
2716  matches Foo
2717with forField matching foo_
2718</pre></td></tr>
2719
2720
2721<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>
2722<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
2723
2724Given
2725  struct Foo {
2726    Foo() : foo_(1) { }
2727    int foo_;
2728  };
2729recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
2730    withInitializer(integerLiteral(equals(1)))))))
2731  matches Foo
2732with withInitializer matching (1)
2733</pre></td></tr>
2734
2735
2736<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>
2737<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', or 'do while' statement that has
2738a given body.
2739
2740Given
2741  for (;;) {}
2742hasBody(compoundStmt())
2743  matches 'for (;;) {}'
2744with compoundStmt()
2745  matching '{}'
2746</pre></td></tr>
2747
2748
2749<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>
2750<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
2751
2752Example:
2753    forStmt(hasLoopVariable(anything()))
2754matches 'int x' in
2755    for (int x : a) { }
2756</pre></td></tr>
2757
2758
2759<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>
2760<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
2761
2762Example:
2763    forStmt(hasRangeInit(anything()))
2764matches 'a' in
2765    for (int x : a) { }
2766</pre></td></tr>
2767
2768
2769<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>
2770<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
2771
2772
2773<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>
2774<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
2775
2776Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
2777  class Y { public: void x(); };
2778  void z() { Y y; y.x(); }",
2779
2780FIXME: Overload to allow directly matching types?
2781</pre></td></tr>
2782
2783
2784<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>
2785<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
2786</pre></td></tr>
2787
2788
2789<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>
2790<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
2791matcher, or is a pointer to a type that matches the InnerMatcher.
2792</pre></td></tr>
2793
2794
2795<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>
2796<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
2797belongs to.
2798
2799FIXME: Generalize this for other kinds of declarations.
2800FIXME: What other kind of declarations would we need to generalize
2801this to?
2802
2803Example matches A() in the last line
2804    (matcher = constructExpr(hasDeclaration(methodDecl(
2805        ofClass(hasName("A"))))))
2806  class A {
2807   public:
2808    A();
2809  };
2810  A a = A();
2811</pre></td></tr>
2812
2813
2814<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>
2815<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
2816
2817Given:
2818  class A { void func(); };
2819  class B { void member(); };
2820
2821recordDecl(hasMethod(hasName("func"))) matches the declaration of A
2822but not B.
2823</pre></td></tr>
2824
2825
2826<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>
2827<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
2828a class matching Base.
2829
2830Note that a class is not considered to be derived from itself.
2831
2832Example matches Y, Z, C (Base == hasName("X"))
2833  class X;
2834  class Y : public X {};  directly derived
2835  class Z : public Y {};  indirectly derived
2836  typedef X A;
2837  typedef A B;
2838  class C : public B {};  derived from a typedef of X
2839
2840In the following example, Bar matches isDerivedFrom(hasName("X")):
2841  class Foo;
2842  typedef Foo X;
2843  class Bar : public Foo {};  derived from a type that X is a typedef of
2844</pre></td></tr>
2845
2846
2847<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>
2848<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
2849match Base.
2850</pre></td></tr>
2851
2852
2853<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>
2854<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
2855given matcher.
2856
2857Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
2858  class Y { public: void x(); };
2859  void z() { Y y; y.x(); }
2860</pre></td></tr>
2861
2862
2863<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>
2864<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
2865
2866Given
2867  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
2868  void f() { f(); }
2869callExpr(callee(expr()))
2870  matches this-&gt;x(), x(), y.x(), f()
2871with callee(...)
2872  matching this-&gt;x, x, y.x, f respectively
2873
2874Note: Callee cannot take the more general internal::Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
2875because this introduces ambiguous overloads with calls to Callee taking a
2876internal::Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
2877implemented in terms of implicit casts.
2878</pre></td></tr>
2879
2880
2881<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>
2882<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
2883expression.
2884
2885Given
2886  void x(int, int, int) { int y; x(1, y, 42); }
2887callExpr(hasAnyArgument(declRefExpr()))
2888  matches x(1, y, 42)
2889with hasAnyArgument(...)
2890  matching y
2891
2892FIXME: Currently this will ignore parentheses and implicit casts on
2893the argument before applying the inner matcher. We'll want to remove
2894this to allow for greater control by the user once ignoreImplicit()
2895has been implemented.
2896</pre></td></tr>
2897
2898
2899<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>
2900<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
2901call expression.
2902
2903Example matches y in x(y)
2904    (matcher = callExpr(hasArgument(0, declRefExpr())))
2905  void x(int) { int y; x(y); }
2906</pre></td></tr>
2907
2908
2909<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>
2910<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
2911matches the given matcher.
2912
2913The associated declaration is:
2914- for type nodes, the declaration of the underlying type
2915- for CallExpr, the declaration of the callee
2916- for MemberExpr, the declaration of the referenced member
2917- for CXXConstructExpr, the declaration of the constructor
2918
2919Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
2920function. e.g. various subtypes of clang::Type and various expressions.
2921
2922Usable 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;,
2923  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;,
2924  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;,
2925  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;,
2926  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;,
2927  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;
2928</pre></td></tr>
2929
2930
2931<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>
2932<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
2933extension, matches the constant given in the statement.
2934
2935Given
2936  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
2937caseStmt(hasCaseConstant(integerLiteral()))
2938  matches "case 1:"
2939</pre></td></tr>
2940
2941
2942<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>
2943<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher.
2944
2945Example: matches "a string" (matcher =
2946                                 hasSourceExpression(constructExpr()))
2947class URL { URL(string); };
2948URL url = "a string";
2949</pre></td></tr>
2950
2951
2952<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>
2953<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
2954TemplateArgument matching the given InnerMatcher.
2955
2956Given
2957  template&lt;typename T&gt; class A {};
2958  template&lt;&gt; class A&lt;double&gt; {};
2959  A&lt;int&gt; a;
2960classTemplateSpecializationDecl(hasAnyTemplateArgument(
2961    refersToType(asString("int"))))
2962  matches the specialization A&lt;int&gt;
2963</pre></td></tr>
2964
2965
2966<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>
2967<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
2968matches the given InnerMatcher.
2969
2970Given
2971  template&lt;typename T, typename U&gt; class A {};
2972  A&lt;bool, int&gt; b;
2973  A&lt;int, bool&gt; c;
2974classTemplateSpecializationDecl(hasTemplateArgument(
2975    1, refersToType(asString("int"))))
2976  matches the specialization A&lt;bool, int&gt;
2977</pre></td></tr>
2978
2979
2980<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>
2981<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
2982type.
2983
2984Given
2985  struct A {};
2986  A a[7];
2987  int b[7];
2988arrayType(hasElementType(builtinType()))
2989  matches "int b[7]"
2990
2991Usable 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;
2992</pre></td></tr>
2993
2994
2995<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>
2996<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
2997type.
2998
2999Given
3000  struct A {};
3001  A a[7];
3002  int b[7];
3003arrayType(hasElementType(builtinType()))
3004  matches "int b[7]"
3005
3006Usable 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;
3007</pre></td></tr>
3008
3009
3010<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>
3011<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
3012a given matcher.
3013
3014Given
3015  { {}; 1+2; }
3016hasAnySubstatement(compoundStmt())
3017  matches '{ {}; 1+2; }'
3018with compoundStmt()
3019  matching '{}'
3020</pre></td></tr>
3021
3022
3023<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>
3024<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
3025or conditional operator.
3026
3027Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3028  if (true) {}
3029</pre></td></tr>
3030
3031
3032<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>
3033<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator.
3034
3035Example matches b
3036  condition ? a : b
3037</pre></td></tr>
3038
3039
3040<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>
3041<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
3042
3043Example matches a
3044  condition ? a : b
3045</pre></td></tr>
3046
3047
3048<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>
3049<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
3050matches the given matcher.
3051
3052The associated declaration is:
3053- for type nodes, the declaration of the underlying type
3054- for CallExpr, the declaration of the callee
3055- for MemberExpr, the declaration of the referenced member
3056- for CXXConstructExpr, the declaration of the constructor
3057
3058Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3059function. e.g. various subtypes of clang::Type and various expressions.
3060
3061Usable 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;,
3062  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;,
3063  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;,
3064  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;,
3065  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;,
3066  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;
3067</pre></td></tr>
3068
3069
3070<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>
3071<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
3072specific using shadow declaration.
3073
3074FIXME: This currently only works for functions. Fix.
3075
3076Given
3077  namespace a { void f() {} }
3078  using a::f;
3079  void g() {
3080    f();     Matches this ..
3081    a::f();  .. but not this.
3082  }
3083declRefExpr(throughUsingDeclaration(anything()))
3084  matches f()
3085</pre></td></tr>
3086
3087
3088<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>
3089<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
3090specified matcher.
3091
3092Example matches x in if(x)
3093    (matcher = declRefExpr(to(varDecl(hasName("x")))))
3094  bool x;
3095  if (x) {}
3096</pre></td></tr>
3097
3098
3099<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>
3100<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
3101
3102Note that this does not work for global declarations because the AST
3103breaks up multiple-declaration DeclStmt's into multiple single-declaration
3104DeclStmt's.
3105Example: Given non-global declarations
3106  int a, b = 0;
3107  int c;
3108  int d = 2, e;
3109declStmt(containsDeclaration(
3110      0, varDecl(hasInitializer(anything()))))
3111  matches only 'int d = 2, e;', and
3112declStmt(containsDeclaration(1, varDecl()))
3113  matches 'int a, b = 0' as well as 'int d = 2, e;'
3114  but 'int c;' is not matched.
3115</pre></td></tr>
3116
3117
3118<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>
3119<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
3120
3121Given
3122  int a, b;
3123  int c;
3124declStmt(hasSingleDecl(anything()))
3125  matches 'int c;' but not 'int a, b;'.
3126</pre></td></tr>
3127
3128
3129<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>
3130<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
3131the inner matcher.
3132
3133Given
3134  int x;
3135declaratorDecl(hasTypeLoc(loc(asString("int"))))
3136  matches int x
3137</pre></td></tr>
3138
3139
3140<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>
3141<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
3142Decl, matches InnerMatcher.
3143
3144Given
3145  namespace N {
3146    namespace M {
3147      class D {};
3148    }
3149  }
3150
3151recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
3152declaration of class D.
3153</pre></td></tr>
3154
3155
3156<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>
3157<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has
3158a given body.
3159
3160Given
3161  for (;;) {}
3162hasBody(compoundStmt())
3163  matches 'for (;;) {}'
3164with compoundStmt()
3165  matching '{}'
3166</pre></td></tr>
3167
3168
3169<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>
3170<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
3171or conditional operator.
3172
3173Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3174  if (true) {}
3175</pre></td></tr>
3176
3177
3178<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>
3179<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
3180matches InnerMatcher if the qualifier exists.
3181
3182Given
3183  namespace N {
3184    namespace M {
3185      class D {};
3186    }
3187  }
3188  N::M::D d;
3189
3190elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
3191matches the type of the variable declaration of d.
3192</pre></td></tr>
3193
3194
3195<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>
3196<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
3197
3198Given
3199  namespace N {
3200    namespace M {
3201      class D {};
3202    }
3203  }
3204  N::M::D d;
3205
3206elaboratedType(namesType(recordType(
3207hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
3208declaration of d.
3209</pre></td></tr>
3210
3211
3212<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>
3213<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
3214matches the given matcher.
3215
3216The associated declaration is:
3217- for type nodes, the declaration of the underlying type
3218- for CallExpr, the declaration of the callee
3219- for MemberExpr, the declaration of the referenced member
3220- for CXXConstructExpr, the declaration of the constructor
3221
3222Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3223function. e.g. various subtypes of clang::Type and various expressions.
3224
3225Usable 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;,
3226  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;,
3227  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;,
3228  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;,
3229  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;,
3230  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;
3231</pre></td></tr>
3232
3233
3234<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>
3235<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
3236
3237(Note: Clang's AST refers to other conversions as "casts" too, and calls
3238actual casts "explicit" casts.)
3239</pre></td></tr>
3240
3241
3242<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>
3243<tr><td colspan="4" class="doc" id="hasType2"><pre>Overloaded to match the declaration of the expression's or value
3244declaration's type.
3245
3246In case of a value declaration (for example a variable declaration),
3247this resolves one layer of indirection. For example, in the value
3248declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
3249while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
3250of x."
3251
3252Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3253            and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
3254 class X {};
3255 void y(X &amp;x) { x; X z; }
3256
3257Usable 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;
3258</pre></td></tr>
3259
3260
3261<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>
3262<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
3263matcher.
3264
3265Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3266            and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
3267 class X {};
3268 void y(X &amp;x) { x; X z; }
3269</pre></td></tr>
3270
3271
3272<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>
3273<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
3274are stripped off.
3275
3276Parentheses and explicit casts are not discarded.
3277Given
3278  int arr[5];
3279  int a = 0;
3280  char b = 0;
3281  const int c = a;
3282  int *d = arr;
3283  long e = (long) 0l;
3284The matchers
3285   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
3286   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
3287would match the declarations for a, b, c, and d, but not e.
3288While
3289   varDecl(hasInitializer(integerLiteral()))
3290   varDecl(hasInitializer(declRefExpr()))
3291only match the declarations for b, c, and d.
3292</pre></td></tr>
3293
3294
3295<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>
3296<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
3297casts are stripped off.
3298
3299Implicit and non-C Style casts are also discarded.
3300Given
3301  int a = 0;
3302  char b = (0);
3303  void* c = reinterpret_cast&lt;char*&gt;(0);
3304  char d = char(0);
3305The matcher
3306   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
3307would match the declarations for a, b, c, and d.
3308while
3309   varDecl(hasInitializer(integerLiteral()))
3310only match the declaration for a.
3311</pre></td></tr>
3312
3313
3314<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>
3315<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
3316parentheses are stripped off.
3317
3318Explicit casts are not discarded.
3319Given
3320  int arr[5];
3321  int a = 0;
3322  char b = (0);
3323  const int c = a;
3324  int *d = (arr);
3325  long e = ((long) 0l);
3326The matchers
3327   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
3328   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
3329would match the declarations for a, b, c, and d, but not e.
3330while
3331   varDecl(hasInitializer(integerLiteral()))
3332   varDecl(hasInitializer(declRefExpr()))
3333would only match the declaration for a.
3334</pre></td></tr>
3335
3336
3337<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>
3338<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has
3339a given body.
3340
3341Given
3342  for (;;) {}
3343hasBody(compoundStmt())
3344  matches 'for (;;) {}'
3345with compoundStmt()
3346  matching '{}'
3347</pre></td></tr>
3348
3349
3350<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>
3351<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
3352or conditional operator.
3353
3354Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3355  if (true) {}
3356</pre></td></tr>
3357
3358
3359<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>
3360<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
3361
3362Example:
3363    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
3364matches '++x' in
3365    for (x; x &lt; N; ++x) { }
3366</pre></td></tr>
3367
3368
3369<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>
3370<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
3371
3372Example:
3373    forStmt(hasLoopInit(declStmt()))
3374matches 'int x = 0' in
3375    for (int x = 0; x &lt; N; ++x) { }
3376</pre></td></tr>
3377
3378
3379<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>
3380<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
3381
3382Does not match the 'this' parameter of a method.
3383
3384Given
3385  class X { void f(int x, int y, int z) {} };
3386methodDecl(hasAnyParameter(hasName("y")))
3387  matches f(int x, int y, int z) {}
3388with hasAnyParameter(...)
3389  matching int y
3390</pre></td></tr>
3391
3392
3393<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>
3394<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
3395
3396Given
3397  class X { void f(int x) {} };
3398methodDecl(hasParameter(0, hasType(varDecl())))
3399  matches f(int x) {}
3400with hasParameter(...)
3401  matching int x
3402</pre></td></tr>
3403
3404
3405<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>
3406<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
3407
3408Given:
3409  class X { int f() { return 1; } };
3410methodDecl(returns(asString("int")))
3411  matches int f() { return 1; }
3412</pre></td></tr>
3413
3414
3415<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>
3416<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
3417or conditional operator.
3418
3419Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3420  if (true) {}
3421</pre></td></tr>
3422
3423
3424<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>
3425<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
3426
3427Given
3428  if (A* a = GetAPointer()) {}
3429hasConditionVariableStatement(...)
3430  matches 'A* a = GetAPointer()'.
3431</pre></td></tr>
3432
3433
3434<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>
3435<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
3436
3437Examples matches the if statement
3438  (matcher = ifStmt(hasElse(boolLiteral(equals(true)))))
3439  if (false) false; else true;
3440</pre></td></tr>
3441
3442
3443<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>
3444<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
3445
3446Examples matches the if statement
3447  (matcher = ifStmt(hasThen(boolLiteral(equals(true)))))
3448  if (false) true; else false;
3449</pre></td></tr>
3450
3451
3452<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>
3453<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
3454matcher.
3455
3456FIXME: Unit test this matcher
3457</pre></td></tr>
3458
3459
3460<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>
3461<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
3462matches the given matcher.
3463
3464The associated declaration is:
3465- for type nodes, the declaration of the underlying type
3466- for CallExpr, the declaration of the callee
3467- for MemberExpr, the declaration of the referenced member
3468- for CXXConstructExpr, the declaration of the constructor
3469
3470Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3471function. e.g. various subtypes of clang::Type and various expressions.
3472
3473Usable 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;,
3474  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;,
3475  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;,
3476  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;,
3477  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;,
3478  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;
3479</pre></td></tr>
3480
3481
3482<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>
3483<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
3484matches the given matcher.
3485
3486The associated declaration is:
3487- for type nodes, the declaration of the underlying type
3488- for CallExpr, the declaration of the callee
3489- for MemberExpr, the declaration of the referenced member
3490- for CXXConstructExpr, the declaration of the constructor
3491
3492Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3493function. e.g. various subtypes of clang::Type and various expressions.
3494
3495Usable 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;,
3496  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;,
3497  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;,
3498  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;,
3499  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;,
3500  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;
3501</pre></td></tr>
3502
3503
3504<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>
3505<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
3506matches the given matcher.
3507
3508The associated declaration is:
3509- for type nodes, the declaration of the underlying type
3510- for CallExpr, the declaration of the callee
3511- for MemberExpr, the declaration of the referenced member
3512- for CXXConstructExpr, the declaration of the constructor
3513
3514Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3515function. e.g. various subtypes of clang::Type and various expressions.
3516
3517Usable 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;,
3518  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;,
3519  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;,
3520  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;,
3521  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;,
3522  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;
3523</pre></td></tr>
3524
3525
3526<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>
3527<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
3528matched by a given matcher.
3529
3530Given
3531  struct X { int m; };
3532  void f(X x) { x.m; m; }
3533memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
3534  matches "x.m" and "m"
3535with hasObjectExpression(...)
3536  matching "x" and the implicit object expression of "m" which has type X*.
3537</pre></td></tr>
3538
3539
3540<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>
3541<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
3542given matcher.
3543
3544Given
3545  struct { int first, second; } first, second;
3546  int i(second.first);
3547  int j(first.second);
3548memberExpr(member(hasName("first")))
3549  matches second.first
3550  but not first.second (because the member name there is "second").
3551</pre></td></tr>
3552
3553
3554<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>
3555<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
3556pointee matches a given matcher.
3557
3558Given
3559  int *a;
3560  int const *b;
3561  float const *f;
3562pointerType(pointee(isConstQualified(), isInteger()))
3563  matches "int const *b"
3564
3565Usable 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;,
3566  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;
3567</pre></td></tr>
3568
3569
3570<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>
3571<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
3572pointee matches a given matcher.
3573
3574Given
3575  int *a;
3576  int const *b;
3577  float const *f;
3578pointerType(pointee(isConstQualified(), isInteger()))
3579  matches "int const *b"
3580
3581Usable 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;,
3582  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;
3583</pre></td></tr>
3584
3585
3586<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>
3587<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
3588
3589Given
3590  struct A { struct B { struct C {}; }; };
3591  A::B::C c;
3592nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
3593  matches "A::"
3594</pre></td></tr>
3595
3596
3597<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>
3598<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
3599given TypeLoc.
3600
3601Given
3602  struct A { struct B { struct C {}; }; };
3603  A::B::C c;
3604nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
3605  hasDeclaration(recordDecl(hasName("A")))))))
3606  matches "A::"
3607</pre></td></tr>
3608
3609
3610<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>
3611<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
3612
3613Given
3614  struct A { struct B { struct C {}; }; };
3615  A::B::C c;
3616nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
3617  matches "A::"
3618</pre></td></tr>
3619
3620
3621<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>
3622<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
3623given namespace matcher.
3624
3625Given
3626  namespace ns { struct A {}; }
3627  ns::A a;
3628nestedNameSpecifier(specifiesNamespace(hasName("ns")))
3629  matches "ns::"
3630</pre></td></tr>
3631
3632
3633<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>
3634<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
3635given QualType matcher without qualifiers.
3636
3637Given
3638  struct A { struct B { struct C {}; }; };
3639  A::B::C c;
3640nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
3641  matches "A::"
3642</pre></td></tr>
3643
3644
3645<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>
3646<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
3647
3648Given
3649  int (*ptr_to_array)[4];
3650  int (*ptr_to_func)(int);
3651
3652varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
3653ptr_to_func but not ptr_to_array.
3654
3655Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
3656</pre></td></tr>
3657
3658
3659<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>
3660<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
3661pointee matches a given matcher.
3662
3663Given
3664  int *a;
3665  int const *b;
3666  float const *f;
3667pointerType(pointee(isConstQualified(), isInteger()))
3668  matches "int const *b"
3669
3670Usable 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;,
3671  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;
3672</pre></td></tr>
3673
3674
3675<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>
3676<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
3677pointee matches a given matcher.
3678
3679Given
3680  int *a;
3681  int const *b;
3682  float const *f;
3683pointerType(pointee(isConstQualified(), isInteger()))
3684  matches "int const *b"
3685
3686Usable 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;,
3687  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;
3688</pre></td></tr>
3689
3690
3691<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>
3692<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
3693
3694Given:
3695  typedef int &amp;int_ref;
3696  int a;
3697  int_ref b = a;
3698
3699varDecl(hasType(qualType(referenceType()))))) will not match the
3700declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
3701</pre></td></tr>
3702
3703
3704<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>
3705<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
3706matches the given matcher.
3707
3708The associated declaration is:
3709- for type nodes, the declaration of the underlying type
3710- for CallExpr, the declaration of the callee
3711- for MemberExpr, the declaration of the referenced member
3712- for CXXConstructExpr, the declaration of the constructor
3713
3714Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3715function. e.g. various subtypes of clang::Type and various expressions.
3716
3717Usable 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;,
3718  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;,
3719  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;,
3720  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;,
3721  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;,
3722  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;
3723</pre></td></tr>
3724
3725
3726<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>
3727<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
3728</pre></td></tr>
3729
3730
3731<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>
3732<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
3733matches the specified matcher.
3734
3735Example matches y-&gt;x()
3736    (matcher = callExpr(on(hasType(pointsTo(recordDecl(hasName("Y")))))))
3737  class Y { public: void x(); };
3738  void z() { Y *y; y-&gt;x(); }
3739</pre></td></tr>
3740
3741
3742<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>
3743<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
3744</pre></td></tr>
3745
3746
3747<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>
3748<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
3749type matches the specified matcher.
3750
3751Example matches X &amp;x and const X &amp;y
3752    (matcher = varDecl(hasType(references(recordDecl(hasName("X"))))))
3753  class X {
3754    void a(X b) {
3755      X &amp;x = b;
3756      const X &amp;y = b;
3757    }
3758  };
3759</pre></td></tr>
3760
3761
3762<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>
3763<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
3764matches the given matcher.
3765
3766The associated declaration is:
3767- for type nodes, the declaration of the underlying type
3768- for CallExpr, the declaration of the callee
3769- for MemberExpr, the declaration of the referenced member
3770- for CXXConstructExpr, the declaration of the constructor
3771
3772Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3773function. e.g. various subtypes of clang::Type and various expressions.
3774
3775Usable 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;,
3776  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;,
3777  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;,
3778  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;,
3779  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;,
3780  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;
3781</pre></td></tr>
3782
3783
3784<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>
3785<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
3786pointee matches a given matcher.
3787
3788Given
3789  int *a;
3790  int const *b;
3791  float const *f;
3792pointerType(pointee(isConstQualified(), isInteger()))
3793  matches "int const *b"
3794
3795Usable 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;,
3796  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;
3797</pre></td></tr>
3798
3799
3800<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>
3801<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
3802pointee matches a given matcher.
3803
3804Given
3805  int *a;
3806  int const *b;
3807  float const *f;
3808pointerType(pointee(isConstQualified(), isInteger()))
3809  matches "int const *b"
3810
3811Usable 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;,
3812  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;
3813</pre></td></tr>
3814
3815
3816<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>
3817<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3818alignof.
3819</pre></td></tr>
3820
3821
3822<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>
3823<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
3824sizeof.
3825</pre></td></tr>
3826
3827
3828<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>
3829<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
3830statement. This matcher may produce multiple matches.
3831
3832Given
3833  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
3834switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
3835  matches four times, with "c" binding each of "case 1:", "case 2:",
3836"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
3837"switch (1)", "switch (2)" and "switch (2)".
3838</pre></td></tr>
3839
3840
3841<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>
3842<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
3843matches the given matcher.
3844
3845The associated declaration is:
3846- for type nodes, the declaration of the underlying type
3847- for CallExpr, the declaration of the callee
3848- for MemberExpr, the declaration of the referenced member
3849- for CXXConstructExpr, the declaration of the constructor
3850
3851Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3852function. e.g. various subtypes of clang::Type and various expressions.
3853
3854Usable 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;,
3855  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;,
3856  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;,
3857  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;,
3858  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;,
3859  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;
3860</pre></td></tr>
3861
3862
3863<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>
3864<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
3865
3866Given
3867  template&lt;typename T&gt; struct A {};
3868  struct B { B* next; };
3869  A&lt;&amp;B::next&gt; a;
3870templateSpecializationType(hasAnyTemplateArgument(
3871  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
3872  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
3873    B::next
3874</pre></td></tr>
3875
3876
3877<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>
3878<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
3879declaration.
3880
3881Given
3882  template&lt;typename T&gt; struct A {};
3883  struct B { B* next; };
3884  A&lt;&amp;B::next&gt; a;
3885classTemplateSpecializationDecl(hasAnyTemplateArgument(
3886    refersToDeclaration(fieldDecl(hasName("next"))))
3887  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
3888    B::next
3889</pre></td></tr>
3890
3891
3892<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>
3893<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
3894
3895Given
3896  template&lt;int T&gt; struct A {};
3897  C&lt;42&gt; c;
3898classTemplateSpecializationDecl(
3899  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
3900  matches the implicit instantiation of C in C&lt;42&gt;.
3901</pre></td></tr>
3902
3903
3904<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>
3905<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
3906
3907Given
3908  struct X {};
3909  template&lt;typename T&gt; struct A {};
3910  A&lt;X&gt; a;
3911classTemplateSpecializationDecl(hasAnyTemplateArgument(
3912    refersToType(class(hasName("X")))))
3913  matches the specialization A&lt;X&gt;
3914</pre></td></tr>
3915
3916
3917<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>
3918<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations that have at least one
3919TemplateArgument matching the given InnerMatcher.
3920
3921Given
3922  template&lt;typename T&gt; class A {};
3923  template&lt;&gt; class A&lt;double&gt; {};
3924  A&lt;int&gt; a;
3925classTemplateSpecializationDecl(hasAnyTemplateArgument(
3926    refersToType(asString("int"))))
3927  matches the specialization A&lt;int&gt;
3928</pre></td></tr>
3929
3930
3931<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>
3932<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
3933matches the given matcher.
3934
3935The associated declaration is:
3936- for type nodes, the declaration of the underlying type
3937- for CallExpr, the declaration of the callee
3938- for MemberExpr, the declaration of the referenced member
3939- for CXXConstructExpr, the declaration of the constructor
3940
3941Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3942function. e.g. various subtypes of clang::Type and various expressions.
3943
3944Usable 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;,
3945  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;,
3946  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;,
3947  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;,
3948  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;,
3949  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;
3950</pre></td></tr>
3951
3952
3953<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>
3954<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
3955matches the given InnerMatcher.
3956
3957Given
3958  template&lt;typename T, typename U&gt; class A {};
3959  A&lt;bool, int&gt; b;
3960  A&lt;int, bool&gt; c;
3961classTemplateSpecializationDecl(hasTemplateArgument(
3962    1, refersToType(asString("int"))))
3963  matches the specialization A&lt;bool, int&gt;
3964</pre></td></tr>
3965
3966
3967<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>
3968<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
3969matches the given matcher.
3970
3971The associated declaration is:
3972- for type nodes, the declaration of the underlying type
3973- for CallExpr, the declaration of the callee
3974- for MemberExpr, the declaration of the referenced member
3975- for CXXConstructExpr, the declaration of the constructor
3976
3977Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3978function. e.g. various subtypes of clang::Type and various expressions.
3979
3980Usable 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;,
3981  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;,
3982  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;,
3983  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;,
3984  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;,
3985  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;
3986</pre></td></tr>
3987
3988
3989<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>
3990<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
3991
3992Generates results for each match.
3993
3994For example, in:
3995  class A { class B {}; class C {}; };
3996The matcher:
3997  recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
3998will generate results for A, B and C.
3999
4000Usable as: Any Matcher
4001</pre></td></tr>
4002
4003
4004<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>
4005<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
4006matches the given matcher.
4007
4008The associated declaration is:
4009- for type nodes, the declaration of the underlying type
4010- for CallExpr, the declaration of the callee
4011- for MemberExpr, the declaration of the referenced member
4012- for CXXConstructExpr, the declaration of the constructor
4013
4014Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4015function. e.g. various subtypes of clang::Type and various expressions.
4016
4017Usable 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;,
4018  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;,
4019  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;,
4020  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;,
4021  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;,
4022  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;
4023</pre></td></tr>
4024
4025
4026<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>
4027<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
4028
4029Given
4030  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
4031unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
4032  matches sizeof(a) and alignof(c)
4033</pre></td></tr>
4034
4035
4036<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>
4037<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
4038
4039Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
4040  !true
4041</pre></td></tr>
4042
4043
4044<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>
4045<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
4046matches the given matcher.
4047
4048The associated declaration is:
4049- for type nodes, the declaration of the underlying type
4050- for CallExpr, the declaration of the callee
4051- for MemberExpr, the declaration of the referenced member
4052- for CXXConstructExpr, the declaration of the constructor
4053
4054Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4055function. e.g. various subtypes of clang::Type and various expressions.
4056
4057Usable 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;,
4058  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;,
4059  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;,
4060  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;,
4061  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;,
4062  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;
4063</pre></td></tr>
4064
4065
4066<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>
4067<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
4068
4069Given
4070  namespace X { void b(); }
4071  using X::b;
4072usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
4073  matches using X::b </pre></td></tr>
4074
4075
4076<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>
4077<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
4078matched by the given matcher.
4079
4080Given
4081  namespace X { int a; void b(); }
4082  using X::a;
4083  using X::b;
4084usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
4085  matches using X::b but not using X::a </pre></td></tr>
4086
4087
4088<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>
4089<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
4090declaration's type.
4091
4092In case of a value declaration (for example a variable declaration),
4093this resolves one layer of indirection. For example, in the value
4094declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
4095while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
4096of x."
4097
4098Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
4099            and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
4100 class X {};
4101 void y(X &amp;x) { x; X z; }
4102
4103Usable 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;
4104</pre></td></tr>
4105
4106
4107<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>
4108<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
4109matcher.
4110
4111Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
4112            and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
4113 class X {};
4114 void y(X &amp;x) { x; X z; }
4115</pre></td></tr>
4116
4117
4118<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>
4119<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
4120that matches the given matcher.
4121
4122Example matches x (matcher = varDecl(hasInitializer(callExpr())))
4123  bool y() { return true; }
4124  bool x = y();
4125</pre></td></tr>
4126
4127
4128<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>
4129<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
4130expression.
4131
4132Given
4133  void f(int b) {
4134    int a[b];
4135  }
4136variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
4137  varDecl(hasName("b")))))))
4138  matches "int a[b]"
4139</pre></td></tr>
4140
4141
4142<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>
4143<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has
4144a given body.
4145
4146Given
4147  for (;;) {}
4148hasBody(compoundStmt())
4149  matches 'for (;;) {}'
4150with compoundStmt()
4151  matching '{}'
4152</pre></td></tr>
4153
4154
4155<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>
4156<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
4157or conditional operator.
4158
4159Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
4160  if (true) {}
4161</pre></td></tr>
4162
4163
4164<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>
4165<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
4166NestedNameSpecifier-matcher matches.
4167</pre></td></tr>
4168
4169
4170<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>
4171<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
4172QualType-matcher matches.
4173</pre></td></tr>
4174
4175<!--END_TRAVERSAL_MATCHERS -->
4176</table>
4177
4178</div>
4179</body>
4180</html>
4181
4182
4183