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