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