1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2          "http://www.w3.org/TR/html4/strict.dtd">
3<html>
4<head>
5<title>AST Matcher Reference</title>
6<link type="text/css" rel="stylesheet" href="../menu.css" />
7<link type="text/css" rel="stylesheet" href="../content.css" />
8<style type="text/css">
9td {
10  padding: .33em;
11}
12td.doc {
13  display: none;
14  border-bottom: 1px solid black;
15}
16td.name:hover {
17  color: blue;
18  cursor: pointer;
19}
20</style>
21<script type="text/javascript">
22function toggle(id) {
23  if (!id) return;
24  row = document.getElementById(id);
25  if (row.style.display != 'table-cell')
26    row.style.display = 'table-cell';
27  else
28    row.style.display = 'none';
29}
30</script>
31</head>
32<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
33
34<!--#include virtual="../menu.html.incl"-->
35
36<div id="content">
37
38<h1>AST Matcher Reference</h1>
39
40<p>This document shows all currently implemented matchers. The matchers are grouped
41by category and node type they match. You can click on matcher names to show the
42matcher's source documentation.</p>
43
44<p>There are three different basic categories of matchers:
45<ul>
46<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
47<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
48<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
49</ul>
50</p>
51
52<p>Within each category the matchers are ordered by node type they match on.
53Note that if a matcher can match multiple node types, it will it will appear
54multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
55find all matchers that can be used to match on Stmt nodes.</p>
56
57<p>The exception to that rule are matchers that can match on any node. Those
58are marked with a * and are listed in the beginning of each category.</p>
59
60<!-- ======================================================================= -->
61<h2 id="decl-matchers">Node Matchers</h2>
62<!-- ======================================================================= -->
63
64<p>Node matchers are at the core of matcher expressions - they specify the type
65of node that is expected. Every match expression starts with a node matcher,
66which can then be further refined with a narrowing or traversal matcher. All
67traversal matchers take node matchers as their arguments.</p>
68
69<p>For convenience, all node matchers take an arbitrary number of arguments
70and implicitly act as allOf matchers.</p>
71
72<p>Node matchers are the only matchers that support the bind("id") call to
73bind the matched node to the given string, to be later retrieved from the
74match callback.</p>
75
76<table>
77<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
78<!-- START_DECL_MATCHERS -->
79
80<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
81<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
82
83Example matches Z
84  template&lt;class T&gt; class Z {};
85</pre></td></tr>
86
87
88<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>
89<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
90
91Given
92  template&lt;typename T&gt; class A {};
93  template&lt;&gt; class A&lt;double&gt; {};
94  A&lt;int&gt; a;
95classTemplateSpecializationDecl()
96  matches the specializations A&lt;int&gt; and A&lt;double&gt;
97</pre></td></tr>
98
99
100<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('constructorDecl0')"><a name="constructorDecl0Anchor">constructorDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
101<tr><td colspan="4" class="doc" id="constructorDecl0"><pre>Matches C++ constructor declarations.
102
103Example matches Foo::Foo() and Foo::Foo(int)
104  class Foo {
105   public:
106    Foo();
107    Foo(int);
108    int DoSomething();
109  };
110</pre></td></tr>
111
112
113<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
114<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
115
116Examples matches X, C, and the friend declaration inside C;
117  void X();
118  class C {
119    friend X;
120  };
121</pre></td></tr>
122
123
124<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('destructorDecl0')"><a name="destructorDecl0Anchor">destructorDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
125<tr><td colspan="4" class="doc" id="destructorDecl0"><pre>Matches explicit C++ destructor declarations.
126
127Example matches Foo::~Foo()
128  class Foo {
129   public:
130    virtual ~Foo();
131  };
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('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>
136<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
137
138Example matches A, B, C
139  enum X {
140    A, B, C
141  };
142</pre></td></tr>
143
144
145<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>
146<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
147
148Example matches X
149  enum X {
150    A, B, C
151  };
152</pre></td></tr>
153
154
155<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>
156<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
157
158Given
159  class X { int m; };
160fieldDecl()
161  matches 'm'.
162</pre></td></tr>
163
164
165<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>
166<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
167
168Example matches f
169  void f();
170</pre></td></tr>
171
172
173<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>
174<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
175
176Example matches f
177  template&lt;class T&gt; void f(T t) {}
178</pre></td></tr>
179
180
181<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('methodDecl0')"><a name="methodDecl0Anchor">methodDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
182<tr><td colspan="4" class="doc" id="methodDecl0"><pre>Matches method declarations.
183
184Example matches y
185  class X { void y() };
186</pre></td></tr>
187
188
189<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
190<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
191
192Example matches X, S, the anonymous union type, i, and U;
193  typedef int X;
194  struct S {
195    union {
196      int i;
197    } U;
198  };
199</pre></td></tr>
200
201
202<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
203<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches C++ class declarations.
204
205Example matches X, Z
206  class X;
207  template&lt;class T&gt; class Z {};
208</pre></td></tr>
209
210
211<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>
212<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
213
214Given
215  namespace X { int x; }
216  using X::x;
217usingDecl()
218  matches using X::x </pre></td></tr>
219
220
221<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>
222<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
223
224Note: this does not match declarations of member variables, which are
225"field" declarations in Clang parlance.
226
227Example matches a
228  int a;
229</pre></td></tr>
230
231
232<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>
233<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
234</pre></td></tr>
235
236
237<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>
238<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
239
240Given
241  namespace ns {
242    struct A { static void f(); };
243    void A::f() {}
244    void g() { A::f(); }
245  }
246  ns::A a;
247nestedNameSpecifier()
248  matches "ns::" and both "A::"
249</pre></td></tr>
250
251
252<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>
253<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
254</pre></td></tr>
255
256
257<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>
258<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
259
260Given
261  int i = a[1];
262arraySubscriptExpr()
263  matches "a[1]"
264</pre></td></tr>
265
266
267<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>
268<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
269
270 int i = 100;
271  __asm("mov al, 2");
272asmStmt()
273  matches '__asm("mov al, 2")'
274</pre></td></tr>
275
276
277<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>
278<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
279
280Example matches a || b
281  !(a || b)
282</pre></td></tr>
283
284
285<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('bindTemporaryExpr0')"><a name="bindTemporaryExpr0Anchor">bindTemporaryExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
286<tr><td colspan="4" class="doc" id="bindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
287
288Example matches FunctionTakesString(GetStringByValue())
289    (matcher = bindTemporaryExpr())
290  FunctionTakesString(GetStringByValue());
291  FunctionTakesStringByPointer(GetStringPointer());
292</pre></td></tr>
293
294
295<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('boolLiteral0')"><a name="boolLiteral0Anchor">boolLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
296<tr><td colspan="4" class="doc" id="boolLiteral0"><pre>Matches bool literals.
297
298Example matches true
299  true
300</pre></td></tr>
301
302
303<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>
304<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
305
306Given
307  while (true) { break; }
308breakStmt()
309  matches 'break'
310</pre></td></tr>
311
312
313<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>
314<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
315
316Example: Matches (int*) 2.2f in
317  int i = (int) 2.2f;
318</pre></td></tr>
319
320
321<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>
322<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
323
324Example matches x.y() and y()
325  X x;
326  x.y();
327  y();
328</pre></td></tr>
329
330
331<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>
332<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
333
334Example: castExpr() matches each of the following:
335  (int) 3;
336  const_cast&lt;Expr *&gt;(SubExpr);
337  char c = 0;
338but does not match
339  int i = (0);
340  int k = 0;
341</pre></td></tr>
342
343
344<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('catchStmt0')"><a name="catchStmt0Anchor">catchStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
345<tr><td colspan="4" class="doc" id="catchStmt0"><pre>Matches catch statements.
346
347  try {} catch(int i) {}
348catchStmt()
349  matches 'catch(int i)'
350</pre></td></tr>
351
352
353<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>
354<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
355
356Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
357though.
358
359Example matches 'a', L'a'
360  char ch = 'a'; wchar_t chw = L'a';
361</pre></td></tr>
362
363
364<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>
365<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
366
367Example match: {1}, (1, 2)
368  int array[4] = {1}; vector int myvec = (vector int)(1, 2);
369</pre></td></tr>
370
371
372<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>
373<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
374
375Example matches '{}' and '{{}}'in 'for (;;) {{}}'
376  for (;;) {{}}
377</pre></td></tr>
378
379
380<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>
381<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
382
383Example matches a ? b : c
384  (a ? b : c) + 42
385</pre></td></tr>
386
387
388<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constCastExpr0')"><a name="constCastExpr0Anchor">constCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
389<tr><td colspan="4" class="doc" id="constCastExpr0"><pre>Matches a const_cast expression.
390
391Example: Matches const_cast&lt;int*&gt;(&amp;r) in
392  int n = 42;
393  const int &amp;r(n);
394  int* p = const_cast&lt;int*&gt;(&amp;r);
395</pre></td></tr>
396
397
398<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constructExpr0')"><a name="constructExpr0Anchor">constructExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
399<tr><td colspan="4" class="doc" id="constructExpr0"><pre>Matches constructor call expressions (including implicit ones).
400
401Example matches string(ptr, n) and ptr within arguments of f
402    (matcher = constructExpr())
403  void f(const string &amp;a, const string &amp;b);
404  char *ptr;
405  int n;
406  f(string(ptr, n), ptr);
407</pre></td></tr>
408
409
410<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
411<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
412
413Given
414  while (true) { continue; }
415continueStmt()
416  matches 'continue'
417</pre></td></tr>
418
419
420<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>
421<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
422
423Example matches x in if (x)
424  bool x;
425  if (x) {}
426</pre></td></tr>
427
428
429<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>
430<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
431
432Given
433  int a;
434declStmt()
435  matches 'int a'.
436</pre></td></tr>
437
438
439<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultArgExpr0')"><a name="defaultArgExpr0Anchor">defaultArgExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
440<tr><td colspan="4" class="doc" id="defaultArgExpr0"><pre>Matches the value of a default argument at the call site.
441
442Example matches the CXXDefaultArgExpr placeholder inserted for the
443    default value of the second parameter in the call expression f(42)
444    (matcher = defaultArgExpr())
445  void f(int x, int y = 0);
446  f(42);
447</pre></td></tr>
448
449
450<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('deleteExpr0')"><a name="deleteExpr0Anchor">deleteExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
451<tr><td colspan="4" class="doc" id="deleteExpr0"><pre>Matches delete expressions.
452
453Given
454  delete X;
455deleteExpr()
456  matches 'delete X'.
457</pre></td></tr>
458
459
460<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
461<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
462
463Given
464  do {} while (true);
465doStmt()
466  matches 'do {} while(true)'
467</pre></td></tr>
468
469
470<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('dynamicCastExpr0')"><a name="dynamicCastExpr0Anchor">dynamicCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
471<tr><td colspan="4" class="doc" id="dynamicCastExpr0"><pre>Matches a dynamic_cast expression.
472
473Example:
474  dynamicCastExpr()
475matches
476  dynamic_cast&lt;D*&gt;(&amp;b);
477in
478  struct B { virtual ~B() {} }; struct D : B {};
479  B b;
480  D* p = dynamic_cast&lt;D*&gt;(&amp;b);
481</pre></td></tr>
482
483
484<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
485<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
486
487Matches any cast expression written in user code, whether it be a
488C-style cast, a functional-style cast, or a keyword cast.
489
490Does not match implicit conversions.
491
492Note: the name "explicitCast" is chosen to match Clang's terminology, as
493Clang uses the term "cast" to apply to implicit conversions as well as to
494actual cast expressions.
495
496hasDestinationType.
497
498Example: matches all five of the casts in
499  int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
500but does not match the implicit conversion in
501  long ell = 42;
502</pre></td></tr>
503
504
505<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
506<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
507
508Example matches x()
509  void f() { x(); }
510</pre></td></tr>
511
512
513<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forRangeStmt0')"><a name="forRangeStmt0Anchor">forRangeStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
514<tr><td colspan="4" class="doc" id="forRangeStmt0"><pre>Matches range-based for statements.
515
516forRangeStmt() matches 'for (auto a : i)'
517  int i[] =  {1, 2, 3}; for (auto a : i);
518  for(int j = 0; j &lt; 5; ++j);
519</pre></td></tr>
520
521
522<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>
523<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
524
525Example matches 'for (;;) {}'
526  for (;;) {}
527  int i[] =  {1, 2, 3}; for (auto a : i);
528</pre></td></tr>
529
530
531<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('functionalCastExpr0')"><a name="functionalCastExpr0Anchor">functionalCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
532<tr><td colspan="4" class="doc" id="functionalCastExpr0"><pre>Matches functional cast expressions
533
534Example: Matches Foo(bar);
535  Foo f = bar;
536  Foo g = (Foo) bar;
537  Foo h = Foo(bar);
538</pre></td></tr>
539
540
541<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>
542<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
543
544Given
545  goto FOO;
546  FOO: bar();
547gotoStmt()
548  matches 'goto FOO'
549</pre></td></tr>
550
551
552<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>
553<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
554
555Example matches 'if (x) {}'
556  if (x) {}
557</pre></td></tr>
558
559
560<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>
561<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
562
563This matches many different places, including function call return value
564eliding, as well as any type conversions.
565</pre></td></tr>
566
567
568<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
569<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
570
571Given
572  int a[] = { 1, 2 };
573  struct B { int x, y; };
574  B b = { 5, 6 };
575initList()
576  matches "{ 1, 2 }" and "{ 5, 6 }"
577</pre></td></tr>
578
579
580<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>
581<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings.
582
583Not matching character-encoded integers such as L'a'.
584
585Example matches 1, 1L, 0x1, 1U
586</pre></td></tr>
587
588
589<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
590<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
591
592Given
593  goto FOO;
594  FOO: bar();
595labelStmt()
596  matches 'FOO:'
597</pre></td></tr>
598
599
600<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
601<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
602
603Example matches [&amp;](){return 5;}
604  [&amp;](){return 5;}
605</pre></td></tr>
606
607
608<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>
609<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
610
611Example: Given
612  struct T {void func()};
613  T f();
614  void g(T);
615materializeTemporaryExpr() matches 'f()' in these statements
616  T u(f());
617  g(f());
618but does not match
619  f();
620  f().func();
621</pre></td></tr>
622
623
624<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('memberCallExpr0')"><a name="memberCallExpr0Anchor">memberCallExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
625<tr><td colspan="4" class="doc" id="memberCallExpr0"><pre>Matches member call expressions.
626
627Example matches x.y()
628  X x;
629  x.y();
630</pre></td></tr>
631
632
633<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
634<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
635
636Given
637  class Y {
638    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
639    int a; static int b;
640  };
641memberExpr()
642  matches this-&gt;x, x, y.x, a, this-&gt;b
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('newExpr0')"><a name="newExpr0Anchor">newExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
647<tr><td colspan="4" class="doc" id="newExpr0"><pre>Matches new expressions.
648
649Given
650  new X;
651newExpr()
652  matches 'new X'.
653</pre></td></tr>
654
655
656<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('nullPtrLiteralExpr0')"><a name="nullPtrLiteralExpr0Anchor">nullPtrLiteralExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
657<tr><td colspan="4" class="doc" id="nullPtrLiteralExpr0"><pre>Matches nullptr literal.
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('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>
662<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
663
664  foo();;
665nullStmt()
666  matches the second ';'
667</pre></td></tr>
668
669
670<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('operatorCallExpr0')"><a name="operatorCallExpr0Anchor">operatorCallExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
671<tr><td colspan="4" class="doc" id="operatorCallExpr0"><pre>Matches overloaded operator calls.
672
673Note that if an operator isn't overloaded, it won't match. Instead, use
674binaryOperator matcher.
675Currently it does not match operators such as new delete.
676FIXME: figure out why these do not match?
677
678Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
679    (matcher = operatorCallExpr())
680  ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
681  ostream &amp;o; int b = 1, c = 1;
682  o &lt;&lt; b &lt;&lt; c;
683</pre></td></tr>
684
685
686<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('reinterpretCastExpr0')"><a name="reinterpretCastExpr0Anchor">reinterpretCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
687<tr><td colspan="4" class="doc" id="reinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
688
689Either the source expression or the destination type can be matched
690using has(), but hasDestinationType() is more specific and can be
691more readable.
692
693Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
694  void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
695</pre></td></tr>
696
697
698<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
699<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
700
701Given
702  return 1;
703returnStmt()
704  matches 'return 1'
705</pre></td></tr>
706
707
708<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('staticCastExpr0')"><a name="staticCastExpr0Anchor">staticCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
709<tr><td colspan="4" class="doc" id="staticCastExpr0"><pre>Matches a C++ static_cast expression.
710
711hasDestinationType
712reinterpretCast
713
714Example:
715  staticCastExpr()
716matches
717  static_cast&lt;long&gt;(8)
718in
719  long eight(static_cast&lt;long&gt;(8));
720</pre></td></tr>
721
722
723<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>
724<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
725
726Given
727  { ++a; }
728stmt()
729  matches both the compound statement '{ ++a; }' and '++a'.
730</pre></td></tr>
731
732
733<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
734<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
735
736Example matches "abcd", L"abcd"
737  char *s = "abcd"; wchar_t *ws = L"abcd"
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('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>
742<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
743
744Given
745  switch(a) { case 42: break; default: break; }
746switchCase()
747  matches 'case 42: break;' and 'default: break;'.
748</pre></td></tr>
749
750
751<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
752<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
753
754Given
755  switch(a) { case 42: break; default: break; }
756switchStmt()
757  matches 'switch(a)'.
758</pre></td></tr>
759
760
761<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('thisExpr0')"><a name="thisExpr0Anchor">thisExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
762<tr><td colspan="4" class="doc" id="thisExpr0"><pre>Matches implicit and explicit this expressions.
763
764Example matches the implicit this expression in "return i".
765    (matcher = thisExpr())
766struct foo {
767  int i;
768  int f() { return i; }
769};
770</pre></td></tr>
771
772
773<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('throwExpr0')"><a name="throwExpr0Anchor">throwExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
774<tr><td colspan="4" class="doc" id="throwExpr0"><pre>Matches throw expressions.
775
776  try { throw 5; } catch(int i) {}
777throwExpr()
778  matches 'throw 5'
779</pre></td></tr>
780
781
782<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('tryStmt0')"><a name="tryStmt0Anchor">tryStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
783<tr><td colspan="4" class="doc" id="tryStmt0"><pre>Matches try statements.
784
785  try {} catch(int i) {}
786tryStmt()
787  matches 'try {}'
788</pre></td></tr>
789
790
791<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
792<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
793
794Given
795  Foo x = bar;
796  int y = sizeof(x) + alignof(x);
797unaryExprOrTypeTraitExpr()
798  matches sizeof(x) and alignof(x)
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('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>
803<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
804
805Example matches !a
806  !a || b
807</pre></td></tr>
808
809
810<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
811<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
812
813Example match: "foo"_suffix
814</pre></td></tr>
815
816
817<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>
818<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
819
820Given
821  while (true) {}
822whileStmt()
823  matches 'while (true) {}'.
824</pre></td></tr>
825
826
827<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('arrayTypeLoc0')"><a name="arrayTypeLoc0Anchor">arrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayTypeLoc.html">ArrayTypeLoc</a>&gt;...</td></tr>
828<tr><td colspan="4" class="doc" id="arrayTypeLoc0"><pre>Matches all kinds of arrays.
829
830Given
831  int a[] = { 2, 3 };
832  int b[4];
833  void f() { int c[a[0]]; }
834arrayType()
835  matches "int a[]", "int b[4]" and "int c[a[0]]";
836</pre></td></tr>
837
838
839<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('atomicTypeLoc0')"><a name="atomicTypeLoc0Anchor">atomicTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicTypeLoc.html">AtomicTypeLoc</a>&gt;...</td></tr>
840<tr><td colspan="4" class="doc" id="atomicTypeLoc0"><pre>Matches atomic types.
841
842Given
843  _Atomic(int) i;
844atomicType()
845  matches "_Atomic(int) i"
846</pre></td></tr>
847
848
849<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('autoTypeLoc0')"><a name="autoTypeLoc0Anchor">autoTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoTypeLoc.html">AutoTypeLoc</a>&gt;...</td></tr>
850<tr><td colspan="4" class="doc" id="autoTypeLoc0"><pre>Matches types nodes representing C++11 auto types.
851
852Given:
853  auto n = 4;
854  int v[] = { 2, 3 }
855  for (auto i : v) { }
856autoType()
857  matches "auto n" and "auto i"
858</pre></td></tr>
859
860
861<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('blockPointerTypeLoc0')"><a name="blockPointerTypeLoc0Anchor">blockPointerTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerTypeLoc.html">BlockPointerTypeLoc</a>&gt;...</td></tr>
862<tr><td colspan="4" class="doc" id="blockPointerTypeLoc0"><pre>Matches block pointer types, i.e. types syntactically represented as
863"void (^)(int)".
864
865The pointee is always required to be a FunctionType.
866</pre></td></tr>
867
868
869<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('builtinTypeLoc0')"><a name="builtinTypeLoc0Anchor">builtinTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BuiltinTypeLoc.html">BuiltinTypeLoc</a>&gt;...</td></tr>
870<tr><td colspan="4" class="doc" id="builtinTypeLoc0"><pre>Matches builtin Types.
871
872Given
873  struct A {};
874  A a;
875  int b;
876  float c;
877  bool d;
878builtinType()
879  matches "int b", "float c" and "bool d"
880</pre></td></tr>
881
882
883<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('complexTypeLoc0')"><a name="complexTypeLoc0Anchor">complexTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexTypeLoc.html">ComplexTypeLoc</a>&gt;...</td></tr>
884<tr><td colspan="4" class="doc" id="complexTypeLoc0"><pre>Matches C99 complex types.
885
886Given
887  _Complex float f;
888complexType()
889  matches "_Complex float f"
890</pre></td></tr>
891
892
893<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('constantArrayTypeLoc0')"><a name="constantArrayTypeLoc0Anchor">constantArrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConstantArrayTypeLoc.html">ConstantArrayTypeLoc</a>&gt;...</td></tr>
894<tr><td colspan="4" class="doc" id="constantArrayTypeLoc0"><pre>Matches C arrays with a specified constant size.
895
896Given
897  void() {
898    int a[2];
899    int b[] = { 2, 3 };
900    int c[b[0]];
901  }
902constantArrayType()
903  matches "int a[2]"
904</pre></td></tr>
905
906
907<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('dependentSizedArrayTypeLoc0')"><a name="dependentSizedArrayTypeLoc0Anchor">dependentSizedArrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayTypeLoc.html">DependentSizedArrayTypeLoc</a>&gt;...</td></tr>
908<tr><td colspan="4" class="doc" id="dependentSizedArrayTypeLoc0"><pre>Matches C++ arrays whose size is a value-dependent expression.
909
910Given
911  template&lt;typename T, int Size&gt;
912  class array {
913    T data[Size];
914  };
915dependentSizedArrayType
916  matches "T data[Size]"
917</pre></td></tr>
918
919
920<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('functionTypeLoc0')"><a name="functionTypeLoc0Anchor">functionTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionTypeLoc.html">FunctionTypeLoc</a>&gt;...</td></tr>
921<tr><td colspan="4" class="doc" id="functionTypeLoc0"><pre>Matches FunctionType nodes.
922
923Given
924  int (*f)(int);
925  void g();
926functionType()
927  matches "int (*f)(int)" and the type of "g".
928</pre></td></tr>
929
930
931<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('incompleteArrayTypeLoc0')"><a name="incompleteArrayTypeLoc0Anchor">incompleteArrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayTypeLoc.html">IncompleteArrayTypeLoc</a>&gt;...</td></tr>
932<tr><td colspan="4" class="doc" id="incompleteArrayTypeLoc0"><pre>Matches C arrays with unspecified size.
933
934Given
935  int a[] = { 2, 3 };
936  int b[42];
937  void f(int c[]) { int d[a[0]]; };
938incompleteArrayType()
939  matches "int a[]" and "int c[]"
940</pre></td></tr>
941
942
943<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('memberPointerTypeLoc0')"><a name="memberPointerTypeLoc0Anchor">memberPointerTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerTypeLoc.html">MemberPointerTypeLoc</a>&gt;...</td></tr>
944<tr><td colspan="4" class="doc" id="memberPointerTypeLoc0"><pre>Matches member pointer types.
945Given
946  struct A { int i; }
947  A::* ptr = A::i;
948memberPointerType()
949  matches "A::* ptr"
950</pre></td></tr>
951
952
953<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointerTypeLoc0')"><a name="pointerTypeLoc0Anchor">pointerTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>&gt;...</td></tr>
954<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer types.
955
956Given
957  int *a;
958  int &amp;b = *a;
959  int c = 5;
960pointerType()
961  matches "int *a"
962</pre></td></tr>
963
964
965<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('referenceTypeLoc0')"><a name="referenceTypeLoc0Anchor">referenceTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>&gt;...</td></tr>
966<tr><td colspan="4" class="doc" id="referenceTypeLoc0"><pre>Matches reference types.
967
968Given
969  int *a;
970  int &amp;b = *a;
971  int c = 5;
972pointerType()
973  matches "int &amp;b"
974</pre></td></tr>
975
976
977<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>
978<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
979</pre></td></tr>
980
981
982<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('typedefTypeLoc0')"><a name="typedefTypeLoc0Anchor">typedefTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefTypeLoc.html">TypedefTypeLoc</a>&gt;...</td></tr>
983<tr><td colspan="4" class="doc" id="typedefTypeLoc0"><pre>Matches typedef types.
984
985Given
986  typedef int X;
987typedefType()
988  matches "typedef int X"
989</pre></td></tr>
990
991
992<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('variableArrayTypeLoc0')"><a name="variableArrayTypeLoc0Anchor">variableArrayTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VariableArrayTypeLoc.html">VariableArrayTypeLoc</a>&gt;...</td></tr>
993<tr><td colspan="4" class="doc" id="variableArrayTypeLoc0"><pre>Matches C arrays with a specified size that is not an
994integer-constant-expression.
995
996Given
997  void f() {
998    int a[] = { 2, 3 }
999    int b[42];
1000    int c[a[0]];
1001variableArrayType()
1002  matches "int c[a[0]]"
1003</pre></td></tr>
1004
1005
1006<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>
1007<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1008
1009Given
1010  int a[] = { 2, 3 };
1011  int b[4];
1012  void f() { int c[a[0]]; }
1013arrayType()
1014  matches "int a[]", "int b[4]" and "int c[a[0]]";
1015</pre></td></tr>
1016
1017
1018<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>
1019<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1020
1021Given
1022  _Atomic(int) i;
1023atomicType()
1024  matches "_Atomic(int) i"
1025</pre></td></tr>
1026
1027
1028<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1029<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1030
1031Given:
1032  auto n = 4;
1033  int v[] = { 2, 3 }
1034  for (auto i : v) { }
1035autoType()
1036  matches "auto n" and "auto i"
1037</pre></td></tr>
1038
1039
1040<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1041<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1042"void (^)(int)".
1043
1044The pointee is always required to be a FunctionType.
1045</pre></td></tr>
1046
1047
1048<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>
1049<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1050
1051Given
1052  struct A {};
1053  A a;
1054  int b;
1055  float c;
1056  bool d;
1057builtinType()
1058  matches "int b", "float c" and "bool d"
1059</pre></td></tr>
1060
1061
1062<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1063<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1064
1065Given
1066  _Complex float f;
1067complexType()
1068  matches "_Complex float f"
1069</pre></td></tr>
1070
1071
1072<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>
1073<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1074
1075Given
1076  void() {
1077    int a[2];
1078    int b[] = { 2, 3 };
1079    int c[b[0]];
1080  }
1081constantArrayType()
1082  matches "int a[2]"
1083</pre></td></tr>
1084
1085
1086<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>
1087<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1088
1089Given
1090  template&lt;typename T, int Size&gt;
1091  class array {
1092    T data[Size];
1093  };
1094dependentSizedArrayType
1095  matches "T data[Size]"
1096</pre></td></tr>
1097
1098
1099<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>
1100<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1101
1102Given
1103  int (*f)(int);
1104  void g();
1105functionType()
1106  matches "int (*f)(int)" and the type of "g".
1107</pre></td></tr>
1108
1109
1110<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>
1111<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1112
1113Given
1114  int a[] = { 2, 3 };
1115  int b[42];
1116  void f(int c[]) { int d[a[0]]; };
1117incompleteArrayType()
1118  matches "int a[]" and "int c[]"
1119</pre></td></tr>
1120
1121
1122<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>
1123<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1124Given
1125  struct A { int i; }
1126  A::* ptr = A::i;
1127memberPointerType()
1128  matches "A::* ptr"
1129</pre></td></tr>
1130
1131
1132<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>
1133<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types.
1134
1135Given
1136  int *a;
1137  int &amp;b = *a;
1138  int c = 5;
1139pointerType()
1140  matches "int *a"
1141</pre></td></tr>
1142
1143
1144<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>
1145<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches reference types.
1146
1147Given
1148  int *a;
1149  int &amp;b = *a;
1150  int c = 5;
1151pointerType()
1152  matches "int &amp;b"
1153</pre></td></tr>
1154
1155
1156<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>
1157<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1158</pre></td></tr>
1159
1160
1161<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>
1162<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1163
1164Given
1165  typedef int X;
1166typedefType()
1167  matches "typedef int X"
1168</pre></td></tr>
1169
1170
1171<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
1172<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1173integer-constant-expression.
1174
1175Given
1176  void f() {
1177    int a[] = { 2, 3 }
1178    int b[42];
1179    int c[a[0]];
1180variableArrayType()
1181  matches "int c[a[0]]"
1182</pre></td></tr>
1183
1184<!--END_DECL_MATCHERS -->
1185</table>
1186
1187<!-- ======================================================================= -->
1188<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1189<!-- ======================================================================= -->
1190
1191<p>Narrowing matchers match certain attributes on the current node, thus
1192narrowing down the set of nodes of the current type to match on.</p>
1193
1194<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1195which allow users to create more powerful match expressions.</p>
1196
1197<table>
1198<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1199<!-- START_NARROWING_MATCHERS -->
1200
1201<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher&lt;*&gt;  P1, Matcher&lt;*&gt;  P2</td></tr>
1202<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1203
1204Usable as: Any Matcher
1205</pre></td></tr>
1206
1207
1208<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher&lt;*&gt;  P1, Matcher&lt;*&gt;  P2</td></tr>
1209<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1210
1211Usable as: Any Matcher
1212</pre></td></tr>
1213
1214
1215<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1216<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1217
1218Useful when another matcher requires a child matcher, but there's no
1219additional constraint. This will often be used with an explicit conversion
1220to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1221
1222Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1223"int* p" and "void f()" in
1224  int* p;
1225  void f();
1226
1227Usable as: Any Matcher
1228</pre></td></tr>
1229
1230
1231<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;  InnerMatcher</td></tr>
1232<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1233
1234Example matches Y (matcher = recordDecl(unless(hasName("X"))))
1235  class X {};
1236  class Y {};
1237
1238Usable as: Any Matcher
1239</pre></td></tr>
1240
1241
1242<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>
1243<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1244unary).
1245
1246Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1247  !(a || b)
1248</pre></td></tr>
1249
1250
1251<tr><td>Matcher&lt;CXXBoolLiteral&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT  Value</td></tr>
1252<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1253
1254Example matches true (matcher = boolLiteral(equals(true)))
1255  true
1256
1257Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1258           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;
1259</pre></td></tr>
1260
1261
1262<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
1263<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a constructor declaration that has been implicitly added
1264by the compiler (eg. implicit defaultcopy constructors).
1265</pre></td></tr>
1266
1267
1268<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>
1269<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a contructor initializer if it is explicitly written in
1270code (as opposed to implicitly added by the compiler).
1271
1272Given
1273  struct Foo {
1274    Foo() { }
1275    Foo(int) : foo_("A") { }
1276    string foo_;
1277  };
1278constructorDecl(hasAnyConstructorInitializer(isWritten()))
1279  will match Foo(int), but not Foo()
1280</pre></td></tr>
1281
1282
1283<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>std::string Name</td></tr>
1284<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
1285
1286Matches overloaded operator names specified in strings without the
1287"operator" prefix, such as "&lt;&lt;", for OverloadedOperatorCall's.
1288
1289Example matches a &lt;&lt; b
1290    (matcher == operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;")))
1291  a &lt;&lt; b;
1292  c &amp;&amp; d;  assuming both operator&lt;&lt;
1293           and operator&amp;&amp; are overloaded somewhere.
1294</pre></td></tr>
1295
1296
1297<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>StringRef BaseName</td></tr>
1298<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
1299</pre></td></tr>
1300
1301
1302<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>
1303<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
1304static member variable template instantiations.
1305
1306Given
1307  template&lt;typename T&gt; void A(T t) { }
1308  template&lt;&gt; void A(int N) { }
1309functionDecl(isExplicitTemplateSpecialization())
1310  matches the specialization A&lt;int&gt;().
1311
1312Usable 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;
1313</pre></td></tr>
1314
1315
1316<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>StringRef BaseName</td></tr>
1317<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
1318isSameOrDerivedFrom(hasName(...)).
1319</pre></td></tr>
1320
1321
1322<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>
1323<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
1324member variable template instantiations.
1325
1326Given
1327  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1328or
1329  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
1330recordDecl(hasName("::X"), isTemplateInstantiation())
1331  matches the template instantiation of X&lt;A&gt;.
1332
1333But given
1334  template &lt;typename T&gt;  class X {}; class A {};
1335  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
1336recordDecl(hasName("::X"), isTemplateInstantiation())
1337  does not match, as X&lt;A&gt; is an explicit template specialization.
1338
1339Usable 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;
1340</pre></td></tr>
1341
1342
1343<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>
1344<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
1345a specific number of arguments (including absent default arguments).
1346
1347Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1348  void f(int x, int y);
1349  f(0, 0);
1350</pre></td></tr>
1351
1352
1353<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>ValueT  Value</td></tr>
1354<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
1355
1356Example matches true (matcher = boolLiteral(equals(true)))
1357  true
1358
1359Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1360           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;
1361</pre></td></tr>
1362
1363
1364<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>
1365<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
1366child statements.
1367
1368Example: Given
1369  { for (;;) {} }
1370compoundStmt(statementCountIs(0)))
1371  matches '{}'
1372  but does not match the outer compound statement.
1373</pre></td></tr>
1374
1375
1376<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>
1377<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size.
1378
1379Given
1380  int a[42];
1381  int b[2 * 21];
1382  int c[41], d[43];
1383constantArrayType(hasSize(42))
1384  matches "int a[42]" and "int b[2 * 21]"
1385</pre></td></tr>
1386
1387
1388<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>
1389<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
1390declarations.
1391
1392Example: Given
1393  int a, b;
1394  int c;
1395  int d = 2, e;
1396declCountIs(2)
1397  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
1398</pre></td></tr>
1399
1400
1401<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>Decl* Other</td></tr>
1402<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
1403
1404Decl has pointer identity in the AST.
1405</pre></td></tr>
1406
1407
1408<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>ValueT  Value</td></tr>
1409<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
1410
1411Example matches true (matcher = boolLiteral(equals(true)))
1412  true
1413
1414Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1415           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;
1416</pre></td></tr>
1417
1418
1419<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
1420<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
1421
1422Example matches A, va, fa
1423  class A {};
1424  class B;  Doesn't match, as it has no body.
1425  int va;
1426  extern int vb;  Doesn't match, as it doesn't define the variable.
1427  void fa() {}
1428  void fb();  Doesn't match, as it has no body.
1429
1430Usable 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;
1431</pre></td></tr>
1432
1433
1434<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>
1435<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
1436static member variable template instantiations.
1437
1438Given
1439  template&lt;typename T&gt; void A(T t) { }
1440  template&lt;&gt; void A(int N) { }
1441functionDecl(isExplicitTemplateSpecialization())
1442  matches the specialization A&lt;int&gt;().
1443
1444Usable 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;
1445</pre></td></tr>
1446
1447
1448<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>
1449<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
1450
1451Given:
1452  extern "C" void f() {}
1453  extern "C" { void g() {} }
1454  void h() {}
1455functionDecl(isExternC())
1456  matches the declaration of f and g, but not the declaration h
1457</pre></td></tr>
1458
1459
1460<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>
1461<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
1462member variable template instantiations.
1463
1464Given
1465  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1466or
1467  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
1468recordDecl(hasName("::X"), isTemplateInstantiation())
1469  matches the template instantiation of X&lt;A&gt;.
1470
1471But given
1472  template &lt;typename T&gt;  class X {}; class A {};
1473  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
1474recordDecl(hasName("::X"), isTemplateInstantiation())
1475  does not match, as X&lt;A&gt; is an explicit template specialization.
1476
1477Usable 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;
1478</pre></td></tr>
1479
1480
1481<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>
1482<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls that have a specific parameter count.
1483
1484Given
1485  void f(int i) {}
1486  void g(int i, int j) {}
1487functionDecl(parameterCountIs(2))
1488  matches g(int i, int j) {}
1489</pre></td></tr>
1490
1491
1492<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>ValueT  Value</td></tr>
1493<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
1494
1495Example matches true (matcher = boolLiteral(equals(true)))
1496  true
1497
1498Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1499           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;
1500</pre></td></tr>
1501
1502
1503<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>
1504<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
1505to '.'.
1506
1507Member calls on the implicit this pointer match as called with '-&gt;'.
1508
1509Given
1510  class Y {
1511    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1512    int a;
1513    static int b;
1514  };
1515memberExpr(isArrow())
1516  matches this-&gt;x, x, y.x, a, this-&gt;b
1517</pre></td></tr>
1518
1519
1520<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>std::string Name</td></tr>
1521<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
1522
1523Supports specifying enclosing namespaces or classes by prefixing the name
1524with '&lt;enclosing&gt;::'.
1525Does not match typedefs of an underlying type with the given name.
1526
1527Example matches X (Name == "X")
1528  class X;
1529
1530Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
1531  namespace a { namespace b { class X; } }
1532</pre></td></tr>
1533
1534
1535<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>
1536<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
1537a substring matched by the given RegExp.
1538
1539Supports specifying enclosing namespaces or classes by
1540prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
1541of an underlying type with the given name.
1542
1543Example matches X (regexp == "::X")
1544  class X;
1545
1546Example matches X (regexp is one of "::X", "^foo::.*X", among others)
1547  namespace foo { namespace bar { class X; } }
1548</pre></td></tr>
1549
1550
1551<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>
1552<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
1553
1554Given
1555  class Y { public: void x(); };
1556  void z() { Y* y; y-&gt;x(); }
1557callExpr(on(hasType(asString("class Y *"))))
1558  matches y-&gt;x()
1559</pre></td></tr>
1560
1561
1562<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>
1563<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
1564include "top-level" const.
1565
1566Given
1567  void a(int);
1568  void b(int const);
1569  void c(const int);
1570  void d(const int*);
1571  void e(int const) {};
1572functionDecl(hasAnyParameter(hasType(isConstQualified())))
1573  matches "void b(int const)", "void c(const int)" and
1574  "void e(int const) {}". It does not match d as there
1575  is no top-level const on the parameter type "const int *".
1576</pre></td></tr>
1577
1578
1579<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>
1580<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
1581
1582Given
1583  void a(int);
1584  void b(long);
1585  void c(double);
1586functionDecl(hasAnyParameter(hasType(isInteger())))
1587matches "a(int)", "b(long)", but not "c(double)".
1588</pre></td></tr>
1589
1590
1591<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>Stmt* Other</td></tr>
1592<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
1593
1594Stmt has pointer identity in the AST.
1595
1596</pre></td></tr>
1597
1598
1599<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>
1600<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
1601
1602Example matches A, va, fa
1603  class A {};
1604  class B;  Doesn't match, as it has no body.
1605  int va;
1606  extern int vb;  Doesn't match, as it doesn't define the variable.
1607  void fa() {}
1608  void fb();  Doesn't match, as it has no body.
1609
1610Usable 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;
1611</pre></td></tr>
1612
1613
1614<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>
1615<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
1616
1617Given
1618  int x;
1619  int s = sizeof(x) + alignof(x)
1620unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
1621  matches sizeof(x)
1622</pre></td></tr>
1623
1624
1625<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>
1626<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
1627unary).
1628
1629Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1630  !(a || b)
1631</pre></td></tr>
1632
1633
1634<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>
1635<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
1636
1637Example matches A, va, fa
1638  class A {};
1639  class B;  Doesn't match, as it has no body.
1640  int va;
1641  extern int vb;  Doesn't match, as it doesn't define the variable.
1642  void fa() {}
1643  void fb();  Doesn't match, as it has no body.
1644
1645Usable 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;
1646</pre></td></tr>
1647
1648
1649<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>
1650<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
1651static member variable template instantiations.
1652
1653Given
1654  template&lt;typename T&gt; void A(T t) { }
1655  template&lt;&gt; void A(int N) { }
1656functionDecl(isExplicitTemplateSpecialization())
1657  matches the specialization A&lt;int&gt;().
1658
1659Usable 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;
1660</pre></td></tr>
1661
1662
1663<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>
1664<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
1665member variable template instantiations.
1666
1667Given
1668  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1669or
1670  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
1671recordDecl(hasName("::X"), isTemplateInstantiation())
1672  matches the template instantiation of X&lt;A&gt;.
1673
1674But given
1675  template &lt;typename T&gt;  class X {}; class A {};
1676  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
1677recordDecl(hasName("::X"), isTemplateInstantiation())
1678  does not match, as X&lt;A&gt; is an explicit template specialization.
1679
1680Usable 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;
1681</pre></td></tr>
1682
1683<!--END_NARROWING_MATCHERS -->
1684</table>
1685
1686<!-- ======================================================================= -->
1687<h2 id="traversal-matchers">AST Traversal Matchers</h2>
1688<!-- ======================================================================= -->
1689
1690<p>Traversal matchers specify the relationship to other nodes that are
1691reachable from the current node.</p>
1692
1693<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
1694forEachDescendant) which work on all nodes and allow users to write more generic
1695match expressions.</p>
1696
1697<table>
1698<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1699<!-- START_TRAVERSAL_MATCHERS -->
1700
1701<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher&lt;*&gt;  P1, Matcher&lt;*&gt;  P2</td></tr>
1702<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
1703
1704Unlike anyOf, eachOf will generate a match result for each
1705matching submatcher.
1706
1707For example, in:
1708  class A { int a; int b; };
1709The matcher:
1710  recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
1711                    has(fieldDecl(hasName("b")).bind("v"))))
1712will generate two results binding "v", the first of which binds
1713the field declaration of a, the second the field declaration of
1714b.
1715
1716Usable as: Any Matcher
1717</pre></td></tr>
1718
1719
1720<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher&lt;T&gt;  Matcher</td></tr>
1721<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
1722
1723Generates results for each match.
1724
1725For example, in:
1726  class A { class B {}; class C {}; };
1727The matcher:
1728  recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
1729will generate results for A, B and C.
1730
1731Usable as: Any Matcher
1732</pre></td></tr>
1733
1734
1735<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;ChildT&gt;  ChildMatcher</td></tr>
1736<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
1737provided matcher.
1738
1739Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
1740  class X {};  Matches X, because X::X is a class of name X inside X.
1741  class Y { class X {}; };
1742  class Z { class Y { class X {}; }; };  Does not match Z.
1743
1744ChildT must be an AST base type.
1745
1746As opposed to 'has', 'forEach' will cause a match for each result that
1747matches instead of only on the first one.
1748
1749Usable as: Any Matcher
1750</pre></td></tr>
1751
1752
1753<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;DescendantT&gt;  DescendantMatcher</td></tr>
1754<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
1755provided matcher.
1756
1757Example matches X, A, B, C
1758    (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
1759  class X {};  Matches X, because X::X is a class of name X inside X.
1760  class A { class X {}; };
1761  class B { class C { class X {}; }; };
1762
1763DescendantT must be an AST base type.
1764
1765As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
1766each result that matches instead of only on the first one.
1767
1768Note: Recursively combined ForEachDescendant can cause many matches:
1769  recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
1770will match 10 times (plus injected class name matches) on:
1771  class A { class B { class C { class D { class E {}; }; }; }; };
1772
1773Usable as: Any Matcher
1774</pre></td></tr>
1775
1776
1777<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;ChildT&gt;  ChildMatcher</td></tr>
1778<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
1779provided matcher.
1780
1781Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
1782  class X {};  Matches X, because X::X is a class of name X inside X.
1783  class Y { class X {}; };
1784  class Z { class Y { class X {}; }; };  Does not match Z.
1785
1786ChildT must be an AST base type.
1787
1788Usable as: Any Matcher
1789</pre></td></tr>
1790
1791
1792<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;AncestorT&gt;  AncestorMatcher</td></tr>
1793<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
1794matcher.
1795
1796Given
1797void f() { if (true) { int x = 42; } }
1798void g() { for (;;) { int x = 43; } }
1799expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
1800
1801Usable as: Any Matcher
1802</pre></td></tr>
1803
1804
1805<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;DescendantT&gt;  DescendantMatcher</td></tr>
1806<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
1807provided matcher.
1808
1809Example matches X, Y, Z
1810    (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
1811  class X {};  Matches X, because X::X is a class of name X inside X.
1812  class Y { class X {}; };
1813  class Z { class Y { class X {}; }; };
1814
1815DescendantT must be an AST base type.
1816
1817Usable as: Any Matcher
1818</pre></td></tr>
1819
1820
1821<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;ParentT&gt;  ParentMatcher</td></tr>
1822<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
1823matcher.
1824
1825Given
1826void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
1827compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
1828
1829Usable as: Any Matcher
1830</pre></td></tr>
1831
1832
1833<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>
1834<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
1835
1836Given
1837  int i[5];
1838  void f() { i[1] = 42; }
1839arraySubscriptExpression(hasBase(implicitCastExpr(
1840    hasSourceExpression(declRefExpr()))))
1841  matches i[1] with the declRefExpr() matching i
1842</pre></td></tr>
1843
1844
1845<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>
1846<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
1847
1848Given
1849  int i[5];
1850  void f() { i[1] = 42; }
1851arraySubscriptExpression(hasIndex(integerLiteral()))
1852  matches i[1] with the integerLiteral() matching 1
1853</pre></td></tr>
1854
1855
1856<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayTypeLoc.html">ArrayTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasElementTypeLoc1')"><a name="hasElementTypeLoc1Anchor">hasElementTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
1857<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
1858type.
1859
1860Given
1861  struct A {};
1862  A a[7];
1863  int b[7];
1864arrayType(hasElementType(builtinType()))
1865  matches "int b[7]"
1866
1867Usable 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;
1868</pre></td></tr>
1869
1870
1871<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;</td><td class="name" onclick="toggle('hasElementType1')"><a name="hasElementType1Anchor">hasElementType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
1872<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
1873type.
1874
1875Given
1876  struct A {};
1877  A a[7];
1878  int b[7];
1879arrayType(hasElementType(builtinType()))
1880  matches "int b[7]"
1881
1882Usable 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;
1883</pre></td></tr>
1884
1885
1886<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>
1887<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
1888
1889Given
1890  _Atomic(int) i;
1891  _Atomic(float) f;
1892atomicType(hasValueType(isInteger()))
1893 matches "_Atomic(int) i"
1894
1895Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
1896</pre></td></tr>
1897
1898
1899<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>
1900<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
1901
1902Given
1903  _Atomic(int) i;
1904  _Atomic(float) f;
1905atomicType(hasValueType(isInteger()))
1906 matches "_Atomic(int) i"
1907
1908Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
1909</pre></td></tr>
1910
1911
1912<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>
1913<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
1914
1915Note: There is no TypeLoc for the deduced type and thus no
1916getDeducedLoc() matcher.
1917
1918Given
1919  auto a = 1;
1920  auto b = 2.0;
1921autoType(hasDeducedType(isInteger()))
1922  matches "auto a"
1923
1924Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
1925</pre></td></tr>
1926
1927
1928<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;  InnerMatcher</td></tr>
1929<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
1930binary operator matches.
1931</pre></td></tr>
1932
1933
1934<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>
1935<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
1936
1937Example matches a (matcher = binaryOperator(hasLHS()))
1938  a || b
1939</pre></td></tr>
1940
1941
1942<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>
1943<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
1944
1945Example matches b (matcher = binaryOperator(hasRHS()))
1946  a || b
1947</pre></td></tr>
1948
1949
1950<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerTypeLoc.html">BlockPointerTypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointeeLoc3')"><a name="pointeeLoc3Anchor">pointeeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
1951<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
1952pointee matches a given matcher.
1953
1954Given
1955  int *a;
1956  int const *b;
1957  float const *f;
1958pointerType(pointee(isConstQualified(), isInteger()))
1959  matches "int const *b"
1960
1961Usable 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;,
1962  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;
1963</pre></td></tr>
1964
1965
1966<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;</td><td class="name" onclick="toggle('pointee3')"><a name="pointee3Anchor">pointee</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
1967<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
1968pointee matches a given matcher.
1969
1970Given
1971  int *a;
1972  int const *b;
1973  float const *f;
1974pointerType(pointee(isConstQualified(), isInteger()))
1975  matches "int const *b"
1976
1977Usable 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;,
1978  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;
1979</pre></td></tr>
1980
1981
1982<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
1983<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a type if the declaration of the type matches the given
1984matcher.
1985
1986Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
1987  Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;
1988</pre></td></tr>
1989
1990
1991<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>
1992<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
1993
1994Given
1995  struct Foo {
1996    Foo() : foo_(1) { }
1997    int foo_;
1998  };
1999recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
2000  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
2001</pre></td></tr>
2002
2003
2004<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>
2005<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
2006
2007Given
2008  struct Foo {
2009    Foo() : foo_(1) { }
2010    int foo_;
2011  };
2012recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
2013    forField(hasName("foo_"))))))
2014  matches Foo
2015with forField matching foo_
2016</pre></td></tr>
2017
2018
2019<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>
2020<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
2021
2022Given
2023  struct Foo {
2024    Foo() : foo_(1) { }
2025    int foo_;
2026  };
2027recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
2028    withInitializer(integerLiteral(equals(1)))))))
2029  matches Foo
2030with withInitializer matching (1)
2031</pre></td></tr>
2032
2033
2034<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>
2035<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
2036
2037Example matches y.x() (matcher = callExpr(on(hasType(recordDecl(hasName("Y"))))))
2038  class Y { public: void x(); };
2039  void z() { Y y; y.x(); }",
2040
2041FIXME: Overload to allow directly matching types?
2042</pre></td></tr>
2043
2044
2045<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>
2046<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
2047
2048
2049<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>
2050<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
2051</pre></td></tr>
2052
2053
2054<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>
2055<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
2056belongs to.
2057
2058FIXME: Generalize this for other kinds of declarations.
2059FIXME: What other kind of declarations would we need to generalize
2060this to?
2061
2062Example matches A() in the last line
2063    (matcher = constructExpr(hasDeclaration(methodDecl(
2064        ofClass(hasName("A"))))))
2065  class A {
2066   public:
2067    A();
2068  };
2069  A a = A();
2070</pre></td></tr>
2071
2072
2073<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>
2074<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
2075a class matching Base.
2076
2077Note that a class is not considered to be derived from itself.
2078
2079Example matches Y, Z, C (Base == hasName("X"))
2080  class X;
2081  class Y : public X {};  directly derived
2082  class Z : public Y {};  indirectly derived
2083  typedef X A;
2084  typedef A B;
2085  class C : public B {};  derived from a typedef of X
2086
2087In the following example, Bar matches isDerivedFrom(hasName("X")):
2088  class Foo;
2089  typedef Foo X;
2090  class Bar : public Foo {};  derived from a type that X is a typedef of
2091</pre></td></tr>
2092
2093
2094<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>
2095<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
2096match Base.
2097</pre></td></tr>
2098
2099
2100<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>
2101<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
2102given matcher.
2103
2104Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
2105  class Y { public: void x(); };
2106  void z() { Y y; y.x();
2107</pre></td></tr>
2108
2109
2110<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>
2111<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
2112expression.
2113
2114Given
2115  void x(int, int, int) { int y; x(1, y, 42); }
2116callExpr(hasAnyArgument(declRefExpr()))
2117  matches x(1, y, 42)
2118with hasAnyArgument(...)
2119  matching y
2120</pre></td></tr>
2121
2122
2123<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>
2124<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
2125call expression.
2126
2127Example matches y in x(y)
2128    (matcher = callExpr(hasArgument(0, declRefExpr())))
2129  void x(int) { int y; x(y); }
2130</pre></td></tr>
2131
2132
2133<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
2134<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a type if the declaration of the type matches the given
2135matcher.
2136
2137Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
2138  Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;
2139</pre></td></tr>
2140
2141
2142<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>
2143<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher.
2144
2145Example: matches "a string" (matcher =
2146                                 hasSourceExpression(constructExpr()))
2147class URL { URL(string); };
2148URL url = "a string";
2149</pre></td></tr>
2150
2151
2152<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>
2153<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
2154TemplateArgument matching the given InnerMatcher.
2155
2156Given
2157  template&lt;typename T&gt; class A {};
2158  template&lt;&gt; class A&lt;double&gt; {};
2159  A&lt;int&gt; a;
2160classTemplateSpecializationDecl(hasAnyTemplateArgument(
2161    refersToType(asString("int"))))
2162  matches the specialization A&lt;int&gt;
2163</pre></td></tr>
2164
2165
2166<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>
2167<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
2168matches the given InnerMatcher.
2169
2170Given
2171  template&lt;typename T, typename U&gt; class A {};
2172  A&lt;bool, int&gt; b;
2173  A&lt;int, bool&gt; c;
2174classTemplateSpecializationDecl(hasTemplateArgument(
2175    1, refersToType(asString("int"))))
2176  matches the specialization A&lt;bool, int&gt;
2177</pre></td></tr>
2178
2179
2180<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexTypeLoc.html">ComplexTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasElementTypeLoc0')"><a name="hasElementTypeLoc0Anchor">hasElementTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
2181<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
2182type.
2183
2184Given
2185  struct A {};
2186  A a[7];
2187  int b[7];
2188arrayType(hasElementType(builtinType()))
2189  matches "int b[7]"
2190
2191Usable 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;
2192</pre></td></tr>
2193
2194
2195<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;</td><td class="name" onclick="toggle('hasElementType0')"><a name="hasElementType0Anchor">hasElementType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
2196<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
2197type.
2198
2199Given
2200  struct A {};
2201  A a[7];
2202  int b[7];
2203arrayType(hasElementType(builtinType()))
2204  matches "int b[7]"
2205
2206Usable 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;
2207</pre></td></tr>
2208
2209
2210<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>
2211<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
2212a given matcher.
2213
2214Given
2215  { {}; 1+2; }
2216hasAnySubstatement(compoundStmt())
2217  matches '{ {}; 1+2; }'
2218with compoundStmt()
2219  matching '{}'
2220</pre></td></tr>
2221
2222
2223<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasCondition4')"><a name="hasCondition4Anchor">hasCondition</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2224<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
2225or conditional operator.
2226
2227Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2228  if (true) {}
2229</pre></td></tr>
2230
2231
2232<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasFalseExpression0')"><a name="hasFalseExpression0Anchor">hasFalseExpression</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2233<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator.
2234
2235Example matches b
2236  condition ? a : b
2237</pre></td></tr>
2238
2239
2240<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasTrueExpression0')"><a name="hasTrueExpression0Anchor">hasTrueExpression</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2241<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
2242
2243Example matches a
2244  condition ? a : b
2245</pre></td></tr>
2246
2247
2248<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>
2249<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
2250specific using shadow declaration.
2251
2252FIXME: This currently only works for functions. Fix.
2253
2254Given
2255  namespace a { void f() {} }
2256  using a::f;
2257  void g() {
2258    f();     Matches this ..
2259    a::f();  .. but not this.
2260  }
2261declRefExpr(throughUsingDeclaration(anything()))
2262  matches f()
2263</pre></td></tr>
2264
2265
2266<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>
2267<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
2268specified matcher.
2269
2270Example matches x in if(x)
2271    (matcher = declRefExpr(to(varDecl(hasName("x")))))
2272  bool x;
2273  if (x) {}
2274</pre></td></tr>
2275
2276
2277<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>
2278<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
2279
2280Note that this does not work for global declarations because the AST
2281breaks up multiple-declaration DeclStmt's into multiple single-declaration
2282DeclStmt's.
2283Example: Given non-global declarations
2284  int a, b = 0;
2285  int c;
2286  int d = 2, e;
2287declStmt(containsDeclaration(
2288      0, varDecl(hasInitializer(anything()))))
2289  matches only 'int d = 2, e;', and
2290declStmt(containsDeclaration(1, varDecl()))
2291  matches 'int a, b = 0' as well as 'int d = 2, e;'
2292  but 'int c;' is not matched.
2293</pre></td></tr>
2294
2295
2296<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>
2297<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
2298
2299Given
2300  int a, b;
2301  int c;
2302declStmt(hasSingleDecl(anything()))
2303  matches 'int c;' but not 'int a, b;'.
2304</pre></td></tr>
2305
2306
2307<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>
2308<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has
2309a given body.
2310
2311Given
2312  for (;;) {}
2313hasBody(compoundStmt())
2314  matches 'for (;;) {}'
2315with compoundStmt()
2316  matching '{}'
2317</pre></td></tr>
2318
2319
2320<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>
2321<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
2322or conditional operator.
2323
2324Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2325  if (true) {}
2326</pre></td></tr>
2327
2328
2329<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>
2330<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
2331
2332(Note: Clang's AST refers to other conversions as "casts" too, and calls
2333actual casts "explicit" casts.)
2334</pre></td></tr>
2335
2336
2337<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>
2338<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
2339declaration's type.
2340
2341In case of a value declaration (for example a variable declaration),
2342this resolves one layer of indirection. For example, in the value
2343declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
2344while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
2345of x."
2346
2347Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
2348            and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
2349 class X {};
2350 void y(X &amp;x) { x; X z; }
2351
2352Usable 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;
2353</pre></td></tr>
2354
2355
2356<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>
2357<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
2358are stripped off.
2359
2360Parentheses and explicit casts are not discarded.
2361Given
2362  int arr[5];
2363  int a = 0;
2364  char b = 0;
2365  const int c = a;
2366  int *d = arr;
2367  long e = (long) 0l;
2368The matchers
2369   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
2370   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
2371would match the declarations for a, b, c, and d, but not e.
2372While
2373   varDecl(hasInitializer(integerLiteral()))
2374   varDecl(hasInitializer(declRefExpr()))
2375only match the declarations for b, c, and d.
2376</pre></td></tr>
2377
2378
2379<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>
2380<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
2381casts are stripped off.
2382
2383Implicit and non-C Style casts are also discarded.
2384Given
2385  int a = 0;
2386  char b = (0);
2387  void* c = reinterpret_cast&lt;char*&gt;(0);
2388  char d = char(0);
2389The matcher
2390   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
2391would match the declarations for a, b, c, and d.
2392while
2393   varDecl(hasInitializer(integerLiteral()))
2394only match the declaration for a.
2395</pre></td></tr>
2396
2397
2398<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>
2399<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
2400parentheses are stripped off.
2401
2402Explicit casts are not discarded.
2403Given
2404  int arr[5];
2405  int a = 0;
2406  char b = (0);
2407  const int c = a;
2408  int *d = (arr);
2409  long e = ((long) 0l);
2410The matchers
2411   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
2412   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
2413would match the declarations for a, b, c, and d, but not e.
2414while
2415   varDecl(hasInitializer(integerLiteral()))
2416   varDecl(hasInitializer(declRefExpr()))
2417would only match the declaration for a.
2418</pre></td></tr>
2419
2420
2421<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>
2422<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has
2423a given body.
2424
2425Given
2426  for (;;) {}
2427hasBody(compoundStmt())
2428  matches 'for (;;) {}'
2429with compoundStmt()
2430  matching '{}'
2431</pre></td></tr>
2432
2433
2434<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>
2435<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
2436or conditional operator.
2437
2438Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2439  if (true) {}
2440</pre></td></tr>
2441
2442
2443<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>
2444<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
2445
2446Example:
2447    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
2448matches '++x' in
2449    for (x; x &lt; N; ++x) { }
2450</pre></td></tr>
2451
2452
2453<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>
2454<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
2455
2456Example:
2457    forStmt(hasLoopInit(declStmt()))
2458matches 'int x = 0' in
2459    for (int x = 0; x &lt; N; ++x) { }
2460</pre></td></tr>
2461
2462
2463<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>
2464<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
2465
2466Does not match the 'this' parameter of a method.
2467
2468Given
2469  class X { void f(int x, int y, int z) {} };
2470methodDecl(hasAnyParameter(hasName("y")))
2471  matches f(int x, int y, int z) {}
2472with hasAnyParameter(...)
2473  matching int y
2474</pre></td></tr>
2475
2476
2477<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>
2478<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
2479
2480Given
2481  class X { void f(int x) {} };
2482methodDecl(hasParameter(0, hasType(varDecl())))
2483  matches f(int x) {}
2484with hasParameter(...)
2485  matching int x
2486</pre></td></tr>
2487
2488
2489<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>
2490<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
2491
2492Given:
2493  class X { int f() { return 1; } };
2494methodDecl(returns(asString("int")))
2495  matches int f() { return 1; }
2496</pre></td></tr>
2497
2498
2499<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>
2500<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
2501or conditional operator.
2502
2503Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2504  if (true) {}
2505</pre></td></tr>
2506
2507
2508<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>
2509<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
2510
2511Given
2512  if (A* a = GetAPointer()) {}
2513hasConditionVariableStatment(...)
2514  matches 'A* a = GetAPointer()'.
2515</pre></td></tr>
2516
2517
2518<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>
2519<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
2520matcher.
2521
2522FIXME: Unit test this matcher
2523</pre></td></tr>
2524
2525
2526<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
2527<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a type if the declaration of the type matches the given
2528matcher.
2529
2530Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
2531  Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;
2532</pre></td></tr>
2533
2534
2535<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>
2536<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
2537matched by a given matcher.
2538
2539Given
2540  struct X { int m; };
2541  void f(X x) { x.m; m; }
2542memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
2543  matches "x.m" and "m"
2544with hasObjectExpression(...)
2545  matching "x" and the implicit object expression of "m" which has type X*.
2546</pre></td></tr>
2547
2548
2549<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>
2550<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
2551given matcher.
2552
2553Given
2554  struct { int first, second; } first, second;
2555  int i(second.first);
2556  int j(first.second);
2557memberExpr(member(hasName("first")))
2558  matches second.first
2559  but not first.second (because the member name there is "second").
2560</pre></td></tr>
2561
2562
2563<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerTypeLoc.html">MemberPointerTypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointeeLoc2')"><a name="pointeeLoc2Anchor">pointeeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
2564<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
2565pointee matches a given matcher.
2566
2567Given
2568  int *a;
2569  int const *b;
2570  float const *f;
2571pointerType(pointee(isConstQualified(), isInteger()))
2572  matches "int const *b"
2573
2574Usable 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;,
2575  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;
2576</pre></td></tr>
2577
2578
2579<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;</td><td class="name" onclick="toggle('pointee2')"><a name="pointee2Anchor">pointee</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
2580<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
2581pointee matches a given matcher.
2582
2583Given
2584  int *a;
2585  int const *b;
2586  float const *f;
2587pointerType(pointee(isConstQualified(), isInteger()))
2588  matches "int const *b"
2589
2590Usable 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;,
2591  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;
2592</pre></td></tr>
2593
2594
2595<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>
2596<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
2597
2598Given
2599  struct A { struct B { struct C {}; }; };
2600  A::B::C c;
2601nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
2602  matches "A::"
2603</pre></td></tr>
2604
2605
2606<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('loc1')"><a name="loc1Anchor">loc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;  InnerMatcher</td></tr>
2607<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
2608NestedNameSpecifier-matcher matches.
2609</pre></td></tr>
2610
2611
2612<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>
2613<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
2614given TypeLoc.
2615
2616Given
2617  struct A { struct B { struct C {}; }; };
2618  A::B::C c;
2619nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
2620  hasDeclaration(recordDecl(hasName("A")))))))
2621  matches "A::"
2622</pre></td></tr>
2623
2624
2625<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>
2626<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
2627
2628Given
2629  struct A { struct B { struct C {}; }; };
2630  A::B::C c;
2631nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
2632  matches "A::"
2633</pre></td></tr>
2634
2635
2636<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>
2637<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
2638given namespace matcher.
2639
2640Given
2641  namespace ns { struct A {}; }
2642  ns::A a;
2643nestedNameSpecifier(specifiesNamespace(hasName("ns")))
2644  matches "ns::"
2645</pre></td></tr>
2646
2647
2648<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>
2649<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
2650given QualType matcher without qualifiers.
2651
2652Given
2653  struct A { struct B { struct C {}; }; };
2654  A::B::C c;
2655nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
2656  matches "A::"
2657</pre></td></tr>
2658
2659
2660<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointeeLoc1')"><a name="pointeeLoc1Anchor">pointeeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
2661<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
2662pointee matches a given matcher.
2663
2664Given
2665  int *a;
2666  int const *b;
2667  float const *f;
2668pointerType(pointee(isConstQualified(), isInteger()))
2669  matches "int const *b"
2670
2671Usable 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;,
2672  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;
2673</pre></td></tr>
2674
2675
2676<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;</td><td class="name" onclick="toggle('pointee1')"><a name="pointee1Anchor">pointee</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
2677<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
2678pointee matches a given matcher.
2679
2680Given
2681  int *a;
2682  int const *b;
2683  float const *f;
2684pointerType(pointee(isConstQualified(), isInteger()))
2685  matches "int const *b"
2686
2687Usable 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;,
2688  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;
2689</pre></td></tr>
2690
2691
2692<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
2693<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a type if the declaration of the type matches the given
2694matcher.
2695
2696Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
2697  Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;
2698</pre></td></tr>
2699
2700
2701<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>
2702<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
2703</pre></td></tr>
2704
2705
2706<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>
2707<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
2708</pre></td></tr>
2709
2710
2711<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointeeLoc0')"><a name="pointeeLoc0Anchor">pointeeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
2712<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
2713pointee matches a given matcher.
2714
2715Given
2716  int *a;
2717  int const *b;
2718  float const *f;
2719pointerType(pointee(isConstQualified(), isInteger()))
2720  matches "int const *b"
2721
2722Usable 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;,
2723  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;
2724</pre></td></tr>
2725
2726
2727<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;</td><td class="name" onclick="toggle('pointee0')"><a name="pointee0Anchor">pointee</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
2728<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
2729pointee matches a given matcher.
2730
2731Given
2732  int *a;
2733  int const *b;
2734  float const *f;
2735pointerType(pointee(isConstQualified(), isInteger()))
2736  matches "int const *b"
2737
2738Usable 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;,
2739  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;
2740</pre></td></tr>
2741
2742
2743<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('alignOfExpr0')"><a name="alignOfExpr0Anchor">alignOfExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr>
2744<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
2745alignof.
2746</pre></td></tr>
2747
2748
2749<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('sizeOfExpr0')"><a name="sizeOfExpr0Anchor">sizeOfExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr>
2750<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
2751sizeof.
2752</pre></td></tr>
2753
2754
2755<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>
2756<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a TemplateArgument that refers to a certain declaration.
2757
2758Given
2759  template&lt;typename T&gt; struct A {};
2760  struct B { B* next; };
2761  A&lt;&amp;B::next&gt; a;
2762classTemplateSpecializationDecl(hasAnyTemplateArgument(
2763    refersToDeclaration(fieldDecl(hasName("next"))))
2764  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
2765    B::next
2766</pre></td></tr>
2767
2768
2769<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>
2770<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
2771
2772Given
2773  struct X {};
2774  template&lt;typename T&gt; struct A {};
2775  A&lt;X&gt; a;
2776classTemplateSpecializationDecl(hasAnyTemplateArgument(
2777    refersToType(class(hasName("X")))))
2778  matches the specialization A&lt;X&gt;
2779</pre></td></tr>
2780
2781
2782<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('loc0')"><a name="loc0Anchor">loc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;  InnerMatcher</td></tr>
2783<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
2784QualType-matcher matches.
2785</pre></td></tr>
2786
2787
2788<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;</td><td class="name" onclick="toggle('hasDecl0')"><a name="hasDecl0Anchor">hasDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt; InnerMatcher</td></tr>
2789<tr><td colspan="4" class="doc" id="hasDecl0"><pre>Matches TypedefTypes referring to a specific
2790TypedefNameDecl.
2791</pre></td></tr>
2792
2793
2794<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>
2795<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
2796
2797Given
2798  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
2799unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
2800  matches sizeof(a) and alignof(c)
2801</pre></td></tr>
2802
2803
2804<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>
2805<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
2806
2807Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
2808  !true
2809</pre></td></tr>
2810
2811
2812<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>
2813<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
2814
2815Given
2816  namespace X { void b(); }
2817  using X::b;
2818usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
2819  matches using X::b </pre></td></tr>
2820
2821
2822<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>
2823<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
2824matched by the given matcher.
2825
2826Given
2827  namespace X { int a; void b(); }
2828  using X::a;
2829  using X::b;
2830usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
2831  matches using X::b but not using X::a </pre></td></tr>
2832
2833
2834<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
2835<tr><td colspan="4" class="doc" id="hasType2"><pre>Overloaded to match the declaration of the expression's or value
2836declaration's type.
2837
2838In case of a value declaration (for example a variable declaration),
2839this resolves one layer of indirection. For example, in the value
2840declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
2841while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
2842of x."
2843
2844Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
2845            and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
2846 class X {};
2847 void y(X &amp;x) { x; X z; }
2848
2849Usable 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;
2850</pre></td></tr>
2851
2852
2853<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>
2854<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
2855that matches the given matcher.
2856
2857Example matches x (matcher = varDecl(hasInitializer(callExpr())))
2858  bool y() { return true; }
2859  bool x = y();
2860</pre></td></tr>
2861
2862
2863<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>
2864<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
2865expression.
2866
2867Given
2868  void f(int b) {
2869    int a[b];
2870  }
2871variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
2872  varDecl(hasName("b")))))))
2873  matches "int a[b]"
2874</pre></td></tr>
2875
2876
2877<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>
2878<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has
2879a given body.
2880
2881Given
2882  for (;;) {}
2883hasBody(compoundStmt())
2884  matches 'for (;;) {}'
2885with compoundStmt()
2886  matching '{}'
2887</pre></td></tr>
2888
2889
2890<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>
2891<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
2892or conditional operator.
2893
2894Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
2895  if (true) {}
2896</pre></td></tr>
2897
2898<!--END_TRAVERSAL_MATCHERS -->
2899</table>
2900
2901</div>
2902</body>
2903</html>
2904
2905
2906