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