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