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