1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2          "http://www.w3.org/TR/html4/strict.dtd">
3<html>
4<head>
5<title>AST Matcher Reference</title>
6<link type="text/css" rel="stylesheet" href="../menu.css" />
7<link type="text/css" rel="stylesheet" href="../content.css" />
8<style type="text/css">
9td {
10  padding: .33em;
11}
12td.doc {
13  display: none;
14  border-bottom: 1px solid black;
15}
16td.name:hover {
17  color: blue;
18  cursor: pointer;
19}
20</style>
21<script type="text/javascript">
22function toggle(id) {
23  if (!id) return;
24  row = document.getElementById(id);
25  if (row.style.display != 'table-cell')
26    row.style.display = 'table-cell';
27  else
28    row.style.display = 'none';
29}
30</script>
31</head>
32<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
33
34<!--#include virtual="../menu.html.incl"-->
35
36<div id="content">
37
38<h1>AST Matcher Reference</h1>
39
40<p>This document shows all currently implemented matchers. The matchers are grouped
41by category and node type they match. You can click on matcher names to show the
42matcher's source documentation.</p>
43
44<p>There are three different basic categories of matchers:
45<ul>
46<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
47<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
48<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
49</ul>
50</p>
51
52<p>Within each category the matchers are ordered by node type they match on.
53Note that if a matcher can match multiple node types, it will it will appear
54multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
55find all matchers that can be used to match on Stmt nodes.</p>
56
57<p>The exception to that rule are matchers that can match on any node. Those
58are marked with a * and are listed in the beginning of each category.</p>
59
60<p>Note that the categorization of matchers is a great help when you combine
61them into matcher expressions. You will usually want to form matcher expressions
62that read like english sentences by alternating between node matchers and
63narrowing or traversal matchers, like this:
64<pre>
65recordDecl(hasDescendant(
66    ifStmt(hasTrueExpression(
67        expr(hasDescendant(
68            ifStmt()))))))
69</pre>
70</p>
71
72<!-- ======================================================================= -->
73<h2 id="decl-matchers">Node Matchers</h2>
74<!-- ======================================================================= -->
75
76<p>Node matchers are at the core of matcher expressions - they specify the type
77of node that is expected. Every match expression starts with a node matcher,
78which can then be further refined with a narrowing or traversal matcher. All
79traversal matchers take node matchers as their arguments.</p>
80
81<p>For convenience, all node matchers take an arbitrary number of arguments
82and implicitly act as allOf matchers.</p>
83
84<p>Node matchers are the only matchers that support the bind("id") call to
85bind the matched node to the given string, to be later retrieved from the
86match callback.</p>
87
88<p>It is important to remember that the arguments to node matchers are
89predicates on the same node, just with additional information about the type.
90This is often useful to make matcher expression more readable by inlining bind
91calls into redundant node matchers inside another node matcher:
92<pre>
93// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
94// the same node.
95recordDecl(decl().bind("id"), hasName("::MyClass"))
96</pre>
97</p>
98
99<table>
100<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
101<!-- START_DECL_MATCHERS -->
102
103<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;...</td></tr>
104<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
105
106Examples matches i(42).
107  class C {
108    C() : i(42) {}
109    int i;
110  };
111</pre></td></tr>
112
113
114<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>&gt;...</td></tr>
115<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
116
117Given
118  class C {
119  public:
120    int a;
121  };
122accessSpecDecl()
123  matches 'public:'
124</pre></td></tr>
125
126
127<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
128<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
129
130Example matches Z
131  template&lt;class T&gt; class Z {};
132</pre></td></tr>
133
134
135<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
136<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
137
138Given
139  template&lt;typename T&gt; class A {};
140  template&lt;&gt; class A&lt;double&gt; {};
141  A&lt;int&gt; a;
142classTemplateSpecializationDecl()
143  matches the specializations A&lt;int&gt; and A&lt;double&gt;
144</pre></td></tr>
145
146
147<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
148<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
149
150Example matches Foo::Foo() and Foo::Foo(int)
151  class Foo {
152   public:
153    Foo();
154    Foo(int);
155    int DoSomething();
156  };
157</pre></td></tr>
158
159
160<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;...</td></tr>
161<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
162
163Example matches the operator.
164  class X { operator int() const; };
165</pre></td></tr>
166
167
168<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
169<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
170
171Example matches Foo::~Foo()
172  class Foo {
173   public:
174    virtual ~Foo();
175  };
176</pre></td></tr>
177
178
179<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
180<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
181
182Example matches y
183  class X { void y(); };
184</pre></td></tr>
185
186
187<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
188<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
189
190Example matches X, Z
191  class X;
192  template&lt;class T&gt; class Z {};
193</pre></td></tr>
194
195
196<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
197<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
198
199Examples matches X, C, and the friend declaration inside C;
200  void X();
201  class C {
202    friend X;
203  };
204</pre></td></tr>
205
206
207<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;...</td></tr>
208<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
209and non-type template parameter declarations).
210
211Given
212  class X { int y; };
213declaratorDecl()
214  matches int y.
215</pre></td></tr>
216
217
218<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
219<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
220
221Example matches A, B, C
222  enum X {
223    A, B, C
224  };
225</pre></td></tr>
226
227
228<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
229<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
230
231Example matches X
232  enum X {
233    A, B, C
234  };
235</pre></td></tr>
236
237
238<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
239<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
240
241Given
242  class X { int m; };
243fieldDecl()
244  matches 'm'.
245</pre></td></tr>
246
247
248<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;...</td></tr>
249<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
250
251Given
252  class X { friend void foo(); };
253friendDecl()
254  matches 'friend void foo()'.
255</pre></td></tr>
256
257
258<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
259<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
260
261Example matches f
262  void f();
263</pre></td></tr>
264
265
266<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
267<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
268
269Example matches f
270  template&lt;class T&gt; void f(T t) {}
271</pre></td></tr>
272
273
274<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>&gt;...</td></tr>
275<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
276
277Given
278  goto FOO;
279  FOO: bar();
280labelDecl()
281  matches 'FOO:'
282</pre></td></tr>
283
284
285<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>
286<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
287
288Given
289  extern "C" {}
290linkageSpecDecl()
291  matches "extern "C" {}"
292</pre></td></tr>
293
294
295<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>
296<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
297
298Example matches X, S, the anonymous union type, i, and U;
299  typedef int X;
300  struct S {
301    union {
302      int i;
303    } U;
304  };
305</pre></td></tr>
306
307
308<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>&gt;...</td></tr>
309<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
310
311Given
312  namespace test {}
313  namespace alias = ::test;
314namespaceAliasDecl()
315  matches "namespace alias" but not "namespace test"
316</pre></td></tr>
317
318
319<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
320<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
321
322Given
323  namespace {}
324  namespace test {}
325namespaceDecl()
326  matches "namespace {}" and "namespace test {}"
327</pre></td></tr>
328
329
330<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>&gt;...</td></tr>
331<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
332
333Given
334  template &lt;typename T, int N&gt; struct C {};
335nonTypeTemplateParmDecl()
336  matches 'N', but not 'T'.
337</pre></td></tr>
338
339
340<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>&gt;...</td></tr>
341<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
342
343Example matches Foo (Additions)
344  @interface Foo (Additions)
345  @end
346</pre></td></tr>
347
348
349<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>&gt;...</td></tr>
350<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
351
352Example matches Foo (Additions)
353  @implementation Foo (Additions)
354  @end
355</pre></td></tr>
356
357
358<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>&gt;...</td></tr>
359<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
360
361Example matches Foo
362  @implementation Foo
363  @end
364</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('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;...</td></tr>
368<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
369
370Example matches Foo
371  @interface Foo
372  @end
373</pre></td></tr>
374
375
376<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>&gt;...</td></tr>
377<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
378
379Example matches _enabled
380  @implementation Foo {
381    BOOL _enabled;
382  }
383  @end
384</pre></td></tr>
385
386
387<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;...</td></tr>
388<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
389
390Example matches both declaration and definition of -[Foo method]
391  @interface Foo
392  - (void)method;
393  @end
394
395  @implementation Foo
396  - (void)method {}
397  @end
398</pre></td></tr>
399
400
401<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;...</td></tr>
402<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
403
404Example matches enabled
405  @interface Foo
406  @property BOOL enabled;
407  @end
408</pre></td></tr>
409
410
411<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>&gt;...</td></tr>
412<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
413
414Example matches FooDelegate
415  @protocol FooDelegate
416  @end
417</pre></td></tr>
418
419
420<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>
421<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
422
423Given
424  void f(int x);
425parmVarDecl()
426  matches int x.
427</pre></td></tr>
428
429
430<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;...</td></tr>
431<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
432
433Example matches X, Z, U, and S
434  class X;
435  template&lt;class T&gt; class Z {};
436  struct S {};
437  union U {};
438</pre></td></tr>
439
440
441<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>&gt;...</td></tr>
442<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
443
444Example:
445  staticAssertExpr()
446matches
447  static_assert(sizeof(S) == sizeof(int))
448in
449  struct S {
450    int x;
451  };
452  static_assert(sizeof(S) == sizeof(int));
453</pre></td></tr>
454
455
456<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>&gt;...</td></tr>
457<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
458
459Given
460  template &lt;typename T, int N&gt; struct C {};
461templateTypeParmDecl()
462  matches 'T', but not 'N'.
463</pre></td></tr>
464
465
466<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>
467<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
468
469Given
470  int X;
471  namespace NS {
472  int Y;
473  }  namespace NS
474decl(hasDeclContext(translationUnitDecl()))
475  matches "int X", but not "int Y".
476</pre></td></tr>
477
478
479<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>&gt;...</td></tr>
480<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
481
482Given
483  typedef int X;
484  using Y = int;
485typeAliasDecl()
486  matches "using Y = int", but not "typedef int X"
487</pre></td></tr>
488
489
490<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>&gt;...</td></tr>
491<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
492
493typeAliasTemplateDecl() matches
494  template &lt;typename T&gt;
495  using Y = X&lt;T&gt;;
496</pre></td></tr>
497
498
499<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>
500<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
501
502Given
503  typedef int X;
504  using Y = int;
505typedefDecl()
506  matches "typedef int X", but not "using Y = int"
507</pre></td></tr>
508
509
510<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;...</td></tr>
511<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
512
513Given
514  typedef int X;
515  using Y = int;
516typedefNameDecl()
517  matches "typedef int X" and "using Y = int"
518</pre></td></tr>
519
520
521<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>&gt;...</td></tr>
522<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
523typename.
524
525Given
526  template &lt;typename T&gt;
527  struct Base { typedef T Foo; };
528
529  template&lt;typename T&gt;
530  struct S : private Base&lt;T&gt; {
531    using typename Base&lt;T&gt;::Foo;
532  };
533unresolvedUsingTypenameDecl()
534  matches using Base&lt;T&gt;::Foo </pre></td></tr>
535
536
537<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>
538<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
539
540Given
541  template&lt;typename X&gt;
542  class C : private X {
543    using X::x;
544  };
545unresolvedUsingValueDecl()
546  matches using X::x </pre></td></tr>
547
548
549<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>
550<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
551
552Given
553  namespace X { int x; }
554  using X::x;
555usingDecl()
556  matches using X::x </pre></td></tr>
557
558
559<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>
560<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
561
562Given
563  namespace X { int x; }
564  using namespace X;
565usingDirectiveDecl()
566  matches using namespace X </pre></td></tr>
567
568
569<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>
570<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
571
572Example matches A, B, C and F
573  enum X { A, B, C };
574  void F();
575</pre></td></tr>
576
577
578<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>
579<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
580
581Note: this does not match declarations of member variables, which are
582"field" declarations in Clang parlance.
583
584Example matches a
585  int a;
586</pre></td></tr>
587
588
589<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>
590<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
591</pre></td></tr>
592
593
594<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>
595<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
596
597Given
598  namespace ns {
599    struct A { static void f(); };
600    void A::f() {}
601    void g() { A::f(); }
602  }
603  ns::A a;
604nestedNameSpecifier()
605  matches "ns::" and both "A::"
606</pre></td></tr>
607
608
609<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>
610<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
611</pre></td></tr>
612
613
614<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;...</td></tr>
615<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
616
617Given
618  FOO: bar();
619  void *ptr = &amp;&amp;FOO;
620  goto *bar;
621addrLabelExpr()
622  matches '&amp;&amp;FOO'
623</pre></td></tr>
624
625
626<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>
627<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
628
629Given
630  int i = a[1];
631arraySubscriptExpr()
632  matches "a[1]"
633</pre></td></tr>
634
635
636<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>
637<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
638
639 int i = 100;
640  __asm("mov al, 2");
641asmStmt()
642  matches '__asm("mov al, 2")'
643</pre></td></tr>
644
645
646<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>&gt;...</td></tr>
647<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
648Example matches __atomic_load_n(ptr, 1)
649  void foo() { int *ptr; __atomic_load_n(ptr, 1); }
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('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>&gt;...</td></tr>
654<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
655
656Example matches a ?: b
657  (a ?: b) + 42;
658</pre></td></tr>
659
660
661<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>
662<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
663
664Example matches a || b
665  !(a || b)
666</pre></td></tr>
667
668
669<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
670<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
671
672Given
673  while (true) { break; }
674breakStmt()
675  matches 'break'
676</pre></td></tr>
677
678
679<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>
680<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
681
682Example: Matches (int) 2.2f in
683  int i = (int) 2.2f;
684</pre></td></tr>
685
686
687<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>
688<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
689
690Example matches x.y() and y()
691  X x;
692  x.y();
693  y();
694</pre></td></tr>
695
696
697<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>
698<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
699
700Given
701  switch(a) { case 42: break; default: break; }
702caseStmt()
703  matches 'case 42:'.
704</pre></td></tr>
705
706
707<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>
708<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
709
710Example: castExpr() matches each of the following:
711  (int) 3;
712  const_cast&lt;Expr *&gt;(SubExpr);
713  char c = 0;
714but does not match
715  int i = (0);
716  int k = 0;
717</pre></td></tr>
718
719
720<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>
721<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
722
723Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
724though.
725
726Example matches 'a', L'a'
727  char ch = 'a';
728  wchar_t chw = L'a';
729</pre></td></tr>
730
731
732<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>
733<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
734
735Example match: {1}, (1, 2)
736  int array[4] = {1};
737  vector int myvec = (vector int)(1, 2);
738</pre></td></tr>
739
740
741<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>
742<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
743
744Example matches '{}' and '{{}}' in 'for (;;) {{}}'
745  for (;;) {{}}
746</pre></td></tr>
747
748
749<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>
750<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
751
752Example matches a ? b : c
753  (a ? b : c) + 42
754</pre></td></tr>
755
756
757<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>
758<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
759
760Given
761  while (true) { continue; }
762continueStmt()
763  matches 'continue'
764</pre></td></tr>
765
766
767<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
768<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
769
770Example matches,
771  kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
772</pre></td></tr>
773
774
775<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
776<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
777
778Example matches FunctionTakesString(GetStringByValue())
779    (matcher = cxxBindTemporaryExpr())
780  FunctionTakesString(GetStringByValue());
781  FunctionTakesStringByPointer(GetStringPointer());
782</pre></td></tr>
783
784
785<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
786<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
787
788Example matches true
789  true
790</pre></td></tr>
791
792
793<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
794<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
795
796  try {} catch(int i) {}
797cxxCatchStmt()
798  matches 'catch(int i)'
799</pre></td></tr>
800
801
802<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
803<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
804
805Example: Matches const_cast&lt;int*&gt;(&amp;r) in
806  int n = 42;
807  const int &amp;r(n);
808  int* p = const_cast&lt;int*&gt;(&amp;r);
809</pre></td></tr>
810
811
812<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
813<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
814
815Example matches string(ptr, n) and ptr within arguments of f
816    (matcher = cxxConstructExpr())
817  void f(const string &amp;a, const string &amp;b);
818  char *ptr;
819  int n;
820  f(string(ptr, n), ptr);
821</pre></td></tr>
822
823
824<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
825<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
826
827Example matches the CXXDefaultArgExpr placeholder inserted for the
828    default value of the second parameter in the call expression f(42)
829    (matcher = cxxDefaultArgExpr())
830  void f(int x, int y = 0);
831  f(42);
832</pre></td></tr>
833
834
835<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
836<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
837
838Given
839  delete X;
840cxxDeleteExpr()
841  matches 'delete X'.
842</pre></td></tr>
843
844
845<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
846<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
847
848Example:
849  cxxDynamicCastExpr()
850matches
851  dynamic_cast&lt;D*&gt;(&amp;b);
852in
853  struct B { virtual ~B() {} }; struct D : B {};
854  B b;
855  D* p = dynamic_cast&lt;D*&gt;(&amp;b);
856</pre></td></tr>
857
858
859<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
860<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
861
862cxxForRangeStmt() matches 'for (auto a : i)'
863  int i[] =  {1, 2, 3}; for (auto a : i);
864  for(int j = 0; j &lt; 5; ++j);
865</pre></td></tr>
866
867
868<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
869<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
870
871Example: Matches Foo(bar);
872  Foo f = bar;
873  Foo g = (Foo) bar;
874  Foo h = Foo(bar);
875</pre></td></tr>
876
877
878<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
879<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
880
881Example matches x.y()
882  X x;
883  x.y();
884</pre></td></tr>
885
886
887<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
888<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
889
890Given
891  new X;
892cxxNewExpr()
893  matches 'new X'.
894</pre></td></tr>
895
896
897<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
898<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
899</pre></td></tr>
900
901
902<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
903<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
904
905Note that if an operator isn't overloaded, it won't match. Instead, use
906binaryOperator matcher.
907Currently it does not match operators such as new delete.
908FIXME: figure out why these do not match?
909
910Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
911    (matcher = cxxOperatorCallExpr())
912  ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
913  ostream &amp;o; int b = 1, c = 1;
914  o &lt;&lt; b &lt;&lt; c;
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('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
919<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
920
921Either the source expression or the destination type can be matched
922using has(), but hasDestinationType() is more specific and can be
923more readable.
924
925Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
926  void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
927</pre></td></tr>
928
929
930<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
931<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
932
933See also: hasDestinationType
934See also: reinterpretCast
935
936Example:
937  cxxStaticCastExpr()
938matches
939  static_cast&lt;long&gt;(8)
940in
941  long eight(static_cast&lt;long&gt;(8));
942</pre></td></tr>
943
944
945<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>&gt;...</td></tr>
946<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
947
948Given
949  std::vector&lt;int&gt; a({ 1, 2, 3 });
950  std::vector&lt;int&gt; b = { 4, 5 };
951  int c[] = { 6, 7 };
952  std::pair&lt;int, int&gt; d = { 8, 9 };
953cxxStdInitializerListExpr()
954  matches "{ 1, 2, 3 }" and "{ 4, 5 }"
955</pre></td></tr>
956
957
958<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
959<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
960
961Example: Matches Foo(bar, bar)
962  Foo h = Foo(bar, bar);
963</pre></td></tr>
964
965
966<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
967<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
968
969Example matches the implicit this expression in "return i".
970    (matcher = cxxThisExpr())
971struct foo {
972  int i;
973  int f() { return i; }
974};
975</pre></td></tr>
976
977
978<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
979<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
980
981  try { throw 5; } catch(int i) {}
982cxxThrowExpr()
983  matches 'throw 5'
984</pre></td></tr>
985
986
987<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
988<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
989
990  try {} catch(int i) {}
991cxxTryStmt()
992  matches 'try {}'
993</pre></td></tr>
994
995
996<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
997<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
998
999Example matches T(t) in return statement of f
1000    (matcher = cxxUnresolvedConstructExpr())
1001  template &lt;typename T&gt;
1002  void f(const T&amp; t) { return T(t); }
1003</pre></td></tr>
1004
1005
1006<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1007<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1008
1009Example matches x in if (x)
1010  bool x;
1011  if (x) {}
1012</pre></td></tr>
1013
1014
1015<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>
1016<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1017
1018Given
1019  int a;
1020declStmt()
1021  matches 'int a'.
1022</pre></td></tr>
1023
1024
1025<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>
1026<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1027
1028Given
1029  switch(a) { case 42: break; default: break; }
1030defaultStmt()
1031  matches 'default:'.
1032</pre></td></tr>
1033
1034
1035<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;...</td></tr>
1036<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1037
1038Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1039  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1040</pre></td></tr>
1041
1042
1043<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>
1044<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1045
1046Given
1047  do {} while (true);
1048doStmt()
1049  matches 'do {} while(true)'
1050</pre></td></tr>
1051
1052
1053<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>
1054<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1055
1056Matches any cast expression written in user code, whether it be a
1057C-style cast, a functional-style cast, or a keyword cast.
1058
1059Does not match implicit conversions.
1060
1061Note: the name "explicitCast" is chosen to match Clang's terminology, as
1062Clang uses the term "cast" to apply to implicit conversions as well as to
1063actual cast expressions.
1064
1065See also: hasDestinationType.
1066
1067Example: matches all five of the casts in
1068  int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1069but does not match the implicit conversion in
1070  long ell = 42;
1071</pre></td></tr>
1072
1073
1074<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1075<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1076
1077Example matches x()
1078  void f() { x(); }
1079</pre></td></tr>
1080
1081
1082<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>
1083<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1084of the sub-expression's evaluation.
1085
1086Example matches std::string()
1087  const std::string str = std::string();
1088</pre></td></tr>
1089
1090
1091<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>
1092<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g.
10931.0, 1.0f, 1.0L and 1e10.
1094
1095Does not match implicit conversions such as
1096  float a = 10;
1097</pre></td></tr>
1098
1099
1100<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>
1101<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1102
1103Example matches 'for (;;) {}'
1104  for (;;) {}
1105  int i[] =  {1, 2, 3}; for (auto a : i);
1106</pre></td></tr>
1107
1108
1109<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>&gt;...</td></tr>
1110<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1111</pre></td></tr>
1112
1113
1114<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1115<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1116
1117Given
1118  goto FOO;
1119  FOO: bar();
1120gotoStmt()
1121  matches 'goto FOO'
1122</pre></td></tr>
1123
1124
1125<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>
1126<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1127
1128Example matches 'if (x) {}'
1129  if (x) {}
1130</pre></td></tr>
1131
1132
1133<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>
1134<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1135
1136This matches many different places, including function call return value
1137eliding, as well as any type conversions.
1138</pre></td></tr>
1139
1140
1141<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>&gt;...</td></tr>
1142<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1143
1144Given
1145  point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1146implicitValueInitExpr()
1147  matches "[0].y" (implicitly)
1148</pre></td></tr>
1149
1150
1151<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>
1152<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1153
1154Given
1155  int a[] = { 1, 2 };
1156  struct B { int x, y; };
1157  B b = { 5, 6 };
1158initListExpr()
1159  matches "{ 1, 2 }" and "{ 5, 6 }"
1160</pre></td></tr>
1161
1162
1163<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>
1164<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g.
11651, 1L, 0x1 and 1U.
1166
1167Does not match character-encoded integers such as L'a'.
1168</pre></td></tr>
1169
1170
1171<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>
1172<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1173
1174Given
1175  goto FOO;
1176  FOO: bar();
1177labelStmt()
1178  matches 'FOO:'
1179</pre></td></tr>
1180
1181
1182<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>
1183<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1184
1185Example matches [&amp;](){return 5;}
1186  [&amp;](){return 5;}
1187</pre></td></tr>
1188
1189
1190<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>
1191<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1192
1193Example: Given
1194  struct T {void func();};
1195  T f();
1196  void g(T);
1197materializeTemporaryExpr() matches 'f()' in these statements
1198  T u(f());
1199  g(f());
1200  f().func();
1201but does not match
1202  f();
1203</pre></td></tr>
1204
1205
1206<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>
1207<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1208
1209Given
1210  class Y {
1211    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1212    int a; static int b;
1213  };
1214memberExpr()
1215  matches this-&gt;x, x, y.x, a, this-&gt;b
1216</pre></td></tr>
1217
1218
1219<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>
1220<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1221
1222  foo();;
1223nullStmt()
1224  matches the second ';'
1225</pre></td></tr>
1226
1227
1228<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>&gt;...</td></tr>
1229<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1230
1231Example matches @catch
1232  @try {}
1233  @catch (...) {}
1234</pre></td></tr>
1235
1236
1237<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>&gt;...</td></tr>
1238<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
1239
1240Example matches @finally
1241  @try {}
1242  @finally {}
1243</pre></td></tr>
1244
1245
1246<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;...</td></tr>
1247<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1248
1249The innermost message send invokes the "alloc" class method on the
1250NSString class, while the outermost message send invokes the
1251"initWithString" instance method on the object returned from
1252NSString's "alloc". This matcher should match both message sends.
1253  [[NSString alloc] initWithString:@"Hello"]
1254</pre></td></tr>
1255
1256
1257<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>&gt;...</td></tr>
1258<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
1259
1260Example matches @throw obj;
1261</pre></td></tr>
1262
1263
1264<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>&gt;...</td></tr>
1265<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
1266
1267Example matches @try
1268  @try {}
1269  @catch (...) {}
1270</pre></td></tr>
1271
1272
1273<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;...</td></tr>
1274<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
1275to reference another expressions and can be met
1276in BinaryConditionalOperators, for example.
1277
1278Example matches 'a'
1279  (a ?: c) + 42;
1280</pre></td></tr>
1281
1282
1283<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>&gt;...</td></tr>
1284<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
1285
1286Example matches (foo() + 1)
1287  int foo() { return 1; }
1288  int a = (foo() + 1);
1289</pre></td></tr>
1290
1291
1292<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>&gt;...</td></tr>
1293<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
1294ParenListExprs don't have a predefined type and are used for late parsing.
1295In the final AST, they can be met in template declarations.
1296
1297Given
1298  template&lt;typename T&gt; class X {
1299    void f() {
1300      X x(*this);
1301      int a = 0, b = 1; int i = (a, b);
1302    }
1303  };
1304parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
1305has a predefined type and is a ParenExpr, not a ParenListExpr.
1306</pre></td></tr>
1307
1308
1309<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>&gt;...</td></tr>
1310<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
1311
1312Example: Matches __func__
1313  printf("%s", __func__);
1314</pre></td></tr>
1315
1316
1317<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>
1318<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
1319
1320Given
1321  return 1;
1322returnStmt()
1323  matches 'return 1'
1324</pre></td></tr>
1325
1326
1327<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>
1328<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
1329
1330Given
1331  { ++a; }
1332stmt()
1333  matches both the compound statement '{ ++a; }' and '++a'.
1334</pre></td></tr>
1335
1336
1337<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;...</td></tr>
1338<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
1339
1340Example match: ({ int X = 4; X; })
1341  int C = ({ int X = 4; X; });
1342</pre></td></tr>
1343
1344
1345<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>
1346<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
1347
1348Example matches "abcd", L"abcd"
1349  char *s = "abcd";
1350  wchar_t *ws = L"abcd";
1351</pre></td></tr>
1352
1353
1354<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>
1355<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
1356
1357Given
1358  template &lt;int N&gt;
1359  struct A { static const int n = N; };
1360  struct B : public A&lt;42&gt; {};
1361substNonTypeTemplateParmExpr()
1362  matches "N" in the right-hand side of "static const int n = N;"
1363</pre></td></tr>
1364
1365
1366<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>
1367<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1368
1369Given
1370  switch(a) { case 42: break; default: break; }
1371switchCase()
1372  matches 'case 42:' and 'default:'.
1373</pre></td></tr>
1374
1375
1376<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>
1377<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1378
1379Given
1380  switch(a) { case 42: break; default: break; }
1381switchStmt()
1382  matches 'switch(a)'.
1383</pre></td></tr>
1384
1385
1386<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>
1387<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1388
1389Given
1390  Foo x = bar;
1391  int y = sizeof(x) + alignof(x);
1392unaryExprOrTypeTraitExpr()
1393  matches sizeof(x) and alignof(x)
1394</pre></td></tr>
1395
1396
1397<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>
1398<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1399
1400Example matches !a
1401  !a || b
1402</pre></td></tr>
1403
1404
1405<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>&gt;...</td></tr>
1406<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
1407but could not be resolved to a specific declaration.
1408
1409Given
1410  template&lt;typename T&gt;
1411  T foo() { T a; return a; }
1412  template&lt;typename T&gt;
1413  void bar() {
1414    foo&lt;T&gt;();
1415  }
1416unresolvedLookupExpr()
1417  matches foo&lt;T&gt;() </pre></td></tr>
1418
1419
1420<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>
1421<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1422
1423Example match: "foo"_suffix
1424</pre></td></tr>
1425
1426
1427<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>
1428<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1429
1430Given
1431  while (true) {}
1432whileStmt()
1433  matches 'while (true) {}'.
1434</pre></td></tr>
1435
1436
1437<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>
1438<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1439
1440Given
1441  template &lt;typename T&gt; struct C {};
1442  C&lt;int&gt; c;
1443templateArgument()
1444  matches 'int' in C&lt;int&gt;.
1445</pre></td></tr>
1446
1447
1448<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;</td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;...</td></tr>
1449<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
1450
1451Given
1452  template &lt;typename T&gt; class X { };
1453  X&lt;int&gt; xi;
1454templateName()
1455  matches 'X' in X&lt;int&gt;.
1456</pre></td></tr>
1457
1458
1459<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>
1460<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1461</pre></td></tr>
1462
1463
1464<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>
1465<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1466
1467Given
1468  int a[] = { 2, 3 };
1469  int b[4];
1470  void f() { int c[a[0]]; }
1471arrayType()
1472  matches "int a[]", "int b[4]" and "int c[a[0]]";
1473</pre></td></tr>
1474
1475
1476<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>
1477<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1478
1479Given
1480  _Atomic(int) i;
1481atomicType()
1482  matches "_Atomic(int) i"
1483</pre></td></tr>
1484
1485
1486<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>
1487<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1488
1489Given:
1490  auto n = 4;
1491  int v[] = { 2, 3 }
1492  for (auto i : v) { }
1493autoType()
1494  matches "auto n" and "auto i"
1495</pre></td></tr>
1496
1497
1498<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>
1499<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1500"void (^)(int)".
1501
1502The pointee is always required to be a FunctionType.
1503</pre></td></tr>
1504
1505
1506<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>
1507<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1508
1509Given
1510  struct A {};
1511  A a;
1512  int b;
1513  float c;
1514  bool d;
1515builtinType()
1516  matches "int b", "float c" and "bool d"
1517</pre></td></tr>
1518
1519
1520<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>
1521<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1522
1523Given
1524  _Complex float f;
1525complexType()
1526  matches "_Complex float f"
1527</pre></td></tr>
1528
1529
1530<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>
1531<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1532
1533Given
1534  void() {
1535    int a[2];
1536    int b[] = { 2, 3 };
1537    int c[b[0]];
1538  }
1539constantArrayType()
1540  matches "int a[2]"
1541</pre></td></tr>
1542
1543
1544<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;...</td></tr>
1545<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1546Example matches i[] in declaration of f.
1547    (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1548Example matches i[1].
1549    (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1550  void f(int i[]) {
1551    i[1] = 0;
1552  }
1553</pre></td></tr>
1554
1555
1556<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>
1557<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1558
1559Given
1560  template&lt;typename T, int Size&gt;
1561  class array {
1562    T data[Size];
1563  };
1564dependentSizedArrayType
1565  matches "T data[Size]"
1566</pre></td></tr>
1567
1568
1569<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>
1570<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1571qualified name.
1572
1573Given
1574  namespace N {
1575    namespace M {
1576      class D {};
1577    }
1578  }
1579  class C {};
1580
1581  class C c;
1582  N::M::D d;
1583
1584elaboratedType() matches the type of the variable declarations of both
1585c and d.
1586</pre></td></tr>
1587
1588
1589<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;...</td></tr>
1590<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
1591
1592Given
1593  enum C { Green };
1594  enum class S { Red };
1595
1596  C c;
1597  S s;
1598
1599enumType() matches the type of the variable declarations of both c and
1600s.
1601</pre></td></tr>
1602
1603
1604<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;...</td></tr>
1605<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1606
1607Given
1608  int (*f)(int);
1609  void g();
1610functionProtoType()
1611  matches "int (*f)(int)" and the type of "g" in C++ mode.
1612  In C mode, "g" is not matched because it does not contain a prototype.
1613</pre></td></tr>
1614
1615
1616<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>
1617<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1618
1619Given
1620  int (*f)(int);
1621  void g();
1622functionType()
1623  matches "int (*f)(int)" and the type of "g".
1624</pre></td></tr>
1625
1626
1627<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>
1628<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1629
1630Given
1631  int a[] = { 2, 3 };
1632  int b[42];
1633  void f(int c[]) { int d[a[0]]; };
1634incompleteArrayType()
1635  matches "int a[]" and "int c[]"
1636</pre></td></tr>
1637
1638
1639<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;...</td></tr>
1640<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1641
1642Example matches S s, but not S&lt;T&gt; s.
1643    (matcher = parmVarDecl(hasType(injectedClassNameType())))
1644  template &lt;typename T&gt; struct S {
1645    void f(S s);
1646    void g(S&lt;T&gt; s);
1647  };
1648</pre></td></tr>
1649
1650
1651<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>
1652<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1653
1654Given:
1655  int *a;
1656  int &amp;b = *a;
1657  int &amp;&amp;c = 1;
1658  auto &amp;d = b;
1659  auto &amp;&amp;e = c;
1660  auto &amp;&amp;f = 2;
1661  int g = 5;
1662
1663lValueReferenceType() matches the types of b, d, and e. e is
1664matched since the type is deduced as int&amp; by reference collapsing rules.
1665</pre></td></tr>
1666
1667
1668<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>
1669<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1670Given
1671  struct A { int i; }
1672  A::* ptr = A::i;
1673memberPointerType()
1674  matches "A::* ptr"
1675</pre></td></tr>
1676
1677
1678<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>&gt;...</td></tr>
1679<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1680a pointer type, despite being syntactically similar.
1681
1682Given
1683  int *a;
1684
1685  @interface Foo
1686  @end
1687  Foo *f;
1688pointerType()
1689  matches "Foo *f", but does not match "int *a".
1690</pre></td></tr>
1691
1692
1693<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>
1694<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1695
1696Given
1697  int (*ptr_to_array)[4];
1698  int *array_of_ptrs[4];
1699
1700varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1701array_of_ptrs.
1702</pre></td></tr>
1703
1704
1705<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>
1706<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1707types.
1708
1709Given
1710  int *a;
1711  int &amp;b = *a;
1712  int c = 5;
1713
1714  @interface Foo
1715  @end
1716  Foo *f;
1717pointerType()
1718  matches "int *a", but does not match "Foo *f".
1719</pre></td></tr>
1720
1721
1722<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>
1723<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1724
1725Given:
1726  int *a;
1727  int &amp;b = *a;
1728  int &amp;&amp;c = 1;
1729  auto &amp;d = b;
1730  auto &amp;&amp;e = c;
1731  auto &amp;&amp;f = 2;
1732  int g = 5;
1733
1734rValueReferenceType() matches the types of c and f. e is not
1735matched as it is deduced to int&amp; by reference collapsing rules.
1736</pre></td></tr>
1737
1738
1739<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>
1740<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1741
1742Given
1743  class C {};
1744  struct S {};
1745
1746  C c;
1747  S s;
1748
1749recordType() matches the type of the variable declarations of both c
1750and s.
1751</pre></td></tr>
1752
1753
1754<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>
1755<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1756
1757Given
1758  int *a;
1759  int &amp;b = *a;
1760  int &amp;&amp;c = 1;
1761  auto &amp;d = b;
1762  auto &amp;&amp;e = c;
1763  auto &amp;&amp;f = 2;
1764  int g = 5;
1765
1766referenceType() matches the types of b, c, d, e, and f.
1767</pre></td></tr>
1768
1769
1770<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;...</td></tr>
1771<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
1772template type parameter.
1773
1774Given
1775  template &lt;typename T&gt;
1776  void F(T t) {
1777    int i = 1 + t;
1778  }
1779
1780substTemplateTypeParmType() matches the type of 't' but not '1'
1781</pre></td></tr>
1782
1783
1784<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;...</td></tr>
1785<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
1786
1787Given
1788  enum E {};
1789  class C {};
1790
1791  E e;
1792  C c;
1793
1794tagType() matches the type of the variable declarations of both e
1795and c.
1796</pre></td></tr>
1797
1798
1799<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>
1800<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1801
1802Given
1803  template &lt;typename T&gt;
1804  class C { };
1805
1806  template class C&lt;int&gt;;  A
1807  C&lt;char&gt; var;            B
1808
1809templateSpecializationType() matches the type of the explicit
1810instantiation in A and the type of the variable declaration in B.
1811</pre></td></tr>
1812
1813
1814<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;...</td></tr>
1815<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
1816
1817Example matches T, but not int.
1818    (matcher = templateTypeParmType())
1819  template &lt;typename T&gt; void f(int i);
1820</pre></td></tr>
1821
1822
1823<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>
1824<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1825</pre></td></tr>
1826
1827
1828<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>
1829<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1830
1831Given
1832  typedef int X;
1833typedefType()
1834  matches "typedef int X"
1835</pre></td></tr>
1836
1837
1838<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>
1839<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1840
1841Given:
1842  typedef __underlying_type(T) type;
1843unaryTransformType()
1844  matches "__underlying_type(T)"
1845</pre></td></tr>
1846
1847
1848<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>
1849<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1850integer-constant-expression.
1851
1852Given
1853  void f() {
1854    int a[] = { 2, 3 }
1855    int b[42];
1856    int c[a[0]];
1857  }
1858variableArrayType()
1859  matches "int c[a[0]]"
1860</pre></td></tr>
1861
1862<!--END_DECL_MATCHERS -->
1863</table>
1864
1865<!-- ======================================================================= -->
1866<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1867<!-- ======================================================================= -->
1868
1869<p>Narrowing matchers match certain attributes on the current node, thus
1870narrowing down the set of nodes of the current type to match on.</p>
1871
1872<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1873which allow users to create more powerful match expressions.</p>
1874
1875<table>
1876<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1877<!-- START_NARROWING_MATCHERS -->
1878
1879<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>
1880<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1881
1882Usable as: Any Matcher
1883</pre></td></tr>
1884
1885
1886<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>
1887<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1888
1889Usable as: Any Matcher
1890</pre></td></tr>
1891
1892
1893<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1894<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1895
1896Useful when another matcher requires a child matcher, but there's no
1897additional constraint. This will often be used with an explicit conversion
1898to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1899
1900Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1901"int* p" and "void f()" in
1902  int* p;
1903  void f();
1904
1905Usable as: Any Matcher
1906</pre></td></tr>
1907
1908
1909<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
1910<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1911
1912Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
1913  class X {};
1914  class Y {};
1915
1916Usable as: Any Matcher
1917</pre></td></tr>
1918
1919
1920<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>
1921<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1922unary).
1923
1924Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1925  !(a || b)
1926</pre></td></tr>
1927
1928
1929<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr>
1930<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
1931
1932
1933<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT  Value</td></tr>
1934<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
1935
1936Given
1937  f('false, 3.14, 42);
1938characterLiteral(equals(0))
1939  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
1940  match false
1941floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
1942  match 3.14
1943integerLiteral(equals(42))
1944  matches 42
1945
1946Note that you cannot directly match a negative numeric literal because the
1947minus sign is not part of the literal: It is a unary operator whose operand
1948is the positive numeric literal. Instead, you must use a unaryOperator()
1949matcher to match the minus sign:
1950
1951unaryOperator(hasOperatorName("-"),
1952              hasUnaryOperand(integerLiteral(equals(13))))
1953
1954Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
1955           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;
1956</pre></td></tr>
1957
1958
1959<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr>
1960<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
1961
1962
1963<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr>
1964<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
1965
1966
1967<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;</td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr>
1968<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
1969
1970Given
1971  try {
1972    ...
1973  } catch (int) {
1974    ...
1975  } catch (...) {
1976    ...
1977  }
1978endcode
1979cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
1980</pre></td></tr>
1981
1982
1983<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>
1984<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1985a specific number of arguments (including absent default arguments).
1986
1987Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1988  void f(int x, int y);
1989  f(0, 0);
1990</pre></td></tr>
1991
1992
1993<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>
1994<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
1995</pre></td></tr>
1996
1997
1998<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr>
1999<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
2000zero initialization.
2001
2002Given
2003void foo() {
2004  struct point { double x; double y; };
2005  point pt[2] = { { 1.0, 2.0 } };
2006}
2007initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
2008will match the implicit array filler for pt[1].
2009</pre></td></tr>
2010
2011
2012<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr>
2013<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
2014
2015Given
2016  struct S {
2017    S(); #1
2018    S(const S &amp;); #2
2019    S(S &amp;&amp;); #3
2020  };
2021cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
2022</pre></td></tr>
2023
2024
2025<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr>
2026<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
2027
2028Given
2029  struct S {
2030    S(); #1
2031    S(const S &amp;); #2
2032    S(S &amp;&amp;); #3
2033  };
2034cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
2035</pre></td></tr>
2036
2037
2038<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr>
2039<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
2040
2041Given
2042  struct S {
2043    S(); #1
2044    S(int) {} #2
2045    S(S &amp;&amp;) : S() {} #3
2046  };
2047  S::S() : S(0) {} #4
2048cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
2049#1 or #2.
2050</pre></td></tr>
2051
2052
2053<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>
2054<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with
2055the explicit keyword.
2056
2057Given
2058  struct S {
2059    S(int); #1
2060    explicit S(double); #2
2061    operator int(); #3
2062    explicit operator bool(); #4
2063  };
2064cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2065cxxConversionDecl(isExplicit()) will match #4, but not #3.
2066</pre></td></tr>
2067
2068
2069<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr>
2070<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
2071
2072Given
2073  struct S {
2074    S(); #1
2075    S(const S &amp;); #2
2076    S(S &amp;&amp;); #3
2077  };
2078cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
2079</pre></td></tr>
2080
2081
2082<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>
2083<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with
2084the explicit keyword.
2085
2086Given
2087  struct S {
2088    S(int); #1
2089    explicit S(double); #2
2090    operator int(); #3
2091    explicit operator bool(); #4
2092  };
2093cxxConstructorDecl(isExplicit()) will match #2, but not #1.
2094cxxConversionDecl(isExplicit()) will match #4, but not #3.
2095</pre></td></tr>
2096
2097
2098<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>
2099<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
2100opposed to a member.
2101
2102Given
2103  struct B {};
2104  struct D : B {
2105    int I;
2106    D(int i) : I(i) {}
2107  };
2108  struct E : B {
2109    E() : B() {}
2110  };
2111cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
2112  will match E(), but not match D(int).
2113</pre></td></tr>
2114
2115
2116<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>
2117<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
2118opposed to a base.
2119
2120Given
2121  struct B {};
2122  struct D : B {
2123    int I;
2124    D(int i) : I(i) {}
2125  };
2126  struct E : B {
2127    E() : B() {}
2128  };
2129cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
2130  will match D(int), but not match E().
2131</pre></td></tr>
2132
2133
2134<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>
2135<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
2136code (as opposed to implicitly added by the compiler).
2137
2138Given
2139  struct Foo {
2140    Foo() { }
2141    Foo(int) : foo_("A") { }
2142    string foo_;
2143  };
2144cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
2145  will match Foo(int), but not Foo()
2146</pre></td></tr>
2147
2148
2149<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>
2150<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
2151
2152Given
2153struct A {
2154  void foo() const;
2155  void bar();
2156};
2157
2158cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
2159</pre></td></tr>
2160
2161
2162<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr>
2163<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
2164operator.
2165
2166Given
2167struct A {
2168  A &amp;operator=(const A &amp;);
2169  A &amp;operator=(A &amp;&amp;);
2170};
2171
2172cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
2173the second one.
2174</pre></td></tr>
2175
2176
2177<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr>
2178<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
2179
2180Given:
2181  class A final {};
2182
2183  struct B {
2184    virtual void f();
2185  };
2186
2187  struct C : B {
2188    void f() final;
2189  };
2190matches A and C::f, but not B, C, or B::f
2191</pre></td></tr>
2192
2193
2194<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr>
2195<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2196operator.
2197
2198Given
2199struct A {
2200  A &amp;operator=(const A &amp;);
2201  A &amp;operator=(A &amp;&amp;);
2202};
2203
2204cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2205the first one.
2206</pre></td></tr>
2207
2208
2209<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>
2210<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2211
2212Given
2213  class A {
2214   public:
2215    virtual void x();
2216  };
2217  class B : public A {
2218   public:
2219    virtual void x();
2220  };
2221  matches B::x
2222</pre></td></tr>
2223
2224
2225<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>
2226<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2227
2228Given
2229  class A {
2230   public:
2231    virtual void x() = 0;
2232  };
2233  matches A::x
2234</pre></td></tr>
2235
2236
2237<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr>
2238<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2239
2240Given
2241  struct S {
2242    S(); #1
2243    S(const S &amp;) = default; #2
2244    S(S &amp;&amp;) = delete; #3
2245  };
2246cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2247</pre></td></tr>
2248
2249
2250<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>
2251<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
2252
2253Given
2254  class A {
2255   public:
2256    virtual void x();
2257  };
2258  matches A::x
2259</pre></td></tr>
2260
2261
2262<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr>
2263<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2264
2265Given
2266  class A {
2267   public:
2268    virtual void x();
2269  };
2270  class B : public A {
2271   public:
2272    void x();
2273  };
2274  matches A::x but not B::x
2275</pre></td></tr>
2276
2277
2278<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr>
2279<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
2280
2281Given:
2282  MyClass *p1 = new MyClass[10];
2283cxxNewExpr(isArray())
2284  matches the expression 'new MyClass[10]'.
2285</pre></td></tr>
2286
2287
2288<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>
2289<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2290
2291Matches overloaded operator names specified in strings without the
2292"operator" prefix: e.g. "&lt;&lt;".
2293
2294Given:
2295  class A { int operator*(); };
2296  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2297  A a;
2298  a &lt;&lt; a;   &lt;-- This matches
2299
2300cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2301specified line and
2302cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2303matches the declaration of A.
2304
2305Usable 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;
2306</pre></td></tr>
2307
2308
2309<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr>
2310<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
2311
2312Example matches x (matcher = cxxRecordDecl(hasDefinition()))
2313class x {};
2314class y;
2315</pre></td></tr>
2316
2317
2318<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>
2319<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2320</pre></td></tr>
2321
2322
2323<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>
2324<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2325static member variable template instantiations.
2326
2327Given
2328  template&lt;typename T&gt; void A(T t) { }
2329  template&lt;&gt; void A(int N) { }
2330functionDecl(isExplicitTemplateSpecialization())
2331  matches the specialization A&lt;int&gt;().
2332
2333Usable 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;
2334</pre></td></tr>
2335
2336
2337<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr>
2338<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2339
2340Given:
2341  class A final {};
2342
2343  struct B {
2344    virtual void f();
2345  };
2346
2347  struct C : B {
2348    void f() final;
2349  };
2350matches A and C::f, but not B, C, or B::f
2351</pre></td></tr>
2352
2353
2354<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr>
2355<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2356
2357Given:
2358  auto x = []{};
2359
2360cxxRecordDecl(isLambda()) matches the implicit class declaration of
2361decltype(x)
2362</pre></td></tr>
2363
2364
2365<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>
2366<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
2367isSameOrDerivedFrom(hasName(...)).
2368</pre></td></tr>
2369
2370
2371<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>
2372<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2373member variable template instantiations.
2374
2375Given
2376  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2377or
2378  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2379cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2380  matches the template instantiation of X&lt;A&gt;.
2381
2382But given
2383  template &lt;typename T&gt;  class X {}; class A {};
2384  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2385cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2386  does not match, as X&lt;A&gt; is an explicit template specialization.
2387
2388Usable 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;
2389</pre></td></tr>
2390
2391
2392<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>
2393<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2394a specific number of arguments (including absent default arguments).
2395
2396Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2397  void f(int x, int y);
2398  f(0, 0);
2399</pre></td></tr>
2400
2401
2402<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr>
2403<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2404
2405Example: matches the implicit cast around 0
2406(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2407  int *p = 0;
2408</pre></td></tr>
2409
2410
2411<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr>
2412<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2413
2414
2415<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>const ValueT  Value</td></tr>
2416<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
2417
2418Given
2419  f('false, 3.14, 42);
2420characterLiteral(equals(0))
2421  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2422  match false
2423floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2424  match 3.14
2425integerLiteral(equals(42))
2426  matches 42
2427
2428Note that you cannot directly match a negative numeric literal because the
2429minus sign is not part of the literal: It is a unary operator whose operand
2430is the positive numeric literal. Instead, you must use a unaryOperator()
2431matcher to match the minus sign:
2432
2433unaryOperator(hasOperatorName("-"),
2434              hasUnaryOperand(integerLiteral(equals(13))))
2435
2436Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
2437           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;
2438</pre></td></tr>
2439
2440
2441<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr>
2442<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2443
2444
2445<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr>
2446<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2447
2448
2449<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>
2450<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2451
2452Given
2453  template&lt;typename T&gt; struct C {};
2454  C&lt;int&gt; c;
2455classTemplateSpecializationDecl(templateArgumentCountIs(1))
2456  matches C&lt;int&gt;.
2457</pre></td></tr>
2458
2459
2460<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>
2461<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2462child statements.
2463
2464Example: Given
2465  { for (;;) {} }
2466compoundStmt(statementCountIs(0)))
2467  matches '{}'
2468  but does not match the outer compound statement.
2469</pre></td></tr>
2470
2471
2472<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>
2473<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
2474
2475Given
2476  int a[42];
2477  int b[2 * 21];
2478  int c[41], d[43];
2479  char *s = "abcd";
2480  wchar_t *ws = L"abcd";
2481  char *w = "a";
2482constantArrayType(hasSize(42))
2483  matches "int a[42]" and "int b[2 * 21]"
2484stringLiteral(hasSize(4))
2485  matches "abcd", L"abcd"
2486</pre></td></tr>
2487
2488
2489<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>
2490<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2491declarations.
2492
2493Example: Given
2494  int a, b;
2495  int c;
2496  int d = 2, e;
2497declCountIs(2)
2498  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2499</pre></td></tr>
2500
2501
2502<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>
2503<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2504
2505Matches a node if it equals the node previously bound to ID.
2506
2507Given
2508  class X { int a; int b; };
2509cxxRecordDecl(
2510    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2511    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2512  matches the class X, as a and b have the same type.
2513
2514Note that when multiple matches are involved via forEach* matchers,
2515equalsBoundNodes acts as a filter.
2516For example:
2517compoundStmt(
2518    forEachDescendant(varDecl().bind("d")),
2519    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2520will trigger a match for each combination of variable declaration
2521and reference to that variable declaration within a compound statement.
2522</pre></td></tr>
2523
2524
2525<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr>
2526<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2527
2528Decl has pointer identity in the AST.
2529</pre></td></tr>
2530
2531
2532<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>
2533<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2534
2535Given
2536  __attribute__((device)) void f() { ... }
2537decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2538f. If the matcher is use from clang-query, attr::Kind parameter should be
2539passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2540</pre></td></tr>
2541
2542
2543<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>
2544<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2545partially matching a given regex.
2546
2547Example matches Y but not X
2548    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2549  #include "ASTMatcher.h"
2550  class X {};
2551ASTMatcher.h:
2552  class Y {};
2553
2554Usable 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;
2555</pre></td></tr>
2556
2557
2558<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>
2559<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2560
2561Example matches X but not Y
2562  (matcher = cxxRecordDecl(isExpansionInMainFile())
2563  #include &lt;Y.h&gt;
2564  class X {};
2565Y.h:
2566  class Y {};
2567
2568Usable 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;
2569</pre></td></tr>
2570
2571
2572<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>
2573<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2574
2575Example matches Y but not X
2576    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2577  #include &lt;SystemHeader.h&gt;
2578  class X {};
2579SystemHeader.h:
2580  class Y {};
2581
2582Usable 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;
2583</pre></td></tr>
2584
2585
2586<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>
2587<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2588by the compiler (eg. implicit defaultcopy constructors).
2589</pre></td></tr>
2590
2591
2592<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>
2593<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2594
2595Given
2596  class C {
2597  public:    int a;
2598  protected: int b;
2599  private:   int c;
2600  };
2601fieldDecl(isPrivate())
2602  matches 'int c;'
2603</pre></td></tr>
2604
2605
2606<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>
2607<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2608
2609Given
2610  class C {
2611  public:    int a;
2612  protected: int b;
2613  private:   int c;
2614  };
2615fieldDecl(isProtected())
2616  matches 'int b;'
2617</pre></td></tr>
2618
2619
2620<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>
2621<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2622
2623Given
2624  class C {
2625  public:    int a;
2626  protected: int b;
2627  private:   int c;
2628  };
2629fieldDecl(isPublic())
2630  matches 'int a;'
2631</pre></td></tr>
2632
2633
2634<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;</td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr>
2635<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2636a specific number of designators.
2637
2638Example: Given
2639  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2640  point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2641designatorCountIs(2)
2642  matches '{ [2].y = 1.0, [0].x = 1.0 }',
2643  but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2644</pre></td></tr>
2645
2646
2647<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;</td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr>
2648<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
2649
2650Example matches Y (matcher = enumDecl(isScoped()))
2651enum X {};
2652enum class Y {};
2653</pre></td></tr>
2654
2655
2656<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr>
2657<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
2658bit width.
2659
2660Given
2661  class C {
2662    int a : 2;
2663    int b : 4;
2664    int c : 2;
2665  };
2666fieldDecl(hasBitWidth(2))
2667  matches 'int a;' and 'int c;' but not 'int b;'.
2668</pre></td></tr>
2669
2670
2671<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr>
2672<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
2673
2674Given
2675  class C {
2676    int a : 2;
2677    int b;
2678  };
2679fieldDecl(isBitField())
2680  matches 'int a;' but not 'int b;'.
2681</pre></td></tr>
2682
2683
2684<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>const ValueT  Value</td></tr>
2685<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
2686
2687Given
2688  f('false, 3.14, 42);
2689characterLiteral(equals(0))
2690  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2691  match false
2692floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2693  match 3.14
2694integerLiteral(equals(42))
2695  matches 42
2696
2697Note that you cannot directly match a negative numeric literal because the
2698minus sign is not part of the literal: It is a unary operator whose operand
2699is the positive numeric literal. Instead, you must use a unaryOperator()
2700matcher to match the minus sign:
2701
2702unaryOperator(hasOperatorName("-"),
2703              hasUnaryOperand(integerLiteral(equals(13))))
2704
2705Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
2706           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;
2707</pre></td></tr>
2708
2709
2710<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr>
2711<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
2712
2713
2714<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
2715<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
2716
2717Given:
2718  void f();
2719  void g() noexcept;
2720  void h() noexcept(true);
2721  void i() noexcept(false);
2722  void j() throw();
2723  void k() throw(int);
2724  void l() throw(...);
2725functionDecl(hasDynamicExceptionSpec()) and
2726  functionProtoType(hasDynamicExceptionSpec())
2727  match the declarations of j, k, and l, but not f, g, h, or i.
2728</pre></td></tr>
2729
2730
2731<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>
2732<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
2733
2734Matches overloaded operator names specified in strings without the
2735"operator" prefix: e.g. "&lt;&lt;".
2736
2737Given:
2738  class A { int operator*(); };
2739  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2740  A a;
2741  a &lt;&lt; a;   &lt;-- This matches
2742
2743cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2744specified line and
2745cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2746matches the declaration of A.
2747
2748Usable 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;
2749</pre></td></tr>
2750
2751
2752<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr>
2753<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
2754
2755Example matches Y (matcher = functionDecl(hasTrailingReturn()))
2756int X() {}
2757auto Y() -&gt; int {}
2758</pre></td></tr>
2759
2760
2761<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr>
2762<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations.
2763
2764Given:
2765  constexpr int foo = 42;
2766  constexpr int bar();
2767varDecl(isConstexpr())
2768  matches the declaration of foo.
2769functionDecl(isConstexpr())
2770  matches the declaration of bar.
2771</pre></td></tr>
2772
2773
2774<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr>
2775<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
2776
2777Given:
2778  class A { ~A(); };
2779  class B { ~B() = default; };
2780functionDecl(isDefaulted())
2781  matches the declaration of ~B, but not ~A.
2782</pre></td></tr>
2783
2784
2785<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr>
2786<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
2787
2788Example matches A, va, fa
2789  class A {};
2790  class B;  Doesn't match, as it has no body.
2791  int va;
2792  extern int vb;  Doesn't match, as it doesn't define the variable.
2793  void fa() {}
2794  void fb();  Doesn't match, as it has no body.
2795  @interface X
2796  - (void)ma; Doesn't match, interface is declaration.
2797  @end
2798  @implementation X
2799  - (void)ma {}
2800  @end
2801
2802Usable 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;,
2803  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
2804</pre></td></tr>
2805
2806
2807<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>
2808<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
2809
2810Given:
2811  void Func();
2812  void DeletedFunc() = delete;
2813functionDecl(isDeleted())
2814  matches the declaration of DeletedFunc, but not Func.
2815</pre></td></tr>
2816
2817
2818<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>
2819<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
2820static member variable template instantiations.
2821
2822Given
2823  template&lt;typename T&gt; void A(T t) { }
2824  template&lt;&gt; void A(int N) { }
2825functionDecl(isExplicitTemplateSpecialization())
2826  matches the specialization A&lt;int&gt;().
2827
2828Usable 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;
2829</pre></td></tr>
2830
2831
2832<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>
2833<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
2834
2835Given:
2836  extern "C" void f() {}
2837  extern "C" { void g() {} }
2838  void h() {}
2839  extern "C" int x = 1;
2840  extern "C" int y = 2;
2841  int z = 3;
2842functionDecl(isExternC())
2843  matches the declaration of f and g, but not the declaration of h.
2844varDecl(isExternC())
2845  matches the declaration of x and y, but not the declaration of z.
2846</pre></td></tr>
2847
2848
2849<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr>
2850<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2851the inline keyword.
2852
2853Given
2854  inline void f();
2855  void g();
2856  namespace n {
2857  inline namespace m {}
2858  }
2859functionDecl(isInline()) will match ::f().
2860namespaceDecl(isInline()) will match n::m.
2861</pre></td></tr>
2862
2863
2864<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr>
2865<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
2866
2867Given
2868  void nope();
2869  [[noreturn]] void a();
2870  __attribute__((noreturn)) void b();
2871  struct c { [[noreturn]] c(); };
2872functionDecl(isNoReturn())
2873  matches all of those except
2874  void nope();
2875</pre></td></tr>
2876
2877
2878<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr>
2879<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2880
2881Given:
2882  void f();
2883  void g() noexcept;
2884  void h() throw();
2885  void i() throw(int);
2886  void j() noexcept(false);
2887functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2888  match the declarations of g, and h, but not f, i or j.
2889</pre></td></tr>
2890
2891
2892<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr>
2893<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variablefunction declarations that have "static" storage
2894class specifier ("static" keyword) written in the source.
2895
2896Given:
2897  static void f() {}
2898  static int i = 0;
2899  extern int j;
2900  int k;
2901functionDecl(isStaticStorageClass())
2902  matches the function declaration f.
2903varDecl(isStaticStorageClass())
2904  matches the variable declaration i.
2905</pre></td></tr>
2906
2907
2908<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>
2909<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2910member variable template instantiations.
2911
2912Given
2913  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2914or
2915  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2916cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2917  matches the template instantiation of X&lt;A&gt;.
2918
2919But given
2920  template &lt;typename T&gt;  class X {}; class A {};
2921  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2922cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2923  does not match, as X&lt;A&gt; is an explicit template specialization.
2924
2925Usable 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;
2926</pre></td></tr>
2927
2928
2929<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr>
2930<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
2931
2932Example matches f, but not g or h. The function i will not match, even when
2933compiled in C mode.
2934  void f(...);
2935  void g(int);
2936  template &lt;typename... Ts&gt; void h(Ts...);
2937  void i();
2938</pre></td></tr>
2939
2940
2941<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>
2942<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2943specific parameter count.
2944
2945Given
2946  void f(int i) {}
2947  void g(int i, int j) {}
2948  void h(int i, int j);
2949  void j(int i);
2950  void k(int x, int y, int z, ...);
2951functionDecl(parameterCountIs(2))
2952  matches g and h
2953functionProtoType(parameterCountIs(2))
2954  matches g and h
2955functionProtoType(parameterCountIs(3))
2956  matches k
2957</pre></td></tr>
2958
2959
2960<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
2961<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
2962
2963Given:
2964  void f();
2965  void g() noexcept;
2966  void h() noexcept(true);
2967  void i() noexcept(false);
2968  void j() throw();
2969  void k() throw(int);
2970  void l() throw(...);
2971functionDecl(hasDynamicExceptionSpec()) and
2972  functionProtoType(hasDynamicExceptionSpec())
2973  match the declarations of j, k, and l, but not f, g, h, or i.
2974</pre></td></tr>
2975
2976
2977<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr>
2978<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
2979
2980Given:
2981  void f();
2982  void g() noexcept;
2983  void h() throw();
2984  void i() throw(int);
2985  void j() noexcept(false);
2986functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2987  match the declarations of g, and h, but not f, i or j.
2988</pre></td></tr>
2989
2990
2991<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
2992<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2993specific parameter count.
2994
2995Given
2996  void f(int i) {}
2997  void g(int i, int j) {}
2998  void h(int i, int j);
2999  void j(int i);
3000  void k(int x, int y, int z, ...);
3001functionDecl(parameterCountIs(2))
3002  matches g and h
3003functionProtoType(parameterCountIs(2))
3004  matches g and h
3005functionProtoType(parameterCountIs(3))
3006  matches k
3007</pre></td></tr>
3008
3009
3010<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr>
3011<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
3012
3013
3014<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>const ValueT  Value</td></tr>
3015<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
3016
3017Given
3018  f('false, 3.14, 42);
3019characterLiteral(equals(0))
3020  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3021  match false
3022floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3023  match 3.14
3024integerLiteral(equals(42))
3025  matches 42
3026
3027Note that you cannot directly match a negative numeric literal because the
3028minus sign is not part of the literal: It is a unary operator whose operand
3029is the positive numeric literal. Instead, you must use a unaryOperator()
3030matcher to match the minus sign:
3031
3032unaryOperator(hasOperatorName("-"),
3033              hasUnaryOperand(integerLiteral(equals(13))))
3034
3035Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
3036           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;
3037</pre></td></tr>
3038
3039
3040<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr>
3041<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
3042
3043
3044<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned Value</td></tr>
3045<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
3046
3047
3048<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>
3049<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
3050to '.'.
3051
3052Member calls on the implicit this pointer match as called with '-&gt;'.
3053
3054Given
3055  class Y {
3056    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3057    int a;
3058    static int b;
3059  };
3060memberExpr(isArrow())
3061  matches this-&gt;x, x, y.x, a, this-&gt;b
3062</pre></td></tr>
3063
3064
3065<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasExternalFormalLinkage0')"><a name="hasExternalFormalLinkage0Anchor">hasExternalFormalLinkage</a></td><td></td></tr>
3066<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
3067
3068Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
3069void f() {
3070  int x;
3071  static int y;
3072}
3073int z;
3074
3075Example matches f() because it has external formal linkage despite being
3076unique to the translation unit as though it has internal likage
3077(matcher = functionDecl(hasExternalFormalLinkage()))
3078
3079namespace {
3080void f() {}
3081}
3082</pre></td></tr>
3083
3084
3085<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>const std::string  Name</td></tr>
3086<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
3087
3088Supports specifying enclosing namespaces or classes by prefixing the name
3089with '&lt;enclosing&gt;::'.
3090Does not match typedefs of an underlying type with the given name.
3091
3092Example matches X (Name == "X")
3093  class X;
3094
3095Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
3096  namespace a { namespace b { class X; } }
3097</pre></td></tr>
3098
3099
3100<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>
3101<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
3102a substring matched by the given RegExp.
3103
3104Supports specifying enclosing namespaces or classes by
3105prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
3106of an underlying type with the given name.
3107
3108Example matches X (regexp == "::X")
3109  class X;
3110
3111Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3112  namespace foo { namespace bar { class X; } }
3113</pre></td></tr>
3114
3115
3116<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isAnonymous0')"><a name="isAnonymous0Anchor">isAnonymous</a></td><td></td></tr>
3117<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3118
3119Given
3120  namespace n {
3121  namespace {} #1
3122  }
3123namespaceDecl(isAnonymous()) will match #1 but not ::n.
3124</pre></td></tr>
3125
3126
3127<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr>
3128<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3129the inline keyword.
3130
3131Given
3132  inline void f();
3133  void g();
3134  namespace n {
3135  inline namespace m {}
3136  }
3137functionDecl(isInline()) will match ::f().
3138namespaceDecl(isInline()) will match n::m.
3139</pre></td></tr>
3140
3141
3142<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
3143<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3144a specific number of arguments (including absent default arguments).
3145
3146Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3147  void f(int x, int y);
3148  f(0, 0);
3149</pre></td></tr>
3150
3151
3152<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr>
3153<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3154
3155objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3156message expression in
3157
3158  UIWebView *webView = ...;
3159  CGRect bodyFrame = webView.frame;
3160  bodyFrame.size.height = self.bodyContentHeight;
3161  webView.frame = bodyFrame;
3162      ^---- matches here
3163</pre></td></tr>
3164
3165
3166<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr>
3167<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3168
3169Matches only when the selector of the objCMessageExpr is NULL. This may
3170represent an error condition in the tree!
3171</pre></td></tr>
3172
3173
3174<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasSelector0')"><a name="hasSelector0Anchor">hasSelector</a></td><td>std::string BaseName</td></tr>
3175<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3176
3177 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3178 matches the outer message expr in the code below, but NOT the message
3179 invocation for self.bodyView.
3180    [self.bodyView loadHTMLString:html baseURL:NULL];
3181</pre></td></tr>
3182
3183
3184<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasUnarySelector0')"><a name="hasUnarySelector0Anchor">hasUnarySelector</a></td><td></td></tr>
3185<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3186
3187 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3188 matches self.bodyView in the code below, but NOT the outer message
3189 invocation of "loadHTMLString:baseURL:".
3190    [self.bodyView loadHTMLString:html baseURL:NULL];
3191</pre></td></tr>
3192
3193
3194<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>std::string RegExp</td></tr>
3195<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3196a substring matched by the given RegExp.
3197 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3198 invocation for self.bodyView.
3199    [self.bodyView loadHTMLString:html baseURL:NULL];
3200</pre></td></tr>
3201
3202
3203<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr>
3204<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3205
3206 matcher = objCMessageExpr(numSelectorArgs(0));
3207 matches self.bodyView in the code below
3208
3209 matcher = objCMessageExpr(numSelectorArgs(2));
3210 matches the invocation of "loadHTMLString:baseURL:" but not that
3211 of self.bodyView
3212    [self.bodyView loadHTMLString:html baseURL:NULL];
3213</pre></td></tr>
3214
3215
3216<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
3217<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
3218
3219Example matches A, va, fa
3220  class A {};
3221  class B;  Doesn't match, as it has no body.
3222  int va;
3223  extern int vb;  Doesn't match, as it doesn't define the variable.
3224  void fa() {}
3225  void fb();  Doesn't match, as it has no body.
3226  @interface X
3227  - (void)ma; Doesn't match, interface is declaration.
3228  @end
3229  @implementation X
3230  - (void)ma {}
3231  @end
3232
3233Usable 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;,
3234  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
3235</pre></td></tr>
3236
3237
3238<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefaultArgument0')"><a name="hasDefaultArgument0Anchor">hasDefaultArgument</a></td><td></td></tr>
3239<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
3240
3241Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
3242void x(int val) {}
3243void y(int val = 0) {}
3244</pre></td></tr>
3245
3246
3247<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>
3248<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3249
3250Given
3251  class Y { public: void x(); };
3252  void z() { Y* y; y-&gt;x(); }
3253cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3254  matches y-&gt;x()
3255</pre></td></tr>
3256
3257
3258<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>
3259<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3260
3261Matches a node if it equals the node previously bound to ID.
3262
3263Given
3264  class X { int a; int b; };
3265cxxRecordDecl(
3266    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3267    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3268  matches the class X, as a and b have the same type.
3269
3270Note that when multiple matches are involved via forEach* matchers,
3271equalsBoundNodes acts as a filter.
3272For example:
3273compoundStmt(
3274    forEachDescendant(varDecl().bind("d")),
3275    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3276will trigger a match for each combination of variable declaration
3277and reference to that variable declaration within a compound statement.
3278</pre></td></tr>
3279
3280
3281<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>
3282<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3283the node, not hidden within a typedef.
3284
3285Given
3286  typedef const int const_int;
3287  const_int i;
3288  int *const j;
3289  int *volatile k;
3290  int m;
3291varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3292i is const-qualified but the qualifier is not local.
3293</pre></td></tr>
3294
3295
3296<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr>
3297<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3298
3299Given
3300  void a(char);
3301  void b(wchar_t);
3302  void c(double);
3303functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3304matches "a(char)", "b(wchar_t)", but not "c(double)".
3305</pre></td></tr>
3306
3307
3308<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr>
3309<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3310the Objective-C object pointer type, which is different despite being
3311syntactically similar.
3312
3313Given
3314  int *i = nullptr;
3315
3316  @interface Foo
3317  @end
3318  Foo *f;
3319
3320  int j;
3321varDecl(hasType(isAnyPointer()))
3322  matches "int *i" and "Foo *f", but not "int j".
3323</pre></td></tr>
3324
3325
3326<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>
3327<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3328include "top-level" const.
3329
3330Given
3331  void a(int);
3332  void b(int const);
3333  void c(const int);
3334  void d(const int*);
3335  void e(int const) {};
3336functionDecl(hasAnyParameter(hasType(isConstQualified())))
3337  matches "void b(int const)", "void c(const int)" and
3338  "void e(int const) {}". It does not match d as there
3339  is no top-level const on the parameter type "const int *".
3340</pre></td></tr>
3341
3342
3343<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>
3344<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3345
3346Given
3347  void a(int);
3348  void b(long);
3349  void c(double);
3350functionDecl(hasAnyParameter(hasType(isInteger())))
3351matches "a(int)", "b(long)", but not "c(double)".
3352</pre></td></tr>
3353
3354
3355<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr>
3356<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3357
3358Given
3359  void a(int);
3360  void b(unsigned long);
3361  void c(double);
3362functionDecl(hasAnyParameter(hasType(isSignedInteger())))
3363matches "a(int)", but not "b(unsigned long)" and "c(double)".
3364</pre></td></tr>
3365
3366
3367<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr>
3368<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3369
3370Given
3371  void a(int);
3372  void b(unsigned long);
3373  void c(double);
3374functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
3375matches "b(unsigned long)", but not "a(int)" and "c(double)".
3376</pre></td></tr>
3377
3378
3379<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr>
3380<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3381include "top-level" volatile.
3382
3383Given
3384  void a(int);
3385  void b(int volatile);
3386  void c(volatile int);
3387  void d(volatile int*);
3388  void e(int volatile) {};
3389functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3390  matches "void b(int volatile)", "void c(volatile int)" and
3391  "void e(int volatile) {}". It does not match d as there
3392  is no top-level volatile on the parameter type "volatile int *".
3393</pre></td></tr>
3394
3395
3396<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr>
3397<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3398
3399Example matches C, but not S or U.
3400  struct S {};
3401  class C {};
3402  union U {};
3403</pre></td></tr>
3404
3405
3406<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr>
3407<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3408
3409Example matches S, but not C or U.
3410  struct S {};
3411  class C {};
3412  union U {};
3413</pre></td></tr>
3414
3415
3416<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr>
3417<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3418
3419Example matches U, but not C or S.
3420  struct S {};
3421  class C {};
3422  union U {};
3423</pre></td></tr>
3424
3425
3426<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>
3427<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3428
3429Matches a node if it equals the node previously bound to ID.
3430
3431Given
3432  class X { int a; int b; };
3433cxxRecordDecl(
3434    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3435    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3436  matches the class X, as a and b have the same type.
3437
3438Note that when multiple matches are involved via forEach* matchers,
3439equalsBoundNodes acts as a filter.
3440For example:
3441compoundStmt(
3442    forEachDescendant(varDecl().bind("d")),
3443    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3444will trigger a match for each combination of variable declaration
3445and reference to that variable declaration within a compound statement.
3446</pre></td></tr>
3447
3448
3449<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>const Stmt* Other</td></tr>
3450<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3451
3452Stmt has pointer identity in the AST.
3453</pre></td></tr>
3454
3455
3456<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>
3457<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3458partially matching a given regex.
3459
3460Example matches Y but not X
3461    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3462  #include "ASTMatcher.h"
3463  class X {};
3464ASTMatcher.h:
3465  class Y {};
3466
3467Usable 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;
3468</pre></td></tr>
3469
3470
3471<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>
3472<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3473
3474Example matches X but not Y
3475  (matcher = cxxRecordDecl(isExpansionInMainFile())
3476  #include &lt;Y.h&gt;
3477  class X {};
3478Y.h:
3479  class Y {};
3480
3481Usable 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;
3482</pre></td></tr>
3483
3484
3485<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>
3486<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3487
3488Example matches Y but not X
3489    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3490  #include &lt;SystemHeader.h&gt;
3491  class X {};
3492SystemHeader.h:
3493  class Y {};
3494
3495Usable 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;
3496</pre></td></tr>
3497
3498
3499<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;</td><td class="name" onclick="toggle('hasSize1')"><a name="hasSize1Anchor">hasSize</a></td><td>unsigned N</td></tr>
3500<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3501
3502Given
3503  int a[42];
3504  int b[2 * 21];
3505  int c[41], d[43];
3506  char *s = "abcd";
3507  wchar_t *ws = L"abcd";
3508  char *w = "a";
3509constantArrayType(hasSize(42))
3510  matches "int a[42]" and "int b[2 * 21]"
3511stringLiteral(hasSize(4))
3512  matches "abcd", L"abcd"
3513</pre></td></tr>
3514
3515
3516<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>
3517<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3518
3519Example matches A, va, fa
3520  class A {};
3521  class B;  Doesn't match, as it has no body.
3522  int va;
3523  extern int vb;  Doesn't match, as it doesn't define the variable.
3524  void fa() {}
3525  void fb();  Doesn't match, as it has no body.
3526  @interface X
3527  - (void)ma; Doesn't match, interface is declaration.
3528  @end
3529  @implementation X
3530  - (void)ma {}
3531  @end
3532
3533Usable 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;,
3534  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
3535</pre></td></tr>
3536
3537
3538<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>
3539<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3540
3541Note that 'Value' is a string as the template argument's value is
3542an arbitrary precision integer. 'Value' must be euqal to the canonical
3543representation of that integral value in base 10.
3544
3545Given
3546  template&lt;int T&gt; struct C {};
3547  C&lt;42&gt; c;
3548classTemplateSpecializationDecl(
3549  hasAnyTemplateArgument(equalsIntegralValue("42")))
3550  matches the implicit instantiation of C in C&lt;42&gt;.
3551</pre></td></tr>
3552
3553
3554<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>
3555<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3556
3557Given
3558  template&lt;int T&gt; struct C {};
3559  C&lt;42&gt; c;
3560classTemplateSpecializationDecl(
3561  hasAnyTemplateArgument(isIntegral()))
3562  matches the implicit instantiation of C in C&lt;42&gt;
3563  with isIntegral() matching 42.
3564</pre></td></tr>
3565
3566
3567<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>
3568<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3569
3570Given
3571  template&lt;typename T&gt; struct C {};
3572  C&lt;int&gt; c;
3573classTemplateSpecializationDecl(templateArgumentCountIs(1))
3574  matches C&lt;int&gt;.
3575</pre></td></tr>
3576
3577
3578<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>
3579<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3580partially matching a given regex.
3581
3582Example matches Y but not X
3583    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3584  #include "ASTMatcher.h"
3585  class X {};
3586ASTMatcher.h:
3587  class Y {};
3588
3589Usable 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;
3590</pre></td></tr>
3591
3592
3593<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>
3594<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3595
3596Example matches X but not Y
3597  (matcher = cxxRecordDecl(isExpansionInMainFile())
3598  #include &lt;Y.h&gt;
3599  class X {};
3600Y.h:
3601  class Y {};
3602
3603Usable 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;
3604</pre></td></tr>
3605
3606
3607<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>
3608<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
3609
3610Example matches Y but not X
3611    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3612  #include &lt;SystemHeader.h&gt;
3613  class X {};
3614SystemHeader.h:
3615  class Y {};
3616
3617Usable 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;
3618</pre></td></tr>
3619
3620
3621<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr>
3622<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
3623
3624Given
3625 struct S { bool func(); };
3626functionDecl(returns(booleanType()))
3627  matches "bool func();"
3628</pre></td></tr>
3629
3630
3631<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>
3632<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
3633
3634Matches a node if it equals the node previously bound to ID.
3635
3636Given
3637  class X { int a; int b; };
3638cxxRecordDecl(
3639    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3640    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3641  matches the class X, as a and b have the same type.
3642
3643Note that when multiple matches are involved via forEach* matchers,
3644equalsBoundNodes acts as a filter.
3645For example:
3646compoundStmt(
3647    forEachDescendant(varDecl().bind("d")),
3648    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3649will trigger a match for each combination of variable declaration
3650and reference to that variable declaration within a compound statement.
3651</pre></td></tr>
3652
3653
3654<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('equalsNode2')"><a name="equalsNode2Anchor">equalsNode</a></td><td>const Type* Other</td></tr>
3655<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
3656
3657Type has pointer identity in the AST.
3658</pre></td></tr>
3659
3660
3661<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr>
3662<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
3663
3664Given
3665  int i;
3666  float f;
3667realFloatingPointType()
3668  matches "float f" but not "int i"
3669</pre></td></tr>
3670
3671
3672<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>
3673<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
3674
3675Given
3676 struct S { void func(); };
3677functionDecl(returns(voidType()))
3678  matches "void func();"
3679</pre></td></tr>
3680
3681
3682<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>
3683<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
3684
3685Given
3686  int x;
3687  int s = sizeof(x) + alignof(x)
3688unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
3689  matches sizeof(x)
3690</pre></td></tr>
3691
3692
3693<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>
3694<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3695unary).
3696
3697Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3698  !(a || b)
3699</pre></td></tr>
3700
3701
3702<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr>
3703<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
3704
3705Example matches x, but not y, z, or a.
3706(matcher = varDecl(hasAutomaticStorageDuration())
3707void f() {
3708  int x;
3709  static int y;
3710  thread_local int z;
3711}
3712int a;
3713</pre></td></tr>
3714
3715
3716<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>
3717<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
3718
3719Example matches y and z (matcher = varDecl(hasGlobalStorage())
3720void f() {
3721  int x;
3722  static int y;
3723}
3724int z;
3725</pre></td></tr>
3726
3727
3728<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>
3729<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
3730non-static local variable.
3731
3732Example matches x (matcher = varDecl(hasLocalStorage())
3733void f() {
3734  int x;
3735  static int y;
3736}
3737int z;
3738</pre></td></tr>
3739
3740
3741<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr>
3742<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
3743It includes the variable declared at namespace scope and those declared
3744with "static" and "extern" storage class specifiers.
3745
3746void f() {
3747  int x;
3748  static int y;
3749  thread_local int z;
3750}
3751int a;
3752static int b;
3753extern int c;
3754varDecl(hasStaticStorageDuration())
3755  matches the function declaration y, a, b and c.
3756</pre></td></tr>
3757
3758
3759<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr>
3760<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
3761
3762Example matches z, but not x, z, or a.
3763(matcher = varDecl(hasThreadStorageDuration())
3764void f() {
3765  int x;
3766  static int y;
3767  thread_local int z;
3768}
3769int a;
3770</pre></td></tr>
3771
3772
3773<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr>
3774<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations.
3775
3776Given:
3777  constexpr int foo = 42;
3778  constexpr int bar();
3779varDecl(isConstexpr())
3780  matches the declaration of foo.
3781functionDecl(isConstexpr())
3782  matches the declaration of bar.
3783</pre></td></tr>
3784
3785
3786<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>
3787<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3788
3789Example matches A, va, fa
3790  class A {};
3791  class B;  Doesn't match, as it has no body.
3792  int va;
3793  extern int vb;  Doesn't match, as it doesn't define the variable.
3794  void fa() {}
3795  void fb();  Doesn't match, as it has no body.
3796  @interface X
3797  - (void)ma; Doesn't match, interface is declaration.
3798  @end
3799  @implementation X
3800  - (void)ma {}
3801  @end
3802
3803Usable 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;,
3804  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
3805</pre></td></tr>
3806
3807
3808<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr>
3809<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3810a C++ catch block, or an Objective-C statement.
3811
3812Example matches x (matcher = varDecl(isExceptionVariable())
3813void f(int y) {
3814  try {
3815  } catch (int x) {
3816  }
3817}
3818</pre></td></tr>
3819
3820
3821<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>
3822<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3823static member variable template instantiations.
3824
3825Given
3826  template&lt;typename T&gt; void A(T t) { }
3827  template&lt;&gt; void A(int N) { }
3828functionDecl(isExplicitTemplateSpecialization())
3829  matches the specialization A&lt;int&gt;().
3830
3831Usable 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;
3832</pre></td></tr>
3833
3834
3835<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr>
3836<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
3837
3838Given:
3839  extern "C" void f() {}
3840  extern "C" { void g() {} }
3841  void h() {}
3842  extern "C" int x = 1;
3843  extern "C" int y = 2;
3844  int z = 3;
3845functionDecl(isExternC())
3846  matches the declaration of f and g, but not the declaration of h.
3847varDecl(isExternC())
3848  matches the declaration of x and y, but not the declaration of z.
3849</pre></td></tr>
3850
3851
3852<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr>
3853<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variablefunction declarations that have "static" storage
3854class specifier ("static" keyword) written in the source.
3855
3856Given:
3857  static void f() {}
3858  static int i = 0;
3859  extern int j;
3860  int k;
3861functionDecl(isStaticStorageClass())
3862  matches the function declaration f.
3863varDecl(isStaticStorageClass())
3864  matches the variable declaration i.
3865</pre></td></tr>
3866
3867
3868<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>
3869<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3870member variable template instantiations.
3871
3872Given
3873  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3874or
3875  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3876cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3877  matches the template instantiation of X&lt;A&gt;.
3878
3879But given
3880  template &lt;typename T&gt;  class X {}; class A {};
3881  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3882cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3883  does not match, as X&lt;A&gt; is an explicit template specialization.
3884
3885Usable 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;
3886</pre></td></tr>
3887
3888
3889<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>
3890<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3891template instantiations.
3892
3893Given
3894  template&lt;typename T&gt; void A(T t) { T i; }
3895  A(0);
3896  A(0U);
3897functionDecl(isInstantiated())
3898  matches 'A(int) {...};' and 'A(unsigned) {...}'.
3899</pre></td></tr>
3900
3901
3902<tr><td>Matcher&lt;internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;&gt;</td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr>
3903<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3904GNU's __null, C++11's nullptr, or C's NULL macro.
3905
3906Given:
3907  void *v1 = NULL;
3908  void *v2 = nullptr;
3909  void *v3 = __null; GNU extension
3910  char *cp = (char *)0;
3911  int *ip = 0;
3912  int i = 0;
3913expr(nullPointerConstant())
3914  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3915  initializer for i.
3916</pre></td></tr>
3917
3918
3919<tr><td>Matcher&lt;internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;&gt;</td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr>
3920<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3921
3922This matcher is only provided as a performance optimization of hasName.
3923    hasAnyName(a, b, c)
3924 is equivalent to, but faster than
3925    anyOf(hasName(a), hasName(b), hasName(c))
3926</pre></td></tr>
3927
3928
3929<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>
3930<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
3931
3932Given
3933  int j;
3934  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
3935  A(0);
3936  A(0U);
3937declStmt(isInTemplateInstantiation())
3938  matches 'int i;' and 'unsigned i'.
3939unless(stmt(isInTemplateInstantiation()))
3940  will NOT match j += 42; as it's shared between the template definition and
3941  instantiation.
3942</pre></td></tr>
3943
3944<!--END_NARROWING_MATCHERS -->
3945</table>
3946
3947<!-- ======================================================================= -->
3948<h2 id="traversal-matchers">AST Traversal Matchers</h2>
3949<!-- ======================================================================= -->
3950
3951<p>Traversal matchers specify the relationship to other nodes that are
3952reachable from the current node.</p>
3953
3954<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
3955forEachDescendant) which work on all nodes and allow users to write more generic
3956match expressions.</p>
3957
3958<table>
3959<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
3960<!-- START_TRAVERSAL_MATCHERS -->
3961
3962<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>
3963<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
3964
3965Unlike anyOf, eachOf will generate a match result for each
3966matching submatcher.
3967
3968For example, in:
3969  class A { int a; int b; };
3970The matcher:
3971  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
3972                       has(fieldDecl(hasName("b")).bind("v"))))
3973will generate two results binding "v", the first of which binds
3974the field declaration of a, the second the field declaration of
3975b.
3976
3977Usable as: Any Matcher
3978</pre></td></tr>
3979
3980
3981<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3982<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3983provided matcher.
3984
3985Example matches X, A, A::X, B, B::C, B::C::X
3986  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
3987  class X {};
3988  class A { class X {}; };  Matches A, because A::X is a class of name
3989                            X inside A.
3990  class B { class C { class X {}; }; };
3991
3992DescendantT must be an AST base type.
3993
3994As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
3995each result that matches instead of only on the first one.
3996
3997Note: Recursively combined ForEachDescendant can cause many matches:
3998  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
3999    forEachDescendant(cxxRecordDecl())
4000  )))
4001will match 10 times (plus injected class name matches) on:
4002  class A { class B { class C { class D { class E {}; }; }; }; };
4003
4004Usable as: Any Matcher
4005</pre></td></tr>
4006
4007
4008<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
4009<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
4010provided matcher.
4011
4012Example matches X, Y, Y::X, Z::Y, Z::Y::X
4013  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
4014  class X {};
4015  class Y { class X {}; };  Matches Y, because Y::X is a class of name X
4016                            inside Y.
4017  class Z { class Y { class X {}; }; };  Does not match Z.
4018
4019ChildT must be an AST base type.
4020
4021As opposed to 'has', 'forEach' will cause a match for each result that
4022matches instead of only on the first one.
4023
4024Usable as: Any Matcher
4025</pre></td></tr>
4026
4027
4028<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
4029<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
4030matcher.
4031
4032Given
4033void f() { if (true) { int x = 42; } }
4034void g() { for (;;) { int x = 43; } }
4035expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
4036
4037Usable as: Any Matcher
4038</pre></td></tr>
4039
4040
4041<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4042<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4043provided matcher.
4044
4045Example matches X, Y, Z
4046    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
4047  class X {};  Matches X, because X::X is a class of name X inside X.
4048  class Y { class X {}; };
4049  class Z { class Y { class X {}; }; };
4050
4051DescendantT must be an AST base type.
4052
4053Usable as: Any Matcher
4054</pre></td></tr>
4055
4056
4057<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
4058<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
4059provided matcher.
4060
4061Example matches X, Y
4062  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
4063  class X {};  Matches X, because X::X is a class of name X inside X.
4064  class Y { class X {}; };
4065  class Z { class Y { class X {}; }; };  Does not match Z.
4066
4067ChildT must be an AST base type.
4068
4069Usable as: Any Matcher
4070Note that has is direct matcher, so it also matches things like implicit
4071casts and paren casts. If you are matching with expr then you should
4072probably consider using ignoringParenImpCasts like:
4073has(ignoringParenImpCasts(expr())).
4074</pre></td></tr>
4075
4076
4077<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
4078<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
4079matcher.
4080
4081Given
4082void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
4083compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
4084
4085Usable as: Any Matcher
4086</pre></td></tr>
4087
4088
4089<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasCondition5')"><a name="hasCondition5Anchor">hasCondition</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4090<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
4091switch statement or conditional operator.
4092
4093Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4094  if (true) {}
4095</pre></td></tr>
4096
4097
4098<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</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>
4099<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
4100(binary or ternary).
4101
4102Example matches b
4103  condition ? a : b
4104  condition ?: b
4105</pre></td></tr>
4106
4107
4108<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</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>
4109<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
4110
4111Example 1 (conditional ternary operator): matches a
4112  condition ? a : b
4113
4114Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
4115  condition ?: b
4116</pre></td></tr>
4117
4118
4119<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
4120<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
4121matches the given matcher.
4122
4123The associated declaration is:
4124- for type nodes, the declaration of the underlying type
4125- for CallExpr, the declaration of the callee
4126- for MemberExpr, the declaration of the referenced member
4127- for CXXConstructExpr, the declaration of the constructor
4128- for CXXNewExpr, the declaration of the operator new
4129
4130For type nodes, hasDeclaration will generally match the declaration of the
4131sugared type. Given
4132  class X {};
4133  typedef X Y;
4134  Y y;
4135in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4136typedefDecl. A common use case is to match the underlying, desugared type.
4137This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4138  varDecl(hasType(hasUnqualifiedDesugaredType(
4139      recordType(hasDeclaration(decl())))))
4140In this matcher, the decl will match the CXXRecordDecl of class X.
4141
4142Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
4143  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4144  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4145  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4146  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4147  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4148  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4149</pre></td></tr>
4150
4151
4152<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>
4153<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
4154
4155Given
4156  int i[5];
4157  void f() { i[1] = 42; }
4158arraySubscriptExpression(hasBase(implicitCastExpr(
4159    hasSourceExpression(declRefExpr()))))
4160  matches i[1] with the declRefExpr() matching i
4161</pre></td></tr>
4162
4163
4164<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>
4165<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
4166
4167Given
4168  int i[5];
4169  void f() { i[1] = 42; }
4170arraySubscriptExpression(hasIndex(integerLiteral()))
4171  matches i[1] with the integerLiteral() matching 1
4172</pre></td></tr>
4173
4174
4175<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasLHS1')"><a name="hasLHS1Anchor">hasLHS</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4176<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
4177
4178Example matches a (matcher = binaryOperator(hasLHS()))
4179  a || b
4180</pre></td></tr>
4181
4182
4183<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasRHS1')"><a name="hasRHS1Anchor">hasRHS</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4184<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
4185
4186Example matches b (matcher = binaryOperator(hasRHS()))
4187  a || b
4188</pre></td></tr>
4189
4190
4191<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>
4192<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
4193type.
4194
4195Given
4196  struct A {};
4197  A a[7];
4198  int b[7];
4199arrayType(hasElementType(builtinType()))
4200  matches "int b[7]"
4201
4202Usable 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;
4203</pre></td></tr>
4204
4205
4206<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>
4207<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
4208type.
4209
4210Given
4211  struct A {};
4212  A a[7];
4213  int b[7];
4214arrayType(hasElementType(builtinType()))
4215  matches "int b[7]"
4216
4217Usable 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;
4218</pre></td></tr>
4219
4220
4221<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>
4222<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
4223
4224Given
4225  _Atomic(int) i;
4226  _Atomic(float) f;
4227atomicType(hasValueType(isInteger()))
4228 matches "_Atomic(int) i"
4229
4230Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
4231</pre></td></tr>
4232
4233
4234<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>
4235<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4236
4237Given
4238  _Atomic(int) i;
4239  _Atomic(float) f;
4240atomicType(hasValueType(isInteger()))
4241 matches "_Atomic(int) i"
4242
4243Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
4244</pre></td></tr>
4245
4246
4247<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>
4248<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4249
4250Note: There is no TypeLoc for the deduced type and thus no
4251getDeducedLoc() matcher.
4252
4253Given
4254  auto a = 1;
4255  auto b = 2.0;
4256autoType(hasDeducedType(isInteger()))
4257  matches "auto a"
4258
4259Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
4260</pre></td></tr>
4261
4262
4263<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;  InnerMatcher</td></tr>
4264<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4265binary operator matches.
4266</pre></td></tr>
4267
4268
4269<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>
4270<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
4271
4272Example matches a (matcher = binaryOperator(hasLHS()))
4273  a || b
4274</pre></td></tr>
4275
4276
4277<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>
4278<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
4279
4280Example matches b (matcher = binaryOperator(hasRHS()))
4281  a || b
4282</pre></td></tr>
4283
4284
4285<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>
4286<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
4287pointee matches a given matcher.
4288
4289Given
4290  int *a;
4291  int const *b;
4292  float const *f;
4293pointerType(pointee(isConstQualified(), isInteger()))
4294  matches "int const *b"
4295
4296Usable 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;,
4297  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;
4298</pre></td></tr>
4299
4300
4301<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>
4302<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4303pointee matches a given matcher.
4304
4305Given
4306  int *a;
4307  int const *b;
4308  float const *f;
4309pointerType(pointee(isConstQualified(), isInteger()))
4310  matches "int const *b"
4311
4312Usable 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;,
4313  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;
4314</pre></td></tr>
4315
4316
4317<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParam1')"><a name="forEachArgumentWithParam1Anchor">forEachArgumentWithParam</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; ParamMatcher</td></tr>
4318<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4319
4320Given
4321  void f(int i);
4322  int y;
4323  f(y);
4324callExpr(
4325  forEachArgumentWithParam(
4326    declRefExpr(to(varDecl(hasName("y")))),
4327    parmVarDecl(hasType(isInteger()))
4328))
4329  matches f(y);
4330with declRefExpr(...)
4331  matching int y
4332and parmVarDecl(...)
4333  matching int i
4334</pre></td></tr>
4335
4336
4337<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>
4338<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
4339expression.
4340
4341Given
4342  void x(int, int, int) { int y; x(1, y, 42); }
4343callExpr(hasAnyArgument(declRefExpr()))
4344  matches x(1, y, 42)
4345with hasAnyArgument(...)
4346  matching y
4347</pre></td></tr>
4348
4349
4350<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>
4351<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4352call expression.
4353
4354Example matches y in x(y)
4355    (matcher = callExpr(hasArgument(0, declRefExpr())))
4356  void x(int) { int y; x(y); }
4357</pre></td></tr>
4358
4359
4360<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
4361<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
4362matches the given matcher.
4363
4364The associated declaration is:
4365- for type nodes, the declaration of the underlying type
4366- for CallExpr, the declaration of the callee
4367- for MemberExpr, the declaration of the referenced member
4368- for CXXConstructExpr, the declaration of the constructor
4369- for CXXNewExpr, the declaration of the operator new
4370
4371For type nodes, hasDeclaration will generally match the declaration of the
4372sugared type. Given
4373  class X {};
4374  typedef X Y;
4375  Y y;
4376in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4377typedefDecl. A common use case is to match the underlying, desugared type.
4378This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4379  varDecl(hasType(hasUnqualifiedDesugaredType(
4380      recordType(hasDeclaration(decl())))))
4381In this matcher, the decl will match the CXXRecordDecl of class X.
4382
4383Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
4384  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4385  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4386  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4387  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4388  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4389  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4390</pre></td></tr>
4391
4392
4393<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>
4394<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4395
4396Given
4397  class A { A() : i(42), j(42) {} int i; int j; };
4398cxxConstructorDecl(forEachConstructorInitializer(
4399  forField(decl().bind("x"))
4400))
4401  will trigger two matches, binding for 'i' and 'j' respectively.
4402</pre></td></tr>
4403
4404
4405<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>
4406<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4407
4408Given
4409  struct Foo {
4410    Foo() : foo_(1) { }
4411    int foo_;
4412  };
4413cxxRecordDecl(has(cxxConstructorDecl(
4414  hasAnyConstructorInitializer(anything())
4415)))
4416  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
4417</pre></td></tr>
4418
4419
4420<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>
4421<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
4422
4423Given
4424  struct Foo {
4425    Foo() : foo_(1) { }
4426    int foo_;
4427  };
4428cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4429    forField(hasName("foo_"))))))
4430  matches Foo
4431with forField matching foo_
4432</pre></td></tr>
4433
4434
4435<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>
4436<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
4437
4438Given
4439  struct Foo {
4440    Foo() : foo_(1) { }
4441    int foo_;
4442  };
4443cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4444    withInitializer(integerLiteral(equals(1)))))))
4445  matches Foo
4446with withInitializer matching (1)
4447</pre></td></tr>
4448
4449
4450<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>
4451<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
4452definition that has a given body.
4453
4454Given
4455  for (;;) {}
4456hasBody(compoundStmt())
4457  matches 'for (;;) {}'
4458with compoundStmt()
4459  matching '{}'
4460</pre></td></tr>
4461
4462
4463<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>
4464<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
4465
4466Example:
4467    forStmt(hasLoopVariable(anything()))
4468matches 'int x' in
4469    for (int x : a) { }
4470</pre></td></tr>
4471
4472
4473<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>
4474<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
4475
4476Example:
4477    forStmt(hasRangeInit(anything()))
4478matches 'a' in
4479    for (int x : a) { }
4480</pre></td></tr>
4481
4482
4483<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>
4484<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
4485
4486
4487<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>
4488<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
4489
4490Example matches y.x()
4491  (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
4492  class Y { public: void x(); };
4493  void z() { Y y; y.x(); }
4494
4495FIXME: Overload to allow directly matching types?
4496</pre></td></tr>
4497
4498
4499<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>
4500<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
4501</pre></td></tr>
4502
4503
4504<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>
4505<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
4506matcher, or is a pointer to a type that matches the InnerMatcher.
4507</pre></td></tr>
4508
4509
4510<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('forEachOverridden0')"><a name="forEachOverridden0Anchor">forEachOverridden</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt; InnerMatcher</td></tr>
4511<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overriden by the given method. This matcher may
4512produce multiple matches.
4513
4514Given
4515  class A { virtual void f(); };
4516  class B : public A { void f(); };
4517  class C : public B { void f(); };
4518cxxMethodDecl(ofClass(hasName("C")),
4519              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4520  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
4521  that B::f is not overridden by C::f).
4522
4523The check can produce multiple matches in case of multiple inheritance, e.g.
4524  class A1 { virtual void f(); };
4525  class A2 { virtual void f(); };
4526  class C : public A1, public A2 { void f(); };
4527cxxMethodDecl(ofClass(hasName("C")),
4528              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4529  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
4530  once with "b" binding "A2::f" and "d" binding "C::f".
4531</pre></td></tr>
4532
4533
4534<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>
4535<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
4536belongs to.
4537
4538FIXME: Generalize this for other kinds of declarations.
4539FIXME: What other kind of declarations would we need to generalize
4540this to?
4541
4542Example matches A() in the last line
4543    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
4544        ofClass(hasName("A"))))))
4545  class A {
4546   public:
4547    A();
4548  };
4549  A a = A();
4550</pre></td></tr>
4551
4552
4553<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasArraySize0')"><a name="hasArraySize0Anchor">hasArraySize</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4554<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
4555
4556Given:
4557  MyClass *p1 = new MyClass[10];
4558cxxNewExpr(hasArraySize(intgerLiteral(equals(10))))
4559  matches the expression 'new MyClass[10]'.
4560</pre></td></tr>
4561
4562
4563<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
4564<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
4565matches the given matcher.
4566
4567The associated declaration is:
4568- for type nodes, the declaration of the underlying type
4569- for CallExpr, the declaration of the callee
4570- for MemberExpr, the declaration of the referenced member
4571- for CXXConstructExpr, the declaration of the constructor
4572- for CXXNewExpr, the declaration of the operator new
4573
4574For type nodes, hasDeclaration will generally match the declaration of the
4575sugared type. Given
4576  class X {};
4577  typedef X Y;
4578  Y y;
4579in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4580typedefDecl. A common use case is to match the underlying, desugared type.
4581This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4582  varDecl(hasType(hasUnqualifiedDesugaredType(
4583      recordType(hasDeclaration(decl())))))
4584In this matcher, the decl will match the CXXRecordDecl of class X.
4585
4586Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
4587  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4588  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4589  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4590  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4591  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4592  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4593</pre></td></tr>
4594
4595
4596<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>
4597<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
4598
4599Given:
4600  class A { void func(); };
4601  class B { void member(); };
4602
4603cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
4604A but not B.
4605</pre></td></tr>
4606
4607
4608<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>
4609<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
4610a class matching Base.
4611
4612Note that a class is not considered to be derived from itself.
4613
4614Example matches Y, Z, C (Base == hasName("X"))
4615  class X;
4616  class Y : public X {};  directly derived
4617  class Z : public Y {};  indirectly derived
4618  typedef X A;
4619  typedef A B;
4620  class C : public B {};  derived from a typedef of X
4621
4622In the following example, Bar matches isDerivedFrom(hasName("X")):
4623  class Foo;
4624  typedef Foo X;
4625  class Bar : public Foo {};  derived from a type that X is a typedef of
4626</pre></td></tr>
4627
4628
4629<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>
4630<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
4631match Base.
4632</pre></td></tr>
4633
4634
4635<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>
4636<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
4637given matcher.
4638
4639Example matches y.x() (matcher = callExpr(callee(
4640                                   cxxMethodDecl(hasName("x")))))
4641  class Y { public: void x(); };
4642  void z() { Y y; y.x(); }
4643</pre></td></tr>
4644
4645
4646<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>
4647<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
4648
4649Given
4650  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
4651  void f() { f(); }
4652callExpr(callee(expr()))
4653  matches this-&gt;x(), x(), y.x(), f()
4654with callee(...)
4655  matching this-&gt;x, x, y.x, f respectively
4656
4657Note: Callee cannot take the more general internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
4658because this introduces ambiguous overloads with calls to Callee taking a
4659internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
4660implemented in terms of implicit casts.
4661</pre></td></tr>
4662
4663
4664<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParam0')"><a name="forEachArgumentWithParam0Anchor">forEachArgumentWithParam</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; ParamMatcher</td></tr>
4665<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
4666
4667Given
4668  void f(int i);
4669  int y;
4670  f(y);
4671callExpr(
4672  forEachArgumentWithParam(
4673    declRefExpr(to(varDecl(hasName("y")))),
4674    parmVarDecl(hasType(isInteger()))
4675))
4676  matches f(y);
4677with declRefExpr(...)
4678  matching int y
4679and parmVarDecl(...)
4680  matching int i
4681</pre></td></tr>
4682
4683
4684<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>
4685<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
4686expression.
4687
4688Given
4689  void x(int, int, int) { int y; x(1, y, 42); }
4690callExpr(hasAnyArgument(declRefExpr()))
4691  matches x(1, y, 42)
4692with hasAnyArgument(...)
4693  matching y
4694</pre></td></tr>
4695
4696
4697<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>
4698<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
4699call expression.
4700
4701Example matches y in x(y)
4702    (matcher = callExpr(hasArgument(0, declRefExpr())))
4703  void x(int) { int y; x(y); }
4704</pre></td></tr>
4705
4706
4707<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
4708<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
4709matches the given matcher.
4710
4711The associated declaration is:
4712- for type nodes, the declaration of the underlying type
4713- for CallExpr, the declaration of the callee
4714- for MemberExpr, the declaration of the referenced member
4715- for CXXConstructExpr, the declaration of the constructor
4716- for CXXNewExpr, the declaration of the operator new
4717
4718For type nodes, hasDeclaration will generally match the declaration of the
4719sugared type. Given
4720  class X {};
4721  typedef X Y;
4722  Y y;
4723in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4724typedefDecl. A common use case is to match the underlying, desugared type.
4725This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4726  varDecl(hasType(hasUnqualifiedDesugaredType(
4727      recordType(hasDeclaration(decl())))))
4728In this matcher, the decl will match the CXXRecordDecl of class X.
4729
4730Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
4731  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4732  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4733  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4734  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4735  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4736  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4737</pre></td></tr>
4738
4739
4740<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>
4741<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
4742extension, matches the constant given in the statement.
4743
4744Given
4745  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
4746caseStmt(hasCaseConstant(integerLiteral()))
4747  matches "case 1:"
4748</pre></td></tr>
4749
4750
4751<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>
4752<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
4753or opaque value's source expression matches the given matcher.
4754
4755Example 1: matches "a string"
4756(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
4757class URL { URL(string); };
4758URL url = "a string";
4759
4760Example 2: matches 'b' (matcher =
4761opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
4762int a = b ?: 1;
4763</pre></td></tr>
4764
4765
4766<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>
4767<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4768functionDecl that have at least one TemplateArgument matching the given
4769InnerMatcher.
4770
4771Given
4772  template&lt;typename T&gt; class A {};
4773  template&lt;&gt; class A&lt;double&gt; {};
4774  A&lt;int&gt; a;
4775
4776  template&lt;typename T&gt; f() {};
4777  void func() { f&lt;int&gt;(); };
4778
4779classTemplateSpecializationDecl(hasAnyTemplateArgument(
4780    refersToType(asString("int"))))
4781  matches the specialization A&lt;int&gt;
4782
4783functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
4784  matches the specialization f&lt;int&gt;
4785</pre></td></tr>
4786
4787
4788<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasSpecializedTemplate0')"><a name="hasSpecializedTemplate0Anchor">hasSpecializedTemplate</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt; InnerMatcher</td></tr>
4789<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
4790
4791Given
4792  tempalate&lt;typename T&gt; class A {};
4793  typedef A&lt;int&gt; B;
4794classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
4795  matches 'B' with classTemplateDecl() matching the class template
4796  declaration of 'A'.
4797</pre></td></tr>
4798
4799
4800<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>
4801<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
4802functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
4803
4804Given
4805  template&lt;typename T, typename U&gt; class A {};
4806  A&lt;bool, int&gt; b;
4807  A&lt;int, bool&gt; c;
4808
4809  template&lt;typename T&gt; void f() {}
4810  void func() { f&lt;int&gt;(); };
4811classTemplateSpecializationDecl(hasTemplateArgument(
4812    1, refersToType(asString("int"))))
4813  matches the specialization A&lt;bool, int&gt;
4814
4815functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
4816  matches the specialization f&lt;int&gt;
4817</pre></td></tr>
4818
4819
4820<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>
4821<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
4822type.
4823
4824Given
4825  struct A {};
4826  A a[7];
4827  int b[7];
4828arrayType(hasElementType(builtinType()))
4829  matches "int b[7]"
4830
4831Usable 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;
4832</pre></td></tr>
4833
4834
4835<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>
4836<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
4837type.
4838
4839Given
4840  struct A {};
4841  A a[7];
4842  int b[7];
4843arrayType(hasElementType(builtinType()))
4844  matches "int b[7]"
4845
4846Usable 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;
4847</pre></td></tr>
4848
4849
4850<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>
4851<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
4852a given matcher. Also matches StmtExprs that have CompoundStmt as children.
4853
4854Given
4855  { {}; 1+2; }
4856hasAnySubstatement(compoundStmt())
4857  matches '{ {}; 1+2; }'
4858with compoundStmt()
4859  matching '{}'
4860</pre></td></tr>
4861
4862
4863<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;</td><td class="name" onclick="toggle('hasDecayedType0')"><a name="hasDecayedType0Anchor">hasDecayedType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerType</td></tr>
4864<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
4865</pre></td></tr>
4866
4867
4868<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
4869<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
4870matches the given matcher.
4871
4872The associated declaration is:
4873- for type nodes, the declaration of the underlying type
4874- for CallExpr, the declaration of the callee
4875- for MemberExpr, the declaration of the referenced member
4876- for CXXConstructExpr, the declaration of the constructor
4877- for CXXNewExpr, the declaration of the operator new
4878
4879For type nodes, hasDeclaration will generally match the declaration of the
4880sugared type. Given
4881  class X {};
4882  typedef X Y;
4883  Y y;
4884in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4885typedefDecl. A common use case is to match the underlying, desugared type.
4886This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4887  varDecl(hasType(hasUnqualifiedDesugaredType(
4888      recordType(hasDeclaration(decl())))))
4889In this matcher, the decl will match the CXXRecordDecl of class X.
4890
4891Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
4892  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
4893  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
4894  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
4895  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
4896  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
4897  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4898</pre></td></tr>
4899
4900
4901<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>
4902<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
4903specific using shadow declaration.
4904
4905Given
4906  namespace a { void f() {} }
4907  using a::f;
4908  void g() {
4909    f();     Matches this ..
4910    a::f();  .. but not this.
4911  }
4912declRefExpr(throughUsingDecl(anything()))
4913  matches f()
4914</pre></td></tr>
4915
4916
4917<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>
4918<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
4919specified matcher.
4920
4921Example matches x in if(x)
4922    (matcher = declRefExpr(to(varDecl(hasName("x")))))
4923  bool x;
4924  if (x) {}
4925</pre></td></tr>
4926
4927
4928<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>
4929<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
4930
4931Note that this does not work for global declarations because the AST
4932breaks up multiple-declaration DeclStmt's into multiple single-declaration
4933DeclStmt's.
4934Example: Given non-global declarations
4935  int a, b = 0;
4936  int c;
4937  int d = 2, e;
4938declStmt(containsDeclaration(
4939      0, varDecl(hasInitializer(anything()))))
4940  matches only 'int d = 2, e;', and
4941declStmt(containsDeclaration(1, varDecl()))
4942  matches 'int a, b = 0' as well as 'int d = 2, e;'
4943  but 'int c;' is not matched.
4944</pre></td></tr>
4945
4946
4947<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>
4948<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
4949
4950Given
4951  int a, b;
4952  int c;
4953declStmt(hasSingleDecl(anything()))
4954  matches 'int c;' but not 'int a, b;'.
4955</pre></td></tr>
4956
4957
4958<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>
4959<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
4960the inner matcher.
4961
4962Given
4963  int x;
4964declaratorDecl(hasTypeLoc(loc(asString("int"))))
4965  matches int x
4966</pre></td></tr>
4967
4968
4969<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>
4970<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
4971Decl, matches InnerMatcher.
4972
4973Given
4974  namespace N {
4975    namespace M {
4976      class D {};
4977    }
4978  }
4979
4980cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
4981declaration of class D.
4982</pre></td></tr>
4983
4984
4985<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>
4986<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
4987definition that has a given body.
4988
4989Given
4990  for (;;) {}
4991hasBody(compoundStmt())
4992  matches 'for (;;) {}'
4993with compoundStmt()
4994  matching '{}'
4995</pre></td></tr>
4996
4997
4998<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>
4999<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
5000switch statement or conditional operator.
5001
5002Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5003  if (true) {}
5004</pre></td></tr>
5005
5006
5007<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>
5008<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
5009matches InnerMatcher if the qualifier exists.
5010
5011Given
5012  namespace N {
5013    namespace M {
5014      class D {};
5015    }
5016  }
5017  N::M::D d;
5018
5019elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
5020matches the type of the variable declaration of d.
5021</pre></td></tr>
5022
5023
5024<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>
5025<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
5026
5027Given
5028  namespace N {
5029    namespace M {
5030      class D {};
5031    }
5032  }
5033  N::M::D d;
5034
5035elaboratedType(namesType(recordType(
5036hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
5037declaration of d.
5038</pre></td></tr>
5039
5040
5041<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5042<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
5043matches the given matcher.
5044
5045The associated declaration is:
5046- for type nodes, the declaration of the underlying type
5047- for CallExpr, the declaration of the callee
5048- for MemberExpr, the declaration of the referenced member
5049- for CXXConstructExpr, the declaration of the constructor
5050- for CXXNewExpr, the declaration of the operator new
5051
5052For type nodes, hasDeclaration will generally match the declaration of the
5053sugared type. Given
5054  class X {};
5055  typedef X Y;
5056  Y y;
5057in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5058typedefDecl. A common use case is to match the underlying, desugared type.
5059This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5060  varDecl(hasType(hasUnqualifiedDesugaredType(
5061      recordType(hasDeclaration(decl())))))
5062In this matcher, the decl will match the CXXRecordDecl of class X.
5063
5064Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5065  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5066  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5067  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5068  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5069  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5070  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5071</pre></td></tr>
5072
5073
5074<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>
5075<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
5076
5077(Note: Clang's AST refers to other conversions as "casts" too, and calls
5078actual casts "explicit" casts.)
5079</pre></td></tr>
5080
5081
5082<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('hasType3')"><a name="hasType3Anchor">hasType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
5083<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
5084declaration's type.
5085
5086In case of a value declaration (for example a variable declaration),
5087this resolves one layer of indirection. For example, in the value
5088declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5089X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5090declaration of x.
5091
5092Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5093            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5094 class X {};
5095 void y(X &amp;x) { x; X z; }
5096
5097Usable 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;
5098</pre></td></tr>
5099
5100
5101<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>
5102<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
5103matcher.
5104
5105Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5106            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5107            and U (matcher = typedefDecl(hasType(asString("int")))
5108 class X {};
5109 void y(X &amp;x) { x; X z; }
5110 typedef int U;
5111</pre></td></tr>
5112
5113
5114<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>
5115<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
5116are stripped off.
5117
5118Parentheses and explicit casts are not discarded.
5119Given
5120  int arr[5];
5121  int a = 0;
5122  char b = 0;
5123  const int c = a;
5124  int *d = arr;
5125  long e = (long) 0l;
5126The matchers
5127   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
5128   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
5129would match the declarations for a, b, c, and d, but not e.
5130While
5131   varDecl(hasInitializer(integerLiteral()))
5132   varDecl(hasInitializer(declRefExpr()))
5133only match the declarations for b, c, and d.
5134</pre></td></tr>
5135
5136
5137<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringImplicit0')"><a name="ignoringImplicit0Anchor">ignoringImplicit</a></td><td>ast_matchers::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5138<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
5139nodes are stripped off.
5140
5141Parentheses and explicit casts are not discarded.
5142Given
5143  class C {};
5144  C a = C();
5145  C b;
5146  C c = b;
5147The matchers
5148   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
5149would match the declarations for a, b, and c.
5150While
5151   varDecl(hasInitializer(cxxConstructExpr()))
5152only match the declarations for b and c.
5153</pre></td></tr>
5154
5155
5156<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>
5157<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
5158casts are stripped off.
5159
5160Implicit and non-C Style casts are also discarded.
5161Given
5162  int a = 0;
5163  char b = (0);
5164  void* c = reinterpret_cast&lt;char*&gt;(0);
5165  char d = char(0);
5166The matcher
5167   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
5168would match the declarations for a, b, c, and d.
5169while
5170   varDecl(hasInitializer(integerLiteral()))
5171only match the declaration for a.
5172</pre></td></tr>
5173
5174
5175<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>
5176<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
5177parentheses are stripped off.
5178
5179Explicit casts are not discarded.
5180Given
5181  int arr[5];
5182  int a = 0;
5183  char b = (0);
5184  const int c = a;
5185  int *d = (arr);
5186  long e = ((long) 0l);
5187The matchers
5188   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
5189   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
5190would match the declarations for a, b, c, and d, but not e.
5191while
5192   varDecl(hasInitializer(integerLiteral()))
5193   varDecl(hasInitializer(declRefExpr()))
5194would only match the declaration for a.
5195</pre></td></tr>
5196
5197
5198<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('hasInClassInitializer0')"><a name="hasInClassInitializer0Anchor">hasInClassInitializer</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5199<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
5200
5201Given
5202  class C {
5203    int a = 2;
5204    int b = 3;
5205    int c;
5206  };
5207fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
5208  matches 'int a;' but not 'int b;'.
5209fieldDecl(hasInClassInitializer(anything()))
5210  matches 'int a;' and 'int b;' but not 'int c;'.
5211</pre></td></tr>
5212
5213
5214<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>
5215<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
5216definition that has a given body.
5217
5218Given
5219  for (;;) {}
5220hasBody(compoundStmt())
5221  matches 'for (;;) {}'
5222with compoundStmt()
5223  matching '{}'
5224</pre></td></tr>
5225
5226
5227<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>
5228<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
5229switch statement or conditional operator.
5230
5231Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5232  if (true) {}
5233</pre></td></tr>
5234
5235
5236<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>
5237<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
5238
5239Example:
5240    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
5241matches '++x' in
5242    for (x; x &lt; N; ++x) { }
5243</pre></td></tr>
5244
5245
5246<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>
5247<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
5248
5249Example:
5250    forStmt(hasLoopInit(declStmt()))
5251matches 'int x = 0' in
5252    for (int x = 0; x &lt; N; ++x) { }
5253</pre></td></tr>
5254
5255
5256<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>
5257<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
5258
5259Does not match the 'this' parameter of a method.
5260
5261Given
5262  class X { void f(int x, int y, int z) {} };
5263cxxMethodDecl(hasAnyParameter(hasName("y")))
5264  matches f(int x, int y, int z) {}
5265with hasAnyParameter(...)
5266  matching int y
5267</pre></td></tr>
5268
5269
5270<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument2')"><a name="hasAnyTemplateArgument2Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
5271<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5272functionDecl that have at least one TemplateArgument matching the given
5273InnerMatcher.
5274
5275Given
5276  template&lt;typename T&gt; class A {};
5277  template&lt;&gt; class A&lt;double&gt; {};
5278  A&lt;int&gt; a;
5279
5280  template&lt;typename T&gt; f() {};
5281  void func() { f&lt;int&gt;(); };
5282
5283classTemplateSpecializationDecl(hasAnyTemplateArgument(
5284    refersToType(asString("int"))))
5285  matches the specialization A&lt;int&gt;
5286
5287functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5288  matches the specialization f&lt;int&gt;
5289</pre></td></tr>
5290
5291
5292<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasBody4')"><a name="hasBody4Anchor">hasBody</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
5293<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
5294definition that has a given body.
5295
5296Given
5297  for (;;) {}
5298hasBody(compoundStmt())
5299  matches 'for (;;) {}'
5300with compoundStmt()
5301  matching '{}'
5302</pre></td></tr>
5303
5304
5305<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>
5306<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
5307
5308Given
5309  class X { void f(int x) {} };
5310cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5311  matches f(int x) {}
5312with hasParameter(...)
5313  matching int x
5314</pre></td></tr>
5315
5316
5317<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgument2')"><a name="hasTemplateArgument2Anchor">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>
5318<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5319functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5320
5321Given
5322  template&lt;typename T, typename U&gt; class A {};
5323  A&lt;bool, int&gt; b;
5324  A&lt;int, bool&gt; c;
5325
5326  template&lt;typename T&gt; void f() {}
5327  void func() { f&lt;int&gt;(); };
5328classTemplateSpecializationDecl(hasTemplateArgument(
5329    1, refersToType(asString("int"))))
5330  matches the specialization A&lt;bool, int&gt;
5331
5332functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5333  matches the specialization f&lt;int&gt;
5334</pre></td></tr>
5335
5336
5337<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>
5338<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
5339
5340Given:
5341  class X { int f() { return 1; } };
5342cxxMethodDecl(returns(asString("int")))
5343  matches int f() { return 1; }
5344</pre></td></tr>
5345
5346
5347<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>
5348<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
5349switch statement or conditional operator.
5350
5351Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5352  if (true) {}
5353</pre></td></tr>
5354
5355
5356<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>
5357<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
5358
5359Given
5360  if (A* a = GetAPointer()) {}
5361hasConditionVariableStatement(...)
5362  matches 'A* a = GetAPointer()'.
5363</pre></td></tr>
5364
5365
5366<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>
5367<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
5368
5369Examples matches the if statement
5370  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
5371  if (false) false; else true;
5372</pre></td></tr>
5373
5374
5375<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>
5376<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
5377
5378Examples matches the if statement
5379  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
5380  if (false) true; else false;
5381</pre></td></tr>
5382
5383
5384<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>
5385<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
5386matcher.
5387
5388FIXME: Unit test this matcher
5389</pre></td></tr>
5390
5391
5392<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;</td><td class="name" onclick="toggle('hasSyntacticForm0')"><a name="hasSyntacticForm0Anchor">hasSyntacticForm</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5393<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
5394(if expression have it).
5395</pre></td></tr>
5396
5397
5398<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5399<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
5400matches the given matcher.
5401
5402The associated declaration is:
5403- for type nodes, the declaration of the underlying type
5404- for CallExpr, the declaration of the callee
5405- for MemberExpr, the declaration of the referenced member
5406- for CXXConstructExpr, the declaration of the constructor
5407- for CXXNewExpr, the declaration of the operator new
5408
5409For type nodes, hasDeclaration will generally match the declaration of the
5410sugared type. Given
5411  class X {};
5412  typedef X Y;
5413  Y y;
5414in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5415typedefDecl. A common use case is to match the underlying, desugared type.
5416This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5417  varDecl(hasType(hasUnqualifiedDesugaredType(
5418      recordType(hasDeclaration(decl())))))
5419In this matcher, the decl will match the CXXRecordDecl of class X.
5420
5421Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5422  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5423  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5424  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5425  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5426  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5427  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5428</pre></td></tr>
5429
5430
5431<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5432<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
5433matches the given matcher.
5434
5435The associated declaration is:
5436- for type nodes, the declaration of the underlying type
5437- for CallExpr, the declaration of the callee
5438- for MemberExpr, the declaration of the referenced member
5439- for CXXConstructExpr, the declaration of the constructor
5440- for CXXNewExpr, the declaration of the operator new
5441
5442For type nodes, hasDeclaration will generally match the declaration of the
5443sugared type. Given
5444  class X {};
5445  typedef X Y;
5446  Y y;
5447in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5448typedefDecl. A common use case is to match the underlying, desugared type.
5449This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5450  varDecl(hasType(hasUnqualifiedDesugaredType(
5451      recordType(hasDeclaration(decl())))))
5452In this matcher, the decl will match the CXXRecordDecl of class X.
5453
5454Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5455  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5456  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5457  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5458  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5459  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5460  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5461</pre></td></tr>
5462
5463
5464<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5465<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
5466matches the given matcher.
5467
5468The associated declaration is:
5469- for type nodes, the declaration of the underlying type
5470- for CallExpr, the declaration of the callee
5471- for MemberExpr, the declaration of the referenced member
5472- for CXXConstructExpr, the declaration of the constructor
5473- for CXXNewExpr, the declaration of the operator new
5474
5475For type nodes, hasDeclaration will generally match the declaration of the
5476sugared type. Given
5477  class X {};
5478  typedef X Y;
5479  Y y;
5480in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5481typedefDecl. A common use case is to match the underlying, desugared type.
5482This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5483  varDecl(hasType(hasUnqualifiedDesugaredType(
5484      recordType(hasDeclaration(decl())))))
5485In this matcher, the decl will match the CXXRecordDecl of class X.
5486
5487Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5488  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5489  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5490  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5491  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5492  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5493  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5494</pre></td></tr>
5495
5496
5497<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>
5498<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
5499matched by a given matcher.
5500
5501Given
5502  struct X { int m; };
5503  void f(X x) { x.m; m; }
5504memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
5505  matches "x.m" and "m"
5506with hasObjectExpression(...)
5507  matching "x" and the implicit object expression of "m" which has type X*.
5508</pre></td></tr>
5509
5510
5511<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>
5512<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
5513given matcher.
5514
5515Given
5516  struct { int first, second; } first, second;
5517  int i(second.first);
5518  int j(first.second);
5519memberExpr(member(hasName("first")))
5520  matches second.first
5521  but not first.second (because the member name there is "second").
5522</pre></td></tr>
5523
5524
5525<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>
5526<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
5527pointee matches a given matcher.
5528
5529Given
5530  int *a;
5531  int const *b;
5532  float const *f;
5533pointerType(pointee(isConstQualified(), isInteger()))
5534  matches "int const *b"
5535
5536Usable 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;,
5537  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;
5538</pre></td></tr>
5539
5540
5541<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>
5542<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
5543pointee matches a given matcher.
5544
5545Given
5546  int *a;
5547  int const *b;
5548  float const *f;
5549pointerType(pointee(isConstQualified(), isInteger()))
5550  matches "int const *b"
5551
5552Usable 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;,
5553  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;
5554</pre></td></tr>
5555
5556
5557<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasUnderlyingDecl0')"><a name="hasUnderlyingDecl0Anchor">hasUnderlyingDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; InnerMatcher</td></tr>
5558<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
5559matcher.
5560
5561Given
5562  namespace N { template&lt;class T&gt; void f(T t); }
5563  template &lt;class T&gt; void g() { using N::f; f(T()); }
5564unresolvedLookupExpr(hasAnyDeclaration(
5565    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
5566  matches the use of f in g() .
5567</pre></td></tr>
5568
5569
5570<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>
5571<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
5572
5573Given
5574  struct A { struct B { struct C {}; }; };
5575  A::B::C c;
5576nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
5577  matches "A::"
5578</pre></td></tr>
5579
5580
5581<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>
5582<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
5583given TypeLoc.
5584
5585Given
5586  struct A { struct B { struct C {}; }; };
5587  A::B::C c;
5588nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
5589  hasDeclaration(cxxRecordDecl(hasName("A")))))))
5590  matches "A::"
5591</pre></td></tr>
5592
5593
5594<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>
5595<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
5596
5597Given
5598  struct A { struct B { struct C {}; }; };
5599  A::B::C c;
5600nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
5601  matches "A::"
5602</pre></td></tr>
5603
5604
5605<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>
5606<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
5607given namespace matcher.
5608
5609Given
5610  namespace ns { struct A {}; }
5611  ns::A a;
5612nestedNameSpecifier(specifiesNamespace(hasName("ns")))
5613  matches "ns::"
5614</pre></td></tr>
5615
5616
5617<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>
5618<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
5619given QualType matcher without qualifiers.
5620
5621Given
5622  struct A { struct B { struct C {}; }; };
5623  A::B::C c;
5624nestedNameSpecifier(specifiesType(
5625  hasDeclaration(cxxRecordDecl(hasName("A")))
5626))
5627  matches "A::"
5628</pre></td></tr>
5629
5630
5631<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument2')"><a name="hasArgument2Anchor">hasArgument</a></td><td>unsigned N, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5632<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
5633call expression.
5634
5635Example matches y in x(y)
5636    (matcher = callExpr(hasArgument(0, declRefExpr())))
5637  void x(int) { int y; x(y); }
5638</pre></td></tr>
5639
5640
5641<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasReceiverType0')"><a name="hasReceiverType0Anchor">hasReceiverType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
5642<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
5643
5644Example
5645matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
5646matches the [webView ...] message invocation.
5647  NSString *webViewJavaScript = ...
5648  UIWebView *webView = ...
5649  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
5650</pre></td></tr>
5651
5652
5653<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;</td><td class="name" onclick="toggle('hasSourceExpression1')"><a name="hasSourceExpression1Anchor">hasSourceExpression</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5654<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
5655or opaque value's source expression matches the given matcher.
5656
5657Example 1: matches "a string"
5658(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
5659class URL { URL(string); };
5660URL url = "a string";
5661
5662Example 2: matches 'b' (matcher =
5663opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
5664int a = b ?: 1;
5665</pre></td></tr>
5666
5667
5668<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1OverloadExpr.html">OverloadExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyDeclaration0')"><a name="hasAnyDeclaration0Anchor">hasAnyDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
5669<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
5670overloads matches the given matcher.
5671
5672Given
5673  template &lt;typename T&gt; void foo(T);
5674  template &lt;typename T&gt; void bar(T);
5675  template &lt;typename T&gt; void baz(T t) {
5676    foo(t);
5677    bar(t);
5678  }
5679unresolvedLookupExpr(hasAnyDeclaration(
5680    functionTemplateDecl(hasName("foo"))))
5681  matches foo in foo(t); but not bar in bar(t);
5682</pre></td></tr>
5683
5684
5685<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>
5686<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
5687
5688Given
5689  int (*ptr_to_array)[4];
5690  int (*ptr_to_func)(int);
5691
5692varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
5693ptr_to_func but not ptr_to_array.
5694
5695Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
5696</pre></td></tr>
5697
5698
5699<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>
5700<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
5701pointee matches a given matcher.
5702
5703Given
5704  int *a;
5705  int const *b;
5706  float const *f;
5707pointerType(pointee(isConstQualified(), isInteger()))
5708  matches "int const *b"
5709
5710Usable 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;,
5711  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;
5712</pre></td></tr>
5713
5714
5715<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>
5716<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
5717pointee matches a given matcher.
5718
5719Given
5720  int *a;
5721  int const *b;
5722  float const *f;
5723pointerType(pointee(isConstQualified(), isInteger()))
5724  matches "int const *b"
5725
5726Usable 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;,
5727  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;
5728</pre></td></tr>
5729
5730
5731<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>
5732<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
5733
5734Given:
5735  typedef int &amp;int_ref;
5736  int a;
5737  int_ref b = a;
5738
5739varDecl(hasType(qualType(referenceType()))))) will not match the
5740declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
5741</pre></td></tr>
5742
5743
5744<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5745<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
5746matches the given matcher.
5747
5748The associated declaration is:
5749- for type nodes, the declaration of the underlying type
5750- for CallExpr, the declaration of the callee
5751- for MemberExpr, the declaration of the referenced member
5752- for CXXConstructExpr, the declaration of the constructor
5753- for CXXNewExpr, the declaration of the operator new
5754
5755For type nodes, hasDeclaration will generally match the declaration of the
5756sugared type. Given
5757  class X {};
5758  typedef X Y;
5759  Y y;
5760in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5761typedefDecl. A common use case is to match the underlying, desugared type.
5762This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5763  varDecl(hasType(hasUnqualifiedDesugaredType(
5764      recordType(hasDeclaration(decl())))))
5765In this matcher, the decl will match the CXXRecordDecl of class X.
5766
5767Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5768  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5769  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5770  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5771  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5772  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5773  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5774</pre></td></tr>
5775
5776
5777<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('ignoringParens0')"><a name="ignoringParens0Anchor">ignoringParens</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
5778<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
5779
5780Given
5781  void (*fp)(void);
5782The matcher
5783  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
5784would match the declaration for fp.
5785</pre></td></tr>
5786
5787
5788<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>
5789<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
5790</pre></td></tr>
5791
5792
5793<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>
5794<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
5795matches the specified matcher.
5796
5797Example matches y-&gt;x()
5798  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
5799     cxxRecordDecl(hasName("Y")))))))
5800  class Y { public: void x(); };
5801  void z() { Y *y; y-&gt;x(); }
5802</pre></td></tr>
5803
5804
5805<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>
5806<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
5807</pre></td></tr>
5808
5809
5810<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>
5811<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
5812type matches the specified matcher.
5813
5814Example matches X &amp;x and const X &amp;y
5815    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
5816  class X {
5817    void a(X b) {
5818      X &amp;x = b;
5819      const X &amp;y = b;
5820    }
5821  };
5822</pre></td></tr>
5823
5824
5825<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5826<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
5827matches the given matcher.
5828
5829The associated declaration is:
5830- for type nodes, the declaration of the underlying type
5831- for CallExpr, the declaration of the callee
5832- for MemberExpr, the declaration of the referenced member
5833- for CXXConstructExpr, the declaration of the constructor
5834- for CXXNewExpr, the declaration of the operator new
5835
5836For type nodes, hasDeclaration will generally match the declaration of the
5837sugared type. Given
5838  class X {};
5839  typedef X Y;
5840  Y y;
5841in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5842typedefDecl. A common use case is to match the underlying, desugared type.
5843This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5844  varDecl(hasType(hasUnqualifiedDesugaredType(
5845      recordType(hasDeclaration(decl())))))
5846In this matcher, the decl will match the CXXRecordDecl of class X.
5847
5848Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5849  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5850  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5851  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5852  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5853  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5854  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5855</pre></td></tr>
5856
5857
5858<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>
5859<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
5860pointee matches a given matcher.
5861
5862Given
5863  int *a;
5864  int const *b;
5865  float const *f;
5866pointerType(pointee(isConstQualified(), isInteger()))
5867  matches "int const *b"
5868
5869Usable 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;,
5870  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;
5871</pre></td></tr>
5872
5873
5874<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>
5875<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
5876pointee matches a given matcher.
5877
5878Given
5879  int *a;
5880  int const *b;
5881  float const *f;
5882pointerType(pointee(isConstQualified(), isInteger()))
5883  matches "int const *b"
5884
5885Usable 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;,
5886  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;
5887</pre></td></tr>
5888
5889
5890<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;</td><td class="name" onclick="toggle('hasReturnValue0')"><a name="hasReturnValue0Anchor">hasReturnValue</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5891<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
5892
5893Given
5894  return a + b;
5895hasReturnValue(binaryOperator())
5896  matches 'return a + b'
5897with binaryOperator()
5898  matching 'a + b'
5899</pre></td></tr>
5900
5901
5902<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnySubstatement1')"><a name="hasAnySubstatement1Anchor">hasAnySubstatement</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
5903<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
5904a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5905
5906Given
5907  { {}; 1+2; }
5908hasAnySubstatement(compoundStmt())
5909  matches '{ {}; 1+2; }'
5910with compoundStmt()
5911  matching '{}'
5912</pre></td></tr>
5913
5914
5915<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr>
5916<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5917alignof.
5918</pre></td></tr>
5919
5920
5921<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forFunction0')"><a name="forFunction0Anchor">forFunction</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt; InnerMatcher</td></tr>
5922<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to
5923
5924Given:
5925F&amp; operator=(const F&amp; o) {
5926  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
5927  return *this;
5928}
5929returnStmt(forFunction(hasName("operator=")))
5930  matches 'return *this'
5931  but does match 'return &gt; 0'
5932</pre></td></tr>
5933
5934
5935<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr>
5936<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5937sizeof.
5938</pre></td></tr>
5939
5940
5941<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasReplacementType0')"><a name="hasReplacementType0Anchor">hasReplacementType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
5942<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
5943type that matches the provided matcher.
5944
5945Given
5946  template &lt;typename T&gt;
5947  double F(T t);
5948  int i;
5949  double j = F(i);
5950
5951substTemplateTypeParmType(hasReplacementType(type())) matches int
5952</pre></td></tr>
5953
5954
5955<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>
5956<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
5957statement. This matcher may produce multiple matches.
5958
5959Given
5960  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
5961switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
5962  matches four times, with "c" binding each of "case 1:", "case 2:",
5963"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
5964"switch (1)", "switch (2)" and "switch (2)".
5965</pre></td></tr>
5966
5967
5968<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</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>
5969<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
5970switch statement or conditional operator.
5971
5972Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5973  if (true) {}
5974</pre></td></tr>
5975
5976
5977<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5978<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
5979matches the given matcher.
5980
5981The associated declaration is:
5982- for type nodes, the declaration of the underlying type
5983- for CallExpr, the declaration of the callee
5984- for MemberExpr, the declaration of the referenced member
5985- for CXXConstructExpr, the declaration of the constructor
5986- for CXXNewExpr, the declaration of the operator new
5987
5988For type nodes, hasDeclaration will generally match the declaration of the
5989sugared type. Given
5990  class X {};
5991  typedef X Y;
5992  Y y;
5993in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5994typedefDecl. A common use case is to match the underlying, desugared type.
5995This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5996  varDecl(hasType(hasUnqualifiedDesugaredType(
5997      recordType(hasDeclaration(decl())))))
5998In this matcher, the decl will match the CXXRecordDecl of class X.
5999
6000Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
6001  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
6002  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
6003  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
6004  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
6005  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
6006  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6007</pre></td></tr>
6008
6009
6010<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>
6011<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
6012
6013Given
6014  struct B { int next; };
6015  template&lt;int(B::*next_ptr)&gt; struct A {};
6016  A&lt;&amp;B::next&gt; a;
6017templateSpecializationType(hasAnyTemplateArgument(
6018  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
6019  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
6020    B::next
6021</pre></td></tr>
6022
6023
6024<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>
6025<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
6026declaration.
6027
6028Given
6029  struct B { int next; };
6030  template&lt;int(B::*next_ptr)&gt; struct A {};
6031  A&lt;&amp;B::next&gt; a;
6032classTemplateSpecializationDecl(hasAnyTemplateArgument(
6033    refersToDeclaration(fieldDecl(hasName("next")))))
6034  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
6035    B::next
6036</pre></td></tr>
6037
6038
6039<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>
6040<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
6041
6042Given
6043  template&lt;int T&gt; struct C {};
6044  C&lt;42&gt; c;
6045classTemplateSpecializationDecl(
6046  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
6047  matches the implicit instantiation of C in C&lt;42&gt;.
6048</pre></td></tr>
6049
6050
6051<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToTemplate0')"><a name="refersToTemplate0Anchor">refersToTemplate</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt; InnerMatcher</td></tr>
6052<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
6053
6054Given
6055  template&lt;template &lt;typename&gt; class S&gt; class X {};
6056  template&lt;typename T&gt; class Y {};"
6057  X&lt;Y&gt; xi;
6058classTemplateSpecializationDecl(hasAnyTemplateArgument(
6059    refersToTemplate(templateName())))
6060  matches the specialization X&lt;Y&gt;
6061</pre></td></tr>
6062
6063
6064<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>
6065<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
6066
6067Given
6068  struct X {};
6069  template&lt;typename T&gt; struct A {};
6070  A&lt;X&gt; a;
6071classTemplateSpecializationDecl(hasAnyTemplateArgument(
6072    refersToType(class(hasName("X")))))
6073  matches the specialization A&lt;X&gt;
6074</pre></td></tr>
6075
6076
6077<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>
6078<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6079functionDecl that have at least one TemplateArgument matching the given
6080InnerMatcher.
6081
6082Given
6083  template&lt;typename T&gt; class A {};
6084  template&lt;&gt; class A&lt;double&gt; {};
6085  A&lt;int&gt; a;
6086
6087  template&lt;typename T&gt; f() {};
6088  void func() { f&lt;int&gt;(); };
6089
6090classTemplateSpecializationDecl(hasAnyTemplateArgument(
6091    refersToType(asString("int"))))
6092  matches the specialization A&lt;int&gt;
6093
6094functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6095  matches the specialization f&lt;int&gt;
6096</pre></td></tr>
6097
6098
6099<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
6100<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
6101matches the given matcher.
6102
6103The associated declaration is:
6104- for type nodes, the declaration of the underlying type
6105- for CallExpr, the declaration of the callee
6106- for MemberExpr, the declaration of the referenced member
6107- for CXXConstructExpr, the declaration of the constructor
6108- for CXXNewExpr, the declaration of the operator new
6109
6110For type nodes, hasDeclaration will generally match the declaration of the
6111sugared type. Given
6112  class X {};
6113  typedef X Y;
6114  Y y;
6115in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6116typedefDecl. A common use case is to match the underlying, desugared type.
6117This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6118  varDecl(hasType(hasUnqualifiedDesugaredType(
6119      recordType(hasDeclaration(decl())))))
6120In this matcher, the decl will match the CXXRecordDecl of class X.
6121
6122Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
6123  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
6124  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
6125  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
6126  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
6127  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
6128  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6129</pre></td></tr>
6130
6131
6132<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>
6133<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6134functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
6135
6136Given
6137  template&lt;typename T, typename U&gt; class A {};
6138  A&lt;bool, int&gt; b;
6139  A&lt;int, bool&gt; c;
6140
6141  template&lt;typename T&gt; void f() {}
6142  void func() { f&lt;int&gt;(); };
6143classTemplateSpecializationDecl(hasTemplateArgument(
6144    1, refersToType(asString("int"))))
6145  matches the specialization A&lt;bool, int&gt;
6146
6147functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6148  matches the specialization f&lt;int&gt;
6149</pre></td></tr>
6150
6151
6152<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
6153<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
6154matches the given matcher.
6155
6156The associated declaration is:
6157- for type nodes, the declaration of the underlying type
6158- for CallExpr, the declaration of the callee
6159- for MemberExpr, the declaration of the referenced member
6160- for CXXConstructExpr, the declaration of the constructor
6161- for CXXNewExpr, the declaration of the operator new
6162
6163For type nodes, hasDeclaration will generally match the declaration of the
6164sugared type. Given
6165  class X {};
6166  typedef X Y;
6167  Y y;
6168in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6169typedefDecl. A common use case is to match the underlying, desugared type.
6170This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6171  varDecl(hasType(hasUnqualifiedDesugaredType(
6172      recordType(hasDeclaration(decl())))))
6173In this matcher, the decl will match the CXXRecordDecl of class X.
6174
6175Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
6176  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
6177  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
6178  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
6179  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
6180  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
6181  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6182</pre></td></tr>
6183
6184
6185<tr><td>Matcher&lt;T&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>const Matcher&lt;T&gt;  Matcher</td></tr>
6186<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
6187
6188Generates results for each match.
6189
6190For example, in:
6191  class A { class B {}; class C {}; };
6192The matcher:
6193  cxxRecordDecl(hasName("::A"),
6194                findAll(cxxRecordDecl(isDefinition()).bind("m")))
6195will generate results for A, B and C.
6196
6197Usable as: Any Matcher
6198</pre></td></tr>
6199
6200
6201<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</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>
6202<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
6203matcher.
6204
6205Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6206            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6207            and U (matcher = typedefDecl(hasType(asString("int")))
6208 class X {};
6209 void y(X &amp;x) { x; X z; }
6210 typedef int U;
6211</pre></td></tr>
6212
6213
6214<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
6215<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
6216matches the given matcher.
6217
6218The associated declaration is:
6219- for type nodes, the declaration of the underlying type
6220- for CallExpr, the declaration of the callee
6221- for MemberExpr, the declaration of the referenced member
6222- for CXXConstructExpr, the declaration of the constructor
6223- for CXXNewExpr, the declaration of the operator new
6224
6225For type nodes, hasDeclaration will generally match the declaration of the
6226sugared type. Given
6227  class X {};
6228  typedef X Y;
6229  Y y;
6230in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6231typedefDecl. A common use case is to match the underlying, desugared type.
6232This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6233  varDecl(hasType(hasUnqualifiedDesugaredType(
6234      recordType(hasDeclaration(decl())))))
6235In this matcher, the decl will match the CXXRecordDecl of class X.
6236
6237Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
6238  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
6239  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
6240  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
6241  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
6242  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
6243  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6244</pre></td></tr>
6245
6246
6247<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('hasUnqualifiedDesugaredType0')"><a name="hasUnqualifiedDesugaredType0Anchor">hasUnqualifiedDesugaredType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt; InnerMatcher</td></tr>
6248<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
6249type of the matched node.
6250
6251For example, in:
6252  class A {};
6253  using B = A;
6254The matcher type(hasUnqualifeidDesugaredType(recordType())) matches
6255both B and A.
6256</pre></td></tr>
6257
6258
6259<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>
6260<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
6261
6262Given
6263  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
6264unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
6265  matches sizeof(a) and alignof(c)
6266</pre></td></tr>
6267
6268
6269<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>
6270<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
6271
6272Example matches true (matcher = hasUnaryOperand(
6273                                  cxxBoolLiteral(equals(true))))
6274  !true
6275</pre></td></tr>
6276
6277
6278<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>const Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
6279<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
6280matches the given matcher.
6281
6282The associated declaration is:
6283- for type nodes, the declaration of the underlying type
6284- for CallExpr, the declaration of the callee
6285- for MemberExpr, the declaration of the referenced member
6286- for CXXConstructExpr, the declaration of the constructor
6287- for CXXNewExpr, the declaration of the operator new
6288
6289For type nodes, hasDeclaration will generally match the declaration of the
6290sugared type. Given
6291  class X {};
6292  typedef X Y;
6293  Y y;
6294in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6295typedefDecl. A common use case is to match the underlying, desugared type.
6296This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6297  varDecl(hasType(hasUnqualifiedDesugaredType(
6298      recordType(hasDeclaration(decl())))))
6299In this matcher, the decl will match the CXXRecordDecl of class X.
6300
6301Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
6302  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
6303  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
6304  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;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
6305  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
6306  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
6307  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6308</pre></td></tr>
6309
6310
6311<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>
6312<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
6313
6314Given
6315  namespace X { void b(); }
6316  using X::b;
6317usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
6318  matches using X::b </pre></td></tr>
6319
6320
6321<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>
6322<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
6323matched by the given matcher.
6324
6325Given
6326  namespace X { int a; void b(); }
6327  using X::a;
6328  using X::b;
6329usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
6330  matches using X::b but not using X::a </pre></td></tr>
6331
6332
6333<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
6334<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
6335declaration's type.
6336
6337In case of a value declaration (for example a variable declaration),
6338this resolves one layer of indirection. For example, in the value
6339declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6340X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6341declaration of x.
6342
6343Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6344            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6345 class X {};
6346 void y(X &amp;x) { x; X z; }
6347
6348Usable 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;
6349</pre></td></tr>
6350
6351
6352<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
6353<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
6354matcher.
6355
6356Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6357            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6358            and U (matcher = typedefDecl(hasType(asString("int")))
6359 class X {};
6360 void y(X &amp;x) { x; X z; }
6361 typedef int U;
6362</pre></td></tr>
6363
6364
6365<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>
6366<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
6367that matches the given matcher.
6368
6369Example matches x (matcher = varDecl(hasInitializer(callExpr())))
6370  bool y() { return true; }
6371  bool x = y();
6372</pre></td></tr>
6373
6374
6375<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>
6376<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
6377expression.
6378
6379Given
6380  void f(int b) {
6381    int a[b];
6382  }
6383variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
6384  varDecl(hasName("b")))))))
6385  matches "int a[b]"
6386</pre></td></tr>
6387
6388
6389<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>
6390<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
6391definition that has a given body.
6392
6393Given
6394  for (;;) {}
6395hasBody(compoundStmt())
6396  matches 'for (;;) {}'
6397with compoundStmt()
6398  matching '{}'
6399</pre></td></tr>
6400
6401
6402<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>
6403<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
6404switch statement or conditional operator.
6405
6406Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6407  if (true) {}
6408</pre></td></tr>
6409
6410
6411<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>
6412<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
6413NestedNameSpecifier-matcher matches.
6414</pre></td></tr>
6415
6416
6417<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>
6418<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
6419QualType-matcher matches.
6420</pre></td></tr>
6421
6422<!--END_TRAVERSAL_MATCHERS -->
6423</table>
6424
6425</div>
6426</body>
6427</html>
6428
6429
6430