xref: /aosp_15_r20/external/clang/docs/LibASTMatchersReference.html (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2*67e74705SXin Li          "http://www.w3.org/TR/html4/strict.dtd">
3*67e74705SXin Li<html>
4*67e74705SXin Li<head>
5*67e74705SXin Li<title>AST Matcher Reference</title>
6*67e74705SXin Li<link type="text/css" rel="stylesheet" href="../menu.css" />
7*67e74705SXin Li<link type="text/css" rel="stylesheet" href="../content.css" />
8*67e74705SXin Li<style type="text/css">
9*67e74705SXin Litd {
10*67e74705SXin Li  padding: .33em;
11*67e74705SXin Li}
12*67e74705SXin Litd.doc {
13*67e74705SXin Li  display: none;
14*67e74705SXin Li  border-bottom: 1px solid black;
15*67e74705SXin Li}
16*67e74705SXin Litd.name:hover {
17*67e74705SXin Li  color: blue;
18*67e74705SXin Li  cursor: pointer;
19*67e74705SXin Li}
20*67e74705SXin Li</style>
21*67e74705SXin Li<script type="text/javascript">
22*67e74705SXin Lifunction toggle(id) {
23*67e74705SXin Li  if (!id) return;
24*67e74705SXin Li  row = document.getElementById(id);
25*67e74705SXin Li  if (row.style.display != 'table-cell')
26*67e74705SXin Li    row.style.display = 'table-cell';
27*67e74705SXin Li  else
28*67e74705SXin Li    row.style.display = 'none';
29*67e74705SXin Li}
30*67e74705SXin Li</script>
31*67e74705SXin Li</head>
32*67e74705SXin Li<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
33*67e74705SXin Li
34*67e74705SXin Li<!--#include virtual="../menu.html.incl"-->
35*67e74705SXin Li
36*67e74705SXin Li<div id="content">
37*67e74705SXin Li
38*67e74705SXin Li<h1>AST Matcher Reference</h1>
39*67e74705SXin Li
40*67e74705SXin Li<p>This document shows all currently implemented matchers. The matchers are grouped
41*67e74705SXin Liby category and node type they match. You can click on matcher names to show the
42*67e74705SXin Limatcher's source documentation.</p>
43*67e74705SXin Li
44*67e74705SXin Li<p>There are three different basic categories of matchers:
45*67e74705SXin Li<ul>
46*67e74705SXin Li<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
47*67e74705SXin Li<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
48*67e74705SXin Li<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
49*67e74705SXin Li</ul>
50*67e74705SXin Li</p>
51*67e74705SXin Li
52*67e74705SXin Li<p>Within each category the matchers are ordered by node type they match on.
53*67e74705SXin LiNote that if a matcher can match multiple node types, it will it will appear
54*67e74705SXin Limultiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
55*67e74705SXin Lifind all matchers that can be used to match on Stmt nodes.</p>
56*67e74705SXin Li
57*67e74705SXin Li<p>The exception to that rule are matchers that can match on any node. Those
58*67e74705SXin Liare marked with a * and are listed in the beginning of each category.</p>
59*67e74705SXin Li
60*67e74705SXin Li<p>Note that the categorization of matchers is a great help when you combine
61*67e74705SXin Lithem into matcher expressions. You will usually want to form matcher expressions
62*67e74705SXin Lithat read like english sentences by alternating between node matchers and
63*67e74705SXin Linarrowing or traversal matchers, like this:
64*67e74705SXin Li<pre>
65*67e74705SXin LirecordDecl(hasDescendant(
66*67e74705SXin Li    ifStmt(hasTrueExpression(
67*67e74705SXin Li        expr(hasDescendant(
68*67e74705SXin Li            ifStmt()))))))
69*67e74705SXin Li</pre>
70*67e74705SXin Li</p>
71*67e74705SXin Li
72*67e74705SXin Li<!-- ======================================================================= -->
73*67e74705SXin Li<h2 id="decl-matchers">Node Matchers</h2>
74*67e74705SXin Li<!-- ======================================================================= -->
75*67e74705SXin Li
76*67e74705SXin Li<p>Node matchers are at the core of matcher expressions - they specify the type
77*67e74705SXin Liof node that is expected. Every match expression starts with a node matcher,
78*67e74705SXin Liwhich can then be further refined with a narrowing or traversal matcher. All
79*67e74705SXin Litraversal matchers take node matchers as their arguments.</p>
80*67e74705SXin Li
81*67e74705SXin Li<p>For convenience, all node matchers take an arbitrary number of arguments
82*67e74705SXin Liand implicitly act as allOf matchers.</p>
83*67e74705SXin Li
84*67e74705SXin Li<p>Node matchers are the only matchers that support the bind("id") call to
85*67e74705SXin Libind the matched node to the given string, to be later retrieved from the
86*67e74705SXin Limatch callback.</p>
87*67e74705SXin Li
88*67e74705SXin Li<p>It is important to remember that the arguments to node matchers are
89*67e74705SXin Lipredicates on the same node, just with additional information about the type.
90*67e74705SXin LiThis is often useful to make matcher expression more readable by inlining bind
91*67e74705SXin Licalls into redundant node matchers inside another node matcher:
92*67e74705SXin Li<pre>
93*67e74705SXin Li// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
94*67e74705SXin Li// the same node.
95*67e74705SXin LirecordDecl(decl().bind("id"), hasName("::MyClass"))
96*67e74705SXin Li</pre>
97*67e74705SXin Li</p>
98*67e74705SXin Li
99*67e74705SXin Li<table>
100*67e74705SXin Li<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
101*67e74705SXin Li<!-- START_DECL_MATCHERS -->
102*67e74705SXin Li
103*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;...</td></tr>
104*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
105*67e74705SXin Li
106*67e74705SXin LiExamples matches i(42).
107*67e74705SXin Li  class C {
108*67e74705SXin Li    C() : i(42) {}
109*67e74705SXin Li    int i;
110*67e74705SXin Li  };
111*67e74705SXin Li</pre></td></tr>
112*67e74705SXin Li
113*67e74705SXin Li
114*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>&gt;...</td></tr>
115*67e74705SXin Li<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
116*67e74705SXin Li
117*67e74705SXin LiGiven
118*67e74705SXin Li  class C {
119*67e74705SXin Li  public:
120*67e74705SXin Li    int a;
121*67e74705SXin Li  };
122*67e74705SXin LiaccessSpecDecl()
123*67e74705SXin Li  matches 'public:'
124*67e74705SXin Li</pre></td></tr>
125*67e74705SXin Li
126*67e74705SXin Li
127*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
128*67e74705SXin Li<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
129*67e74705SXin Li
130*67e74705SXin LiExample matches Z
131*67e74705SXin Li  template&lt;class T&gt; class Z {};
132*67e74705SXin Li</pre></td></tr>
133*67e74705SXin Li
134*67e74705SXin Li
135*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
136*67e74705SXin Li<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
137*67e74705SXin Li
138*67e74705SXin LiGiven
139*67e74705SXin Li  template&lt;typename T&gt; class A {};
140*67e74705SXin Li  template&lt;&gt; class A&lt;double&gt; {};
141*67e74705SXin Li  A&lt;int&gt; a;
142*67e74705SXin LiclassTemplateSpecializationDecl()
143*67e74705SXin Li  matches the specializations A&lt;int&gt; and A&lt;double&gt;
144*67e74705SXin Li</pre></td></tr>
145*67e74705SXin Li
146*67e74705SXin Li
147*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
148*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
149*67e74705SXin Li
150*67e74705SXin LiExample matches Foo::Foo() and Foo::Foo(int)
151*67e74705SXin Li  class Foo {
152*67e74705SXin Li   public:
153*67e74705SXin Li    Foo();
154*67e74705SXin Li    Foo(int);
155*67e74705SXin Li    int DoSomething();
156*67e74705SXin Li  };
157*67e74705SXin Li</pre></td></tr>
158*67e74705SXin Li
159*67e74705SXin Li
160*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;...</td></tr>
161*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
162*67e74705SXin Li
163*67e74705SXin LiExample matches the operator.
164*67e74705SXin Li  class X { operator int() const; };
165*67e74705SXin Li</pre></td></tr>
166*67e74705SXin Li
167*67e74705SXin Li
168*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
169*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
170*67e74705SXin Li
171*67e74705SXin LiExample matches Foo::~Foo()
172*67e74705SXin Li  class Foo {
173*67e74705SXin Li   public:
174*67e74705SXin Li    virtual ~Foo();
175*67e74705SXin Li  };
176*67e74705SXin Li</pre></td></tr>
177*67e74705SXin Li
178*67e74705SXin Li
179*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
180*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
181*67e74705SXin Li
182*67e74705SXin LiExample matches y
183*67e74705SXin Li  class X { void y(); };
184*67e74705SXin Li</pre></td></tr>
185*67e74705SXin Li
186*67e74705SXin Li
187*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
188*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
189*67e74705SXin Li
190*67e74705SXin LiExample matches X, Z
191*67e74705SXin Li  class X;
192*67e74705SXin Li  template&lt;class T&gt; class Z {};
193*67e74705SXin Li</pre></td></tr>
194*67e74705SXin Li
195*67e74705SXin Li
196*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
197*67e74705SXin Li<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
198*67e74705SXin Li
199*67e74705SXin LiExamples matches X, C, and the friend declaration inside C;
200*67e74705SXin Li  void X();
201*67e74705SXin Li  class C {
202*67e74705SXin Li    friend X;
203*67e74705SXin Li  };
204*67e74705SXin Li</pre></td></tr>
205*67e74705SXin Li
206*67e74705SXin Li
207*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;...</td></tr>
208*67e74705SXin Li<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
209*67e74705SXin Liand non-type template parameter declarations).
210*67e74705SXin Li
211*67e74705SXin LiGiven
212*67e74705SXin Li  class X { int y; };
213*67e74705SXin LideclaratorDecl()
214*67e74705SXin Li  matches int y.
215*67e74705SXin Li</pre></td></tr>
216*67e74705SXin Li
217*67e74705SXin Li
218*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
219*67e74705SXin Li<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
220*67e74705SXin Li
221*67e74705SXin LiExample matches A, B, C
222*67e74705SXin Li  enum X {
223*67e74705SXin Li    A, B, C
224*67e74705SXin Li  };
225*67e74705SXin Li</pre></td></tr>
226*67e74705SXin Li
227*67e74705SXin Li
228*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
229*67e74705SXin Li<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
230*67e74705SXin Li
231*67e74705SXin LiExample matches X
232*67e74705SXin Li  enum X {
233*67e74705SXin Li    A, B, C
234*67e74705SXin Li  };
235*67e74705SXin Li</pre></td></tr>
236*67e74705SXin Li
237*67e74705SXin Li
238*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
239*67e74705SXin Li<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
240*67e74705SXin Li
241*67e74705SXin LiGiven
242*67e74705SXin Li  class X { int m; };
243*67e74705SXin LifieldDecl()
244*67e74705SXin Li  matches 'm'.
245*67e74705SXin Li</pre></td></tr>
246*67e74705SXin Li
247*67e74705SXin Li
248*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;...</td></tr>
249*67e74705SXin Li<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
250*67e74705SXin Li
251*67e74705SXin LiGiven
252*67e74705SXin Li  class X { friend void foo(); };
253*67e74705SXin LifriendDecl()
254*67e74705SXin Li  matches 'friend void foo()'.
255*67e74705SXin Li</pre></td></tr>
256*67e74705SXin Li
257*67e74705SXin Li
258*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
259*67e74705SXin Li<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
260*67e74705SXin Li
261*67e74705SXin LiExample matches f
262*67e74705SXin Li  void f();
263*67e74705SXin Li</pre></td></tr>
264*67e74705SXin Li
265*67e74705SXin Li
266*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
267*67e74705SXin Li<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
268*67e74705SXin Li
269*67e74705SXin LiExample matches f
270*67e74705SXin Li  template&lt;class T&gt; void f(T t) {}
271*67e74705SXin Li</pre></td></tr>
272*67e74705SXin Li
273*67e74705SXin Li
274*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>&gt;...</td></tr>
275*67e74705SXin Li<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
276*67e74705SXin Li
277*67e74705SXin LiGiven
278*67e74705SXin Li  goto FOO;
279*67e74705SXin Li  FOO: bar();
280*67e74705SXin LilabelDecl()
281*67e74705SXin Li  matches 'FOO:'
282*67e74705SXin Li</pre></td></tr>
283*67e74705SXin Li
284*67e74705SXin Li
285*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>&gt;...</td></tr>
286*67e74705SXin Li<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
287*67e74705SXin Li
288*67e74705SXin LiGiven
289*67e74705SXin Li  extern "C" {}
290*67e74705SXin LilinkageSpecDecl()
291*67e74705SXin Li  matches "extern "C" {}"
292*67e74705SXin Li</pre></td></tr>
293*67e74705SXin Li
294*67e74705SXin Li
295*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
296*67e74705SXin Li<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
297*67e74705SXin Li
298*67e74705SXin LiExample matches X, S, the anonymous union type, i, and U;
299*67e74705SXin Li  typedef int X;
300*67e74705SXin Li  struct S {
301*67e74705SXin Li    union {
302*67e74705SXin Li      int i;
303*67e74705SXin Li    } U;
304*67e74705SXin Li  };
305*67e74705SXin Li</pre></td></tr>
306*67e74705SXin Li
307*67e74705SXin Li
308*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>&gt;...</td></tr>
309*67e74705SXin Li<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
310*67e74705SXin Li
311*67e74705SXin LiGiven
312*67e74705SXin Li  namespace test {}
313*67e74705SXin Li  namespace alias = ::test;
314*67e74705SXin LinamespaceAliasDecl()
315*67e74705SXin Li  matches "namespace alias" but not "namespace test"
316*67e74705SXin Li</pre></td></tr>
317*67e74705SXin Li
318*67e74705SXin Li
319*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;...</td></tr>
320*67e74705SXin Li<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
321*67e74705SXin Li
322*67e74705SXin LiGiven
323*67e74705SXin Li  namespace {}
324*67e74705SXin Li  namespace test {}
325*67e74705SXin LinamespaceDecl()
326*67e74705SXin Li  matches "namespace {}" and "namespace test {}"
327*67e74705SXin Li</pre></td></tr>
328*67e74705SXin Li
329*67e74705SXin Li
330*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>&gt;...</td></tr>
331*67e74705SXin Li<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
332*67e74705SXin Li
333*67e74705SXin LiGiven
334*67e74705SXin Li  template &lt;typename T, int N&gt; struct C {};
335*67e74705SXin LinonTypeTemplateParmDecl()
336*67e74705SXin Li  matches 'N', but not 'T'.
337*67e74705SXin Li</pre></td></tr>
338*67e74705SXin Li
339*67e74705SXin Li
340*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;...</td></tr>
341*67e74705SXin Li<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
342*67e74705SXin Li
343*67e74705SXin LiExample matches Foo
344*67e74705SXin Li  @interface Foo
345*67e74705SXin Li  @end
346*67e74705SXin Li</pre></td></tr>
347*67e74705SXin Li
348*67e74705SXin Li
349*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;...</td></tr>
350*67e74705SXin Li<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
351*67e74705SXin Li
352*67e74705SXin LiGiven
353*67e74705SXin Li  void f(int x);
354*67e74705SXin LiparmVarDecl()
355*67e74705SXin Li  matches int x.
356*67e74705SXin Li</pre></td></tr>
357*67e74705SXin Li
358*67e74705SXin Li
359*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;...</td></tr>
360*67e74705SXin Li<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
361*67e74705SXin Li
362*67e74705SXin LiExample matches X, Z, U, and S
363*67e74705SXin Li  class X;
364*67e74705SXin Li  template&lt;class T&gt; class Z {};
365*67e74705SXin Li  struct S {};
366*67e74705SXin Li  union U {};
367*67e74705SXin Li</pre></td></tr>
368*67e74705SXin Li
369*67e74705SXin Li
370*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>&gt;...</td></tr>
371*67e74705SXin Li<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
372*67e74705SXin Li
373*67e74705SXin LiExample:
374*67e74705SXin Li  staticAssertExpr()
375*67e74705SXin Limatches
376*67e74705SXin Li  static_assert(sizeof(S) == sizeof(int))
377*67e74705SXin Liin
378*67e74705SXin Li  struct S {
379*67e74705SXin Li    int x;
380*67e74705SXin Li  };
381*67e74705SXin Li  static_assert(sizeof(S) == sizeof(int));
382*67e74705SXin Li</pre></td></tr>
383*67e74705SXin Li
384*67e74705SXin Li
385*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>&gt;...</td></tr>
386*67e74705SXin Li<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
387*67e74705SXin Li
388*67e74705SXin LiGiven
389*67e74705SXin Li  template &lt;typename T, int N&gt; struct C {};
390*67e74705SXin LitemplateTypeParmDecl()
391*67e74705SXin Li  matches 'T', but not 'N'.
392*67e74705SXin Li</pre></td></tr>
393*67e74705SXin Li
394*67e74705SXin Li
395*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
396*67e74705SXin Li<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
397*67e74705SXin Li
398*67e74705SXin LiGiven
399*67e74705SXin Li  int X;
400*67e74705SXin Li  namespace NS {
401*67e74705SXin Li  int Y;
402*67e74705SXin Li  }  namespace NS
403*67e74705SXin Lidecl(hasDeclContext(translationUnitDecl()))
404*67e74705SXin Li  matches "int X", but not "int Y".
405*67e74705SXin Li</pre></td></tr>
406*67e74705SXin Li
407*67e74705SXin Li
408*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>&gt;...</td></tr>
409*67e74705SXin Li<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
410*67e74705SXin Li
411*67e74705SXin LiGiven
412*67e74705SXin Li  typedef int X;
413*67e74705SXin Li  using Y = int;
414*67e74705SXin LitypeAliasDecl()
415*67e74705SXin Li  matches "using Y = int", but not "typedef int X"
416*67e74705SXin Li</pre></td></tr>
417*67e74705SXin Li
418*67e74705SXin Li
419*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>&gt;...</td></tr>
420*67e74705SXin Li<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
421*67e74705SXin Li
422*67e74705SXin LiGiven
423*67e74705SXin Li  typedef int X;
424*67e74705SXin Li  using Y = int;
425*67e74705SXin LitypedefDecl()
426*67e74705SXin Li  matches "typedef int X", but not "using Y = int"
427*67e74705SXin Li</pre></td></tr>
428*67e74705SXin Li
429*67e74705SXin Li
430*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;...</td></tr>
431*67e74705SXin Li<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
432*67e74705SXin Li
433*67e74705SXin LiGiven
434*67e74705SXin Li  typedef int X;
435*67e74705SXin Li  using Y = int;
436*67e74705SXin LitypedefNameDecl()
437*67e74705SXin Li  matches "typedef int X" and "using Y = int"
438*67e74705SXin Li</pre></td></tr>
439*67e74705SXin Li
440*67e74705SXin Li
441*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>&gt;...</td></tr>
442*67e74705SXin Li<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
443*67e74705SXin Litypename.
444*67e74705SXin Li
445*67e74705SXin LiGiven
446*67e74705SXin Li  template &lt;typename T&gt;
447*67e74705SXin Li  struct Base { typedef T Foo; };
448*67e74705SXin Li
449*67e74705SXin Li  template&lt;typename T&gt;
450*67e74705SXin Li  struct S : private Base&lt;T&gt; {
451*67e74705SXin Li    using typename Base&lt;T&gt;::Foo;
452*67e74705SXin Li  };
453*67e74705SXin LiunresolvedUsingTypenameDecl()
454*67e74705SXin Li  matches using Base&lt;T&gt;::Foo </pre></td></tr>
455*67e74705SXin Li
456*67e74705SXin Li
457*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>&gt;...</td></tr>
458*67e74705SXin Li<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
459*67e74705SXin Li
460*67e74705SXin LiGiven
461*67e74705SXin Li  template&lt;typename X&gt;
462*67e74705SXin Li  class C : private X {
463*67e74705SXin Li    using X::x;
464*67e74705SXin Li  };
465*67e74705SXin LiunresolvedUsingValueDecl()
466*67e74705SXin Li  matches using X::x </pre></td></tr>
467*67e74705SXin Li
468*67e74705SXin Li
469*67e74705SXin Li<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>
470*67e74705SXin Li<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
471*67e74705SXin Li
472*67e74705SXin LiGiven
473*67e74705SXin Li  namespace X { int x; }
474*67e74705SXin Li  using X::x;
475*67e74705SXin LiusingDecl()
476*67e74705SXin Li  matches using X::x </pre></td></tr>
477*67e74705SXin Li
478*67e74705SXin Li
479*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>&gt;...</td></tr>
480*67e74705SXin Li<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
481*67e74705SXin Li
482*67e74705SXin LiGiven
483*67e74705SXin Li  namespace X { int x; }
484*67e74705SXin Li  using namespace X;
485*67e74705SXin LiusingDirectiveDecl()
486*67e74705SXin Li  matches using namespace X </pre></td></tr>
487*67e74705SXin Li
488*67e74705SXin Li
489*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;...</td></tr>
490*67e74705SXin Li<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
491*67e74705SXin Li
492*67e74705SXin LiExample matches A, B, C and F
493*67e74705SXin Li  enum X { A, B, C };
494*67e74705SXin Li  void F();
495*67e74705SXin Li</pre></td></tr>
496*67e74705SXin Li
497*67e74705SXin Li
498*67e74705SXin Li<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>
499*67e74705SXin Li<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
500*67e74705SXin Li
501*67e74705SXin LiNote: this does not match declarations of member variables, which are
502*67e74705SXin Li"field" declarations in Clang parlance.
503*67e74705SXin Li
504*67e74705SXin LiExample matches a
505*67e74705SXin Li  int a;
506*67e74705SXin Li</pre></td></tr>
507*67e74705SXin Li
508*67e74705SXin Li
509*67e74705SXin Li<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>
510*67e74705SXin Li<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
511*67e74705SXin Li</pre></td></tr>
512*67e74705SXin Li
513*67e74705SXin Li
514*67e74705SXin Li<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>
515*67e74705SXin Li<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
516*67e74705SXin Li
517*67e74705SXin LiGiven
518*67e74705SXin Li  namespace ns {
519*67e74705SXin Li    struct A { static void f(); };
520*67e74705SXin Li    void A::f() {}
521*67e74705SXin Li    void g() { A::f(); }
522*67e74705SXin Li  }
523*67e74705SXin Li  ns::A a;
524*67e74705SXin LinestedNameSpecifier()
525*67e74705SXin Li  matches "ns::" and both "A::"
526*67e74705SXin Li</pre></td></tr>
527*67e74705SXin Li
528*67e74705SXin Li
529*67e74705SXin Li<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>
530*67e74705SXin Li<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
531*67e74705SXin Li</pre></td></tr>
532*67e74705SXin Li
533*67e74705SXin Li
534*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;...</td></tr>
535*67e74705SXin Li<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
536*67e74705SXin Li
537*67e74705SXin LiGiven
538*67e74705SXin Li  FOO: bar();
539*67e74705SXin Li  void *ptr = &amp;&amp;FOO;
540*67e74705SXin Li  goto *bar;
541*67e74705SXin LiaddrLabelExpr()
542*67e74705SXin Li  matches '&amp;&amp;FOO'
543*67e74705SXin Li</pre></td></tr>
544*67e74705SXin Li
545*67e74705SXin Li
546*67e74705SXin Li<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>
547*67e74705SXin Li<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
548*67e74705SXin Li
549*67e74705SXin LiGiven
550*67e74705SXin Li  int i = a[1];
551*67e74705SXin LiarraySubscriptExpr()
552*67e74705SXin Li  matches "a[1]"
553*67e74705SXin Li</pre></td></tr>
554*67e74705SXin Li
555*67e74705SXin Li
556*67e74705SXin Li<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>
557*67e74705SXin Li<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
558*67e74705SXin Li
559*67e74705SXin Li int i = 100;
560*67e74705SXin Li  __asm("mov al, 2");
561*67e74705SXin LiasmStmt()
562*67e74705SXin Li  matches '__asm("mov al, 2")'
563*67e74705SXin Li</pre></td></tr>
564*67e74705SXin Li
565*67e74705SXin Li
566*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>&gt;...</td></tr>
567*67e74705SXin Li<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
568*67e74705SXin LiExample matches __atomic_load_n(ptr, 1)
569*67e74705SXin Li  void foo() { int *ptr; __atomic_load_n(ptr, 1); }
570*67e74705SXin Li</pre></td></tr>
571*67e74705SXin Li
572*67e74705SXin Li
573*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>&gt;...</td></tr>
574*67e74705SXin Li<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
575*67e74705SXin Li
576*67e74705SXin LiExample matches a ?: b
577*67e74705SXin Li  (a ?: b) + 42;
578*67e74705SXin Li</pre></td></tr>
579*67e74705SXin Li
580*67e74705SXin Li
581*67e74705SXin Li<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>
582*67e74705SXin Li<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
583*67e74705SXin Li
584*67e74705SXin LiExample matches a || b
585*67e74705SXin Li  !(a || b)
586*67e74705SXin Li</pre></td></tr>
587*67e74705SXin Li
588*67e74705SXin Li
589*67e74705SXin Li<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>
590*67e74705SXin Li<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
591*67e74705SXin Li
592*67e74705SXin LiGiven
593*67e74705SXin Li  while (true) { break; }
594*67e74705SXin LibreakStmt()
595*67e74705SXin Li  matches 'break'
596*67e74705SXin Li</pre></td></tr>
597*67e74705SXin Li
598*67e74705SXin Li
599*67e74705SXin Li<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>
600*67e74705SXin Li<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
601*67e74705SXin Li
602*67e74705SXin LiExample: Matches (int*) 2.2f in
603*67e74705SXin Li  int i = (int) 2.2f;
604*67e74705SXin Li</pre></td></tr>
605*67e74705SXin Li
606*67e74705SXin Li
607*67e74705SXin Li<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>
608*67e74705SXin Li<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
609*67e74705SXin Li
610*67e74705SXin LiExample matches x.y() and y()
611*67e74705SXin Li  X x;
612*67e74705SXin Li  x.y();
613*67e74705SXin Li  y();
614*67e74705SXin Li</pre></td></tr>
615*67e74705SXin Li
616*67e74705SXin Li
617*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;...</td></tr>
618*67e74705SXin Li<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
619*67e74705SXin Li
620*67e74705SXin LiGiven
621*67e74705SXin Li  switch(a) { case 42: break; default: break; }
622*67e74705SXin LicaseStmt()
623*67e74705SXin Li  matches 'case 42: break;'.
624*67e74705SXin Li</pre></td></tr>
625*67e74705SXin Li
626*67e74705SXin Li
627*67e74705SXin Li<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>
628*67e74705SXin Li<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
629*67e74705SXin Li
630*67e74705SXin LiExample: castExpr() matches each of the following:
631*67e74705SXin Li  (int) 3;
632*67e74705SXin Li  const_cast&lt;Expr *&gt;(SubExpr);
633*67e74705SXin Li  char c = 0;
634*67e74705SXin Libut does not match
635*67e74705SXin Li  int i = (0);
636*67e74705SXin Li  int k = 0;
637*67e74705SXin Li</pre></td></tr>
638*67e74705SXin Li
639*67e74705SXin Li
640*67e74705SXin Li<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>
641*67e74705SXin Li<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
642*67e74705SXin Li
643*67e74705SXin LiNot matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
644*67e74705SXin Lithough.
645*67e74705SXin Li
646*67e74705SXin LiExample matches 'a', L'a'
647*67e74705SXin Li  char ch = 'a';
648*67e74705SXin Li  wchar_t chw = L'a';
649*67e74705SXin Li</pre></td></tr>
650*67e74705SXin Li
651*67e74705SXin Li
652*67e74705SXin Li<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>
653*67e74705SXin Li<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
654*67e74705SXin Li
655*67e74705SXin LiExample match: {1}, (1, 2)
656*67e74705SXin Li  int array[4] = {1};
657*67e74705SXin Li  vector int myvec = (vector int)(1, 2);
658*67e74705SXin Li</pre></td></tr>
659*67e74705SXin Li
660*67e74705SXin Li
661*67e74705SXin Li<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>
662*67e74705SXin Li<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
663*67e74705SXin Li
664*67e74705SXin LiExample matches '{}' and '{{}}'in 'for (;;) {{}}'
665*67e74705SXin Li  for (;;) {{}}
666*67e74705SXin Li</pre></td></tr>
667*67e74705SXin Li
668*67e74705SXin Li
669*67e74705SXin Li<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>
670*67e74705SXin Li<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
671*67e74705SXin Li
672*67e74705SXin LiExample matches a ? b : c
673*67e74705SXin Li  (a ? b : c) + 42
674*67e74705SXin Li</pre></td></tr>
675*67e74705SXin Li
676*67e74705SXin Li
677*67e74705SXin Li<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>
678*67e74705SXin Li<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
679*67e74705SXin Li
680*67e74705SXin LiGiven
681*67e74705SXin Li  while (true) { continue; }
682*67e74705SXin LicontinueStmt()
683*67e74705SXin Li  matches 'continue'
684*67e74705SXin Li</pre></td></tr>
685*67e74705SXin Li
686*67e74705SXin Li
687*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>&gt;...</td></tr>
688*67e74705SXin Li<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
689*67e74705SXin Li
690*67e74705SXin LiExample matches,
691*67e74705SXin Li  kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
692*67e74705SXin Li</pre></td></tr>
693*67e74705SXin Li
694*67e74705SXin Li
695*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
696*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
697*67e74705SXin Li
698*67e74705SXin LiExample matches FunctionTakesString(GetStringByValue())
699*67e74705SXin Li    (matcher = cxxBindTemporaryExpr())
700*67e74705SXin Li  FunctionTakesString(GetStringByValue());
701*67e74705SXin Li  FunctionTakesStringByPointer(GetStringPointer());
702*67e74705SXin Li</pre></td></tr>
703*67e74705SXin Li
704*67e74705SXin Li
705*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
706*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
707*67e74705SXin Li
708*67e74705SXin LiExample matches true
709*67e74705SXin Li  true
710*67e74705SXin Li</pre></td></tr>
711*67e74705SXin Li
712*67e74705SXin Li
713*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
714*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
715*67e74705SXin Li
716*67e74705SXin Li  try {} catch(int i) {}
717*67e74705SXin LicxxCatchStmt()
718*67e74705SXin Li  matches 'catch(int i)'
719*67e74705SXin Li</pre></td></tr>
720*67e74705SXin Li
721*67e74705SXin Li
722*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
723*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
724*67e74705SXin Li
725*67e74705SXin LiExample: Matches const_cast&lt;int*&gt;(&amp;r) in
726*67e74705SXin Li  int n = 42;
727*67e74705SXin Li  const int &amp;r(n);
728*67e74705SXin Li  int* p = const_cast&lt;int*&gt;(&amp;r);
729*67e74705SXin Li</pre></td></tr>
730*67e74705SXin Li
731*67e74705SXin Li
732*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
733*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
734*67e74705SXin Li
735*67e74705SXin LiExample matches string(ptr, n) and ptr within arguments of f
736*67e74705SXin Li    (matcher = cxxConstructExpr())
737*67e74705SXin Li  void f(const string &amp;a, const string &amp;b);
738*67e74705SXin Li  char *ptr;
739*67e74705SXin Li  int n;
740*67e74705SXin Li  f(string(ptr, n), ptr);
741*67e74705SXin Li</pre></td></tr>
742*67e74705SXin Li
743*67e74705SXin Li
744*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
745*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
746*67e74705SXin Li
747*67e74705SXin LiExample matches the CXXDefaultArgExpr placeholder inserted for the
748*67e74705SXin Li    default value of the second parameter in the call expression f(42)
749*67e74705SXin Li    (matcher = cxxDefaultArgExpr())
750*67e74705SXin Li  void f(int x, int y = 0);
751*67e74705SXin Li  f(42);
752*67e74705SXin Li</pre></td></tr>
753*67e74705SXin Li
754*67e74705SXin Li
755*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
756*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
757*67e74705SXin Li
758*67e74705SXin LiGiven
759*67e74705SXin Li  delete X;
760*67e74705SXin LicxxDeleteExpr()
761*67e74705SXin Li  matches 'delete X'.
762*67e74705SXin Li</pre></td></tr>
763*67e74705SXin Li
764*67e74705SXin Li
765*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
766*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
767*67e74705SXin Li
768*67e74705SXin LiExample:
769*67e74705SXin Li  cxxDynamicCastExpr()
770*67e74705SXin Limatches
771*67e74705SXin Li  dynamic_cast&lt;D*&gt;(&amp;b);
772*67e74705SXin Liin
773*67e74705SXin Li  struct B { virtual ~B() {} }; struct D : B {};
774*67e74705SXin Li  B b;
775*67e74705SXin Li  D* p = dynamic_cast&lt;D*&gt;(&amp;b);
776*67e74705SXin Li</pre></td></tr>
777*67e74705SXin Li
778*67e74705SXin Li
779*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
780*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
781*67e74705SXin Li
782*67e74705SXin LicxxForRangeStmt() matches 'for (auto a : i)'
783*67e74705SXin Li  int i[] =  {1, 2, 3}; for (auto a : i);
784*67e74705SXin Li  for(int j = 0; j &lt; 5; ++j);
785*67e74705SXin Li</pre></td></tr>
786*67e74705SXin Li
787*67e74705SXin Li
788*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
789*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
790*67e74705SXin Li
791*67e74705SXin LiExample: Matches Foo(bar);
792*67e74705SXin Li  Foo f = bar;
793*67e74705SXin Li  Foo g = (Foo) bar;
794*67e74705SXin Li  Foo h = Foo(bar);
795*67e74705SXin Li</pre></td></tr>
796*67e74705SXin Li
797*67e74705SXin Li
798*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
799*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
800*67e74705SXin Li
801*67e74705SXin LiExample matches x.y()
802*67e74705SXin Li  X x;
803*67e74705SXin Li  x.y();
804*67e74705SXin Li</pre></td></tr>
805*67e74705SXin Li
806*67e74705SXin Li
807*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
808*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
809*67e74705SXin Li
810*67e74705SXin LiGiven
811*67e74705SXin Li  new X;
812*67e74705SXin LicxxNewExpr()
813*67e74705SXin Li  matches 'new X'.
814*67e74705SXin Li</pre></td></tr>
815*67e74705SXin Li
816*67e74705SXin Li
817*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
818*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
819*67e74705SXin Li</pre></td></tr>
820*67e74705SXin Li
821*67e74705SXin Li
822*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
823*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
824*67e74705SXin Li
825*67e74705SXin LiNote that if an operator isn't overloaded, it won't match. Instead, use
826*67e74705SXin LibinaryOperator matcher.
827*67e74705SXin LiCurrently it does not match operators such as new delete.
828*67e74705SXin LiFIXME: figure out why these do not match?
829*67e74705SXin Li
830*67e74705SXin LiExample matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
831*67e74705SXin Li    (matcher = cxxOperatorCallExpr())
832*67e74705SXin Li  ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
833*67e74705SXin Li  ostream &amp;o; int b = 1, c = 1;
834*67e74705SXin Li  o &lt;&lt; b &lt;&lt; c;
835*67e74705SXin Li</pre></td></tr>
836*67e74705SXin Li
837*67e74705SXin Li
838*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
839*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
840*67e74705SXin Li
841*67e74705SXin LiEither the source expression or the destination type can be matched
842*67e74705SXin Liusing has(), but hasDestinationType() is more specific and can be
843*67e74705SXin Limore readable.
844*67e74705SXin Li
845*67e74705SXin LiExample matches reinterpret_cast&lt;char*&gt;(&amp;p) in
846*67e74705SXin Li  void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
847*67e74705SXin Li</pre></td></tr>
848*67e74705SXin Li
849*67e74705SXin Li
850*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
851*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
852*67e74705SXin Li
853*67e74705SXin LiSee also: hasDestinationType
854*67e74705SXin LiSee also: reinterpretCast
855*67e74705SXin Li
856*67e74705SXin LiExample:
857*67e74705SXin Li  cxxStaticCastExpr()
858*67e74705SXin Limatches
859*67e74705SXin Li  static_cast&lt;long&gt;(8)
860*67e74705SXin Liin
861*67e74705SXin Li  long eight(static_cast&lt;long&gt;(8));
862*67e74705SXin Li</pre></td></tr>
863*67e74705SXin Li
864*67e74705SXin Li
865*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
866*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
867*67e74705SXin Li
868*67e74705SXin LiExample: Matches Foo(bar, bar)
869*67e74705SXin Li  Foo h = Foo(bar, bar);
870*67e74705SXin Li</pre></td></tr>
871*67e74705SXin Li
872*67e74705SXin Li
873*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
874*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
875*67e74705SXin Li
876*67e74705SXin LiExample matches the implicit this expression in "return i".
877*67e74705SXin Li    (matcher = cxxThisExpr())
878*67e74705SXin Listruct foo {
879*67e74705SXin Li  int i;
880*67e74705SXin Li  int f() { return i; }
881*67e74705SXin Li};
882*67e74705SXin Li</pre></td></tr>
883*67e74705SXin Li
884*67e74705SXin Li
885*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
886*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
887*67e74705SXin Li
888*67e74705SXin Li  try { throw 5; } catch(int i) {}
889*67e74705SXin LicxxThrowExpr()
890*67e74705SXin Li  matches 'throw 5'
891*67e74705SXin Li</pre></td></tr>
892*67e74705SXin Li
893*67e74705SXin Li
894*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
895*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
896*67e74705SXin Li
897*67e74705SXin Li  try {} catch(int i) {}
898*67e74705SXin LicxxTryStmt()
899*67e74705SXin Li  matches 'try {}'
900*67e74705SXin Li</pre></td></tr>
901*67e74705SXin Li
902*67e74705SXin Li
903*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
904*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
905*67e74705SXin Li
906*67e74705SXin LiExample matches T(t) in return statement of f
907*67e74705SXin Li    (matcher = cxxUnresolvedConstructExpr())
908*67e74705SXin Li  template &lt;typename T&gt;
909*67e74705SXin Li  void f(const T&amp; t) { return T(t); }
910*67e74705SXin Li</pre></td></tr>
911*67e74705SXin Li
912*67e74705SXin Li
913*67e74705SXin Li<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>
914*67e74705SXin Li<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
915*67e74705SXin Li
916*67e74705SXin LiExample matches x in if (x)
917*67e74705SXin Li  bool x;
918*67e74705SXin Li  if (x) {}
919*67e74705SXin Li</pre></td></tr>
920*67e74705SXin Li
921*67e74705SXin Li
922*67e74705SXin Li<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>
923*67e74705SXin Li<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
924*67e74705SXin Li
925*67e74705SXin LiGiven
926*67e74705SXin Li  int a;
927*67e74705SXin LideclStmt()
928*67e74705SXin Li  matches 'int a'.
929*67e74705SXin Li</pre></td></tr>
930*67e74705SXin Li
931*67e74705SXin Li
932*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>&gt;...</td></tr>
933*67e74705SXin Li<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
934*67e74705SXin Li
935*67e74705SXin LiGiven
936*67e74705SXin Li  switch(a) { case 42: break; default: break; }
937*67e74705SXin LidefaultStmt()
938*67e74705SXin Li  matches 'default: break;'.
939*67e74705SXin Li</pre></td></tr>
940*67e74705SXin Li
941*67e74705SXin Li
942*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;...</td></tr>
943*67e74705SXin Li<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
944*67e74705SXin Li
945*67e74705SXin LiExample: Matches { [2].y = 1.0, [0].x = 1.0 }
946*67e74705SXin Li  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
947*67e74705SXin Li</pre></td></tr>
948*67e74705SXin Li
949*67e74705SXin Li
950*67e74705SXin Li<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>
951*67e74705SXin Li<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
952*67e74705SXin Li
953*67e74705SXin LiGiven
954*67e74705SXin Li  do {} while (true);
955*67e74705SXin LidoStmt()
956*67e74705SXin Li  matches 'do {} while(true)'
957*67e74705SXin Li</pre></td></tr>
958*67e74705SXin Li
959*67e74705SXin Li
960*67e74705SXin Li<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>
961*67e74705SXin Li<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
962*67e74705SXin Li
963*67e74705SXin LiMatches any cast expression written in user code, whether it be a
964*67e74705SXin LiC-style cast, a functional-style cast, or a keyword cast.
965*67e74705SXin Li
966*67e74705SXin LiDoes not match implicit conversions.
967*67e74705SXin Li
968*67e74705SXin LiNote: the name "explicitCast" is chosen to match Clang's terminology, as
969*67e74705SXin LiClang uses the term "cast" to apply to implicit conversions as well as to
970*67e74705SXin Liactual cast expressions.
971*67e74705SXin Li
972*67e74705SXin LiSee also: hasDestinationType.
973*67e74705SXin Li
974*67e74705SXin LiExample: matches all five of the casts in
975*67e74705SXin Li  int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
976*67e74705SXin Libut does not match the implicit conversion in
977*67e74705SXin Li  long ell = 42;
978*67e74705SXin Li</pre></td></tr>
979*67e74705SXin Li
980*67e74705SXin Li
981*67e74705SXin Li<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>
982*67e74705SXin Li<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
983*67e74705SXin Li
984*67e74705SXin LiExample matches x()
985*67e74705SXin Li  void f() { x(); }
986*67e74705SXin Li</pre></td></tr>
987*67e74705SXin Li
988*67e74705SXin Li
989*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>&gt;...</td></tr>
990*67e74705SXin Li<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
991*67e74705SXin Liof the sub-expression's evaluation.
992*67e74705SXin Li
993*67e74705SXin LiExample matches std::string()
994*67e74705SXin Li  const std::string str = std::string();
995*67e74705SXin Li</pre></td></tr>
996*67e74705SXin Li
997*67e74705SXin Li
998*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;...</td></tr>
999*67e74705SXin Li<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g.
1000*67e74705SXin Li1.0, 1.0f, 1.0L and 1e10.
1001*67e74705SXin Li
1002*67e74705SXin LiDoes not match implicit conversions such as
1003*67e74705SXin Li  float a = 10;
1004*67e74705SXin Li</pre></td></tr>
1005*67e74705SXin Li
1006*67e74705SXin Li
1007*67e74705SXin Li<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>
1008*67e74705SXin Li<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1009*67e74705SXin Li
1010*67e74705SXin LiExample matches 'for (;;) {}'
1011*67e74705SXin Li  for (;;) {}
1012*67e74705SXin Li  int i[] =  {1, 2, 3}; for (auto a : i);
1013*67e74705SXin Li</pre></td></tr>
1014*67e74705SXin Li
1015*67e74705SXin Li
1016*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>&gt;...</td></tr>
1017*67e74705SXin Li<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1018*67e74705SXin Li</pre></td></tr>
1019*67e74705SXin Li
1020*67e74705SXin Li
1021*67e74705SXin Li<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>
1022*67e74705SXin Li<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1023*67e74705SXin Li
1024*67e74705SXin LiGiven
1025*67e74705SXin Li  goto FOO;
1026*67e74705SXin Li  FOO: bar();
1027*67e74705SXin LigotoStmt()
1028*67e74705SXin Li  matches 'goto FOO'
1029*67e74705SXin Li</pre></td></tr>
1030*67e74705SXin Li
1031*67e74705SXin Li
1032*67e74705SXin Li<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>
1033*67e74705SXin Li<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1034*67e74705SXin Li
1035*67e74705SXin LiExample matches 'if (x) {}'
1036*67e74705SXin Li  if (x) {}
1037*67e74705SXin Li</pre></td></tr>
1038*67e74705SXin Li
1039*67e74705SXin Li
1040*67e74705SXin Li<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>
1041*67e74705SXin Li<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1042*67e74705SXin Li
1043*67e74705SXin LiThis matches many different places, including function call return value
1044*67e74705SXin Lieliding, as well as any type conversions.
1045*67e74705SXin Li</pre></td></tr>
1046*67e74705SXin Li
1047*67e74705SXin Li
1048*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>&gt;...</td></tr>
1049*67e74705SXin Li<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1050*67e74705SXin Li
1051*67e74705SXin LiGiven
1052*67e74705SXin Li  point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1053*67e74705SXin LiimplicitValueInitExpr()
1054*67e74705SXin Li  matches "[0].y" (implicitly)
1055*67e74705SXin Li</pre></td></tr>
1056*67e74705SXin Li
1057*67e74705SXin Li
1058*67e74705SXin Li<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>
1059*67e74705SXin Li<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1060*67e74705SXin Li
1061*67e74705SXin LiGiven
1062*67e74705SXin Li  int a[] = { 1, 2 };
1063*67e74705SXin Li  struct B { int x, y; };
1064*67e74705SXin Li  B b = { 5, 6 };
1065*67e74705SXin LiinitListExpr()
1066*67e74705SXin Li  matches "{ 1, 2 }" and "{ 5, 6 }"
1067*67e74705SXin Li</pre></td></tr>
1068*67e74705SXin Li
1069*67e74705SXin Li
1070*67e74705SXin Li<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>
1071*67e74705SXin Li<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g.
1072*67e74705SXin Li1, 1L, 0x1 and 1U.
1073*67e74705SXin Li
1074*67e74705SXin LiDoes not match character-encoded integers such as L'a'.
1075*67e74705SXin Li</pre></td></tr>
1076*67e74705SXin Li
1077*67e74705SXin Li
1078*67e74705SXin Li<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>
1079*67e74705SXin Li<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1080*67e74705SXin Li
1081*67e74705SXin LiGiven
1082*67e74705SXin Li  goto FOO;
1083*67e74705SXin Li  FOO: bar();
1084*67e74705SXin LilabelStmt()
1085*67e74705SXin Li  matches 'FOO:'
1086*67e74705SXin Li</pre></td></tr>
1087*67e74705SXin Li
1088*67e74705SXin Li
1089*67e74705SXin Li<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>
1090*67e74705SXin Li<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1091*67e74705SXin Li
1092*67e74705SXin LiExample matches [&amp;](){return 5;}
1093*67e74705SXin Li  [&amp;](){return 5;}
1094*67e74705SXin Li</pre></td></tr>
1095*67e74705SXin Li
1096*67e74705SXin Li
1097*67e74705SXin Li<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>
1098*67e74705SXin Li<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1099*67e74705SXin Li
1100*67e74705SXin LiExample: Given
1101*67e74705SXin Li  struct T {void func()};
1102*67e74705SXin Li  T f();
1103*67e74705SXin Li  void g(T);
1104*67e74705SXin LimaterializeTemporaryExpr() matches 'f()' in these statements
1105*67e74705SXin Li  T u(f());
1106*67e74705SXin Li  g(f());
1107*67e74705SXin Libut does not match
1108*67e74705SXin Li  f();
1109*67e74705SXin Li  f().func();
1110*67e74705SXin Li</pre></td></tr>
1111*67e74705SXin Li
1112*67e74705SXin Li
1113*67e74705SXin Li<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>
1114*67e74705SXin Li<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1115*67e74705SXin Li
1116*67e74705SXin LiGiven
1117*67e74705SXin Li  class Y {
1118*67e74705SXin Li    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1119*67e74705SXin Li    int a; static int b;
1120*67e74705SXin Li  };
1121*67e74705SXin LimemberExpr()
1122*67e74705SXin Li  matches this-&gt;x, x, y.x, a, this-&gt;b
1123*67e74705SXin Li</pre></td></tr>
1124*67e74705SXin Li
1125*67e74705SXin Li
1126*67e74705SXin Li<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>
1127*67e74705SXin Li<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1128*67e74705SXin Li
1129*67e74705SXin Li  foo();;
1130*67e74705SXin LinullStmt()
1131*67e74705SXin Li  matches the second ';'
1132*67e74705SXin Li</pre></td></tr>
1133*67e74705SXin Li
1134*67e74705SXin Li
1135*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;...</td></tr>
1136*67e74705SXin Li<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1137*67e74705SXin Li
1138*67e74705SXin LiThe innermost message send invokes the "alloc" class method on the
1139*67e74705SXin LiNSString class, while the outermost message send invokes the
1140*67e74705SXin Li"initWithString" instance method on the object returned from
1141*67e74705SXin LiNSString's "alloc". This matcher should match both message sends.
1142*67e74705SXin Li  [[NSString alloc] initWithString:@"Hello"]
1143*67e74705SXin Li</pre></td></tr>
1144*67e74705SXin Li
1145*67e74705SXin Li
1146*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;...</td></tr>
1147*67e74705SXin Li<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
1148*67e74705SXin Lito reference another expressions and can be met
1149*67e74705SXin Liin BinaryConditionalOperators, for example.
1150*67e74705SXin Li
1151*67e74705SXin LiExample matches 'a'
1152*67e74705SXin Li  (a ?: c) + 42;
1153*67e74705SXin Li</pre></td></tr>
1154*67e74705SXin Li
1155*67e74705SXin Li
1156*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>&gt;...</td></tr>
1157*67e74705SXin Li<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
1158*67e74705SXin Li
1159*67e74705SXin LiExample matches (foo() + 1)
1160*67e74705SXin Li  int foo() { return 1; }
1161*67e74705SXin Li  int a = (foo() + 1);
1162*67e74705SXin Li</pre></td></tr>
1163*67e74705SXin Li
1164*67e74705SXin Li
1165*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>&gt;...</td></tr>
1166*67e74705SXin Li<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
1167*67e74705SXin LiParenListExprs don't have a predefined type and are used for late parsing.
1168*67e74705SXin LiIn the final AST, they can be met in template declarations.
1169*67e74705SXin Li
1170*67e74705SXin LiGiven
1171*67e74705SXin Li  template&lt;typename T&gt; class X {
1172*67e74705SXin Li    void f() {
1173*67e74705SXin Li      X x(*this);
1174*67e74705SXin Li      int a = 0, b = 1; int i = (a, b);
1175*67e74705SXin Li    }
1176*67e74705SXin Li  };
1177*67e74705SXin LiparenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
1178*67e74705SXin Lihas a predefined type and is a ParenExpr, not a ParenListExpr.
1179*67e74705SXin Li</pre></td></tr>
1180*67e74705SXin Li
1181*67e74705SXin Li
1182*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>&gt;...</td></tr>
1183*67e74705SXin Li<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
1184*67e74705SXin Li
1185*67e74705SXin LiExample: Matches __func__
1186*67e74705SXin Li  printf("%s", __func__);
1187*67e74705SXin Li</pre></td></tr>
1188*67e74705SXin Li
1189*67e74705SXin Li
1190*67e74705SXin Li<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>
1191*67e74705SXin Li<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
1192*67e74705SXin Li
1193*67e74705SXin LiGiven
1194*67e74705SXin Li  return 1;
1195*67e74705SXin LireturnStmt()
1196*67e74705SXin Li  matches 'return 1'
1197*67e74705SXin Li</pre></td></tr>
1198*67e74705SXin Li
1199*67e74705SXin Li
1200*67e74705SXin Li<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>
1201*67e74705SXin Li<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
1202*67e74705SXin Li
1203*67e74705SXin LiGiven
1204*67e74705SXin Li  { ++a; }
1205*67e74705SXin Listmt()
1206*67e74705SXin Li  matches both the compound statement '{ ++a; }' and '++a'.
1207*67e74705SXin Li</pre></td></tr>
1208*67e74705SXin Li
1209*67e74705SXin Li
1210*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;...</td></tr>
1211*67e74705SXin Li<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
1212*67e74705SXin Li
1213*67e74705SXin LiExample match: ({ int X = 4; X; })
1214*67e74705SXin Li  int C = ({ int X = 4; X; });
1215*67e74705SXin Li</pre></td></tr>
1216*67e74705SXin Li
1217*67e74705SXin Li
1218*67e74705SXin Li<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>
1219*67e74705SXin Li<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
1220*67e74705SXin Li
1221*67e74705SXin LiExample matches "abcd", L"abcd"
1222*67e74705SXin Li  char *s = "abcd";
1223*67e74705SXin Li  wchar_t *ws = L"abcd";
1224*67e74705SXin Li</pre></td></tr>
1225*67e74705SXin Li
1226*67e74705SXin Li
1227*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>&gt;...</td></tr>
1228*67e74705SXin Li<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
1229*67e74705SXin Li
1230*67e74705SXin LiGiven
1231*67e74705SXin Li  template &lt;int N&gt;
1232*67e74705SXin Li  struct A { static const int n = N; };
1233*67e74705SXin Li  struct B : public A&lt;42&gt; {};
1234*67e74705SXin LisubstNonTypeTemplateParmExpr()
1235*67e74705SXin Li  matches "N" in the right-hand side of "static const int n = N;"
1236*67e74705SXin Li</pre></td></tr>
1237*67e74705SXin Li
1238*67e74705SXin Li
1239*67e74705SXin Li<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>
1240*67e74705SXin Li<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1241*67e74705SXin Li
1242*67e74705SXin LiGiven
1243*67e74705SXin Li  switch(a) { case 42: break; default: break; }
1244*67e74705SXin LiswitchCase()
1245*67e74705SXin Li  matches 'case 42: break;' and 'default: break;'.
1246*67e74705SXin Li</pre></td></tr>
1247*67e74705SXin Li
1248*67e74705SXin Li
1249*67e74705SXin Li<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>
1250*67e74705SXin Li<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1251*67e74705SXin Li
1252*67e74705SXin LiGiven
1253*67e74705SXin Li  switch(a) { case 42: break; default: break; }
1254*67e74705SXin LiswitchStmt()
1255*67e74705SXin Li  matches 'switch(a)'.
1256*67e74705SXin Li</pre></td></tr>
1257*67e74705SXin Li
1258*67e74705SXin Li
1259*67e74705SXin Li<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>
1260*67e74705SXin Li<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1261*67e74705SXin Li
1262*67e74705SXin LiGiven
1263*67e74705SXin Li  Foo x = bar;
1264*67e74705SXin Li  int y = sizeof(x) + alignof(x);
1265*67e74705SXin LiunaryExprOrTypeTraitExpr()
1266*67e74705SXin Li  matches sizeof(x) and alignof(x)
1267*67e74705SXin Li</pre></td></tr>
1268*67e74705SXin Li
1269*67e74705SXin Li
1270*67e74705SXin Li<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>
1271*67e74705SXin Li<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1272*67e74705SXin Li
1273*67e74705SXin LiExample matches !a
1274*67e74705SXin Li  !a || b
1275*67e74705SXin Li</pre></td></tr>
1276*67e74705SXin Li
1277*67e74705SXin Li
1278*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>&gt;...</td></tr>
1279*67e74705SXin Li<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
1280*67e74705SXin Libut could not be resolved to a specific declaration.
1281*67e74705SXin Li
1282*67e74705SXin LiGiven
1283*67e74705SXin Li  template&lt;typename T&gt;
1284*67e74705SXin Li  T foo() { T a; return a; }
1285*67e74705SXin Li  template&lt;typename T&gt;
1286*67e74705SXin Li  void bar() {
1287*67e74705SXin Li    foo&lt;T&gt;();
1288*67e74705SXin Li  }
1289*67e74705SXin LiunresolvedLookupExpr()
1290*67e74705SXin Li  matches foo&lt;T&gt;() </pre></td></tr>
1291*67e74705SXin Li
1292*67e74705SXin Li
1293*67e74705SXin Li<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>
1294*67e74705SXin Li<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1295*67e74705SXin Li
1296*67e74705SXin LiExample match: "foo"_suffix
1297*67e74705SXin Li</pre></td></tr>
1298*67e74705SXin Li
1299*67e74705SXin Li
1300*67e74705SXin Li<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>
1301*67e74705SXin Li<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1302*67e74705SXin Li
1303*67e74705SXin LiGiven
1304*67e74705SXin Li  while (true) {}
1305*67e74705SXin LiwhileStmt()
1306*67e74705SXin Li  matches 'while (true) {}'.
1307*67e74705SXin Li</pre></td></tr>
1308*67e74705SXin Li
1309*67e74705SXin Li
1310*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;...</td></tr>
1311*67e74705SXin Li<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1312*67e74705SXin Li
1313*67e74705SXin LiGiven
1314*67e74705SXin Li  template &lt;typename T&gt; struct C {};
1315*67e74705SXin Li  C&lt;int&gt; c;
1316*67e74705SXin LitemplateArgument()
1317*67e74705SXin Li  matches 'int' in C&lt;int&gt;.
1318*67e74705SXin Li</pre></td></tr>
1319*67e74705SXin Li
1320*67e74705SXin Li
1321*67e74705SXin Li<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>
1322*67e74705SXin Li<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1323*67e74705SXin Li</pre></td></tr>
1324*67e74705SXin Li
1325*67e74705SXin Li
1326*67e74705SXin Li<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>
1327*67e74705SXin Li<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1328*67e74705SXin Li
1329*67e74705SXin LiGiven
1330*67e74705SXin Li  int a[] = { 2, 3 };
1331*67e74705SXin Li  int b[4];
1332*67e74705SXin Li  void f() { int c[a[0]]; }
1333*67e74705SXin LiarrayType()
1334*67e74705SXin Li  matches "int a[]", "int b[4]" and "int c[a[0]]";
1335*67e74705SXin Li</pre></td></tr>
1336*67e74705SXin Li
1337*67e74705SXin Li
1338*67e74705SXin Li<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>
1339*67e74705SXin Li<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1340*67e74705SXin Li
1341*67e74705SXin LiGiven
1342*67e74705SXin Li  _Atomic(int) i;
1343*67e74705SXin LiatomicType()
1344*67e74705SXin Li  matches "_Atomic(int) i"
1345*67e74705SXin Li</pre></td></tr>
1346*67e74705SXin Li
1347*67e74705SXin Li
1348*67e74705SXin Li<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>
1349*67e74705SXin Li<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1350*67e74705SXin Li
1351*67e74705SXin LiGiven:
1352*67e74705SXin Li  auto n = 4;
1353*67e74705SXin Li  int v[] = { 2, 3 }
1354*67e74705SXin Li  for (auto i : v) { }
1355*67e74705SXin LiautoType()
1356*67e74705SXin Li  matches "auto n" and "auto i"
1357*67e74705SXin Li</pre></td></tr>
1358*67e74705SXin Li
1359*67e74705SXin Li
1360*67e74705SXin Li<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>
1361*67e74705SXin Li<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1362*67e74705SXin Li"void (^)(int)".
1363*67e74705SXin Li
1364*67e74705SXin LiThe pointee is always required to be a FunctionType.
1365*67e74705SXin Li</pre></td></tr>
1366*67e74705SXin Li
1367*67e74705SXin Li
1368*67e74705SXin Li<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>
1369*67e74705SXin Li<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1370*67e74705SXin Li
1371*67e74705SXin LiGiven
1372*67e74705SXin Li  struct A {};
1373*67e74705SXin Li  A a;
1374*67e74705SXin Li  int b;
1375*67e74705SXin Li  float c;
1376*67e74705SXin Li  bool d;
1377*67e74705SXin LibuiltinType()
1378*67e74705SXin Li  matches "int b", "float c" and "bool d"
1379*67e74705SXin Li</pre></td></tr>
1380*67e74705SXin Li
1381*67e74705SXin Li
1382*67e74705SXin Li<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>
1383*67e74705SXin Li<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1384*67e74705SXin Li
1385*67e74705SXin LiGiven
1386*67e74705SXin Li  _Complex float f;
1387*67e74705SXin LicomplexType()
1388*67e74705SXin Li  matches "_Complex float f"
1389*67e74705SXin Li</pre></td></tr>
1390*67e74705SXin Li
1391*67e74705SXin Li
1392*67e74705SXin Li<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>
1393*67e74705SXin Li<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1394*67e74705SXin Li
1395*67e74705SXin LiGiven
1396*67e74705SXin Li  void() {
1397*67e74705SXin Li    int a[2];
1398*67e74705SXin Li    int b[] = { 2, 3 };
1399*67e74705SXin Li    int c[b[0]];
1400*67e74705SXin Li  }
1401*67e74705SXin LiconstantArrayType()
1402*67e74705SXin Li  matches "int a[2]"
1403*67e74705SXin Li</pre></td></tr>
1404*67e74705SXin Li
1405*67e74705SXin Li
1406*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;...</td></tr>
1407*67e74705SXin Li<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1408*67e74705SXin LiExample matches i[] in declaration of f.
1409*67e74705SXin Li    (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1410*67e74705SXin LiExample matches i[1].
1411*67e74705SXin Li    (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1412*67e74705SXin Li  void f(int i[]) {
1413*67e74705SXin Li    i[1] = 0;
1414*67e74705SXin Li  }
1415*67e74705SXin Li</pre></td></tr>
1416*67e74705SXin Li
1417*67e74705SXin Li
1418*67e74705SXin Li<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>
1419*67e74705SXin Li<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1420*67e74705SXin Li
1421*67e74705SXin LiGiven
1422*67e74705SXin Li  template&lt;typename T, int Size&gt;
1423*67e74705SXin Li  class array {
1424*67e74705SXin Li    T data[Size];
1425*67e74705SXin Li  };
1426*67e74705SXin LidependentSizedArrayType
1427*67e74705SXin Li  matches "T data[Size]"
1428*67e74705SXin Li</pre></td></tr>
1429*67e74705SXin Li
1430*67e74705SXin Li
1431*67e74705SXin Li<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>
1432*67e74705SXin Li<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1433*67e74705SXin Liqualified name.
1434*67e74705SXin Li
1435*67e74705SXin LiGiven
1436*67e74705SXin Li  namespace N {
1437*67e74705SXin Li    namespace M {
1438*67e74705SXin Li      class D {};
1439*67e74705SXin Li    }
1440*67e74705SXin Li  }
1441*67e74705SXin Li  class C {};
1442*67e74705SXin Li
1443*67e74705SXin Li  class C c;
1444*67e74705SXin Li  N::M::D d;
1445*67e74705SXin Li
1446*67e74705SXin LielaboratedType() matches the type of the variable declarations of both
1447*67e74705SXin Lic and d.
1448*67e74705SXin Li</pre></td></tr>
1449*67e74705SXin Li
1450*67e74705SXin Li
1451*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;...</td></tr>
1452*67e74705SXin Li<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
1453*67e74705SXin Li
1454*67e74705SXin LiGiven
1455*67e74705SXin Li  enum C { Green };
1456*67e74705SXin Li  enum class S { Red };
1457*67e74705SXin Li
1458*67e74705SXin Li  C c;
1459*67e74705SXin Li  S s;
1460*67e74705SXin Li
1461*67e74705SXin LienumType() matches the type of the variable declarations of both c and
1462*67e74705SXin Lis.
1463*67e74705SXin Li</pre></td></tr>
1464*67e74705SXin Li
1465*67e74705SXin Li
1466*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;...</td></tr>
1467*67e74705SXin Li<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1468*67e74705SXin Li
1469*67e74705SXin LiGiven
1470*67e74705SXin Li  int (*f)(int);
1471*67e74705SXin Li  void g();
1472*67e74705SXin LifunctionProtoType()
1473*67e74705SXin Li  matches "int (*f)(int)" and the type of "g" in C++ mode.
1474*67e74705SXin Li  In C mode, "g" is not matched because it does not contain a prototype.
1475*67e74705SXin Li</pre></td></tr>
1476*67e74705SXin Li
1477*67e74705SXin Li
1478*67e74705SXin Li<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>
1479*67e74705SXin Li<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1480*67e74705SXin Li
1481*67e74705SXin LiGiven
1482*67e74705SXin Li  int (*f)(int);
1483*67e74705SXin Li  void g();
1484*67e74705SXin LifunctionType()
1485*67e74705SXin Li  matches "int (*f)(int)" and the type of "g".
1486*67e74705SXin Li</pre></td></tr>
1487*67e74705SXin Li
1488*67e74705SXin Li
1489*67e74705SXin Li<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>
1490*67e74705SXin Li<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1491*67e74705SXin Li
1492*67e74705SXin LiGiven
1493*67e74705SXin Li  int a[] = { 2, 3 };
1494*67e74705SXin Li  int b[42];
1495*67e74705SXin Li  void f(int c[]) { int d[a[0]]; };
1496*67e74705SXin LiincompleteArrayType()
1497*67e74705SXin Li  matches "int a[]" and "int c[]"
1498*67e74705SXin Li</pre></td></tr>
1499*67e74705SXin Li
1500*67e74705SXin Li
1501*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;...</td></tr>
1502*67e74705SXin Li<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1503*67e74705SXin Li
1504*67e74705SXin LiExample matches S s, but not S&lt;T&gt; s.
1505*67e74705SXin Li    (matcher = parmVarDecl(hasType(injectedClassNameType())))
1506*67e74705SXin Li  template &lt;typename T&gt; struct S {
1507*67e74705SXin Li    void f(S s);
1508*67e74705SXin Li    void g(S&lt;T&gt; s);
1509*67e74705SXin Li  };
1510*67e74705SXin Li</pre></td></tr>
1511*67e74705SXin Li
1512*67e74705SXin Li
1513*67e74705SXin Li<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>
1514*67e74705SXin Li<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1515*67e74705SXin Li
1516*67e74705SXin LiGiven:
1517*67e74705SXin Li  int *a;
1518*67e74705SXin Li  int &amp;b = *a;
1519*67e74705SXin Li  int &amp;&amp;c = 1;
1520*67e74705SXin Li  auto &amp;d = b;
1521*67e74705SXin Li  auto &amp;&amp;e = c;
1522*67e74705SXin Li  auto &amp;&amp;f = 2;
1523*67e74705SXin Li  int g = 5;
1524*67e74705SXin Li
1525*67e74705SXin LilValueReferenceType() matches the types of b, d, and e. e is
1526*67e74705SXin Limatched since the type is deduced as int&amp; by reference collapsing rules.
1527*67e74705SXin Li</pre></td></tr>
1528*67e74705SXin Li
1529*67e74705SXin Li
1530*67e74705SXin Li<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>
1531*67e74705SXin Li<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1532*67e74705SXin LiGiven
1533*67e74705SXin Li  struct A { int i; }
1534*67e74705SXin Li  A::* ptr = A::i;
1535*67e74705SXin LimemberPointerType()
1536*67e74705SXin Li  matches "A::* ptr"
1537*67e74705SXin Li</pre></td></tr>
1538*67e74705SXin Li
1539*67e74705SXin Li
1540*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>&gt;...</td></tr>
1541*67e74705SXin Li<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1542*67e74705SXin Lia pointer type, despite being syntactically similar.
1543*67e74705SXin Li
1544*67e74705SXin LiGiven
1545*67e74705SXin Li  int *a;
1546*67e74705SXin Li
1547*67e74705SXin Li  @interface Foo
1548*67e74705SXin Li  @end
1549*67e74705SXin Li  Foo *f;
1550*67e74705SXin LipointerType()
1551*67e74705SXin Li  matches "Foo *f", but does not match "int *a".
1552*67e74705SXin Li</pre></td></tr>
1553*67e74705SXin Li
1554*67e74705SXin Li
1555*67e74705SXin Li<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>
1556*67e74705SXin Li<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1557*67e74705SXin Li
1558*67e74705SXin LiGiven
1559*67e74705SXin Li  int (*ptr_to_array)[4];
1560*67e74705SXin Li  int *array_of_ptrs[4];
1561*67e74705SXin Li
1562*67e74705SXin LivarDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1563*67e74705SXin Liarray_of_ptrs.
1564*67e74705SXin Li</pre></td></tr>
1565*67e74705SXin Li
1566*67e74705SXin Li
1567*67e74705SXin Li<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>
1568*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1569*67e74705SXin Litypes.
1570*67e74705SXin Li
1571*67e74705SXin LiGiven
1572*67e74705SXin Li  int *a;
1573*67e74705SXin Li  int &amp;b = *a;
1574*67e74705SXin Li  int c = 5;
1575*67e74705SXin Li
1576*67e74705SXin Li  @interface Foo
1577*67e74705SXin Li  @end
1578*67e74705SXin Li  Foo *f;
1579*67e74705SXin LipointerType()
1580*67e74705SXin Li  matches "int *a", but does not match "Foo *f".
1581*67e74705SXin Li</pre></td></tr>
1582*67e74705SXin Li
1583*67e74705SXin Li
1584*67e74705SXin Li<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>
1585*67e74705SXin Li<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1586*67e74705SXin Li
1587*67e74705SXin LiGiven:
1588*67e74705SXin Li  int *a;
1589*67e74705SXin Li  int &amp;b = *a;
1590*67e74705SXin Li  int &amp;&amp;c = 1;
1591*67e74705SXin Li  auto &amp;d = b;
1592*67e74705SXin Li  auto &amp;&amp;e = c;
1593*67e74705SXin Li  auto &amp;&amp;f = 2;
1594*67e74705SXin Li  int g = 5;
1595*67e74705SXin Li
1596*67e74705SXin LirValueReferenceType() matches the types of c and f. e is not
1597*67e74705SXin Limatched as it is deduced to int&amp; by reference collapsing rules.
1598*67e74705SXin Li</pre></td></tr>
1599*67e74705SXin Li
1600*67e74705SXin Li
1601*67e74705SXin Li<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>
1602*67e74705SXin Li<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1603*67e74705SXin Li
1604*67e74705SXin LiGiven
1605*67e74705SXin Li  class C {};
1606*67e74705SXin Li  struct S {};
1607*67e74705SXin Li
1608*67e74705SXin Li  C c;
1609*67e74705SXin Li  S s;
1610*67e74705SXin Li
1611*67e74705SXin LirecordType() matches the type of the variable declarations of both c
1612*67e74705SXin Liand s.
1613*67e74705SXin Li</pre></td></tr>
1614*67e74705SXin Li
1615*67e74705SXin Li
1616*67e74705SXin Li<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>
1617*67e74705SXin Li<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1618*67e74705SXin Li
1619*67e74705SXin LiGiven
1620*67e74705SXin Li  int *a;
1621*67e74705SXin Li  int &amp;b = *a;
1622*67e74705SXin Li  int &amp;&amp;c = 1;
1623*67e74705SXin Li  auto &amp;d = b;
1624*67e74705SXin Li  auto &amp;&amp;e = c;
1625*67e74705SXin Li  auto &amp;&amp;f = 2;
1626*67e74705SXin Li  int g = 5;
1627*67e74705SXin Li
1628*67e74705SXin LireferenceType() matches the types of b, c, d, e, and f.
1629*67e74705SXin Li</pre></td></tr>
1630*67e74705SXin Li
1631*67e74705SXin Li
1632*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;...</td></tr>
1633*67e74705SXin Li<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
1634*67e74705SXin Litemplate type parameter.
1635*67e74705SXin Li
1636*67e74705SXin LiGiven
1637*67e74705SXin Li  template &lt;typename T&gt;
1638*67e74705SXin Li  void F(T t) {
1639*67e74705SXin Li    int i = 1 + t;
1640*67e74705SXin Li  }
1641*67e74705SXin Li
1642*67e74705SXin LisubstTemplateTypeParmType() matches the type of 't' but not '1'
1643*67e74705SXin Li</pre></td></tr>
1644*67e74705SXin Li
1645*67e74705SXin Li
1646*67e74705SXin Li<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>
1647*67e74705SXin Li<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1648*67e74705SXin Li
1649*67e74705SXin LiGiven
1650*67e74705SXin Li  template &lt;typename T&gt;
1651*67e74705SXin Li  class C { };
1652*67e74705SXin Li
1653*67e74705SXin Li  template class C&lt;int&gt;;  A
1654*67e74705SXin Li  C&lt;char&gt; var;            B
1655*67e74705SXin Li
1656*67e74705SXin LitemplateSpecializationType() matches the type of the explicit
1657*67e74705SXin Liinstantiation in A and the type of the variable declaration in B.
1658*67e74705SXin Li</pre></td></tr>
1659*67e74705SXin Li
1660*67e74705SXin Li
1661*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;...</td></tr>
1662*67e74705SXin Li<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
1663*67e74705SXin Li
1664*67e74705SXin LiExample matches T, but not int.
1665*67e74705SXin Li    (matcher = templateTypeParmType())
1666*67e74705SXin Li  template &lt;typename T&gt; void f(int i);
1667*67e74705SXin Li</pre></td></tr>
1668*67e74705SXin Li
1669*67e74705SXin Li
1670*67e74705SXin Li<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>
1671*67e74705SXin Li<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1672*67e74705SXin Li</pre></td></tr>
1673*67e74705SXin Li
1674*67e74705SXin Li
1675*67e74705SXin Li<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>
1676*67e74705SXin Li<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1677*67e74705SXin Li
1678*67e74705SXin LiGiven
1679*67e74705SXin Li  typedef int X;
1680*67e74705SXin LitypedefType()
1681*67e74705SXin Li  matches "typedef int X"
1682*67e74705SXin Li</pre></td></tr>
1683*67e74705SXin Li
1684*67e74705SXin Li
1685*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>&gt;...</td></tr>
1686*67e74705SXin Li<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1687*67e74705SXin Li
1688*67e74705SXin LiGiven:
1689*67e74705SXin Li  typedef __underlying_type(T) type;
1690*67e74705SXin LiunaryTransformType()
1691*67e74705SXin Li  matches "__underlying_type(T)"
1692*67e74705SXin Li</pre></td></tr>
1693*67e74705SXin Li
1694*67e74705SXin Li
1695*67e74705SXin Li<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>
1696*67e74705SXin Li<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1697*67e74705SXin Liinteger-constant-expression.
1698*67e74705SXin Li
1699*67e74705SXin LiGiven
1700*67e74705SXin Li  void f() {
1701*67e74705SXin Li    int a[] = { 2, 3 }
1702*67e74705SXin Li    int b[42];
1703*67e74705SXin Li    int c[a[0]];
1704*67e74705SXin Li  }
1705*67e74705SXin LivariableArrayType()
1706*67e74705SXin Li  matches "int c[a[0]]"
1707*67e74705SXin Li</pre></td></tr>
1708*67e74705SXin Li
1709*67e74705SXin Li<!--END_DECL_MATCHERS -->
1710*67e74705SXin Li</table>
1711*67e74705SXin Li
1712*67e74705SXin Li<!-- ======================================================================= -->
1713*67e74705SXin Li<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1714*67e74705SXin Li<!-- ======================================================================= -->
1715*67e74705SXin Li
1716*67e74705SXin Li<p>Narrowing matchers match certain attributes on the current node, thus
1717*67e74705SXin Linarrowing down the set of nodes of the current type to match on.</p>
1718*67e74705SXin Li
1719*67e74705SXin Li<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1720*67e74705SXin Liwhich allow users to create more powerful match expressions.</p>
1721*67e74705SXin Li
1722*67e74705SXin Li<table>
1723*67e74705SXin Li<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1724*67e74705SXin Li<!-- START_NARROWING_MATCHERS -->
1725*67e74705SXin Li
1726*67e74705SXin Li<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
1727*67e74705SXin Li<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1728*67e74705SXin Li
1729*67e74705SXin LiUsable as: Any Matcher
1730*67e74705SXin Li</pre></td></tr>
1731*67e74705SXin Li
1732*67e74705SXin Li
1733*67e74705SXin Li<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
1734*67e74705SXin Li<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1735*67e74705SXin Li
1736*67e74705SXin LiUsable as: Any Matcher
1737*67e74705SXin Li</pre></td></tr>
1738*67e74705SXin Li
1739*67e74705SXin Li
1740*67e74705SXin Li<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1741*67e74705SXin Li<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1742*67e74705SXin Li
1743*67e74705SXin LiUseful when another matcher requires a child matcher, but there's no
1744*67e74705SXin Liadditional constraint. This will often be used with an explicit conversion
1745*67e74705SXin Lito an internal::Matcher&lt;&gt; type such as TypeMatcher.
1746*67e74705SXin Li
1747*67e74705SXin LiExample: DeclarationMatcher(anything()) matches all declarations, e.g.,
1748*67e74705SXin Li"int* p" and "void f()" in
1749*67e74705SXin Li  int* p;
1750*67e74705SXin Li  void f();
1751*67e74705SXin Li
1752*67e74705SXin LiUsable as: Any Matcher
1753*67e74705SXin Li</pre></td></tr>
1754*67e74705SXin Li
1755*67e74705SXin Li
1756*67e74705SXin Li<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
1757*67e74705SXin Li<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1758*67e74705SXin Li
1759*67e74705SXin LiExample matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
1760*67e74705SXin Li  class X {};
1761*67e74705SXin Li  class Y {};
1762*67e74705SXin Li
1763*67e74705SXin LiUsable as: Any Matcher
1764*67e74705SXin Li</pre></td></tr>
1765*67e74705SXin Li
1766*67e74705SXin Li
1767*67e74705SXin Li<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>
1768*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1769*67e74705SXin Liunary).
1770*67e74705SXin Li
1771*67e74705SXin LiExample matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1772*67e74705SXin Li  !(a || b)
1773*67e74705SXin Li</pre></td></tr>
1774*67e74705SXin Li
1775*67e74705SXin Li
1776*67e74705SXin Li<tr><td>Matcher&lt;CXXBoolLiteral&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT  Value</td></tr>
1777*67e74705SXin Li<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1778*67e74705SXin Li
1779*67e74705SXin LiExample matches true (matcher = cxxBoolLiteral(equals(true)))
1780*67e74705SXin Li  true
1781*67e74705SXin Li
1782*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1783*67e74705SXin Li           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;
1784*67e74705SXin Li</pre></td></tr>
1785*67e74705SXin Li
1786*67e74705SXin Li
1787*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;</td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr>
1788*67e74705SXin Li<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
1789*67e74705SXin Li
1790*67e74705SXin LiGiven
1791*67e74705SXin Li  try {
1792*67e74705SXin Li    ...
1793*67e74705SXin Li  } catch (int) {
1794*67e74705SXin Li    ...
1795*67e74705SXin Li  } catch (...) {
1796*67e74705SXin Li    ...
1797*67e74705SXin Li  }
1798*67e74705SXin Liendcode
1799*67e74705SXin LicxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
1800*67e74705SXin Li</pre></td></tr>
1801*67e74705SXin Li
1802*67e74705SXin Li
1803*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
1804*67e74705SXin Li<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1805*67e74705SXin Lia specific number of arguments (including absent default arguments).
1806*67e74705SXin Li
1807*67e74705SXin LiExample matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1808*67e74705SXin Li  void f(int x, int y);
1809*67e74705SXin Li  f(0, 0);
1810*67e74705SXin Li</pre></td></tr>
1811*67e74705SXin Li
1812*67e74705SXin Li
1813*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr>
1814*67e74705SXin Li<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
1815*67e74705SXin Li</pre></td></tr>
1816*67e74705SXin Li
1817*67e74705SXin Li
1818*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr>
1819*67e74705SXin Li<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
1820*67e74705SXin Lizero initialization.
1821*67e74705SXin Li
1822*67e74705SXin LiGiven
1823*67e74705SXin Livoid foo() {
1824*67e74705SXin Li  struct point { double x; double y; };
1825*67e74705SXin Li  point pt[2] = { { 1.0, 2.0 } };
1826*67e74705SXin Li}
1827*67e74705SXin LiinitListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
1828*67e74705SXin Liwill match the implicit array filler for pt[1].
1829*67e74705SXin Li</pre></td></tr>
1830*67e74705SXin Li
1831*67e74705SXin Li
1832*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr>
1833*67e74705SXin Li<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
1834*67e74705SXin Li
1835*67e74705SXin LiGiven
1836*67e74705SXin Li  struct S {
1837*67e74705SXin Li    S(); #1
1838*67e74705SXin Li    S(const S &amp;); #2
1839*67e74705SXin Li    S(S &amp;&amp;); #3
1840*67e74705SXin Li  };
1841*67e74705SXin LicxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
1842*67e74705SXin Li</pre></td></tr>
1843*67e74705SXin Li
1844*67e74705SXin Li
1845*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr>
1846*67e74705SXin Li<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
1847*67e74705SXin Li
1848*67e74705SXin LiGiven
1849*67e74705SXin Li  struct S {
1850*67e74705SXin Li    S(); #1
1851*67e74705SXin Li    S(const S &amp;); #2
1852*67e74705SXin Li    S(S &amp;&amp;); #3
1853*67e74705SXin Li  };
1854*67e74705SXin LicxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
1855*67e74705SXin Li</pre></td></tr>
1856*67e74705SXin Li
1857*67e74705SXin Li
1858*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr>
1859*67e74705SXin Li<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
1860*67e74705SXin Li
1861*67e74705SXin LiGiven
1862*67e74705SXin Li  struct S {
1863*67e74705SXin Li    S(); #1
1864*67e74705SXin Li    S(int) {} #2
1865*67e74705SXin Li    S(S &amp;&amp;) : S() {} #3
1866*67e74705SXin Li  };
1867*67e74705SXin Li  S::S() : S(0) {} #4
1868*67e74705SXin LicxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
1869*67e74705SXin Li#1 or #2.
1870*67e74705SXin Li</pre></td></tr>
1871*67e74705SXin Li
1872*67e74705SXin Li
1873*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr>
1874*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with
1875*67e74705SXin Lithe explicit keyword.
1876*67e74705SXin Li
1877*67e74705SXin LiGiven
1878*67e74705SXin Li  struct S {
1879*67e74705SXin Li    S(int); #1
1880*67e74705SXin Li    explicit S(double); #2
1881*67e74705SXin Li    operator int(); #3
1882*67e74705SXin Li    explicit operator bool(); #4
1883*67e74705SXin Li  };
1884*67e74705SXin LicxxConstructorDecl(isExplicit()) will match #2, but not #1.
1885*67e74705SXin LicxxConversionDecl(isExplicit()) will match #4, but not #3.
1886*67e74705SXin Li</pre></td></tr>
1887*67e74705SXin Li
1888*67e74705SXin Li
1889*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr>
1890*67e74705SXin Li<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
1891*67e74705SXin Li
1892*67e74705SXin LiGiven
1893*67e74705SXin Li  struct S {
1894*67e74705SXin Li    S(); #1
1895*67e74705SXin Li    S(const S &amp;); #2
1896*67e74705SXin Li    S(S &amp;&amp;); #3
1897*67e74705SXin Li  };
1898*67e74705SXin LicxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
1899*67e74705SXin Li</pre></td></tr>
1900*67e74705SXin Li
1901*67e74705SXin Li
1902*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr>
1903*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with
1904*67e74705SXin Lithe explicit keyword.
1905*67e74705SXin Li
1906*67e74705SXin LiGiven
1907*67e74705SXin Li  struct S {
1908*67e74705SXin Li    S(int); #1
1909*67e74705SXin Li    explicit S(double); #2
1910*67e74705SXin Li    operator int(); #3
1911*67e74705SXin Li    explicit operator bool(); #4
1912*67e74705SXin Li  };
1913*67e74705SXin LicxxConstructorDecl(isExplicit()) will match #2, but not #1.
1914*67e74705SXin LicxxConversionDecl(isExplicit()) will match #4, but not #3.
1915*67e74705SXin Li</pre></td></tr>
1916*67e74705SXin Li
1917*67e74705SXin Li
1918*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr>
1919*67e74705SXin Li<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
1920*67e74705SXin Liopposed to a member.
1921*67e74705SXin Li
1922*67e74705SXin LiGiven
1923*67e74705SXin Li  struct B {};
1924*67e74705SXin Li  struct D : B {
1925*67e74705SXin Li    int I;
1926*67e74705SXin Li    D(int i) : I(i) {}
1927*67e74705SXin Li  };
1928*67e74705SXin Li  struct E : B {
1929*67e74705SXin Li    E() : B() {}
1930*67e74705SXin Li  };
1931*67e74705SXin LicxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
1932*67e74705SXin Li  will match E(), but not match D(int).
1933*67e74705SXin Li</pre></td></tr>
1934*67e74705SXin Li
1935*67e74705SXin Li
1936*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr>
1937*67e74705SXin Li<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
1938*67e74705SXin Liopposed to a base.
1939*67e74705SXin Li
1940*67e74705SXin LiGiven
1941*67e74705SXin Li  struct B {};
1942*67e74705SXin Li  struct D : B {
1943*67e74705SXin Li    int I;
1944*67e74705SXin Li    D(int i) : I(i) {}
1945*67e74705SXin Li  };
1946*67e74705SXin Li  struct E : B {
1947*67e74705SXin Li    E() : B() {}
1948*67e74705SXin Li  };
1949*67e74705SXin LicxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
1950*67e74705SXin Li  will match D(int), but not match E().
1951*67e74705SXin Li</pre></td></tr>
1952*67e74705SXin Li
1953*67e74705SXin Li
1954*67e74705SXin Li<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>
1955*67e74705SXin Li<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
1956*67e74705SXin Licode (as opposed to implicitly added by the compiler).
1957*67e74705SXin Li
1958*67e74705SXin LiGiven
1959*67e74705SXin Li  struct Foo {
1960*67e74705SXin Li    Foo() { }
1961*67e74705SXin Li    Foo(int) : foo_("A") { }
1962*67e74705SXin Li    string foo_;
1963*67e74705SXin Li  };
1964*67e74705SXin LicxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
1965*67e74705SXin Li  will match Foo(int), but not Foo()
1966*67e74705SXin Li</pre></td></tr>
1967*67e74705SXin Li
1968*67e74705SXin Li
1969*67e74705SXin Li<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>
1970*67e74705SXin Li<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
1971*67e74705SXin Li
1972*67e74705SXin LiGiven
1973*67e74705SXin Listruct A {
1974*67e74705SXin Li  void foo() const;
1975*67e74705SXin Li  void bar();
1976*67e74705SXin Li};
1977*67e74705SXin Li
1978*67e74705SXin LicxxMethodDecl(isConst()) matches A::foo() but not A::bar()
1979*67e74705SXin Li</pre></td></tr>
1980*67e74705SXin Li
1981*67e74705SXin Li
1982*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr>
1983*67e74705SXin Li<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
1984*67e74705SXin Lioperator.
1985*67e74705SXin Li
1986*67e74705SXin LiGiven
1987*67e74705SXin Listruct A {
1988*67e74705SXin Li  A &amp;operator=(const A &amp;);
1989*67e74705SXin Li  A &amp;operator=(A &amp;&amp;);
1990*67e74705SXin Li};
1991*67e74705SXin Li
1992*67e74705SXin LicxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
1993*67e74705SXin Lithe second one.
1994*67e74705SXin Li</pre></td></tr>
1995*67e74705SXin Li
1996*67e74705SXin Li
1997*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr>
1998*67e74705SXin Li<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
1999*67e74705SXin Li
2000*67e74705SXin LiGiven:
2001*67e74705SXin Li  class A final {};
2002*67e74705SXin Li
2003*67e74705SXin Li  struct B {
2004*67e74705SXin Li    virtual void f();
2005*67e74705SXin Li  };
2006*67e74705SXin Li
2007*67e74705SXin Li  struct C : B {
2008*67e74705SXin Li    void f() final;
2009*67e74705SXin Li  };
2010*67e74705SXin Limatches A and C::f, but not B, C, or B::f
2011*67e74705SXin Li</pre></td></tr>
2012*67e74705SXin Li
2013*67e74705SXin Li
2014*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr>
2015*67e74705SXin Li<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2016*67e74705SXin Lioperator.
2017*67e74705SXin Li
2018*67e74705SXin LiGiven
2019*67e74705SXin Listruct A {
2020*67e74705SXin Li  A &amp;operator=(const A &amp;);
2021*67e74705SXin Li  A &amp;operator=(A &amp;&amp;);
2022*67e74705SXin Li};
2023*67e74705SXin Li
2024*67e74705SXin LicxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2025*67e74705SXin Lithe first one.
2026*67e74705SXin Li</pre></td></tr>
2027*67e74705SXin Li
2028*67e74705SXin Li
2029*67e74705SXin Li<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>
2030*67e74705SXin Li<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2031*67e74705SXin Li
2032*67e74705SXin LiGiven
2033*67e74705SXin Li  class A {
2034*67e74705SXin Li   public:
2035*67e74705SXin Li    virtual void x();
2036*67e74705SXin Li  };
2037*67e74705SXin Li  class B : public A {
2038*67e74705SXin Li   public:
2039*67e74705SXin Li    virtual void x();
2040*67e74705SXin Li  };
2041*67e74705SXin Li  matches B::x
2042*67e74705SXin Li</pre></td></tr>
2043*67e74705SXin Li
2044*67e74705SXin Li
2045*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr>
2046*67e74705SXin Li<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2047*67e74705SXin Li
2048*67e74705SXin LiGiven
2049*67e74705SXin Li  class A {
2050*67e74705SXin Li   public:
2051*67e74705SXin Li    virtual void x() = 0;
2052*67e74705SXin Li  };
2053*67e74705SXin Li  matches A::x
2054*67e74705SXin Li</pre></td></tr>
2055*67e74705SXin Li
2056*67e74705SXin Li
2057*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr>
2058*67e74705SXin Li<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2059*67e74705SXin Li
2060*67e74705SXin LiGiven
2061*67e74705SXin Li  struct S {
2062*67e74705SXin Li    S(); #1
2063*67e74705SXin Li    S(const S &amp;) = default; #2
2064*67e74705SXin Li    S(S &amp;&amp;) = delete; #3
2065*67e74705SXin Li  };
2066*67e74705SXin LicxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2067*67e74705SXin Li</pre></td></tr>
2068*67e74705SXin Li
2069*67e74705SXin Li
2070*67e74705SXin Li<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>
2071*67e74705SXin Li<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
2072*67e74705SXin Li
2073*67e74705SXin LiGiven
2074*67e74705SXin Li  class A {
2075*67e74705SXin Li   public:
2076*67e74705SXin Li    virtual void x();
2077*67e74705SXin Li  };
2078*67e74705SXin Li  matches A::x
2079*67e74705SXin Li</pre></td></tr>
2080*67e74705SXin Li
2081*67e74705SXin Li
2082*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr>
2083*67e74705SXin Li<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2084*67e74705SXin Li
2085*67e74705SXin LiGiven
2086*67e74705SXin Li  class A {
2087*67e74705SXin Li   public:
2088*67e74705SXin Li    virtual void x();
2089*67e74705SXin Li  };
2090*67e74705SXin Li  class B : public A {
2091*67e74705SXin Li   public:
2092*67e74705SXin Li    void x();
2093*67e74705SXin Li  };
2094*67e74705SXin Li  matches A::x but not B::x
2095*67e74705SXin Li</pre></td></tr>
2096*67e74705SXin Li
2097*67e74705SXin Li
2098*67e74705SXin Li<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>
2099*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2100*67e74705SXin Li
2101*67e74705SXin LiMatches overloaded operator names specified in strings without the
2102*67e74705SXin Li"operator" prefix: e.g. "&lt;&lt;".
2103*67e74705SXin Li
2104*67e74705SXin LiGiven:
2105*67e74705SXin Li  class A { int operator*(); };
2106*67e74705SXin Li  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2107*67e74705SXin Li  A a;
2108*67e74705SXin Li  a &lt;&lt; a;   &lt;-- This matches
2109*67e74705SXin Li
2110*67e74705SXin LicxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2111*67e74705SXin Lispecified line and
2112*67e74705SXin LicxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2113*67e74705SXin Limatches the declaration of A.
2114*67e74705SXin Li
2115*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
2116*67e74705SXin Li</pre></td></tr>
2117*67e74705SXin Li
2118*67e74705SXin Li
2119*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
2120*67e74705SXin Li<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2121*67e74705SXin Li</pre></td></tr>
2122*67e74705SXin Li
2123*67e74705SXin Li
2124*67e74705SXin Li<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>
2125*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2126*67e74705SXin Listatic member variable template instantiations.
2127*67e74705SXin Li
2128*67e74705SXin LiGiven
2129*67e74705SXin Li  template&lt;typename T&gt; void A(T t) { }
2130*67e74705SXin Li  template&lt;&gt; void A(int N) { }
2131*67e74705SXin LifunctionDecl(isExplicitTemplateSpecialization())
2132*67e74705SXin Li  matches the specialization A&lt;int&gt;().
2133*67e74705SXin Li
2134*67e74705SXin LiUsable 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;
2135*67e74705SXin Li</pre></td></tr>
2136*67e74705SXin Li
2137*67e74705SXin Li
2138*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr>
2139*67e74705SXin Li<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2140*67e74705SXin Li
2141*67e74705SXin LiGiven:
2142*67e74705SXin Li  class A final {};
2143*67e74705SXin Li
2144*67e74705SXin Li  struct B {
2145*67e74705SXin Li    virtual void f();
2146*67e74705SXin Li  };
2147*67e74705SXin Li
2148*67e74705SXin Li  struct C : B {
2149*67e74705SXin Li    void f() final;
2150*67e74705SXin Li  };
2151*67e74705SXin Limatches A and C::f, but not B, C, or B::f
2152*67e74705SXin Li</pre></td></tr>
2153*67e74705SXin Li
2154*67e74705SXin Li
2155*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr>
2156*67e74705SXin Li<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2157*67e74705SXin Li
2158*67e74705SXin LiGiven:
2159*67e74705SXin Li  auto x = []{};
2160*67e74705SXin Li
2161*67e74705SXin LicxxRecordDecl(isLambda()) matches the implicit class declaration of
2162*67e74705SXin Lidecltype(x)
2163*67e74705SXin Li</pre></td></tr>
2164*67e74705SXin Li
2165*67e74705SXin Li
2166*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
2167*67e74705SXin Li<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
2168*67e74705SXin LiisSameOrDerivedFrom(hasName(...)).
2169*67e74705SXin Li</pre></td></tr>
2170*67e74705SXin Li
2171*67e74705SXin Li
2172*67e74705SXin Li<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>
2173*67e74705SXin Li<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2174*67e74705SXin Limember variable template instantiations.
2175*67e74705SXin Li
2176*67e74705SXin LiGiven
2177*67e74705SXin Li  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2178*67e74705SXin Lior
2179*67e74705SXin Li  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2180*67e74705SXin LicxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2181*67e74705SXin Li  matches the template instantiation of X&lt;A&gt;.
2182*67e74705SXin Li
2183*67e74705SXin LiBut given
2184*67e74705SXin Li  template &lt;typename T&gt;  class X {}; class A {};
2185*67e74705SXin Li  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2186*67e74705SXin LicxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2187*67e74705SXin Li  does not match, as X&lt;A&gt; is an explicit template specialization.
2188*67e74705SXin Li
2189*67e74705SXin LiUsable 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;
2190*67e74705SXin Li</pre></td></tr>
2191*67e74705SXin Li
2192*67e74705SXin Li
2193*67e74705SXin Li<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>
2194*67e74705SXin Li<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2195*67e74705SXin Lia specific number of arguments (including absent default arguments).
2196*67e74705SXin Li
2197*67e74705SXin LiExample matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2198*67e74705SXin Li  void f(int x, int y);
2199*67e74705SXin Li  f(0, 0);
2200*67e74705SXin Li</pre></td></tr>
2201*67e74705SXin Li
2202*67e74705SXin Li
2203*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr>
2204*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2205*67e74705SXin Li
2206*67e74705SXin LiExample: matches the implicit cast around 0
2207*67e74705SXin Li(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2208*67e74705SXin Li  int *p = 0;
2209*67e74705SXin Li</pre></td></tr>
2210*67e74705SXin Li
2211*67e74705SXin Li
2212*67e74705SXin Li<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>
2213*67e74705SXin Li<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
2214*67e74705SXin Li
2215*67e74705SXin LiExample matches true (matcher = cxxBoolLiteral(equals(true)))
2216*67e74705SXin Li  true
2217*67e74705SXin Li
2218*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
2219*67e74705SXin Li           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;
2220*67e74705SXin Li</pre></td></tr>
2221*67e74705SXin Li
2222*67e74705SXin Li
2223*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
2224*67e74705SXin Li<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2225*67e74705SXin Li
2226*67e74705SXin LiGiven
2227*67e74705SXin Li  template&lt;typename T&gt; struct C {};
2228*67e74705SXin Li  C&lt;int&gt; c;
2229*67e74705SXin LiclassTemplateSpecializationDecl(templateArgumentCountIs(1))
2230*67e74705SXin Li  matches C&lt;int&gt;.
2231*67e74705SXin Li</pre></td></tr>
2232*67e74705SXin Li
2233*67e74705SXin Li
2234*67e74705SXin Li<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>
2235*67e74705SXin Li<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2236*67e74705SXin Lichild statements.
2237*67e74705SXin Li
2238*67e74705SXin LiExample: Given
2239*67e74705SXin Li  { for (;;) {} }
2240*67e74705SXin LicompoundStmt(statementCountIs(0)))
2241*67e74705SXin Li  matches '{}'
2242*67e74705SXin Li  but does not match the outer compound statement.
2243*67e74705SXin Li</pre></td></tr>
2244*67e74705SXin Li
2245*67e74705SXin Li
2246*67e74705SXin Li<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>
2247*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
2248*67e74705SXin Li
2249*67e74705SXin LiGiven
2250*67e74705SXin Li  int a[42];
2251*67e74705SXin Li  int b[2 * 21];
2252*67e74705SXin Li  int c[41], d[43];
2253*67e74705SXin Li  char *s = "abcd";
2254*67e74705SXin Li  wchar_t *ws = L"abcd";
2255*67e74705SXin Li  char *w = "a";
2256*67e74705SXin LiconstantArrayType(hasSize(42))
2257*67e74705SXin Li  matches "int a[42]" and "int b[2 * 21]"
2258*67e74705SXin ListringLiteral(hasSize(4))
2259*67e74705SXin Li  matches "abcd", L"abcd"
2260*67e74705SXin Li</pre></td></tr>
2261*67e74705SXin Li
2262*67e74705SXin Li
2263*67e74705SXin Li<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>
2264*67e74705SXin Li<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2265*67e74705SXin Lideclarations.
2266*67e74705SXin Li
2267*67e74705SXin LiExample: Given
2268*67e74705SXin Li  int a, b;
2269*67e74705SXin Li  int c;
2270*67e74705SXin Li  int d = 2, e;
2271*67e74705SXin LideclCountIs(2)
2272*67e74705SXin Li  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2273*67e74705SXin Li</pre></td></tr>
2274*67e74705SXin Li
2275*67e74705SXin Li
2276*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
2277*67e74705SXin Li<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2278*67e74705SXin Li
2279*67e74705SXin LiMatches a node if it equals the node previously bound to ID.
2280*67e74705SXin Li
2281*67e74705SXin LiGiven
2282*67e74705SXin Li  class X { int a; int b; };
2283*67e74705SXin LicxxRecordDecl(
2284*67e74705SXin Li    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2285*67e74705SXin Li    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2286*67e74705SXin Li  matches the class X, as a and b have the same type.
2287*67e74705SXin Li
2288*67e74705SXin LiNote that when multiple matches are involved via forEach* matchers,
2289*67e74705SXin LiequalsBoundNodes acts as a filter.
2290*67e74705SXin LiFor example:
2291*67e74705SXin LicompoundStmt(
2292*67e74705SXin Li    forEachDescendant(varDecl().bind("d")),
2293*67e74705SXin Li    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2294*67e74705SXin Liwill trigger a match for each combination of variable declaration
2295*67e74705SXin Liand reference to that variable declaration within a compound statement.
2296*67e74705SXin Li</pre></td></tr>
2297*67e74705SXin Li
2298*67e74705SXin Li
2299*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr>
2300*67e74705SXin Li<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2301*67e74705SXin Li
2302*67e74705SXin LiDecl has pointer identity in the AST.
2303*67e74705SXin Li</pre></td></tr>
2304*67e74705SXin Li
2305*67e74705SXin Li
2306*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr>
2307*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2308*67e74705SXin Li
2309*67e74705SXin LiGiven
2310*67e74705SXin Li  __attribute__((device)) void f() { ... }
2311*67e74705SXin Lidecl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2312*67e74705SXin Lif. If the matcher is use from clang-query, attr::Kind parameter should be
2313*67e74705SXin Lipassed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2314*67e74705SXin Li</pre></td></tr>
2315*67e74705SXin Li
2316*67e74705SXin Li
2317*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
2318*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2319*67e74705SXin Lipartially matching a given regex.
2320*67e74705SXin Li
2321*67e74705SXin LiExample matches Y but not X
2322*67e74705SXin Li    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2323*67e74705SXin Li  #include "ASTMatcher.h"
2324*67e74705SXin Li  class X {};
2325*67e74705SXin LiASTMatcher.h:
2326*67e74705SXin Li  class Y {};
2327*67e74705SXin Li
2328*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2329*67e74705SXin Li</pre></td></tr>
2330*67e74705SXin Li
2331*67e74705SXin Li
2332*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr>
2333*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2334*67e74705SXin Li
2335*67e74705SXin LiExample matches X but not Y
2336*67e74705SXin Li  (matcher = cxxRecordDecl(isExpansionInMainFile())
2337*67e74705SXin Li  #include &lt;Y.h&gt;
2338*67e74705SXin Li  class X {};
2339*67e74705SXin LiY.h:
2340*67e74705SXin Li  class Y {};
2341*67e74705SXin Li
2342*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2343*67e74705SXin Li</pre></td></tr>
2344*67e74705SXin Li
2345*67e74705SXin Li
2346*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
2347*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2348*67e74705SXin Li
2349*67e74705SXin LiExample matches Y but not X
2350*67e74705SXin Li    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2351*67e74705SXin Li  #include &lt;SystemHeader.h&gt;
2352*67e74705SXin Li  class X {};
2353*67e74705SXin LiSystemHeader.h:
2354*67e74705SXin Li  class Y {};
2355*67e74705SXin Li
2356*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2357*67e74705SXin Li</pre></td></tr>
2358*67e74705SXin Li
2359*67e74705SXin Li
2360*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
2361*67e74705SXin Li<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2362*67e74705SXin Liby the compiler (eg. implicit defaultcopy constructors).
2363*67e74705SXin Li</pre></td></tr>
2364*67e74705SXin Li
2365*67e74705SXin Li
2366*67e74705SXin Li<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>
2367*67e74705SXin Li<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2368*67e74705SXin Li
2369*67e74705SXin LiGiven
2370*67e74705SXin Li  class C {
2371*67e74705SXin Li  public:    int a;
2372*67e74705SXin Li  protected: int b;
2373*67e74705SXin Li  private:   int c;
2374*67e74705SXin Li  };
2375*67e74705SXin LifieldDecl(isPrivate())
2376*67e74705SXin Li  matches 'int c;'
2377*67e74705SXin Li</pre></td></tr>
2378*67e74705SXin Li
2379*67e74705SXin Li
2380*67e74705SXin Li<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>
2381*67e74705SXin Li<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2382*67e74705SXin Li
2383*67e74705SXin LiGiven
2384*67e74705SXin Li  class C {
2385*67e74705SXin Li  public:    int a;
2386*67e74705SXin Li  protected: int b;
2387*67e74705SXin Li  private:   int c;
2388*67e74705SXin Li  };
2389*67e74705SXin LifieldDecl(isProtected())
2390*67e74705SXin Li  matches 'int b;'
2391*67e74705SXin Li</pre></td></tr>
2392*67e74705SXin Li
2393*67e74705SXin Li
2394*67e74705SXin Li<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>
2395*67e74705SXin Li<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2396*67e74705SXin Li
2397*67e74705SXin LiGiven
2398*67e74705SXin Li  class C {
2399*67e74705SXin Li  public:    int a;
2400*67e74705SXin Li  protected: int b;
2401*67e74705SXin Li  private:   int c;
2402*67e74705SXin Li  };
2403*67e74705SXin LifieldDecl(isPublic())
2404*67e74705SXin Li  matches 'int a;'
2405*67e74705SXin Li</pre></td></tr>
2406*67e74705SXin Li
2407*67e74705SXin Li
2408*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;</td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr>
2409*67e74705SXin Li<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2410*67e74705SXin Lia specific number of designators.
2411*67e74705SXin Li
2412*67e74705SXin LiExample: Given
2413*67e74705SXin Li  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2414*67e74705SXin Li  point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2415*67e74705SXin LidesignatorCountIs(2)
2416*67e74705SXin Li  matches '{ [2].y = 1.0, [0].x = 1.0 }',
2417*67e74705SXin Li  but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2418*67e74705SXin Li</pre></td></tr>
2419*67e74705SXin Li
2420*67e74705SXin Li
2421*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr>
2422*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields.
2423*67e74705SXin Li
2424*67e74705SXin LiGiven
2425*67e74705SXin Li  class C {
2426*67e74705SXin Li    int a : 2;
2427*67e74705SXin Li    int b : 4;
2428*67e74705SXin Li    int c : 2;
2429*67e74705SXin Li  };
2430*67e74705SXin LifieldDecl(isBitField())
2431*67e74705SXin Li  matches 'int a;' and 'int c;' but not 'int b;'.
2432*67e74705SXin Li</pre></td></tr>
2433*67e74705SXin Li
2434*67e74705SXin Li
2435*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr>
2436*67e74705SXin Li<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
2437*67e74705SXin Li
2438*67e74705SXin LiGiven
2439*67e74705SXin Li  class C {
2440*67e74705SXin Li    int a : 2;
2441*67e74705SXin Li    int b;
2442*67e74705SXin Li  };
2443*67e74705SXin LifieldDecl(isBitField())
2444*67e74705SXin Li  matches 'int a;' but not 'int b;'.
2445*67e74705SXin Li</pre></td></tr>
2446*67e74705SXin Li
2447*67e74705SXin Li
2448*67e74705SXin Li<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>
2449*67e74705SXin Li<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
2450*67e74705SXin Li
2451*67e74705SXin LiExample matches true (matcher = cxxBoolLiteral(equals(true)))
2452*67e74705SXin Li  true
2453*67e74705SXin Li
2454*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
2455*67e74705SXin Li           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;
2456*67e74705SXin Li</pre></td></tr>
2457*67e74705SXin Li
2458*67e74705SXin Li
2459*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
2460*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
2461*67e74705SXin Li
2462*67e74705SXin LiGiven:
2463*67e74705SXin Li  void f();
2464*67e74705SXin Li  void g() noexcept;
2465*67e74705SXin Li  void h() noexcept(true);
2466*67e74705SXin Li  void i() noexcept(false);
2467*67e74705SXin Li  void j() throw();
2468*67e74705SXin Li  void k() throw(int);
2469*67e74705SXin Li  void l() throw(...);
2470*67e74705SXin LifunctionDecl(hasDynamicExceptionSpec()) and
2471*67e74705SXin Li  functionProtoType(hasDynamicExceptionSpec())
2472*67e74705SXin Li  match the declarations of j, k, and l, but not f, g, h, or i.
2473*67e74705SXin Li</pre></td></tr>
2474*67e74705SXin Li
2475*67e74705SXin Li
2476*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
2477*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
2478*67e74705SXin Li
2479*67e74705SXin LiMatches overloaded operator names specified in strings without the
2480*67e74705SXin Li"operator" prefix: e.g. "&lt;&lt;".
2481*67e74705SXin Li
2482*67e74705SXin LiGiven:
2483*67e74705SXin Li  class A { int operator*(); };
2484*67e74705SXin Li  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2485*67e74705SXin Li  A a;
2486*67e74705SXin Li  a &lt;&lt; a;   &lt;-- This matches
2487*67e74705SXin Li
2488*67e74705SXin LicxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2489*67e74705SXin Lispecified line and
2490*67e74705SXin LicxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2491*67e74705SXin Limatches the declaration of A.
2492*67e74705SXin Li
2493*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
2494*67e74705SXin Li</pre></td></tr>
2495*67e74705SXin Li
2496*67e74705SXin Li
2497*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr>
2498*67e74705SXin Li<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations.
2499*67e74705SXin Li
2500*67e74705SXin LiGiven:
2501*67e74705SXin Li  constexpr int foo = 42;
2502*67e74705SXin Li  constexpr int bar();
2503*67e74705SXin LivarDecl(isConstexpr())
2504*67e74705SXin Li  matches the declaration of foo.
2505*67e74705SXin LifunctionDecl(isConstexpr())
2506*67e74705SXin Li  matches the declaration of bar.
2507*67e74705SXin Li</pre></td></tr>
2508*67e74705SXin Li
2509*67e74705SXin Li
2510*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr>
2511*67e74705SXin Li<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
2512*67e74705SXin Li
2513*67e74705SXin LiGiven:
2514*67e74705SXin Li  class A { ~A(); };
2515*67e74705SXin Li  class B { ~B() = default; };
2516*67e74705SXin LifunctionDecl(isDefaulted())
2517*67e74705SXin Li  matches the declaration of ~B, but not ~A.
2518*67e74705SXin Li</pre></td></tr>
2519*67e74705SXin Li
2520*67e74705SXin Li
2521*67e74705SXin Li<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>
2522*67e74705SXin Li<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
2523*67e74705SXin Li
2524*67e74705SXin LiExample matches A, va, fa
2525*67e74705SXin Li  class A {};
2526*67e74705SXin Li  class B;  Doesn't match, as it has no body.
2527*67e74705SXin Li  int va;
2528*67e74705SXin Li  extern int vb;  Doesn't match, as it doesn't define the variable.
2529*67e74705SXin Li  void fa() {}
2530*67e74705SXin Li  void fb();  Doesn't match, as it has no body.
2531*67e74705SXin Li
2532*67e74705SXin LiUsable 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;
2533*67e74705SXin Li</pre></td></tr>
2534*67e74705SXin Li
2535*67e74705SXin Li
2536*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr>
2537*67e74705SXin Li<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
2538*67e74705SXin Li
2539*67e74705SXin LiGiven:
2540*67e74705SXin Li  void Func();
2541*67e74705SXin Li  void DeletedFunc() = delete;
2542*67e74705SXin LifunctionDecl(isDeleted())
2543*67e74705SXin Li  matches the declaration of DeletedFunc, but not Func.
2544*67e74705SXin Li</pre></td></tr>
2545*67e74705SXin Li
2546*67e74705SXin Li
2547*67e74705SXin Li<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>
2548*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
2549*67e74705SXin Listatic member variable template instantiations.
2550*67e74705SXin Li
2551*67e74705SXin LiGiven
2552*67e74705SXin Li  template&lt;typename T&gt; void A(T t) { }
2553*67e74705SXin Li  template&lt;&gt; void A(int N) { }
2554*67e74705SXin LifunctionDecl(isExplicitTemplateSpecialization())
2555*67e74705SXin Li  matches the specialization A&lt;int&gt;().
2556*67e74705SXin Li
2557*67e74705SXin LiUsable 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;
2558*67e74705SXin Li</pre></td></tr>
2559*67e74705SXin Li
2560*67e74705SXin Li
2561*67e74705SXin Li<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>
2562*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
2563*67e74705SXin Li
2564*67e74705SXin LiGiven:
2565*67e74705SXin Li  extern "C" void f() {}
2566*67e74705SXin Li  extern "C" { void g() {} }
2567*67e74705SXin Li  void h() {}
2568*67e74705SXin LifunctionDecl(isExternC())
2569*67e74705SXin Li  matches the declaration of f and g, but not the declaration h
2570*67e74705SXin Li</pre></td></tr>
2571*67e74705SXin Li
2572*67e74705SXin Li
2573*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr>
2574*67e74705SXin Li<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2575*67e74705SXin Lithe inline keyword.
2576*67e74705SXin Li
2577*67e74705SXin LiGiven
2578*67e74705SXin Li  inline void f();
2579*67e74705SXin Li  void g();
2580*67e74705SXin Li  namespace n {
2581*67e74705SXin Li  inline namespace m {}
2582*67e74705SXin Li  }
2583*67e74705SXin LifunctionDecl(isInline()) will match ::f().
2584*67e74705SXin LinamespaceDecl(isInline()) will match n::m.
2585*67e74705SXin Li</pre></td></tr>
2586*67e74705SXin Li
2587*67e74705SXin Li
2588*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr>
2589*67e74705SXin Li<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2590*67e74705SXin Li
2591*67e74705SXin LiGiven:
2592*67e74705SXin Li  void f();
2593*67e74705SXin Li  void g() noexcept;
2594*67e74705SXin Li  void h() throw();
2595*67e74705SXin Li  void i() throw(int);
2596*67e74705SXin Li  void j() noexcept(false);
2597*67e74705SXin LifunctionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2598*67e74705SXin Li  match the declarations of g, and h, but not f, i or j.
2599*67e74705SXin Li</pre></td></tr>
2600*67e74705SXin Li
2601*67e74705SXin Li
2602*67e74705SXin Li<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>
2603*67e74705SXin Li<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2604*67e74705SXin Limember variable template instantiations.
2605*67e74705SXin Li
2606*67e74705SXin LiGiven
2607*67e74705SXin Li  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2608*67e74705SXin Lior
2609*67e74705SXin Li  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2610*67e74705SXin LicxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2611*67e74705SXin Li  matches the template instantiation of X&lt;A&gt;.
2612*67e74705SXin Li
2613*67e74705SXin LiBut given
2614*67e74705SXin Li  template &lt;typename T&gt;  class X {}; class A {};
2615*67e74705SXin Li  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2616*67e74705SXin LicxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2617*67e74705SXin Li  does not match, as X&lt;A&gt; is an explicit template specialization.
2618*67e74705SXin Li
2619*67e74705SXin LiUsable 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;
2620*67e74705SXin Li</pre></td></tr>
2621*67e74705SXin Li
2622*67e74705SXin Li
2623*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr>
2624*67e74705SXin Li<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
2625*67e74705SXin Li
2626*67e74705SXin LiExample matches f, but not g or h. The function i will not match, even when
2627*67e74705SXin Licompiled in C mode.
2628*67e74705SXin Li  void f(...);
2629*67e74705SXin Li  void g(int);
2630*67e74705SXin Li  template &lt;typename... Ts&gt; void h(Ts...);
2631*67e74705SXin Li  void i();
2632*67e74705SXin Li</pre></td></tr>
2633*67e74705SXin Li
2634*67e74705SXin Li
2635*67e74705SXin Li<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>
2636*67e74705SXin Li<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2637*67e74705SXin Lispecific parameter count.
2638*67e74705SXin Li
2639*67e74705SXin LiGiven
2640*67e74705SXin Li  void f(int i) {}
2641*67e74705SXin Li  void g(int i, int j) {}
2642*67e74705SXin Li  void h(int i, int j);
2643*67e74705SXin Li  void j(int i);
2644*67e74705SXin Li  void k(int x, int y, int z, ...);
2645*67e74705SXin LifunctionDecl(parameterCountIs(2))
2646*67e74705SXin Li  matches void g(int i, int j) {}
2647*67e74705SXin LifunctionProtoType(parameterCountIs(2))
2648*67e74705SXin Li  matches void h(int i, int j)
2649*67e74705SXin LifunctionProtoType(parameterCountIs(3))
2650*67e74705SXin Li  matches void k(int x, int y, int z, ...);
2651*67e74705SXin Li</pre></td></tr>
2652*67e74705SXin Li
2653*67e74705SXin Li
2654*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
2655*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
2656*67e74705SXin Li
2657*67e74705SXin LiGiven:
2658*67e74705SXin Li  void f();
2659*67e74705SXin Li  void g() noexcept;
2660*67e74705SXin Li  void h() noexcept(true);
2661*67e74705SXin Li  void i() noexcept(false);
2662*67e74705SXin Li  void j() throw();
2663*67e74705SXin Li  void k() throw(int);
2664*67e74705SXin Li  void l() throw(...);
2665*67e74705SXin LifunctionDecl(hasDynamicExceptionSpec()) and
2666*67e74705SXin Li  functionProtoType(hasDynamicExceptionSpec())
2667*67e74705SXin Li  match the declarations of j, k, and l, but not f, g, h, or i.
2668*67e74705SXin Li</pre></td></tr>
2669*67e74705SXin Li
2670*67e74705SXin Li
2671*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr>
2672*67e74705SXin Li<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
2673*67e74705SXin Li
2674*67e74705SXin LiGiven:
2675*67e74705SXin Li  void f();
2676*67e74705SXin Li  void g() noexcept;
2677*67e74705SXin Li  void h() throw();
2678*67e74705SXin Li  void i() throw(int);
2679*67e74705SXin Li  void j() noexcept(false);
2680*67e74705SXin LifunctionDecl(isNoThrow()) and functionProtoType(isNoThrow())
2681*67e74705SXin Li  match the declarations of g, and h, but not f, i or j.
2682*67e74705SXin Li</pre></td></tr>
2683*67e74705SXin Li
2684*67e74705SXin Li
2685*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
2686*67e74705SXin Li<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2687*67e74705SXin Lispecific parameter count.
2688*67e74705SXin Li
2689*67e74705SXin LiGiven
2690*67e74705SXin Li  void f(int i) {}
2691*67e74705SXin Li  void g(int i, int j) {}
2692*67e74705SXin Li  void h(int i, int j);
2693*67e74705SXin Li  void j(int i);
2694*67e74705SXin Li  void k(int x, int y, int z, ...);
2695*67e74705SXin LifunctionDecl(parameterCountIs(2))
2696*67e74705SXin Li  matches void g(int i, int j) {}
2697*67e74705SXin LifunctionProtoType(parameterCountIs(2))
2698*67e74705SXin Li  matches void h(int i, int j)
2699*67e74705SXin LifunctionProtoType(parameterCountIs(3))
2700*67e74705SXin Li  matches void k(int x, int y, int z, ...);
2701*67e74705SXin Li</pre></td></tr>
2702*67e74705SXin Li
2703*67e74705SXin Li
2704*67e74705SXin Li<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>
2705*67e74705SXin Li<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
2706*67e74705SXin Li
2707*67e74705SXin LiExample matches true (matcher = cxxBoolLiteral(equals(true)))
2708*67e74705SXin Li  true
2709*67e74705SXin Li
2710*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
2711*67e74705SXin Li           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;
2712*67e74705SXin Li</pre></td></tr>
2713*67e74705SXin Li
2714*67e74705SXin Li
2715*67e74705SXin Li<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>
2716*67e74705SXin Li<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
2717*67e74705SXin Lito '.'.
2718*67e74705SXin Li
2719*67e74705SXin LiMember calls on the implicit this pointer match as called with '-&gt;'.
2720*67e74705SXin Li
2721*67e74705SXin LiGiven
2722*67e74705SXin Li  class Y {
2723*67e74705SXin Li    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2724*67e74705SXin Li    int a;
2725*67e74705SXin Li    static int b;
2726*67e74705SXin Li  };
2727*67e74705SXin LimemberExpr(isArrow())
2728*67e74705SXin Li  matches this-&gt;x, x, y.x, a, this-&gt;b
2729*67e74705SXin Li</pre></td></tr>
2730*67e74705SXin Li
2731*67e74705SXin Li
2732*67e74705SXin Li<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>
2733*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
2734*67e74705SXin Li
2735*67e74705SXin LiSupports specifying enclosing namespaces or classes by prefixing the name
2736*67e74705SXin Liwith '&lt;enclosing&gt;::'.
2737*67e74705SXin LiDoes not match typedefs of an underlying type with the given name.
2738*67e74705SXin Li
2739*67e74705SXin LiExample matches X (Name == "X")
2740*67e74705SXin Li  class X;
2741*67e74705SXin Li
2742*67e74705SXin LiExample matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
2743*67e74705SXin Li  namespace a { namespace b { class X; } }
2744*67e74705SXin Li</pre></td></tr>
2745*67e74705SXin Li
2746*67e74705SXin Li
2747*67e74705SXin Li<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>
2748*67e74705SXin Li<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
2749*67e74705SXin Lia substring matched by the given RegExp.
2750*67e74705SXin Li
2751*67e74705SXin LiSupports specifying enclosing namespaces or classes by
2752*67e74705SXin Liprefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
2753*67e74705SXin Liof an underlying type with the given name.
2754*67e74705SXin Li
2755*67e74705SXin LiExample matches X (regexp == "::X")
2756*67e74705SXin Li  class X;
2757*67e74705SXin Li
2758*67e74705SXin LiExample matches X (regexp is one of "::X", "^foo::.*X", among others)
2759*67e74705SXin Li  namespace foo { namespace bar { class X; } }
2760*67e74705SXin Li</pre></td></tr>
2761*67e74705SXin Li
2762*67e74705SXin Li
2763*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isAnonymous0')"><a name="isAnonymous0Anchor">isAnonymous</a></td><td></td></tr>
2764*67e74705SXin Li<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
2765*67e74705SXin Li
2766*67e74705SXin LiGiven
2767*67e74705SXin Li  namespace n {
2768*67e74705SXin Li  namespace {} #1
2769*67e74705SXin Li  }
2770*67e74705SXin LinamespaceDecl(isAnonymous()) will match #1 but not ::n.
2771*67e74705SXin Li</pre></td></tr>
2772*67e74705SXin Li
2773*67e74705SXin Li
2774*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr>
2775*67e74705SXin Li<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
2776*67e74705SXin Lithe inline keyword.
2777*67e74705SXin Li
2778*67e74705SXin LiGiven
2779*67e74705SXin Li  inline void f();
2780*67e74705SXin Li  void g();
2781*67e74705SXin Li  namespace n {
2782*67e74705SXin Li  inline namespace m {}
2783*67e74705SXin Li  }
2784*67e74705SXin LifunctionDecl(isInline()) will match ::f().
2785*67e74705SXin LinamespaceDecl(isInline()) will match n::m.
2786*67e74705SXin Li</pre></td></tr>
2787*67e74705SXin Li
2788*67e74705SXin Li
2789*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
2790*67e74705SXin Li<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
2791*67e74705SXin Lia specific number of arguments (including absent default arguments).
2792*67e74705SXin Li
2793*67e74705SXin LiExample matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2794*67e74705SXin Li  void f(int x, int y);
2795*67e74705SXin Li  f(0, 0);
2796*67e74705SXin Li</pre></td></tr>
2797*67e74705SXin Li
2798*67e74705SXin Li
2799*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr>
2800*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
2801*67e74705SXin Li
2802*67e74705SXin LiobjCMessageExpr(hasKeywordSelector()) matches the generated setFrame
2803*67e74705SXin Limessage expression in
2804*67e74705SXin Li
2805*67e74705SXin Li  UIWebView *webView = ...;
2806*67e74705SXin Li  CGRect bodyFrame = webView.frame;
2807*67e74705SXin Li  bodyFrame.size.height = self.bodyContentHeight;
2808*67e74705SXin Li  webView.frame = bodyFrame;
2809*67e74705SXin Li      ^---- matches here
2810*67e74705SXin Li</pre></td></tr>
2811*67e74705SXin Li
2812*67e74705SXin Li
2813*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr>
2814*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
2815*67e74705SXin Li
2816*67e74705SXin LiMatches only when the selector of the objCMessageExpr is NULL. This may
2817*67e74705SXin Lirepresent an error condition in the tree!
2818*67e74705SXin Li</pre></td></tr>
2819*67e74705SXin Li
2820*67e74705SXin Li
2821*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasSelector0')"><a name="hasSelector0Anchor">hasSelector</a></td><td>std::string BaseName</td></tr>
2822*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
2823*67e74705SXin Li
2824*67e74705SXin Li matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
2825*67e74705SXin Li matches the outer message expr in the code below, but NOT the message
2826*67e74705SXin Li invocation for self.bodyView.
2827*67e74705SXin Li    [self.bodyView loadHTMLString:html baseURL:NULL];
2828*67e74705SXin Li</pre></td></tr>
2829*67e74705SXin Li
2830*67e74705SXin Li
2831*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasUnarySelector0')"><a name="hasUnarySelector0Anchor">hasUnarySelector</a></td><td></td></tr>
2832*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
2833*67e74705SXin Li
2834*67e74705SXin Li matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
2835*67e74705SXin Li matches self.bodyView in the code below, but NOT the outer message
2836*67e74705SXin Li invocation of "loadHTMLString:baseURL:".
2837*67e74705SXin Li    [self.bodyView loadHTMLString:html baseURL:NULL];
2838*67e74705SXin Li</pre></td></tr>
2839*67e74705SXin Li
2840*67e74705SXin Li
2841*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>std::string RegExp</td></tr>
2842*67e74705SXin Li<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
2843*67e74705SXin Lia substring matched by the given RegExp.
2844*67e74705SXin Li matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
2845*67e74705SXin Li invocation for self.bodyView.
2846*67e74705SXin Li    [self.bodyView loadHTMLString:html baseURL:NULL];
2847*67e74705SXin Li</pre></td></tr>
2848*67e74705SXin Li
2849*67e74705SXin Li
2850*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr>
2851*67e74705SXin Li<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
2852*67e74705SXin Li
2853*67e74705SXin Li matcher = objCMessageExpr(numSelectorArgs(0));
2854*67e74705SXin Li matches self.bodyView in the code below
2855*67e74705SXin Li
2856*67e74705SXin Li matcher = objCMessageExpr(numSelectorArgs(2));
2857*67e74705SXin Li matches the invocation of "loadHTMLString:baseURL:" but not that
2858*67e74705SXin Li of self.bodyView
2859*67e74705SXin Li    [self.bodyView loadHTMLString:html baseURL:NULL];
2860*67e74705SXin Li</pre></td></tr>
2861*67e74705SXin Li
2862*67e74705SXin Li
2863*67e74705SXin Li<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>
2864*67e74705SXin Li<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
2865*67e74705SXin Li
2866*67e74705SXin LiGiven
2867*67e74705SXin Li  class Y { public: void x(); };
2868*67e74705SXin Li  void z() { Y* y; y-&gt;x(); }
2869*67e74705SXin LicxxMemberCallExpr(on(hasType(asString("class Y *"))))
2870*67e74705SXin Li  matches y-&gt;x()
2871*67e74705SXin Li</pre></td></tr>
2872*67e74705SXin Li
2873*67e74705SXin Li
2874*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
2875*67e74705SXin Li<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
2876*67e74705SXin Li
2877*67e74705SXin LiMatches a node if it equals the node previously bound to ID.
2878*67e74705SXin Li
2879*67e74705SXin LiGiven
2880*67e74705SXin Li  class X { int a; int b; };
2881*67e74705SXin LicxxRecordDecl(
2882*67e74705SXin Li    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2883*67e74705SXin Li    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2884*67e74705SXin Li  matches the class X, as a and b have the same type.
2885*67e74705SXin Li
2886*67e74705SXin LiNote that when multiple matches are involved via forEach* matchers,
2887*67e74705SXin LiequalsBoundNodes acts as a filter.
2888*67e74705SXin LiFor example:
2889*67e74705SXin LicompoundStmt(
2890*67e74705SXin Li    forEachDescendant(varDecl().bind("d")),
2891*67e74705SXin Li    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2892*67e74705SXin Liwill trigger a match for each combination of variable declaration
2893*67e74705SXin Liand reference to that variable declaration within a compound statement.
2894*67e74705SXin Li</pre></td></tr>
2895*67e74705SXin Li
2896*67e74705SXin Li
2897*67e74705SXin Li<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>
2898*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
2899*67e74705SXin Lithe node, not hidden within a typedef.
2900*67e74705SXin Li
2901*67e74705SXin LiGiven
2902*67e74705SXin Li  typedef const int const_int;
2903*67e74705SXin Li  const_int i;
2904*67e74705SXin Li  int *const j;
2905*67e74705SXin Li  int *volatile k;
2906*67e74705SXin Li  int m;
2907*67e74705SXin LivarDecl(hasType(hasLocalQualifiers())) matches only j and k.
2908*67e74705SXin Lii is const-qualified but the qualifier is not local.
2909*67e74705SXin Li</pre></td></tr>
2910*67e74705SXin Li
2911*67e74705SXin Li
2912*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr>
2913*67e74705SXin Li<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
2914*67e74705SXin Li
2915*67e74705SXin LiGiven
2916*67e74705SXin Li  void a(char);
2917*67e74705SXin Li  void b(wchar_t);
2918*67e74705SXin Li  void c(double);
2919*67e74705SXin LifunctionDecl(hasAnyParameter(hasType(isAnyCharacter())))
2920*67e74705SXin Limatches "a(char)", "b(wchar_t)", but not "c(double)".
2921*67e74705SXin Li</pre></td></tr>
2922*67e74705SXin Li
2923*67e74705SXin Li
2924*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr>
2925*67e74705SXin Li<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
2926*67e74705SXin Lithe Objective-C object pointer type, which is different despite being
2927*67e74705SXin Lisyntactically similar.
2928*67e74705SXin Li
2929*67e74705SXin LiGiven
2930*67e74705SXin Li  int *i = nullptr;
2931*67e74705SXin Li
2932*67e74705SXin Li  @interface Foo
2933*67e74705SXin Li  @end
2934*67e74705SXin Li  Foo *f;
2935*67e74705SXin Li
2936*67e74705SXin Li  int j;
2937*67e74705SXin LivarDecl(hasType(isAnyPointer()))
2938*67e74705SXin Li  matches "int *i" and "Foo *f", but not "int j".
2939*67e74705SXin Li</pre></td></tr>
2940*67e74705SXin Li
2941*67e74705SXin Li
2942*67e74705SXin Li<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>
2943*67e74705SXin Li<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
2944*67e74705SXin Liinclude "top-level" const.
2945*67e74705SXin Li
2946*67e74705SXin LiGiven
2947*67e74705SXin Li  void a(int);
2948*67e74705SXin Li  void b(int const);
2949*67e74705SXin Li  void c(const int);
2950*67e74705SXin Li  void d(const int*);
2951*67e74705SXin Li  void e(int const) {};
2952*67e74705SXin LifunctionDecl(hasAnyParameter(hasType(isConstQualified())))
2953*67e74705SXin Li  matches "void b(int const)", "void c(const int)" and
2954*67e74705SXin Li  "void e(int const) {}". It does not match d as there
2955*67e74705SXin Li  is no top-level const on the parameter type "const int *".
2956*67e74705SXin Li</pre></td></tr>
2957*67e74705SXin Li
2958*67e74705SXin Li
2959*67e74705SXin Li<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>
2960*67e74705SXin Li<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
2961*67e74705SXin Li
2962*67e74705SXin LiGiven
2963*67e74705SXin Li  void a(int);
2964*67e74705SXin Li  void b(long);
2965*67e74705SXin Li  void c(double);
2966*67e74705SXin LifunctionDecl(hasAnyParameter(hasType(isInteger())))
2967*67e74705SXin Limatches "a(int)", "b(long)", but not "c(double)".
2968*67e74705SXin Li</pre></td></tr>
2969*67e74705SXin Li
2970*67e74705SXin Li
2971*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr>
2972*67e74705SXin Li<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
2973*67e74705SXin Li
2974*67e74705SXin LiGiven
2975*67e74705SXin Li  void a(int);
2976*67e74705SXin Li  void b(unsigned long);
2977*67e74705SXin Li  void c(double);
2978*67e74705SXin LifunctionDecl(hasAnyParameter(hasType(isInteger())))
2979*67e74705SXin Limatches "a(int)", but not "b(unsigned long)" and "c(double)".
2980*67e74705SXin Li</pre></td></tr>
2981*67e74705SXin Li
2982*67e74705SXin Li
2983*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr>
2984*67e74705SXin Li<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
2985*67e74705SXin Li
2986*67e74705SXin LiGiven
2987*67e74705SXin Li  void a(int);
2988*67e74705SXin Li  void b(unsigned long);
2989*67e74705SXin Li  void c(double);
2990*67e74705SXin LifunctionDecl(hasAnyParameter(hasType(isInteger())))
2991*67e74705SXin Limatches "b(unsigned long)", but not "a(int)" and "c(double)".
2992*67e74705SXin Li</pre></td></tr>
2993*67e74705SXin Li
2994*67e74705SXin Li
2995*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr>
2996*67e74705SXin Li<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
2997*67e74705SXin Liinclude "top-level" volatile.
2998*67e74705SXin Li
2999*67e74705SXin LiGiven
3000*67e74705SXin Li  void a(int);
3001*67e74705SXin Li  void b(int volatile);
3002*67e74705SXin Li  void c(volatile int);
3003*67e74705SXin Li  void d(volatile int*);
3004*67e74705SXin Li  void e(int volatile) {};
3005*67e74705SXin LifunctionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3006*67e74705SXin Li  matches "void b(int volatile)", "void c(volatile int)" and
3007*67e74705SXin Li  "void e(int volatile) {}". It does not match d as there
3008*67e74705SXin Li  is no top-level volatile on the parameter type "volatile int *".
3009*67e74705SXin Li</pre></td></tr>
3010*67e74705SXin Li
3011*67e74705SXin Li
3012*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr>
3013*67e74705SXin Li<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3014*67e74705SXin Li
3015*67e74705SXin LiExample matches C, but not S or U.
3016*67e74705SXin Li  struct S {};
3017*67e74705SXin Li  class C {};
3018*67e74705SXin Li  union U {};
3019*67e74705SXin Li</pre></td></tr>
3020*67e74705SXin Li
3021*67e74705SXin Li
3022*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr>
3023*67e74705SXin Li<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3024*67e74705SXin Li
3025*67e74705SXin LiExample matches S, but not C or U.
3026*67e74705SXin Li  struct S {};
3027*67e74705SXin Li  class C {};
3028*67e74705SXin Li  union U {};
3029*67e74705SXin Li</pre></td></tr>
3030*67e74705SXin Li
3031*67e74705SXin Li
3032*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr>
3033*67e74705SXin Li<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3034*67e74705SXin Li
3035*67e74705SXin LiExample matches U, but not C or S.
3036*67e74705SXin Li  struct S {};
3037*67e74705SXin Li  class C {};
3038*67e74705SXin Li  union U {};
3039*67e74705SXin Li</pre></td></tr>
3040*67e74705SXin Li
3041*67e74705SXin Li
3042*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
3043*67e74705SXin Li<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3044*67e74705SXin Li
3045*67e74705SXin LiMatches a node if it equals the node previously bound to ID.
3046*67e74705SXin Li
3047*67e74705SXin LiGiven
3048*67e74705SXin Li  class X { int a; int b; };
3049*67e74705SXin LicxxRecordDecl(
3050*67e74705SXin Li    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3051*67e74705SXin Li    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3052*67e74705SXin Li  matches the class X, as a and b have the same type.
3053*67e74705SXin Li
3054*67e74705SXin LiNote that when multiple matches are involved via forEach* matchers,
3055*67e74705SXin LiequalsBoundNodes acts as a filter.
3056*67e74705SXin LiFor example:
3057*67e74705SXin LicompoundStmt(
3058*67e74705SXin Li    forEachDescendant(varDecl().bind("d")),
3059*67e74705SXin Li    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3060*67e74705SXin Liwill trigger a match for each combination of variable declaration
3061*67e74705SXin Liand reference to that variable declaration within a compound statement.
3062*67e74705SXin Li</pre></td></tr>
3063*67e74705SXin Li
3064*67e74705SXin Li
3065*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>const Stmt* Other</td></tr>
3066*67e74705SXin Li<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3067*67e74705SXin Li
3068*67e74705SXin LiStmt has pointer identity in the AST.
3069*67e74705SXin Li</pre></td></tr>
3070*67e74705SXin Li
3071*67e74705SXin Li
3072*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
3073*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3074*67e74705SXin Lipartially matching a given regex.
3075*67e74705SXin Li
3076*67e74705SXin LiExample matches Y but not X
3077*67e74705SXin Li    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3078*67e74705SXin Li  #include "ASTMatcher.h"
3079*67e74705SXin Li  class X {};
3080*67e74705SXin LiASTMatcher.h:
3081*67e74705SXin Li  class Y {};
3082*67e74705SXin Li
3083*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3084*67e74705SXin Li</pre></td></tr>
3085*67e74705SXin Li
3086*67e74705SXin Li
3087*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr>
3088*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3089*67e74705SXin Li
3090*67e74705SXin LiExample matches X but not Y
3091*67e74705SXin Li  (matcher = cxxRecordDecl(isExpansionInMainFile())
3092*67e74705SXin Li  #include &lt;Y.h&gt;
3093*67e74705SXin Li  class X {};
3094*67e74705SXin LiY.h:
3095*67e74705SXin Li  class Y {};
3096*67e74705SXin Li
3097*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3098*67e74705SXin Li</pre></td></tr>
3099*67e74705SXin Li
3100*67e74705SXin Li
3101*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
3102*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3103*67e74705SXin Li
3104*67e74705SXin LiExample matches Y but not X
3105*67e74705SXin Li    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3106*67e74705SXin Li  #include &lt;SystemHeader.h&gt;
3107*67e74705SXin Li  class X {};
3108*67e74705SXin LiSystemHeader.h:
3109*67e74705SXin Li  class Y {};
3110*67e74705SXin Li
3111*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3112*67e74705SXin Li</pre></td></tr>
3113*67e74705SXin Li
3114*67e74705SXin Li
3115*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;</td><td class="name" onclick="toggle('hasSize1')"><a name="hasSize1Anchor">hasSize</a></td><td>unsigned N</td></tr>
3116*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
3117*67e74705SXin Li
3118*67e74705SXin LiGiven
3119*67e74705SXin Li  int a[42];
3120*67e74705SXin Li  int b[2 * 21];
3121*67e74705SXin Li  int c[41], d[43];
3122*67e74705SXin Li  char *s = "abcd";
3123*67e74705SXin Li  wchar_t *ws = L"abcd";
3124*67e74705SXin Li  char *w = "a";
3125*67e74705SXin LiconstantArrayType(hasSize(42))
3126*67e74705SXin Li  matches "int a[42]" and "int b[2 * 21]"
3127*67e74705SXin ListringLiteral(hasSize(4))
3128*67e74705SXin Li  matches "abcd", L"abcd"
3129*67e74705SXin Li</pre></td></tr>
3130*67e74705SXin Li
3131*67e74705SXin Li
3132*67e74705SXin Li<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>
3133*67e74705SXin Li<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
3134*67e74705SXin Li
3135*67e74705SXin LiExample matches A, va, fa
3136*67e74705SXin Li  class A {};
3137*67e74705SXin Li  class B;  Doesn't match, as it has no body.
3138*67e74705SXin Li  int va;
3139*67e74705SXin Li  extern int vb;  Doesn't match, as it doesn't define the variable.
3140*67e74705SXin Li  void fa() {}
3141*67e74705SXin Li  void fb();  Doesn't match, as it has no body.
3142*67e74705SXin Li
3143*67e74705SXin LiUsable 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;
3144*67e74705SXin Li</pre></td></tr>
3145*67e74705SXin Li
3146*67e74705SXin Li
3147*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr>
3148*67e74705SXin Li<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
3149*67e74705SXin Li
3150*67e74705SXin LiNote that 'Value' is a string as the template argument's value is
3151*67e74705SXin Lian arbitrary precision integer. 'Value' must be euqal to the canonical
3152*67e74705SXin Lirepresentation of that integral value in base 10.
3153*67e74705SXin Li
3154*67e74705SXin LiGiven
3155*67e74705SXin Li  template&lt;int T&gt; struct A {};
3156*67e74705SXin Li  C&lt;42&gt; c;
3157*67e74705SXin LiclassTemplateSpecializationDecl(
3158*67e74705SXin Li  hasAnyTemplateArgument(equalsIntegralValue("42")))
3159*67e74705SXin Li  matches the implicit instantiation of C in C&lt;42&gt;.
3160*67e74705SXin Li</pre></td></tr>
3161*67e74705SXin Li
3162*67e74705SXin Li
3163*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr>
3164*67e74705SXin Li<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
3165*67e74705SXin Li
3166*67e74705SXin LiGiven
3167*67e74705SXin Li  template&lt;int T&gt; struct A {};
3168*67e74705SXin Li  C&lt;42&gt; c;
3169*67e74705SXin LiclassTemplateSpecializationDecl(
3170*67e74705SXin Li  hasAnyTemplateArgument(isIntegral()))
3171*67e74705SXin Li  matches the implicit instantiation of C in C&lt;42&gt;
3172*67e74705SXin Li  with isIntegral() matching 42.
3173*67e74705SXin Li</pre></td></tr>
3174*67e74705SXin Li
3175*67e74705SXin Li
3176*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs1')"><a name="templateArgumentCountIs1Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
3177*67e74705SXin Li<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
3178*67e74705SXin Li
3179*67e74705SXin LiGiven
3180*67e74705SXin Li  template&lt;typename T&gt; struct C {};
3181*67e74705SXin Li  C&lt;int&gt; c;
3182*67e74705SXin LiclassTemplateSpecializationDecl(templateArgumentCountIs(1))
3183*67e74705SXin Li  matches C&lt;int&gt;.
3184*67e74705SXin Li</pre></td></tr>
3185*67e74705SXin Li
3186*67e74705SXin Li
3187*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
3188*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
3189*67e74705SXin Lipartially matching a given regex.
3190*67e74705SXin Li
3191*67e74705SXin LiExample matches Y but not X
3192*67e74705SXin Li    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3193*67e74705SXin Li  #include "ASTMatcher.h"
3194*67e74705SXin Li  class X {};
3195*67e74705SXin LiASTMatcher.h:
3196*67e74705SXin Li  class Y {};
3197*67e74705SXin Li
3198*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3199*67e74705SXin Li</pre></td></tr>
3200*67e74705SXin Li
3201*67e74705SXin Li
3202*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr>
3203*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
3204*67e74705SXin Li
3205*67e74705SXin LiExample matches X but not Y
3206*67e74705SXin Li  (matcher = cxxRecordDecl(isExpansionInMainFile())
3207*67e74705SXin Li  #include &lt;Y.h&gt;
3208*67e74705SXin Li  class X {};
3209*67e74705SXin LiY.h:
3210*67e74705SXin Li  class Y {};
3211*67e74705SXin Li
3212*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3213*67e74705SXin Li</pre></td></tr>
3214*67e74705SXin Li
3215*67e74705SXin Li
3216*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader2')"><a name="isExpansionInSystemHeader2Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
3217*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
3218*67e74705SXin Li
3219*67e74705SXin LiExample matches Y but not X
3220*67e74705SXin Li    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3221*67e74705SXin Li  #include &lt;SystemHeader.h&gt;
3222*67e74705SXin Li  class X {};
3223*67e74705SXin LiSystemHeader.h:
3224*67e74705SXin Li  class Y {};
3225*67e74705SXin Li
3226*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3227*67e74705SXin Li</pre></td></tr>
3228*67e74705SXin Li
3229*67e74705SXin Li
3230*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr>
3231*67e74705SXin Li<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
3232*67e74705SXin Li
3233*67e74705SXin LiGiven
3234*67e74705SXin Li struct S { bool func(); };
3235*67e74705SXin LifunctionDecl(returns(booleanType()))
3236*67e74705SXin Li  matches "bool func();"
3237*67e74705SXin Li</pre></td></tr>
3238*67e74705SXin Li
3239*67e74705SXin Li
3240*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode2')"><a name="equalsBoundNode2Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
3241*67e74705SXin Li<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
3242*67e74705SXin Li
3243*67e74705SXin LiMatches a node if it equals the node previously bound to ID.
3244*67e74705SXin Li
3245*67e74705SXin LiGiven
3246*67e74705SXin Li  class X { int a; int b; };
3247*67e74705SXin LicxxRecordDecl(
3248*67e74705SXin Li    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3249*67e74705SXin Li    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3250*67e74705SXin Li  matches the class X, as a and b have the same type.
3251*67e74705SXin Li
3252*67e74705SXin LiNote that when multiple matches are involved via forEach* matchers,
3253*67e74705SXin LiequalsBoundNodes acts as a filter.
3254*67e74705SXin LiFor example:
3255*67e74705SXin LicompoundStmt(
3256*67e74705SXin Li    forEachDescendant(varDecl().bind("d")),
3257*67e74705SXin Li    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3258*67e74705SXin Liwill trigger a match for each combination of variable declaration
3259*67e74705SXin Liand reference to that variable declaration within a compound statement.
3260*67e74705SXin Li</pre></td></tr>
3261*67e74705SXin Li
3262*67e74705SXin Li
3263*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('equalsNode2')"><a name="equalsNode2Anchor">equalsNode</a></td><td>const Type* Other</td></tr>
3264*67e74705SXin Li<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
3265*67e74705SXin Li
3266*67e74705SXin LiType has pointer identity in the AST.
3267*67e74705SXin Li</pre></td></tr>
3268*67e74705SXin Li
3269*67e74705SXin Li
3270*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr>
3271*67e74705SXin Li<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
3272*67e74705SXin Li
3273*67e74705SXin LiGiven
3274*67e74705SXin Li  int i;
3275*67e74705SXin Li  float f;
3276*67e74705SXin LirealFloatingPointType()
3277*67e74705SXin Li  matches "float f" but not "int i"
3278*67e74705SXin Li</pre></td></tr>
3279*67e74705SXin Li
3280*67e74705SXin Li
3281*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr>
3282*67e74705SXin Li<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
3283*67e74705SXin Li
3284*67e74705SXin LiGiven
3285*67e74705SXin Li struct S { void func(); };
3286*67e74705SXin LifunctionDecl(returns(voidType()))
3287*67e74705SXin Li  matches "void func();"
3288*67e74705SXin Li</pre></td></tr>
3289*67e74705SXin Li
3290*67e74705SXin Li
3291*67e74705SXin Li<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>
3292*67e74705SXin Li<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
3293*67e74705SXin Li
3294*67e74705SXin LiGiven
3295*67e74705SXin Li  int x;
3296*67e74705SXin Li  int s = sizeof(x) + alignof(x)
3297*67e74705SXin LiunaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
3298*67e74705SXin Li  matches sizeof(x)
3299*67e74705SXin Li</pre></td></tr>
3300*67e74705SXin Li
3301*67e74705SXin Li
3302*67e74705SXin Li<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>
3303*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3304*67e74705SXin Liunary).
3305*67e74705SXin Li
3306*67e74705SXin LiExample matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3307*67e74705SXin Li  !(a || b)
3308*67e74705SXin Li</pre></td></tr>
3309*67e74705SXin Li
3310*67e74705SXin Li
3311*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr>
3312*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
3313*67e74705SXin Li
3314*67e74705SXin LiExample matches x, but not y, z, or a.
3315*67e74705SXin Li(matcher = varDecl(hasAutomaticStorageDuration())
3316*67e74705SXin Livoid f() {
3317*67e74705SXin Li  int x;
3318*67e74705SXin Li  static int y;
3319*67e74705SXin Li  thread_local int z;
3320*67e74705SXin Li}
3321*67e74705SXin Liint a;
3322*67e74705SXin Li</pre></td></tr>
3323*67e74705SXin Li
3324*67e74705SXin Li
3325*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr>
3326*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
3327*67e74705SXin Li
3328*67e74705SXin LiExample matches y and z (matcher = varDecl(hasGlobalStorage())
3329*67e74705SXin Livoid f() {
3330*67e74705SXin Li  int x;
3331*67e74705SXin Li  static int y;
3332*67e74705SXin Li}
3333*67e74705SXin Liint z;
3334*67e74705SXin Li</pre></td></tr>
3335*67e74705SXin Li
3336*67e74705SXin Li
3337*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr>
3338*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
3339*67e74705SXin Linon-static local variable.
3340*67e74705SXin Li
3341*67e74705SXin LiExample matches x (matcher = varDecl(hasLocalStorage())
3342*67e74705SXin Livoid f() {
3343*67e74705SXin Li  int x;
3344*67e74705SXin Li  static int y;
3345*67e74705SXin Li}
3346*67e74705SXin Liint z;
3347*67e74705SXin Li</pre></td></tr>
3348*67e74705SXin Li
3349*67e74705SXin Li
3350*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr>
3351*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
3352*67e74705SXin Li
3353*67e74705SXin LiExample matches y and a, but not x or z.
3354*67e74705SXin Li(matcher = varDecl(hasStaticStorageDuration())
3355*67e74705SXin Livoid f() {
3356*67e74705SXin Li  int x;
3357*67e74705SXin Li  static int y;
3358*67e74705SXin Li  thread_local int z;
3359*67e74705SXin Li}
3360*67e74705SXin Liint a;
3361*67e74705SXin Li</pre></td></tr>
3362*67e74705SXin Li
3363*67e74705SXin Li
3364*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr>
3365*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
3366*67e74705SXin Li
3367*67e74705SXin LiExample matches z, but not x, z, or a.
3368*67e74705SXin Li(matcher = varDecl(hasThreadStorageDuration())
3369*67e74705SXin Livoid f() {
3370*67e74705SXin Li  int x;
3371*67e74705SXin Li  static int y;
3372*67e74705SXin Li  thread_local int z;
3373*67e74705SXin Li}
3374*67e74705SXin Liint a;
3375*67e74705SXin Li</pre></td></tr>
3376*67e74705SXin Li
3377*67e74705SXin Li
3378*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr>
3379*67e74705SXin Li<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations.
3380*67e74705SXin Li
3381*67e74705SXin LiGiven:
3382*67e74705SXin Li  constexpr int foo = 42;
3383*67e74705SXin Li  constexpr int bar();
3384*67e74705SXin LivarDecl(isConstexpr())
3385*67e74705SXin Li  matches the declaration of foo.
3386*67e74705SXin LifunctionDecl(isConstexpr())
3387*67e74705SXin Li  matches the declaration of bar.
3388*67e74705SXin Li</pre></td></tr>
3389*67e74705SXin Li
3390*67e74705SXin Li
3391*67e74705SXin Li<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>
3392*67e74705SXin Li<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3393*67e74705SXin Li
3394*67e74705SXin LiExample matches A, va, fa
3395*67e74705SXin Li  class A {};
3396*67e74705SXin Li  class B;  Doesn't match, as it has no body.
3397*67e74705SXin Li  int va;
3398*67e74705SXin Li  extern int vb;  Doesn't match, as it doesn't define the variable.
3399*67e74705SXin Li  void fa() {}
3400*67e74705SXin Li  void fb();  Doesn't match, as it has no body.
3401*67e74705SXin Li
3402*67e74705SXin LiUsable 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;
3403*67e74705SXin Li</pre></td></tr>
3404*67e74705SXin Li
3405*67e74705SXin Li
3406*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr>
3407*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3408*67e74705SXin Lia C++ catch block, or an Objective-C statement.
3409*67e74705SXin Li
3410*67e74705SXin LiExample matches x (matcher = varDecl(isExceptionVariable())
3411*67e74705SXin Livoid f(int y) {
3412*67e74705SXin Li  try {
3413*67e74705SXin Li  } catch (int x) {
3414*67e74705SXin Li  }
3415*67e74705SXin Li}
3416*67e74705SXin Li</pre></td></tr>
3417*67e74705SXin Li
3418*67e74705SXin Li
3419*67e74705SXin Li<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>
3420*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3421*67e74705SXin Listatic member variable template instantiations.
3422*67e74705SXin Li
3423*67e74705SXin LiGiven
3424*67e74705SXin Li  template&lt;typename T&gt; void A(T t) { }
3425*67e74705SXin Li  template&lt;&gt; void A(int N) { }
3426*67e74705SXin LifunctionDecl(isExplicitTemplateSpecialization())
3427*67e74705SXin Li  matches the specialization A&lt;int&gt;().
3428*67e74705SXin Li
3429*67e74705SXin LiUsable 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;
3430*67e74705SXin Li</pre></td></tr>
3431*67e74705SXin Li
3432*67e74705SXin Li
3433*67e74705SXin Li<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>
3434*67e74705SXin Li<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3435*67e74705SXin Limember variable template instantiations.
3436*67e74705SXin Li
3437*67e74705SXin LiGiven
3438*67e74705SXin Li  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3439*67e74705SXin Lior
3440*67e74705SXin Li  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3441*67e74705SXin LicxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3442*67e74705SXin Li  matches the template instantiation of X&lt;A&gt;.
3443*67e74705SXin Li
3444*67e74705SXin LiBut given
3445*67e74705SXin Li  template &lt;typename T&gt;  class X {}; class A {};
3446*67e74705SXin Li  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3447*67e74705SXin LicxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3448*67e74705SXin Li  does not match, as X&lt;A&gt; is an explicit template specialization.
3449*67e74705SXin Li
3450*67e74705SXin LiUsable 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;
3451*67e74705SXin Li</pre></td></tr>
3452*67e74705SXin Li
3453*67e74705SXin Li
3454*67e74705SXin Li<tr><td>Matcher&lt;internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;&gt;</td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
3455*67e74705SXin Li<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3456*67e74705SXin Litemplate instantiations.
3457*67e74705SXin Li
3458*67e74705SXin LiGiven
3459*67e74705SXin Li  template&lt;typename T&gt; void A(T t) { T i; }
3460*67e74705SXin Li  A(0);
3461*67e74705SXin Li  A(0U);
3462*67e74705SXin LifunctionDecl(isInstantiated())
3463*67e74705SXin Li  matches 'A(int) {...};' and 'A(unsigned) {...}'.
3464*67e74705SXin Li</pre></td></tr>
3465*67e74705SXin Li
3466*67e74705SXin Li
3467*67e74705SXin Li<tr><td>Matcher&lt;internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;&gt;</td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr>
3468*67e74705SXin Li<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3469*67e74705SXin LiGNU's __null, C++11's nullptr, or C's NULL macro.
3470*67e74705SXin Li
3471*67e74705SXin LiGiven:
3472*67e74705SXin Li  void *v1 = NULL;
3473*67e74705SXin Li  void *v2 = nullptr;
3474*67e74705SXin Li  void *v3 = __null; GNU extension
3475*67e74705SXin Li  char *cp = (char *)0;
3476*67e74705SXin Li  int *ip = 0;
3477*67e74705SXin Li  int i = 0;
3478*67e74705SXin Liexpr(nullPointerConstant())
3479*67e74705SXin Li  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3480*67e74705SXin Li  initializer for i.
3481*67e74705SXin Li</pre></td></tr>
3482*67e74705SXin Li
3483*67e74705SXin Li
3484*67e74705SXin Li<tr><td>Matcher&lt;internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;&gt;</td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr>
3485*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3486*67e74705SXin Li
3487*67e74705SXin LiThis matcher is only provided as a performance optimization of hasName.
3488*67e74705SXin Li    hasAnyName(a, b, c)
3489*67e74705SXin Li is equivalent to, but faster than
3490*67e74705SXin Li    anyOf(hasName(a), hasName(b), hasName(c))
3491*67e74705SXin Li</pre></td></tr>
3492*67e74705SXin Li
3493*67e74705SXin Li
3494*67e74705SXin Li<tr><td>Matcher&lt;internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;&gt;</td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr>
3495*67e74705SXin Li<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
3496*67e74705SXin Li
3497*67e74705SXin LiGiven
3498*67e74705SXin Li  int j;
3499*67e74705SXin Li  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
3500*67e74705SXin Li  A(0);
3501*67e74705SXin Li  A(0U);
3502*67e74705SXin LideclStmt(isInTemplateInstantiation())
3503*67e74705SXin Li  matches 'int i;' and 'unsigned i'.
3504*67e74705SXin Liunless(stmt(isInTemplateInstantiation()))
3505*67e74705SXin Li  will NOT match j += 42; as it's shared between the template definition and
3506*67e74705SXin Li  instantiation.
3507*67e74705SXin Li</pre></td></tr>
3508*67e74705SXin Li
3509*67e74705SXin Li<!--END_NARROWING_MATCHERS -->
3510*67e74705SXin Li</table>
3511*67e74705SXin Li
3512*67e74705SXin Li<!-- ======================================================================= -->
3513*67e74705SXin Li<h2 id="traversal-matchers">AST Traversal Matchers</h2>
3514*67e74705SXin Li<!-- ======================================================================= -->
3515*67e74705SXin Li
3516*67e74705SXin Li<p>Traversal matchers specify the relationship to other nodes that are
3517*67e74705SXin Lireachable from the current node.</p>
3518*67e74705SXin Li
3519*67e74705SXin Li<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
3520*67e74705SXin LiforEachDescendant) which work on all nodes and allow users to write more generic
3521*67e74705SXin Limatch expressions.</p>
3522*67e74705SXin Li
3523*67e74705SXin Li<table>
3524*67e74705SXin Li<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
3525*67e74705SXin Li<!-- START_TRAVERSAL_MATCHERS -->
3526*67e74705SXin Li
3527*67e74705SXin Li<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
3528*67e74705SXin Li<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
3529*67e74705SXin Li
3530*67e74705SXin LiUnlike anyOf, eachOf will generate a match result for each
3531*67e74705SXin Limatching submatcher.
3532*67e74705SXin Li
3533*67e74705SXin LiFor example, in:
3534*67e74705SXin Li  class A { int a; int b; };
3535*67e74705SXin LiThe matcher:
3536*67e74705SXin Li  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
3537*67e74705SXin Li                       has(fieldDecl(hasName("b")).bind("v"))))
3538*67e74705SXin Liwill generate two results binding "v", the first of which binds
3539*67e74705SXin Lithe field declaration of a, the second the field declaration of
3540*67e74705SXin Lib.
3541*67e74705SXin Li
3542*67e74705SXin LiUsable as: Any Matcher
3543*67e74705SXin Li</pre></td></tr>
3544*67e74705SXin Li
3545*67e74705SXin Li
3546*67e74705SXin Li<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3547*67e74705SXin Li<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3548*67e74705SXin Liprovided matcher.
3549*67e74705SXin Li
3550*67e74705SXin LiExample matches X, A, B, C
3551*67e74705SXin Li  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
3552*67e74705SXin Li  class X {};  Matches X, because X::X is a class of name X inside X.
3553*67e74705SXin Li  class A { class X {}; };
3554*67e74705SXin Li  class B { class C { class X {}; }; };
3555*67e74705SXin Li
3556*67e74705SXin LiDescendantT must be an AST base type.
3557*67e74705SXin Li
3558*67e74705SXin LiAs opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
3559*67e74705SXin Lieach result that matches instead of only on the first one.
3560*67e74705SXin Li
3561*67e74705SXin LiNote: Recursively combined ForEachDescendant can cause many matches:
3562*67e74705SXin Li  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
3563*67e74705SXin Li    forEachDescendant(cxxRecordDecl())
3564*67e74705SXin Li  )))
3565*67e74705SXin Liwill match 10 times (plus injected class name matches) on:
3566*67e74705SXin Li  class A { class B { class C { class D { class E {}; }; }; }; };
3567*67e74705SXin Li
3568*67e74705SXin LiUsable as: Any Matcher
3569*67e74705SXin Li</pre></td></tr>
3570*67e74705SXin Li
3571*67e74705SXin Li
3572*67e74705SXin Li<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
3573*67e74705SXin Li<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
3574*67e74705SXin Liprovided matcher.
3575*67e74705SXin Li
3576*67e74705SXin LiExample matches X, Y
3577*67e74705SXin Li  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
3578*67e74705SXin Li  class X {};  Matches X, because X::X is a class of name X inside X.
3579*67e74705SXin Li  class Y { class X {}; };
3580*67e74705SXin Li  class Z { class Y { class X {}; }; };  Does not match Z.
3581*67e74705SXin Li
3582*67e74705SXin LiChildT must be an AST base type.
3583*67e74705SXin Li
3584*67e74705SXin LiAs opposed to 'has', 'forEach' will cause a match for each result that
3585*67e74705SXin Limatches instead of only on the first one.
3586*67e74705SXin Li
3587*67e74705SXin LiUsable as: Any Matcher
3588*67e74705SXin Li</pre></td></tr>
3589*67e74705SXin Li
3590*67e74705SXin Li
3591*67e74705SXin Li<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
3592*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
3593*67e74705SXin Limatcher.
3594*67e74705SXin Li
3595*67e74705SXin LiGiven
3596*67e74705SXin Livoid f() { if (true) { int x = 42; } }
3597*67e74705SXin Livoid g() { for (;;) { int x = 43; } }
3598*67e74705SXin Liexpr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
3599*67e74705SXin Li
3600*67e74705SXin LiUsable as: Any Matcher
3601*67e74705SXin Li</pre></td></tr>
3602*67e74705SXin Li
3603*67e74705SXin Li
3604*67e74705SXin Li<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3605*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3606*67e74705SXin Liprovided matcher.
3607*67e74705SXin Li
3608*67e74705SXin LiExample matches X, Y, Z
3609*67e74705SXin Li    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
3610*67e74705SXin Li  class X {};  Matches X, because X::X is a class of name X inside X.
3611*67e74705SXin Li  class Y { class X {}; };
3612*67e74705SXin Li  class Z { class Y { class X {}; }; };
3613*67e74705SXin Li
3614*67e74705SXin LiDescendantT must be an AST base type.
3615*67e74705SXin Li
3616*67e74705SXin LiUsable as: Any Matcher
3617*67e74705SXin Li</pre></td></tr>
3618*67e74705SXin Li
3619*67e74705SXin Li
3620*67e74705SXin Li<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
3621*67e74705SXin Li<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
3622*67e74705SXin Liprovided matcher.
3623*67e74705SXin Li
3624*67e74705SXin LiExample matches X, Y
3625*67e74705SXin Li  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
3626*67e74705SXin Li  class X {};  Matches X, because X::X is a class of name X inside X.
3627*67e74705SXin Li  class Y { class X {}; };
3628*67e74705SXin Li  class Z { class Y { class X {}; }; };  Does not match Z.
3629*67e74705SXin Li
3630*67e74705SXin LiChildT must be an AST base type.
3631*67e74705SXin Li
3632*67e74705SXin LiUsable as: Any Matcher
3633*67e74705SXin LiNote that has is direct matcher, so it also matches things like implicit
3634*67e74705SXin Licasts and paren casts. If you are matching with expr then you should
3635*67e74705SXin Liprobably consider using ignoringParenImpCasts like:
3636*67e74705SXin Lihas(ignoringParenImpCasts(expr())).
3637*67e74705SXin Li</pre></td></tr>
3638*67e74705SXin Li
3639*67e74705SXin Li
3640*67e74705SXin Li<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
3641*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
3642*67e74705SXin Limatcher.
3643*67e74705SXin Li
3644*67e74705SXin LiGiven
3645*67e74705SXin Livoid f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
3646*67e74705SXin LicompoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
3647*67e74705SXin Li
3648*67e74705SXin LiUsable as: Any Matcher
3649*67e74705SXin Li</pre></td></tr>
3650*67e74705SXin Li
3651*67e74705SXin Li
3652*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasCondition5')"><a name="hasCondition5Anchor">hasCondition</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3653*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
3654*67e74705SXin Liswitch statement or conditional operator.
3655*67e74705SXin Li
3656*67e74705SXin LiExample matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
3657*67e74705SXin Li  if (true) {}
3658*67e74705SXin Li</pre></td></tr>
3659*67e74705SXin Li
3660*67e74705SXin Li
3661*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasFalseExpression0')"><a name="hasFalseExpression0Anchor">hasFalseExpression</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3662*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
3663*67e74705SXin Li(binary or ternary).
3664*67e74705SXin Li
3665*67e74705SXin LiExample matches b
3666*67e74705SXin Li  condition ? a : b
3667*67e74705SXin Li  condition ?: b
3668*67e74705SXin Li</pre></td></tr>
3669*67e74705SXin Li
3670*67e74705SXin Li
3671*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasTrueExpression0')"><a name="hasTrueExpression0Anchor">hasTrueExpression</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3672*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
3673*67e74705SXin Li
3674*67e74705SXin LiExample 1 (conditional ternary operator): matches a
3675*67e74705SXin Li  condition ? a : b
3676*67e74705SXin Li
3677*67e74705SXin LiExample 2 (conditional binary operator): matches opaqueValueExpr(condition)
3678*67e74705SXin Li  condition ?: b
3679*67e74705SXin Li</pre></td></tr>
3680*67e74705SXin Li
3681*67e74705SXin Li
3682*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
3683*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
3684*67e74705SXin Limatches the given matcher.
3685*67e74705SXin Li
3686*67e74705SXin LiThe associated declaration is:
3687*67e74705SXin Li- for type nodes, the declaration of the underlying type
3688*67e74705SXin Li- for CallExpr, the declaration of the callee
3689*67e74705SXin Li- for MemberExpr, the declaration of the referenced member
3690*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor
3691*67e74705SXin Li
3692*67e74705SXin LiAlso usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3693*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions.
3694*67e74705SXin Li
3695*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3696*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3697*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
3698*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3699*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3700*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3701*67e74705SXin Li</pre></td></tr>
3702*67e74705SXin Li
3703*67e74705SXin Li
3704*67e74705SXin Li<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>
3705*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
3706*67e74705SXin Li
3707*67e74705SXin LiGiven
3708*67e74705SXin Li  int i[5];
3709*67e74705SXin Li  void f() { i[1] = 42; }
3710*67e74705SXin LiarraySubscriptExpression(hasBase(implicitCastExpr(
3711*67e74705SXin Li    hasSourceExpression(declRefExpr()))))
3712*67e74705SXin Li  matches i[1] with the declRefExpr() matching i
3713*67e74705SXin Li</pre></td></tr>
3714*67e74705SXin Li
3715*67e74705SXin Li
3716*67e74705SXin Li<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>
3717*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
3718*67e74705SXin Li
3719*67e74705SXin LiGiven
3720*67e74705SXin Li  int i[5];
3721*67e74705SXin Li  void f() { i[1] = 42; }
3722*67e74705SXin LiarraySubscriptExpression(hasIndex(integerLiteral()))
3723*67e74705SXin Li  matches i[1] with the integerLiteral() matching 1
3724*67e74705SXin Li</pre></td></tr>
3725*67e74705SXin Li
3726*67e74705SXin Li
3727*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasLHS1')"><a name="hasLHS1Anchor">hasLHS</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3728*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
3729*67e74705SXin Li
3730*67e74705SXin LiExample matches a (matcher = binaryOperator(hasLHS()))
3731*67e74705SXin Li  a || b
3732*67e74705SXin Li</pre></td></tr>
3733*67e74705SXin Li
3734*67e74705SXin Li
3735*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasRHS1')"><a name="hasRHS1Anchor">hasRHS</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3736*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
3737*67e74705SXin Li
3738*67e74705SXin LiExample matches b (matcher = binaryOperator(hasRHS()))
3739*67e74705SXin Li  a || b
3740*67e74705SXin Li</pre></td></tr>
3741*67e74705SXin Li
3742*67e74705SXin Li
3743*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayTypeLoc.html">ArrayTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasElementTypeLoc0')"><a name="hasElementTypeLoc0Anchor">hasElementTypeLoc</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
3744*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
3745*67e74705SXin Litype.
3746*67e74705SXin Li
3747*67e74705SXin LiGiven
3748*67e74705SXin Li  struct A {};
3749*67e74705SXin Li  A a[7];
3750*67e74705SXin Li  int b[7];
3751*67e74705SXin LiarrayType(hasElementType(builtinType()))
3752*67e74705SXin Li  matches "int b[7]"
3753*67e74705SXin Li
3754*67e74705SXin LiUsable 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;
3755*67e74705SXin Li</pre></td></tr>
3756*67e74705SXin Li
3757*67e74705SXin Li
3758*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;</td><td class="name" onclick="toggle('hasElementType0')"><a name="hasElementType0Anchor">hasElementType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
3759*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
3760*67e74705SXin Litype.
3761*67e74705SXin Li
3762*67e74705SXin LiGiven
3763*67e74705SXin Li  struct A {};
3764*67e74705SXin Li  A a[7];
3765*67e74705SXin Li  int b[7];
3766*67e74705SXin LiarrayType(hasElementType(builtinType()))
3767*67e74705SXin Li  matches "int b[7]"
3768*67e74705SXin Li
3769*67e74705SXin LiUsable 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;
3770*67e74705SXin Li</pre></td></tr>
3771*67e74705SXin Li
3772*67e74705SXin Li
3773*67e74705SXin Li<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>
3774*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
3775*67e74705SXin Li
3776*67e74705SXin LiGiven
3777*67e74705SXin Li  _Atomic(int) i;
3778*67e74705SXin Li  _Atomic(float) f;
3779*67e74705SXin LiatomicType(hasValueType(isInteger()))
3780*67e74705SXin Li matches "_Atomic(int) i"
3781*67e74705SXin Li
3782*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
3783*67e74705SXin Li</pre></td></tr>
3784*67e74705SXin Li
3785*67e74705SXin Li
3786*67e74705SXin Li<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>
3787*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
3788*67e74705SXin Li
3789*67e74705SXin LiGiven
3790*67e74705SXin Li  _Atomic(int) i;
3791*67e74705SXin Li  _Atomic(float) f;
3792*67e74705SXin LiatomicType(hasValueType(isInteger()))
3793*67e74705SXin Li matches "_Atomic(int) i"
3794*67e74705SXin Li
3795*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
3796*67e74705SXin Li</pre></td></tr>
3797*67e74705SXin Li
3798*67e74705SXin Li
3799*67e74705SXin Li<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>
3800*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
3801*67e74705SXin Li
3802*67e74705SXin LiNote: There is no TypeLoc for the deduced type and thus no
3803*67e74705SXin LigetDeducedLoc() matcher.
3804*67e74705SXin Li
3805*67e74705SXin LiGiven
3806*67e74705SXin Li  auto a = 1;
3807*67e74705SXin Li  auto b = 2.0;
3808*67e74705SXin LiautoType(hasDeducedType(isInteger()))
3809*67e74705SXin Li  matches "auto a"
3810*67e74705SXin Li
3811*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
3812*67e74705SXin Li</pre></td></tr>
3813*67e74705SXin Li
3814*67e74705SXin Li
3815*67e74705SXin Li<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>
3816*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
3817*67e74705SXin Libinary operator matches.
3818*67e74705SXin Li</pre></td></tr>
3819*67e74705SXin Li
3820*67e74705SXin Li
3821*67e74705SXin Li<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>
3822*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
3823*67e74705SXin Li
3824*67e74705SXin LiExample matches a (matcher = binaryOperator(hasLHS()))
3825*67e74705SXin Li  a || b
3826*67e74705SXin Li</pre></td></tr>
3827*67e74705SXin Li
3828*67e74705SXin Li
3829*67e74705SXin Li<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>
3830*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
3831*67e74705SXin Li
3832*67e74705SXin LiExample matches b (matcher = binaryOperator(hasRHS()))
3833*67e74705SXin Li  a || b
3834*67e74705SXin Li</pre></td></tr>
3835*67e74705SXin Li
3836*67e74705SXin Li
3837*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerTypeLoc.html">BlockPointerTypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointeeLoc0')"><a name="pointeeLoc0Anchor">pointeeLoc</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
3838*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
3839*67e74705SXin Lipointee matches a given matcher.
3840*67e74705SXin Li
3841*67e74705SXin LiGiven
3842*67e74705SXin Li  int *a;
3843*67e74705SXin Li  int const *b;
3844*67e74705SXin Li  float const *f;
3845*67e74705SXin LipointerType(pointee(isConstQualified(), isInteger()))
3846*67e74705SXin Li  matches "int const *b"
3847*67e74705SXin Li
3848*67e74705SXin LiUsable 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;,
3849*67e74705SXin Li  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;
3850*67e74705SXin Li</pre></td></tr>
3851*67e74705SXin Li
3852*67e74705SXin Li
3853*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;</td><td class="name" onclick="toggle('pointee0')"><a name="pointee0Anchor">pointee</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
3854*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
3855*67e74705SXin Lipointee matches a given matcher.
3856*67e74705SXin Li
3857*67e74705SXin LiGiven
3858*67e74705SXin Li  int *a;
3859*67e74705SXin Li  int const *b;
3860*67e74705SXin Li  float const *f;
3861*67e74705SXin LipointerType(pointee(isConstQualified(), isInteger()))
3862*67e74705SXin Li  matches "int const *b"
3863*67e74705SXin Li
3864*67e74705SXin LiUsable 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;,
3865*67e74705SXin Li  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;
3866*67e74705SXin Li</pre></td></tr>
3867*67e74705SXin Li
3868*67e74705SXin Li
3869*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParam1')"><a name="forEachArgumentWithParam1Anchor">forEachArgumentWithParam</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; ParamMatcher</td></tr>
3870*67e74705SXin Li<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
3871*67e74705SXin Li
3872*67e74705SXin LiGiven
3873*67e74705SXin Li  void f(int i);
3874*67e74705SXin Li  int y;
3875*67e74705SXin Li  f(y);
3876*67e74705SXin LicallExpr(
3877*67e74705SXin Li  forEachArgumentWithParam(
3878*67e74705SXin Li    declRefExpr(to(varDecl(hasName("y")))),
3879*67e74705SXin Li    parmVarDecl(hasType(isInteger()))
3880*67e74705SXin Li))
3881*67e74705SXin Li  matches f(y);
3882*67e74705SXin Liwith declRefExpr(...)
3883*67e74705SXin Li  matching int y
3884*67e74705SXin Liand parmVarDecl(...)
3885*67e74705SXin Li  matching int i
3886*67e74705SXin Li</pre></td></tr>
3887*67e74705SXin Li
3888*67e74705SXin Li
3889*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument1')"><a name="hasAnyArgument1Anchor">hasAnyArgument</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3890*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
3891*67e74705SXin Liexpression.
3892*67e74705SXin Li
3893*67e74705SXin LiGiven
3894*67e74705SXin Li  void x(int, int, int) { int y; x(1, y, 42); }
3895*67e74705SXin LicallExpr(hasAnyArgument(declRefExpr()))
3896*67e74705SXin Li  matches x(1, y, 42)
3897*67e74705SXin Liwith hasAnyArgument(...)
3898*67e74705SXin Li  matching y
3899*67e74705SXin Li</pre></td></tr>
3900*67e74705SXin Li
3901*67e74705SXin Li
3902*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument1')"><a name="hasArgument1Anchor">hasArgument</a></td><td>unsigned N, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3903*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
3904*67e74705SXin Licall expression.
3905*67e74705SXin Li
3906*67e74705SXin LiExample matches y in x(y)
3907*67e74705SXin Li    (matcher = callExpr(hasArgument(0, declRefExpr())))
3908*67e74705SXin Li  void x(int) { int y; x(y); }
3909*67e74705SXin Li</pre></td></tr>
3910*67e74705SXin Li
3911*67e74705SXin Li
3912*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
3913*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
3914*67e74705SXin Limatches the given matcher.
3915*67e74705SXin Li
3916*67e74705SXin LiThe associated declaration is:
3917*67e74705SXin Li- for type nodes, the declaration of the underlying type
3918*67e74705SXin Li- for CallExpr, the declaration of the callee
3919*67e74705SXin Li- for MemberExpr, the declaration of the referenced member
3920*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor
3921*67e74705SXin Li
3922*67e74705SXin LiAlso usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3923*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions.
3924*67e74705SXin Li
3925*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3926*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3927*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
3928*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3929*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3930*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3931*67e74705SXin Li</pre></td></tr>
3932*67e74705SXin Li
3933*67e74705SXin Li
3934*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('forEachConstructorInitializer0')"><a name="forEachConstructorInitializer0Anchor">forEachConstructorInitializer</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt; InnerMatcher</td></tr>
3935*67e74705SXin Li<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
3936*67e74705SXin Li
3937*67e74705SXin LiGiven
3938*67e74705SXin Li  class A { A() : i(42), j(42) {} int i; int j; };
3939*67e74705SXin LicxxConstructorDecl(forEachConstructorInitializer(
3940*67e74705SXin Li  forField(decl().bind("x"))
3941*67e74705SXin Li))
3942*67e74705SXin Li  will trigger two matches, binding for 'i' and 'j' respectively.
3943*67e74705SXin Li</pre></td></tr>
3944*67e74705SXin Li
3945*67e74705SXin Li
3946*67e74705SXin Li<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>
3947*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
3948*67e74705SXin Li
3949*67e74705SXin LiGiven
3950*67e74705SXin Li  struct Foo {
3951*67e74705SXin Li    Foo() : foo_(1) { }
3952*67e74705SXin Li    int foo_;
3953*67e74705SXin Li  };
3954*67e74705SXin LicxxRecordDecl(has(cxxConstructorDecl(
3955*67e74705SXin Li  hasAnyConstructorInitializer(anything())
3956*67e74705SXin Li)))
3957*67e74705SXin Li  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
3958*67e74705SXin Li</pre></td></tr>
3959*67e74705SXin Li
3960*67e74705SXin Li
3961*67e74705SXin Li<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>
3962*67e74705SXin Li<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
3963*67e74705SXin Li
3964*67e74705SXin LiGiven
3965*67e74705SXin Li  struct Foo {
3966*67e74705SXin Li    Foo() : foo_(1) { }
3967*67e74705SXin Li    int foo_;
3968*67e74705SXin Li  };
3969*67e74705SXin LicxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
3970*67e74705SXin Li    forField(hasName("foo_"))))))
3971*67e74705SXin Li  matches Foo
3972*67e74705SXin Liwith forField matching foo_
3973*67e74705SXin Li</pre></td></tr>
3974*67e74705SXin Li
3975*67e74705SXin Li
3976*67e74705SXin Li<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>
3977*67e74705SXin Li<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
3978*67e74705SXin Li
3979*67e74705SXin LiGiven
3980*67e74705SXin Li  struct Foo {
3981*67e74705SXin Li    Foo() : foo_(1) { }
3982*67e74705SXin Li    int foo_;
3983*67e74705SXin Li  };
3984*67e74705SXin LicxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
3985*67e74705SXin Li    withInitializer(integerLiteral(equals(1)))))))
3986*67e74705SXin Li  matches Foo
3987*67e74705SXin Liwith withInitializer matching (1)
3988*67e74705SXin Li</pre></td></tr>
3989*67e74705SXin Li
3990*67e74705SXin Li
3991*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody3')"><a name="hasBody3Anchor">hasBody</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3992*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
3993*67e74705SXin Lidefinition that has a given body.
3994*67e74705SXin Li
3995*67e74705SXin LiGiven
3996*67e74705SXin Li  for (;;) {}
3997*67e74705SXin LihasBody(compoundStmt())
3998*67e74705SXin Li  matches 'for (;;) {}'
3999*67e74705SXin Liwith compoundStmt()
4000*67e74705SXin Li  matching '{}'
4001*67e74705SXin Li</pre></td></tr>
4002*67e74705SXin Li
4003*67e74705SXin Li
4004*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasLoopVariable0')"><a name="hasLoopVariable0Anchor">hasLoopVariable</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt; InnerMatcher</td></tr>
4005*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
4006*67e74705SXin Li
4007*67e74705SXin LiExample:
4008*67e74705SXin Li    forStmt(hasLoopVariable(anything()))
4009*67e74705SXin Limatches 'int x' in
4010*67e74705SXin Li    for (int x : a) { }
4011*67e74705SXin Li</pre></td></tr>
4012*67e74705SXin Li
4013*67e74705SXin Li
4014*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasRangeInit0')"><a name="hasRangeInit0Anchor">hasRangeInit</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4015*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
4016*67e74705SXin Li
4017*67e74705SXin LiExample:
4018*67e74705SXin Li    forStmt(hasRangeInit(anything()))
4019*67e74705SXin Limatches 'a' in
4020*67e74705SXin Li    for (int x : a) { }
4021*67e74705SXin Li</pre></td></tr>
4022*67e74705SXin Li
4023*67e74705SXin Li
4024*67e74705SXin Li<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>
4025*67e74705SXin Li<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
4026*67e74705SXin Li
4027*67e74705SXin Li
4028*67e74705SXin Li<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>
4029*67e74705SXin Li<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
4030*67e74705SXin Li
4031*67e74705SXin LiExample matches y.x()
4032*67e74705SXin Li  (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
4033*67e74705SXin Li  class Y { public: void x(); };
4034*67e74705SXin Li  void z() { Y y; y.x(); }",
4035*67e74705SXin Li
4036*67e74705SXin LiFIXME: Overload to allow directly matching types?
4037*67e74705SXin Li</pre></td></tr>
4038*67e74705SXin Li
4039*67e74705SXin Li
4040*67e74705SXin Li<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>
4041*67e74705SXin Li<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
4042*67e74705SXin Li</pre></td></tr>
4043*67e74705SXin Li
4044*67e74705SXin Li
4045*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('thisPointerType0')"><a name="thisPointerType0Anchor">thisPointerType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
4046*67e74705SXin Li<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
4047*67e74705SXin Limatcher, or is a pointer to a type that matches the InnerMatcher.
4048*67e74705SXin Li</pre></td></tr>
4049*67e74705SXin Li
4050*67e74705SXin Li
4051*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('forEachOverridden0')"><a name="forEachOverridden0Anchor">forEachOverridden</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt; InnerMatcher</td></tr>
4052*67e74705SXin Li<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overriden by the given method. This matcher may
4053*67e74705SXin Liproduce multiple matches.
4054*67e74705SXin Li
4055*67e74705SXin LiGiven
4056*67e74705SXin Li  class A { virtual void f(); };
4057*67e74705SXin Li  class B : public A { void f(); };
4058*67e74705SXin Li  class C : public B { void f(); };
4059*67e74705SXin LicxxMethodDecl(ofClass(hasName("C")),
4060*67e74705SXin Li              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4061*67e74705SXin Li  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
4062*67e74705SXin Li  that B::f is not overridden by C::f).
4063*67e74705SXin Li
4064*67e74705SXin LiThe check can produce multiple matches in case of multiple inheritance, e.g.
4065*67e74705SXin Li  class A1 { virtual void f(); };
4066*67e74705SXin Li  class A2 { virtual void f(); };
4067*67e74705SXin Li  class C : public A1, public A2 { void f(); };
4068*67e74705SXin LicxxMethodDecl(ofClass(hasName("C")),
4069*67e74705SXin Li              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
4070*67e74705SXin Li  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
4071*67e74705SXin Li  once with "b" binding "A2::f" and "d" binding "C::f".
4072*67e74705SXin Li</pre></td></tr>
4073*67e74705SXin Li
4074*67e74705SXin Li
4075*67e74705SXin Li<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>
4076*67e74705SXin Li<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
4077*67e74705SXin Libelongs to.
4078*67e74705SXin Li
4079*67e74705SXin LiFIXME: Generalize this for other kinds of declarations.
4080*67e74705SXin LiFIXME: What other kind of declarations would we need to generalize
4081*67e74705SXin Lithis to?
4082*67e74705SXin Li
4083*67e74705SXin LiExample matches A() in the last line
4084*67e74705SXin Li    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
4085*67e74705SXin Li        ofClass(hasName("A"))))))
4086*67e74705SXin Li  class A {
4087*67e74705SXin Li   public:
4088*67e74705SXin Li    A();
4089*67e74705SXin Li  };
4090*67e74705SXin Li  A a = A();
4091*67e74705SXin Li</pre></td></tr>
4092*67e74705SXin Li
4093*67e74705SXin Li
4094*67e74705SXin Li<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>
4095*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
4096*67e74705SXin Li
4097*67e74705SXin LiGiven:
4098*67e74705SXin Li  class A { void func(); };
4099*67e74705SXin Li  class B { void member(); };
4100*67e74705SXin Li
4101*67e74705SXin LicxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
4102*67e74705SXin LiA but not B.
4103*67e74705SXin Li</pre></td></tr>
4104*67e74705SXin Li
4105*67e74705SXin Li
4106*67e74705SXin Li<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>
4107*67e74705SXin Li<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
4108*67e74705SXin Lia class matching Base.
4109*67e74705SXin Li
4110*67e74705SXin LiNote that a class is not considered to be derived from itself.
4111*67e74705SXin Li
4112*67e74705SXin LiExample matches Y, Z, C (Base == hasName("X"))
4113*67e74705SXin Li  class X;
4114*67e74705SXin Li  class Y : public X {};  directly derived
4115*67e74705SXin Li  class Z : public Y {};  indirectly derived
4116*67e74705SXin Li  typedef X A;
4117*67e74705SXin Li  typedef A B;
4118*67e74705SXin Li  class C : public B {};  derived from a typedef of X
4119*67e74705SXin Li
4120*67e74705SXin LiIn the following example, Bar matches isDerivedFrom(hasName("X")):
4121*67e74705SXin Li  class Foo;
4122*67e74705SXin Li  typedef Foo X;
4123*67e74705SXin Li  class Bar : public Foo {};  derived from a type that X is a typedef of
4124*67e74705SXin Li</pre></td></tr>
4125*67e74705SXin Li
4126*67e74705SXin Li
4127*67e74705SXin Li<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>
4128*67e74705SXin Li<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
4129*67e74705SXin Limatch Base.
4130*67e74705SXin Li</pre></td></tr>
4131*67e74705SXin Li
4132*67e74705SXin Li
4133*67e74705SXin Li<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>
4134*67e74705SXin Li<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
4135*67e74705SXin Ligiven matcher.
4136*67e74705SXin Li
4137*67e74705SXin LiExample matches y.x() (matcher = callExpr(callee(
4138*67e74705SXin Li                                   cxxMethodDecl(hasName("x")))))
4139*67e74705SXin Li  class Y { public: void x(); };
4140*67e74705SXin Li  void z() { Y y; y.x(); }
4141*67e74705SXin Li</pre></td></tr>
4142*67e74705SXin Li
4143*67e74705SXin Li
4144*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('callee0')"><a name="callee0Anchor">callee</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
4145*67e74705SXin Li<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
4146*67e74705SXin Li
4147*67e74705SXin LiGiven
4148*67e74705SXin Li  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
4149*67e74705SXin Li  void f() { f(); }
4150*67e74705SXin LicallExpr(callee(expr()))
4151*67e74705SXin Li  matches this-&gt;x(), x(), y.x(), f()
4152*67e74705SXin Liwith callee(...)
4153*67e74705SXin Li  matching this-&gt;x, x, y.x, f respectively
4154*67e74705SXin Li
4155*67e74705SXin LiNote: Callee cannot take the more general internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
4156*67e74705SXin Libecause this introduces ambiguous overloads with calls to Callee taking a
4157*67e74705SXin Liinternal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
4158*67e74705SXin Liimplemented in terms of implicit casts.
4159*67e74705SXin Li</pre></td></tr>
4160*67e74705SXin Li
4161*67e74705SXin Li
4162*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParam0')"><a name="forEachArgumentWithParam0Anchor">forEachArgumentWithParam</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; ParamMatcher</td></tr>
4163*67e74705SXin Li<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
4164*67e74705SXin Li
4165*67e74705SXin LiGiven
4166*67e74705SXin Li  void f(int i);
4167*67e74705SXin Li  int y;
4168*67e74705SXin Li  f(y);
4169*67e74705SXin LicallExpr(
4170*67e74705SXin Li  forEachArgumentWithParam(
4171*67e74705SXin Li    declRefExpr(to(varDecl(hasName("y")))),
4172*67e74705SXin Li    parmVarDecl(hasType(isInteger()))
4173*67e74705SXin Li))
4174*67e74705SXin Li  matches f(y);
4175*67e74705SXin Liwith declRefExpr(...)
4176*67e74705SXin Li  matching int y
4177*67e74705SXin Liand parmVarDecl(...)
4178*67e74705SXin Li  matching int i
4179*67e74705SXin Li</pre></td></tr>
4180*67e74705SXin Li
4181*67e74705SXin Li
4182*67e74705SXin Li<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>
4183*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
4184*67e74705SXin Liexpression.
4185*67e74705SXin Li
4186*67e74705SXin LiGiven
4187*67e74705SXin Li  void x(int, int, int) { int y; x(1, y, 42); }
4188*67e74705SXin LicallExpr(hasAnyArgument(declRefExpr()))
4189*67e74705SXin Li  matches x(1, y, 42)
4190*67e74705SXin Liwith hasAnyArgument(...)
4191*67e74705SXin Li  matching y
4192*67e74705SXin Li</pre></td></tr>
4193*67e74705SXin Li
4194*67e74705SXin Li
4195*67e74705SXin Li<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>
4196*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
4197*67e74705SXin Licall expression.
4198*67e74705SXin Li
4199*67e74705SXin LiExample matches y in x(y)
4200*67e74705SXin Li    (matcher = callExpr(hasArgument(0, declRefExpr())))
4201*67e74705SXin Li  void x(int) { int y; x(y); }
4202*67e74705SXin Li</pre></td></tr>
4203*67e74705SXin Li
4204*67e74705SXin Li
4205*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
4206*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
4207*67e74705SXin Limatches the given matcher.
4208*67e74705SXin Li
4209*67e74705SXin LiThe associated declaration is:
4210*67e74705SXin Li- for type nodes, the declaration of the underlying type
4211*67e74705SXin Li- for CallExpr, the declaration of the callee
4212*67e74705SXin Li- for MemberExpr, the declaration of the referenced member
4213*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor
4214*67e74705SXin Li
4215*67e74705SXin LiAlso usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4216*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions.
4217*67e74705SXin Li
4218*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
4219*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
4220*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
4221*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
4222*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4223*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4224*67e74705SXin Li</pre></td></tr>
4225*67e74705SXin Li
4226*67e74705SXin Li
4227*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;</td><td class="name" onclick="toggle('hasCaseConstant0')"><a name="hasCaseConstant0Anchor">hasCaseConstant</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4228*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
4229*67e74705SXin Liextension, matches the constant given in the statement.
4230*67e74705SXin Li
4231*67e74705SXin LiGiven
4232*67e74705SXin Li  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
4233*67e74705SXin LicaseStmt(hasCaseConstant(integerLiteral()))
4234*67e74705SXin Li  matches "case 1:"
4235*67e74705SXin Li</pre></td></tr>
4236*67e74705SXin Li
4237*67e74705SXin Li
4238*67e74705SXin Li<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>
4239*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre></pre></td></tr>
4240*67e74705SXin Li
4241*67e74705SXin Li
4242*67e74705SXin Li<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>
4243*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
4244*67e74705SXin LiTemplateArgument matching the given InnerMatcher.
4245*67e74705SXin Li
4246*67e74705SXin LiGiven
4247*67e74705SXin Li  template&lt;typename T&gt; class A {};
4248*67e74705SXin Li  template&lt;&gt; class A&lt;double&gt; {};
4249*67e74705SXin Li  A&lt;int&gt; a;
4250*67e74705SXin LiclassTemplateSpecializationDecl(hasAnyTemplateArgument(
4251*67e74705SXin Li    refersToType(asString("int"))))
4252*67e74705SXin Li  matches the specialization A&lt;int&gt;
4253*67e74705SXin Li</pre></td></tr>
4254*67e74705SXin Li
4255*67e74705SXin Li
4256*67e74705SXin Li<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>
4257*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
4258*67e74705SXin Limatches the given InnerMatcher.
4259*67e74705SXin Li
4260*67e74705SXin LiGiven
4261*67e74705SXin Li  template&lt;typename T, typename U&gt; class A {};
4262*67e74705SXin Li  A&lt;bool, int&gt; b;
4263*67e74705SXin Li  A&lt;int, bool&gt; c;
4264*67e74705SXin LiclassTemplateSpecializationDecl(hasTemplateArgument(
4265*67e74705SXin Li    1, refersToType(asString("int"))))
4266*67e74705SXin Li  matches the specialization A&lt;bool, int&gt;
4267*67e74705SXin Li</pre></td></tr>
4268*67e74705SXin Li
4269*67e74705SXin Li
4270*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexTypeLoc.html">ComplexTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasElementTypeLoc1')"><a name="hasElementTypeLoc1Anchor">hasElementTypeLoc</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
4271*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
4272*67e74705SXin Litype.
4273*67e74705SXin Li
4274*67e74705SXin LiGiven
4275*67e74705SXin Li  struct A {};
4276*67e74705SXin Li  A a[7];
4277*67e74705SXin Li  int b[7];
4278*67e74705SXin LiarrayType(hasElementType(builtinType()))
4279*67e74705SXin Li  matches "int b[7]"
4280*67e74705SXin Li
4281*67e74705SXin LiUsable 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;
4282*67e74705SXin Li</pre></td></tr>
4283*67e74705SXin Li
4284*67e74705SXin Li
4285*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;</td><td class="name" onclick="toggle('hasElementType1')"><a name="hasElementType1Anchor">hasElementType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
4286*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
4287*67e74705SXin Litype.
4288*67e74705SXin Li
4289*67e74705SXin LiGiven
4290*67e74705SXin Li  struct A {};
4291*67e74705SXin Li  A a[7];
4292*67e74705SXin Li  int b[7];
4293*67e74705SXin LiarrayType(hasElementType(builtinType()))
4294*67e74705SXin Li  matches "int b[7]"
4295*67e74705SXin Li
4296*67e74705SXin LiUsable 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;
4297*67e74705SXin Li</pre></td></tr>
4298*67e74705SXin Li
4299*67e74705SXin Li
4300*67e74705SXin Li<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>
4301*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
4302*67e74705SXin Lia given matcher. Also matches StmtExprs that have CompoundStmt as children.
4303*67e74705SXin Li
4304*67e74705SXin LiGiven
4305*67e74705SXin Li  { {}; 1+2; }
4306*67e74705SXin LihasAnySubstatement(compoundStmt())
4307*67e74705SXin Li  matches '{ {}; 1+2; }'
4308*67e74705SXin Liwith compoundStmt()
4309*67e74705SXin Li  matching '{}'
4310*67e74705SXin Li</pre></td></tr>
4311*67e74705SXin Li
4312*67e74705SXin Li
4313*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;</td><td class="name" onclick="toggle('hasDecayedType0')"><a name="hasDecayedType0Anchor">hasDecayedType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerType</td></tr>
4314*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
4315*67e74705SXin Li</pre></td></tr>
4316*67e74705SXin Li
4317*67e74705SXin Li
4318*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
4319*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
4320*67e74705SXin Limatches the given matcher.
4321*67e74705SXin Li
4322*67e74705SXin LiThe associated declaration is:
4323*67e74705SXin Li- for type nodes, the declaration of the underlying type
4324*67e74705SXin Li- for CallExpr, the declaration of the callee
4325*67e74705SXin Li- for MemberExpr, the declaration of the referenced member
4326*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor
4327*67e74705SXin Li
4328*67e74705SXin LiAlso usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4329*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions.
4330*67e74705SXin Li
4331*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
4332*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
4333*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
4334*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
4335*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4336*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4337*67e74705SXin Li</pre></td></tr>
4338*67e74705SXin Li
4339*67e74705SXin Li
4340*67e74705SXin Li<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>
4341*67e74705SXin Li<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
4342*67e74705SXin Lispecific using shadow declaration.
4343*67e74705SXin Li
4344*67e74705SXin LiGiven
4345*67e74705SXin Li  namespace a { void f() {} }
4346*67e74705SXin Li  using a::f;
4347*67e74705SXin Li  void g() {
4348*67e74705SXin Li    f();     Matches this ..
4349*67e74705SXin Li    a::f();  .. but not this.
4350*67e74705SXin Li  }
4351*67e74705SXin LideclRefExpr(throughUsingDecl(anything()))
4352*67e74705SXin Li  matches f()
4353*67e74705SXin Li</pre></td></tr>
4354*67e74705SXin Li
4355*67e74705SXin Li
4356*67e74705SXin Li<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>
4357*67e74705SXin Li<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
4358*67e74705SXin Lispecified matcher.
4359*67e74705SXin Li
4360*67e74705SXin LiExample matches x in if(x)
4361*67e74705SXin Li    (matcher = declRefExpr(to(varDecl(hasName("x")))))
4362*67e74705SXin Li  bool x;
4363*67e74705SXin Li  if (x) {}
4364*67e74705SXin Li</pre></td></tr>
4365*67e74705SXin Li
4366*67e74705SXin Li
4367*67e74705SXin Li<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>
4368*67e74705SXin Li<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
4369*67e74705SXin Li
4370*67e74705SXin LiNote that this does not work for global declarations because the AST
4371*67e74705SXin Libreaks up multiple-declaration DeclStmt's into multiple single-declaration
4372*67e74705SXin LiDeclStmt's.
4373*67e74705SXin LiExample: Given non-global declarations
4374*67e74705SXin Li  int a, b = 0;
4375*67e74705SXin Li  int c;
4376*67e74705SXin Li  int d = 2, e;
4377*67e74705SXin LideclStmt(containsDeclaration(
4378*67e74705SXin Li      0, varDecl(hasInitializer(anything()))))
4379*67e74705SXin Li  matches only 'int d = 2, e;', and
4380*67e74705SXin LideclStmt(containsDeclaration(1, varDecl()))
4381*67e74705SXin Li  matches 'int a, b = 0' as well as 'int d = 2, e;'
4382*67e74705SXin Li  but 'int c;' is not matched.
4383*67e74705SXin Li</pre></td></tr>
4384*67e74705SXin Li
4385*67e74705SXin Li
4386*67e74705SXin Li<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>
4387*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
4388*67e74705SXin Li
4389*67e74705SXin LiGiven
4390*67e74705SXin Li  int a, b;
4391*67e74705SXin Li  int c;
4392*67e74705SXin LideclStmt(hasSingleDecl(anything()))
4393*67e74705SXin Li  matches 'int c;' but not 'int a, b;'.
4394*67e74705SXin Li</pre></td></tr>
4395*67e74705SXin Li
4396*67e74705SXin Li
4397*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc0')"><a name="hasTypeLoc0Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
4398*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
4399*67e74705SXin Lithe inner matcher.
4400*67e74705SXin Li
4401*67e74705SXin LiGiven
4402*67e74705SXin Li  int x;
4403*67e74705SXin LideclaratorDecl(hasTypeLoc(loc(asString("int"))))
4404*67e74705SXin Li  matches int x
4405*67e74705SXin Li</pre></td></tr>
4406*67e74705SXin Li
4407*67e74705SXin Li
4408*67e74705SXin Li<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>
4409*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
4410*67e74705SXin LiDecl, matches InnerMatcher.
4411*67e74705SXin Li
4412*67e74705SXin LiGiven
4413*67e74705SXin Li  namespace N {
4414*67e74705SXin Li    namespace M {
4415*67e74705SXin Li      class D {};
4416*67e74705SXin Li    }
4417*67e74705SXin Li  }
4418*67e74705SXin Li
4419*67e74705SXin LicxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
4420*67e74705SXin Lideclaration of class D.
4421*67e74705SXin Li</pre></td></tr>
4422*67e74705SXin Li
4423*67e74705SXin Li
4424*67e74705SXin Li<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>
4425*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
4426*67e74705SXin Lidefinition that has a given body.
4427*67e74705SXin Li
4428*67e74705SXin LiGiven
4429*67e74705SXin Li  for (;;) {}
4430*67e74705SXin LihasBody(compoundStmt())
4431*67e74705SXin Li  matches 'for (;;) {}'
4432*67e74705SXin Liwith compoundStmt()
4433*67e74705SXin Li  matching '{}'
4434*67e74705SXin Li</pre></td></tr>
4435*67e74705SXin Li
4436*67e74705SXin Li
4437*67e74705SXin Li<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>
4438*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
4439*67e74705SXin Liswitch statement or conditional operator.
4440*67e74705SXin Li
4441*67e74705SXin LiExample matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4442*67e74705SXin Li  if (true) {}
4443*67e74705SXin Li</pre></td></tr>
4444*67e74705SXin Li
4445*67e74705SXin Li
4446*67e74705SXin Li<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>
4447*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
4448*67e74705SXin Limatches InnerMatcher if the qualifier exists.
4449*67e74705SXin Li
4450*67e74705SXin LiGiven
4451*67e74705SXin Li  namespace N {
4452*67e74705SXin Li    namespace M {
4453*67e74705SXin Li      class D {};
4454*67e74705SXin Li    }
4455*67e74705SXin Li  }
4456*67e74705SXin Li  N::M::D d;
4457*67e74705SXin Li
4458*67e74705SXin LielaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
4459*67e74705SXin Limatches the type of the variable declaration of d.
4460*67e74705SXin Li</pre></td></tr>
4461*67e74705SXin Li
4462*67e74705SXin Li
4463*67e74705SXin Li<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>
4464*67e74705SXin Li<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
4465*67e74705SXin Li
4466*67e74705SXin LiGiven
4467*67e74705SXin Li  namespace N {
4468*67e74705SXin Li    namespace M {
4469*67e74705SXin Li      class D {};
4470*67e74705SXin Li    }
4471*67e74705SXin Li  }
4472*67e74705SXin Li  N::M::D d;
4473*67e74705SXin Li
4474*67e74705SXin LielaboratedType(namesType(recordType(
4475*67e74705SXin LihasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
4476*67e74705SXin Lideclaration of d.
4477*67e74705SXin Li</pre></td></tr>
4478*67e74705SXin Li
4479*67e74705SXin Li
4480*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
4481*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
4482*67e74705SXin Limatches the given matcher.
4483*67e74705SXin Li
4484*67e74705SXin LiThe associated declaration is:
4485*67e74705SXin Li- for type nodes, the declaration of the underlying type
4486*67e74705SXin Li- for CallExpr, the declaration of the callee
4487*67e74705SXin Li- for MemberExpr, the declaration of the referenced member
4488*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor
4489*67e74705SXin Li
4490*67e74705SXin LiAlso usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4491*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions.
4492*67e74705SXin Li
4493*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
4494*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
4495*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
4496*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
4497*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4498*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4499*67e74705SXin Li</pre></td></tr>
4500*67e74705SXin Li
4501*67e74705SXin Li
4502*67e74705SXin Li<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>
4503*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
4504*67e74705SXin Li
4505*67e74705SXin Li(Note: Clang's AST refers to other conversions as "casts" too, and calls
4506*67e74705SXin Liactual casts "explicit" casts.)
4507*67e74705SXin Li</pre></td></tr>
4508*67e74705SXin Li
4509*67e74705SXin Li
4510*67e74705SXin Li<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>
4511*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
4512*67e74705SXin Lideclaration's type.
4513*67e74705SXin Li
4514*67e74705SXin LiIn case of a value declaration (for example a variable declaration),
4515*67e74705SXin Lithis resolves one layer of indirection. For example, in the value
4516*67e74705SXin Lideclaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
4517*67e74705SXin LiX, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
4518*67e74705SXin Lideclaration of x.
4519*67e74705SXin Li
4520*67e74705SXin LiExample matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4521*67e74705SXin Li            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4522*67e74705SXin Li class X {};
4523*67e74705SXin Li void y(X &amp;x) { x; X z; }
4524*67e74705SXin Li
4525*67e74705SXin LiUsable 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;
4526*67e74705SXin Li</pre></td></tr>
4527*67e74705SXin Li
4528*67e74705SXin Li
4529*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('hasType0')"><a name="hasType0Anchor">hasType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
4530*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
4531*67e74705SXin Limatcher.
4532*67e74705SXin Li
4533*67e74705SXin LiExample matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4534*67e74705SXin Li            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4535*67e74705SXin Li            and U (matcher = typedefDecl(hasType(asString("int")))
4536*67e74705SXin Li class X {};
4537*67e74705SXin Li void y(X &amp;x) { x; X z; }
4538*67e74705SXin Li typedef int U;
4539*67e74705SXin Li</pre></td></tr>
4540*67e74705SXin Li
4541*67e74705SXin Li
4542*67e74705SXin Li<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>
4543*67e74705SXin Li<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
4544*67e74705SXin Liare stripped off.
4545*67e74705SXin Li
4546*67e74705SXin LiParentheses and explicit casts are not discarded.
4547*67e74705SXin LiGiven
4548*67e74705SXin Li  int arr[5];
4549*67e74705SXin Li  int a = 0;
4550*67e74705SXin Li  char b = 0;
4551*67e74705SXin Li  const int c = a;
4552*67e74705SXin Li  int *d = arr;
4553*67e74705SXin Li  long e = (long) 0l;
4554*67e74705SXin LiThe matchers
4555*67e74705SXin Li   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
4556*67e74705SXin Li   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
4557*67e74705SXin Liwould match the declarations for a, b, c, and d, but not e.
4558*67e74705SXin LiWhile
4559*67e74705SXin Li   varDecl(hasInitializer(integerLiteral()))
4560*67e74705SXin Li   varDecl(hasInitializer(declRefExpr()))
4561*67e74705SXin Lionly match the declarations for b, c, and d.
4562*67e74705SXin Li</pre></td></tr>
4563*67e74705SXin Li
4564*67e74705SXin Li
4565*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringImplicit0')"><a name="ignoringImplicit0Anchor">ignoringImplicit</a></td><td>ast_matchers::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4566*67e74705SXin Li<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
4567*67e74705SXin Linodes are stripped off.
4568*67e74705SXin Li
4569*67e74705SXin LiParentheses and explicit casts are not discarded.
4570*67e74705SXin LiGiven
4571*67e74705SXin Li  class C {};
4572*67e74705SXin Li  C a = C();
4573*67e74705SXin Li  C b;
4574*67e74705SXin Li  C c = b;
4575*67e74705SXin LiThe matchers
4576*67e74705SXin Li   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
4577*67e74705SXin Liwould match the declarations for a, b, and c.
4578*67e74705SXin LiWhile
4579*67e74705SXin Li   varDecl(hasInitializer(cxxConstructExpr()))
4580*67e74705SXin Lionly match the declarations for b and c.
4581*67e74705SXin Li</pre></td></tr>
4582*67e74705SXin Li
4583*67e74705SXin Li
4584*67e74705SXin Li<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>
4585*67e74705SXin Li<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
4586*67e74705SXin Licasts are stripped off.
4587*67e74705SXin Li
4588*67e74705SXin LiImplicit and non-C Style casts are also discarded.
4589*67e74705SXin LiGiven
4590*67e74705SXin Li  int a = 0;
4591*67e74705SXin Li  char b = (0);
4592*67e74705SXin Li  void* c = reinterpret_cast&lt;char*&gt;(0);
4593*67e74705SXin Li  char d = char(0);
4594*67e74705SXin LiThe matcher
4595*67e74705SXin Li   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
4596*67e74705SXin Liwould match the declarations for a, b, c, and d.
4597*67e74705SXin Liwhile
4598*67e74705SXin Li   varDecl(hasInitializer(integerLiteral()))
4599*67e74705SXin Lionly match the declaration for a.
4600*67e74705SXin Li</pre></td></tr>
4601*67e74705SXin Li
4602*67e74705SXin Li
4603*67e74705SXin Li<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>
4604*67e74705SXin Li<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
4605*67e74705SXin Liparentheses are stripped off.
4606*67e74705SXin Li
4607*67e74705SXin LiExplicit casts are not discarded.
4608*67e74705SXin LiGiven
4609*67e74705SXin Li  int arr[5];
4610*67e74705SXin Li  int a = 0;
4611*67e74705SXin Li  char b = (0);
4612*67e74705SXin Li  const int c = a;
4613*67e74705SXin Li  int *d = (arr);
4614*67e74705SXin Li  long e = ((long) 0l);
4615*67e74705SXin LiThe matchers
4616*67e74705SXin Li   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
4617*67e74705SXin Li   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
4618*67e74705SXin Liwould match the declarations for a, b, c, and d, but not e.
4619*67e74705SXin Liwhile
4620*67e74705SXin Li   varDecl(hasInitializer(integerLiteral()))
4621*67e74705SXin Li   varDecl(hasInitializer(declRefExpr()))
4622*67e74705SXin Liwould only match the declaration for a.
4623*67e74705SXin Li</pre></td></tr>
4624*67e74705SXin Li
4625*67e74705SXin Li
4626*67e74705SXin Li<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>
4627*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
4628*67e74705SXin Lidefinition that has a given body.
4629*67e74705SXin Li
4630*67e74705SXin LiGiven
4631*67e74705SXin Li  for (;;) {}
4632*67e74705SXin LihasBody(compoundStmt())
4633*67e74705SXin Li  matches 'for (;;) {}'
4634*67e74705SXin Liwith compoundStmt()
4635*67e74705SXin Li  matching '{}'
4636*67e74705SXin Li</pre></td></tr>
4637*67e74705SXin Li
4638*67e74705SXin Li
4639*67e74705SXin Li<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>
4640*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
4641*67e74705SXin Liswitch statement or conditional operator.
4642*67e74705SXin Li
4643*67e74705SXin LiExample matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4644*67e74705SXin Li  if (true) {}
4645*67e74705SXin Li</pre></td></tr>
4646*67e74705SXin Li
4647*67e74705SXin Li
4648*67e74705SXin Li<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>
4649*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
4650*67e74705SXin Li
4651*67e74705SXin LiExample:
4652*67e74705SXin Li    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
4653*67e74705SXin Limatches '++x' in
4654*67e74705SXin Li    for (x; x &lt; N; ++x) { }
4655*67e74705SXin Li</pre></td></tr>
4656*67e74705SXin Li
4657*67e74705SXin Li
4658*67e74705SXin Li<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>
4659*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
4660*67e74705SXin Li
4661*67e74705SXin LiExample:
4662*67e74705SXin Li    forStmt(hasLoopInit(declStmt()))
4663*67e74705SXin Limatches 'int x = 0' in
4664*67e74705SXin Li    for (int x = 0; x &lt; N; ++x) { }
4665*67e74705SXin Li</pre></td></tr>
4666*67e74705SXin Li
4667*67e74705SXin Li
4668*67e74705SXin Li<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>
4669*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
4670*67e74705SXin Li
4671*67e74705SXin LiDoes not match the 'this' parameter of a method.
4672*67e74705SXin Li
4673*67e74705SXin LiGiven
4674*67e74705SXin Li  class X { void f(int x, int y, int z) {} };
4675*67e74705SXin LicxxMethodDecl(hasAnyParameter(hasName("y")))
4676*67e74705SXin Li  matches f(int x, int y, int z) {}
4677*67e74705SXin Liwith hasAnyParameter(...)
4678*67e74705SXin Li  matching int y
4679*67e74705SXin Li</pre></td></tr>
4680*67e74705SXin Li
4681*67e74705SXin Li
4682*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasBody4')"><a name="hasBody4Anchor">hasBody</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
4683*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
4684*67e74705SXin Lidefinition that has a given body.
4685*67e74705SXin Li
4686*67e74705SXin LiGiven
4687*67e74705SXin Li  for (;;) {}
4688*67e74705SXin LihasBody(compoundStmt())
4689*67e74705SXin Li  matches 'for (;;) {}'
4690*67e74705SXin Liwith compoundStmt()
4691*67e74705SXin Li  matching '{}'
4692*67e74705SXin Li</pre></td></tr>
4693*67e74705SXin Li
4694*67e74705SXin Li
4695*67e74705SXin Li<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>
4696*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
4697*67e74705SXin Li
4698*67e74705SXin LiGiven
4699*67e74705SXin Li  class X { void f(int x) {} };
4700*67e74705SXin LicxxMethodDecl(hasParameter(0, hasType(varDecl())))
4701*67e74705SXin Li  matches f(int x) {}
4702*67e74705SXin Liwith hasParameter(...)
4703*67e74705SXin Li  matching int x
4704*67e74705SXin Li</pre></td></tr>
4705*67e74705SXin Li
4706*67e74705SXin Li
4707*67e74705SXin Li<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>
4708*67e74705SXin Li<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
4709*67e74705SXin Li
4710*67e74705SXin LiGiven:
4711*67e74705SXin Li  class X { int f() { return 1; } };
4712*67e74705SXin LicxxMethodDecl(returns(asString("int")))
4713*67e74705SXin Li  matches int f() { return 1; }
4714*67e74705SXin Li</pre></td></tr>
4715*67e74705SXin Li
4716*67e74705SXin Li
4717*67e74705SXin Li<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>
4718*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
4719*67e74705SXin Liswitch statement or conditional operator.
4720*67e74705SXin Li
4721*67e74705SXin LiExample matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4722*67e74705SXin Li  if (true) {}
4723*67e74705SXin Li</pre></td></tr>
4724*67e74705SXin Li
4725*67e74705SXin Li
4726*67e74705SXin Li<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>
4727*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
4728*67e74705SXin Li
4729*67e74705SXin LiGiven
4730*67e74705SXin Li  if (A* a = GetAPointer()) {}
4731*67e74705SXin LihasConditionVariableStatement(...)
4732*67e74705SXin Li  matches 'A* a = GetAPointer()'.
4733*67e74705SXin Li</pre></td></tr>
4734*67e74705SXin Li
4735*67e74705SXin Li
4736*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasElse0')"><a name="hasElse0Anchor">hasElse</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
4737*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
4738*67e74705SXin Li
4739*67e74705SXin LiExamples matches the if statement
4740*67e74705SXin Li  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
4741*67e74705SXin Li  if (false) false; else true;
4742*67e74705SXin Li</pre></td></tr>
4743*67e74705SXin Li
4744*67e74705SXin Li
4745*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasThen0')"><a name="hasThen0Anchor">hasThen</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
4746*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
4747*67e74705SXin Li
4748*67e74705SXin LiExamples matches the if statement
4749*67e74705SXin Li  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
4750*67e74705SXin Li  if (false) true; else false;
4751*67e74705SXin Li</pre></td></tr>
4752*67e74705SXin Li
4753*67e74705SXin Li
4754*67e74705SXin Li<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>
4755*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
4756*67e74705SXin Limatcher.
4757*67e74705SXin Li
4758*67e74705SXin LiFIXME: Unit test this matcher
4759*67e74705SXin Li</pre></td></tr>
4760*67e74705SXin Li
4761*67e74705SXin Li
4762*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;</td><td class="name" onclick="toggle('hasSyntacticForm0')"><a name="hasSyntacticForm0Anchor">hasSyntacticForm</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4763*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
4764*67e74705SXin Li(if expression have it).
4765*67e74705SXin Li</pre></td></tr>
4766*67e74705SXin Li
4767*67e74705SXin Li
4768*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
4769*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
4770*67e74705SXin Limatches the given matcher.
4771*67e74705SXin Li
4772*67e74705SXin LiThe associated declaration is:
4773*67e74705SXin Li- for type nodes, the declaration of the underlying type
4774*67e74705SXin Li- for CallExpr, the declaration of the callee
4775*67e74705SXin Li- for MemberExpr, the declaration of the referenced member
4776*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor
4777*67e74705SXin Li
4778*67e74705SXin LiAlso usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4779*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions.
4780*67e74705SXin Li
4781*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
4782*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
4783*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
4784*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
4785*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4786*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4787*67e74705SXin Li</pre></td></tr>
4788*67e74705SXin Li
4789*67e74705SXin Li
4790*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
4791*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
4792*67e74705SXin Limatches the given matcher.
4793*67e74705SXin Li
4794*67e74705SXin LiThe associated declaration is:
4795*67e74705SXin Li- for type nodes, the declaration of the underlying type
4796*67e74705SXin Li- for CallExpr, the declaration of the callee
4797*67e74705SXin Li- for MemberExpr, the declaration of the referenced member
4798*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor
4799*67e74705SXin Li
4800*67e74705SXin LiAlso usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4801*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions.
4802*67e74705SXin Li
4803*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
4804*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
4805*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
4806*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
4807*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4808*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4809*67e74705SXin Li</pre></td></tr>
4810*67e74705SXin Li
4811*67e74705SXin Li
4812*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
4813*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
4814*67e74705SXin Limatches the given matcher.
4815*67e74705SXin Li
4816*67e74705SXin LiThe associated declaration is:
4817*67e74705SXin Li- for type nodes, the declaration of the underlying type
4818*67e74705SXin Li- for CallExpr, the declaration of the callee
4819*67e74705SXin Li- for MemberExpr, the declaration of the referenced member
4820*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor
4821*67e74705SXin Li
4822*67e74705SXin LiAlso usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4823*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions.
4824*67e74705SXin Li
4825*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
4826*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
4827*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
4828*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
4829*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4830*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4831*67e74705SXin Li</pre></td></tr>
4832*67e74705SXin Li
4833*67e74705SXin Li
4834*67e74705SXin Li<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>
4835*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
4836*67e74705SXin Limatched by a given matcher.
4837*67e74705SXin Li
4838*67e74705SXin LiGiven
4839*67e74705SXin Li  struct X { int m; };
4840*67e74705SXin Li  void f(X x) { x.m; m; }
4841*67e74705SXin LimemberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
4842*67e74705SXin Li  matches "x.m" and "m"
4843*67e74705SXin Liwith hasObjectExpression(...)
4844*67e74705SXin Li  matching "x" and the implicit object expression of "m" which has type X*.
4845*67e74705SXin Li</pre></td></tr>
4846*67e74705SXin Li
4847*67e74705SXin Li
4848*67e74705SXin Li<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>
4849*67e74705SXin Li<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
4850*67e74705SXin Ligiven matcher.
4851*67e74705SXin Li
4852*67e74705SXin LiGiven
4853*67e74705SXin Li  struct { int first, second; } first, second;
4854*67e74705SXin Li  int i(second.first);
4855*67e74705SXin Li  int j(first.second);
4856*67e74705SXin LimemberExpr(member(hasName("first")))
4857*67e74705SXin Li  matches second.first
4858*67e74705SXin Li  but not first.second (because the member name there is "second").
4859*67e74705SXin Li</pre></td></tr>
4860*67e74705SXin Li
4861*67e74705SXin Li
4862*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerTypeLoc.html">MemberPointerTypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointeeLoc1')"><a name="pointeeLoc1Anchor">pointeeLoc</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
4863*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
4864*67e74705SXin Lipointee matches a given matcher.
4865*67e74705SXin Li
4866*67e74705SXin LiGiven
4867*67e74705SXin Li  int *a;
4868*67e74705SXin Li  int const *b;
4869*67e74705SXin Li  float const *f;
4870*67e74705SXin LipointerType(pointee(isConstQualified(), isInteger()))
4871*67e74705SXin Li  matches "int const *b"
4872*67e74705SXin Li
4873*67e74705SXin LiUsable 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;,
4874*67e74705SXin Li  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;
4875*67e74705SXin Li</pre></td></tr>
4876*67e74705SXin Li
4877*67e74705SXin Li
4878*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;</td><td class="name" onclick="toggle('pointee1')"><a name="pointee1Anchor">pointee</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
4879*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
4880*67e74705SXin Lipointee matches a given matcher.
4881*67e74705SXin Li
4882*67e74705SXin LiGiven
4883*67e74705SXin Li  int *a;
4884*67e74705SXin Li  int const *b;
4885*67e74705SXin Li  float const *f;
4886*67e74705SXin LipointerType(pointee(isConstQualified(), isInteger()))
4887*67e74705SXin Li  matches "int const *b"
4888*67e74705SXin Li
4889*67e74705SXin LiUsable 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;,
4890*67e74705SXin Li  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;
4891*67e74705SXin Li</pre></td></tr>
4892*67e74705SXin Li
4893*67e74705SXin Li
4894*67e74705SXin Li<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>
4895*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
4896*67e74705SXin Li
4897*67e74705SXin LiGiven
4898*67e74705SXin Li  struct A { struct B { struct C {}; }; };
4899*67e74705SXin Li  A::B::C c;
4900*67e74705SXin LinestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
4901*67e74705SXin Li  matches "A::"
4902*67e74705SXin Li</pre></td></tr>
4903*67e74705SXin Li
4904*67e74705SXin Li
4905*67e74705SXin Li<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>
4906*67e74705SXin Li<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
4907*67e74705SXin Ligiven TypeLoc.
4908*67e74705SXin Li
4909*67e74705SXin LiGiven
4910*67e74705SXin Li  struct A { struct B { struct C {}; }; };
4911*67e74705SXin Li  A::B::C c;
4912*67e74705SXin LinestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
4913*67e74705SXin Li  hasDeclaration(cxxRecordDecl(hasName("A")))))))
4914*67e74705SXin Li  matches "A::"
4915*67e74705SXin Li</pre></td></tr>
4916*67e74705SXin Li
4917*67e74705SXin Li
4918*67e74705SXin Li<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>
4919*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
4920*67e74705SXin Li
4921*67e74705SXin LiGiven
4922*67e74705SXin Li  struct A { struct B { struct C {}; }; };
4923*67e74705SXin Li  A::B::C c;
4924*67e74705SXin LinestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
4925*67e74705SXin Li  matches "A::"
4926*67e74705SXin Li</pre></td></tr>
4927*67e74705SXin Li
4928*67e74705SXin Li
4929*67e74705SXin Li<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>
4930*67e74705SXin Li<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
4931*67e74705SXin Ligiven namespace matcher.
4932*67e74705SXin Li
4933*67e74705SXin LiGiven
4934*67e74705SXin Li  namespace ns { struct A {}; }
4935*67e74705SXin Li  ns::A a;
4936*67e74705SXin LinestedNameSpecifier(specifiesNamespace(hasName("ns")))
4937*67e74705SXin Li  matches "ns::"
4938*67e74705SXin Li</pre></td></tr>
4939*67e74705SXin Li
4940*67e74705SXin Li
4941*67e74705SXin Li<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>
4942*67e74705SXin Li<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
4943*67e74705SXin Ligiven QualType matcher without qualifiers.
4944*67e74705SXin Li
4945*67e74705SXin LiGiven
4946*67e74705SXin Li  struct A { struct B { struct C {}; }; };
4947*67e74705SXin Li  A::B::C c;
4948*67e74705SXin LinestedNameSpecifier(specifiesType(
4949*67e74705SXin Li  hasDeclaration(cxxRecordDecl(hasName("A")))
4950*67e74705SXin Li))
4951*67e74705SXin Li  matches "A::"
4952*67e74705SXin Li</pre></td></tr>
4953*67e74705SXin Li
4954*67e74705SXin Li
4955*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument2')"><a name="hasArgument2Anchor">hasArgument</a></td><td>unsigned N, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4956*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
4957*67e74705SXin Licall expression.
4958*67e74705SXin Li
4959*67e74705SXin LiExample matches y in x(y)
4960*67e74705SXin Li    (matcher = callExpr(hasArgument(0, declRefExpr())))
4961*67e74705SXin Li  void x(int) { int y; x(y); }
4962*67e74705SXin Li</pre></td></tr>
4963*67e74705SXin Li
4964*67e74705SXin Li
4965*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasReceiverType0')"><a name="hasReceiverType0Anchor">hasReceiverType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
4966*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
4967*67e74705SXin Li
4968*67e74705SXin LiExample
4969*67e74705SXin Limatcher = objCMessageExpr(hasRecieverType(asString("UIWebView *")));
4970*67e74705SXin Limatches the [webView ...] message invocation.
4971*67e74705SXin Li  NSString *webViewJavaScript = ...
4972*67e74705SXin Li  UIWebView *webView = ...
4973*67e74705SXin Li  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
4974*67e74705SXin Li</pre></td></tr>
4975*67e74705SXin Li
4976*67e74705SXin Li
4977*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;</td><td class="name" onclick="toggle('hasSourceExpression1')"><a name="hasSourceExpression1Anchor">hasSourceExpression</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4978*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre></pre></td></tr>
4979*67e74705SXin Li
4980*67e74705SXin Li
4981*67e74705SXin Li<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>
4982*67e74705SXin Li<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
4983*67e74705SXin Li
4984*67e74705SXin LiGiven
4985*67e74705SXin Li  int (*ptr_to_array)[4];
4986*67e74705SXin Li  int (*ptr_to_func)(int);
4987*67e74705SXin Li
4988*67e74705SXin LivarDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
4989*67e74705SXin Liptr_to_func but not ptr_to_array.
4990*67e74705SXin Li
4991*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
4992*67e74705SXin Li</pre></td></tr>
4993*67e74705SXin Li
4994*67e74705SXin Li
4995*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointeeLoc2')"><a name="pointeeLoc2Anchor">pointeeLoc</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
4996*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
4997*67e74705SXin Lipointee matches a given matcher.
4998*67e74705SXin Li
4999*67e74705SXin LiGiven
5000*67e74705SXin Li  int *a;
5001*67e74705SXin Li  int const *b;
5002*67e74705SXin Li  float const *f;
5003*67e74705SXin LipointerType(pointee(isConstQualified(), isInteger()))
5004*67e74705SXin Li  matches "int const *b"
5005*67e74705SXin Li
5006*67e74705SXin LiUsable 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;,
5007*67e74705SXin Li  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;
5008*67e74705SXin Li</pre></td></tr>
5009*67e74705SXin Li
5010*67e74705SXin Li
5011*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;</td><td class="name" onclick="toggle('pointee2')"><a name="pointee2Anchor">pointee</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
5012*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
5013*67e74705SXin Lipointee matches a given matcher.
5014*67e74705SXin Li
5015*67e74705SXin LiGiven
5016*67e74705SXin Li  int *a;
5017*67e74705SXin Li  int const *b;
5018*67e74705SXin Li  float const *f;
5019*67e74705SXin LipointerType(pointee(isConstQualified(), isInteger()))
5020*67e74705SXin Li  matches "int const *b"
5021*67e74705SXin Li
5022*67e74705SXin LiUsable 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;,
5023*67e74705SXin Li  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;
5024*67e74705SXin Li</pre></td></tr>
5025*67e74705SXin Li
5026*67e74705SXin Li
5027*67e74705SXin Li<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>
5028*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
5029*67e74705SXin Li
5030*67e74705SXin LiGiven:
5031*67e74705SXin Li  typedef int &amp;int_ref;
5032*67e74705SXin Li  int a;
5033*67e74705SXin Li  int_ref b = a;
5034*67e74705SXin Li
5035*67e74705SXin LivarDecl(hasType(qualType(referenceType()))))) will not match the
5036*67e74705SXin Lideclaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
5037*67e74705SXin Li</pre></td></tr>
5038*67e74705SXin Li
5039*67e74705SXin Li
5040*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5041*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
5042*67e74705SXin Limatches the given matcher.
5043*67e74705SXin Li
5044*67e74705SXin LiThe associated declaration is:
5045*67e74705SXin Li- for type nodes, the declaration of the underlying type
5046*67e74705SXin Li- for CallExpr, the declaration of the callee
5047*67e74705SXin Li- for MemberExpr, the declaration of the referenced member
5048*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor
5049*67e74705SXin Li
5050*67e74705SXin LiAlso usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5051*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions.
5052*67e74705SXin Li
5053*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
5054*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
5055*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
5056*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
5057*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
5058*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5059*67e74705SXin Li</pre></td></tr>
5060*67e74705SXin Li
5061*67e74705SXin Li
5062*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('ignoringParens0')"><a name="ignoringParens0Anchor">ignoringParens</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
5063*67e74705SXin Li<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
5064*67e74705SXin Li
5065*67e74705SXin LiGiven
5066*67e74705SXin Li  void (*fp)(void);
5067*67e74705SXin LiThe matcher
5068*67e74705SXin Li  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
5069*67e74705SXin Liwould match the declaration for fp.
5070*67e74705SXin Li</pre></td></tr>
5071*67e74705SXin Li
5072*67e74705SXin Li
5073*67e74705SXin Li<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>
5074*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
5075*67e74705SXin Li</pre></td></tr>
5076*67e74705SXin Li
5077*67e74705SXin Li
5078*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('pointsTo0')"><a name="pointsTo0Anchor">pointsTo</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
5079*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
5080*67e74705SXin Limatches the specified matcher.
5081*67e74705SXin Li
5082*67e74705SXin LiExample matches y-&gt;x()
5083*67e74705SXin Li  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
5084*67e74705SXin Li     cxxRecordDecl(hasName("Y")))))))
5085*67e74705SXin Li  class Y { public: void x(); };
5086*67e74705SXin Li  void z() { Y *y; y-&gt;x(); }
5087*67e74705SXin Li</pre></td></tr>
5088*67e74705SXin Li
5089*67e74705SXin Li
5090*67e74705SXin Li<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>
5091*67e74705SXin Li<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
5092*67e74705SXin Li</pre></td></tr>
5093*67e74705SXin Li
5094*67e74705SXin Li
5095*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('references0')"><a name="references0Anchor">references</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
5096*67e74705SXin Li<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
5097*67e74705SXin Litype matches the specified matcher.
5098*67e74705SXin Li
5099*67e74705SXin LiExample matches X &amp;x and const X &amp;y
5100*67e74705SXin Li    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
5101*67e74705SXin Li  class X {
5102*67e74705SXin Li    void a(X b) {
5103*67e74705SXin Li      X &amp;x = b;
5104*67e74705SXin Li      const X &amp;y = b;
5105*67e74705SXin Li    }
5106*67e74705SXin Li  };
5107*67e74705SXin Li</pre></td></tr>
5108*67e74705SXin Li
5109*67e74705SXin Li
5110*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5111*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
5112*67e74705SXin Limatches the given matcher.
5113*67e74705SXin Li
5114*67e74705SXin LiThe associated declaration is:
5115*67e74705SXin Li- for type nodes, the declaration of the underlying type
5116*67e74705SXin Li- for CallExpr, the declaration of the callee
5117*67e74705SXin Li- for MemberExpr, the declaration of the referenced member
5118*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor
5119*67e74705SXin Li
5120*67e74705SXin LiAlso usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5121*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions.
5122*67e74705SXin Li
5123*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
5124*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
5125*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
5126*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
5127*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
5128*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5129*67e74705SXin Li</pre></td></tr>
5130*67e74705SXin Li
5131*67e74705SXin Li
5132*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointeeLoc3')"><a name="pointeeLoc3Anchor">pointeeLoc</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
5133*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
5134*67e74705SXin Lipointee matches a given matcher.
5135*67e74705SXin Li
5136*67e74705SXin LiGiven
5137*67e74705SXin Li  int *a;
5138*67e74705SXin Li  int const *b;
5139*67e74705SXin Li  float const *f;
5140*67e74705SXin LipointerType(pointee(isConstQualified(), isInteger()))
5141*67e74705SXin Li  matches "int const *b"
5142*67e74705SXin Li
5143*67e74705SXin LiUsable 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;,
5144*67e74705SXin Li  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;
5145*67e74705SXin Li</pre></td></tr>
5146*67e74705SXin Li
5147*67e74705SXin Li
5148*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;</td><td class="name" onclick="toggle('pointee3')"><a name="pointee3Anchor">pointee</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
5149*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
5150*67e74705SXin Lipointee matches a given matcher.
5151*67e74705SXin Li
5152*67e74705SXin LiGiven
5153*67e74705SXin Li  int *a;
5154*67e74705SXin Li  int const *b;
5155*67e74705SXin Li  float const *f;
5156*67e74705SXin LipointerType(pointee(isConstQualified(), isInteger()))
5157*67e74705SXin Li  matches "int const *b"
5158*67e74705SXin Li
5159*67e74705SXin LiUsable 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;,
5160*67e74705SXin Li  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;
5161*67e74705SXin Li</pre></td></tr>
5162*67e74705SXin Li
5163*67e74705SXin Li
5164*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;</td><td class="name" onclick="toggle('hasReturnValue0')"><a name="hasReturnValue0Anchor">hasReturnValue</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5165*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
5166*67e74705SXin Li
5167*67e74705SXin LiGiven
5168*67e74705SXin Li  return a + b;
5169*67e74705SXin LihasReturnValue(binaryOperator())
5170*67e74705SXin Li  matches 'return a + b'
5171*67e74705SXin Liwith binaryOperator()
5172*67e74705SXin Li  matching 'a + b'
5173*67e74705SXin Li</pre></td></tr>
5174*67e74705SXin Li
5175*67e74705SXin Li
5176*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnySubstatement1')"><a name="hasAnySubstatement1Anchor">hasAnySubstatement</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
5177*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
5178*67e74705SXin Lia given matcher. Also matches StmtExprs that have CompoundStmt as children.
5179*67e74705SXin Li
5180*67e74705SXin LiGiven
5181*67e74705SXin Li  { {}; 1+2; }
5182*67e74705SXin LihasAnySubstatement(compoundStmt())
5183*67e74705SXin Li  matches '{ {}; 1+2; }'
5184*67e74705SXin Liwith compoundStmt()
5185*67e74705SXin Li  matching '{}'
5186*67e74705SXin Li</pre></td></tr>
5187*67e74705SXin Li
5188*67e74705SXin Li
5189*67e74705SXin Li<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>
5190*67e74705SXin Li<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5191*67e74705SXin Lialignof.
5192*67e74705SXin Li</pre></td></tr>
5193*67e74705SXin Li
5194*67e74705SXin Li
5195*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forFunction0')"><a name="forFunction0Anchor">forFunction</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt; InnerMatcher</td></tr>
5196*67e74705SXin Li<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statemenet belongs to
5197*67e74705SXin Li
5198*67e74705SXin LiGiven:
5199*67e74705SXin LiF&amp; operator=(const F&amp; o) {
5200*67e74705SXin Li  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
5201*67e74705SXin Li  return *this;
5202*67e74705SXin Li}
5203*67e74705SXin LireturnStmt(forFunction(hasName("operator=")))
5204*67e74705SXin Li  matches 'return *this'
5205*67e74705SXin Li  but does match 'return &gt; 0'
5206*67e74705SXin Li</pre></td></tr>
5207*67e74705SXin Li
5208*67e74705SXin Li
5209*67e74705SXin Li<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>
5210*67e74705SXin Li<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
5211*67e74705SXin Lisizeof.
5212*67e74705SXin Li</pre></td></tr>
5213*67e74705SXin Li
5214*67e74705SXin Li
5215*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;</td><td class="name" onclick="toggle('forEachSwitchCase0')"><a name="forEachSwitchCase0Anchor">forEachSwitchCase</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt; InnerMatcher</td></tr>
5216*67e74705SXin Li<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
5217*67e74705SXin Listatement. This matcher may produce multiple matches.
5218*67e74705SXin Li
5219*67e74705SXin LiGiven
5220*67e74705SXin Li  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
5221*67e74705SXin LiswitchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
5222*67e74705SXin Li  matches four times, with "c" binding each of "case 1:", "case 2:",
5223*67e74705SXin Li"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
5224*67e74705SXin Li"switch (1)", "switch (2)" and "switch (2)".
5225*67e74705SXin Li</pre></td></tr>
5226*67e74705SXin Li
5227*67e74705SXin Li
5228*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition4')"><a name="hasCondition4Anchor">hasCondition</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5229*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
5230*67e74705SXin Liswitch statement or conditional operator.
5231*67e74705SXin Li
5232*67e74705SXin LiExample matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5233*67e74705SXin Li  if (true) {}
5234*67e74705SXin Li</pre></td></tr>
5235*67e74705SXin Li
5236*67e74705SXin Li
5237*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5238*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
5239*67e74705SXin Limatches the given matcher.
5240*67e74705SXin Li
5241*67e74705SXin LiThe associated declaration is:
5242*67e74705SXin Li- for type nodes, the declaration of the underlying type
5243*67e74705SXin Li- for CallExpr, the declaration of the callee
5244*67e74705SXin Li- for MemberExpr, the declaration of the referenced member
5245*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor
5246*67e74705SXin Li
5247*67e74705SXin LiAlso usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5248*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions.
5249*67e74705SXin Li
5250*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
5251*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
5252*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
5253*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
5254*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
5255*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5256*67e74705SXin Li</pre></td></tr>
5257*67e74705SXin Li
5258*67e74705SXin Li
5259*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('isExpr0')"><a name="isExpr0Anchor">isExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5260*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
5261*67e74705SXin Li
5262*67e74705SXin LiGiven
5263*67e74705SXin Li  template&lt;typename T&gt; struct A {};
5264*67e74705SXin Li  struct B { B* next; };
5265*67e74705SXin Li  A&lt;&amp;B::next&gt; a;
5266*67e74705SXin LitemplateSpecializationType(hasAnyTemplateArgument(
5267*67e74705SXin Li  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
5268*67e74705SXin Li  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5269*67e74705SXin Li    B::next
5270*67e74705SXin Li</pre></td></tr>
5271*67e74705SXin Li
5272*67e74705SXin Li
5273*67e74705SXin Li<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>
5274*67e74705SXin Li<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
5275*67e74705SXin Lideclaration.
5276*67e74705SXin Li
5277*67e74705SXin LiGiven
5278*67e74705SXin Li  template&lt;typename T&gt; struct A {};
5279*67e74705SXin Li  struct B { B* next; };
5280*67e74705SXin Li  A&lt;&amp;B::next&gt; a;
5281*67e74705SXin LiclassTemplateSpecializationDecl(hasAnyTemplateArgument(
5282*67e74705SXin Li    refersToDeclaration(fieldDecl(hasName("next"))))
5283*67e74705SXin Li  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
5284*67e74705SXin Li    B::next
5285*67e74705SXin Li</pre></td></tr>
5286*67e74705SXin Li
5287*67e74705SXin Li
5288*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToIntegralType0')"><a name="refersToIntegralType0Anchor">refersToIntegralType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
5289*67e74705SXin Li<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
5290*67e74705SXin Li
5291*67e74705SXin LiGiven
5292*67e74705SXin Li  template&lt;int T&gt; struct A {};
5293*67e74705SXin Li  C&lt;42&gt; c;
5294*67e74705SXin LiclassTemplateSpecializationDecl(
5295*67e74705SXin Li  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
5296*67e74705SXin Li  matches the implicit instantiation of C in C&lt;42&gt;.
5297*67e74705SXin Li</pre></td></tr>
5298*67e74705SXin Li
5299*67e74705SXin Li
5300*67e74705SXin Li<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>
5301*67e74705SXin Li<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
5302*67e74705SXin Li
5303*67e74705SXin LiGiven
5304*67e74705SXin Li  struct X {};
5305*67e74705SXin Li  template&lt;typename T&gt; struct A {};
5306*67e74705SXin Li  A&lt;X&gt; a;
5307*67e74705SXin LiclassTemplateSpecializationDecl(hasAnyTemplateArgument(
5308*67e74705SXin Li    refersToType(class(hasName("X")))))
5309*67e74705SXin Li  matches the specialization A&lt;X&gt;
5310*67e74705SXin Li</pre></td></tr>
5311*67e74705SXin Li
5312*67e74705SXin Li
5313*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument1')"><a name="hasAnyTemplateArgument1Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
5314*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations that have at least one
5315*67e74705SXin LiTemplateArgument matching the given InnerMatcher.
5316*67e74705SXin Li
5317*67e74705SXin LiGiven
5318*67e74705SXin Li  template&lt;typename T&gt; class A {};
5319*67e74705SXin Li  template&lt;&gt; class A&lt;double&gt; {};
5320*67e74705SXin Li  A&lt;int&gt; a;
5321*67e74705SXin LiclassTemplateSpecializationDecl(hasAnyTemplateArgument(
5322*67e74705SXin Li    refersToType(asString("int"))))
5323*67e74705SXin Li  matches the specialization A&lt;int&gt;
5324*67e74705SXin Li</pre></td></tr>
5325*67e74705SXin Li
5326*67e74705SXin Li
5327*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5328*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
5329*67e74705SXin Limatches the given matcher.
5330*67e74705SXin Li
5331*67e74705SXin LiThe associated declaration is:
5332*67e74705SXin Li- for type nodes, the declaration of the underlying type
5333*67e74705SXin Li- for CallExpr, the declaration of the callee
5334*67e74705SXin Li- for MemberExpr, the declaration of the referenced member
5335*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor
5336*67e74705SXin Li
5337*67e74705SXin LiAlso usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5338*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions.
5339*67e74705SXin Li
5340*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
5341*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
5342*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
5343*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
5344*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
5345*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5346*67e74705SXin Li</pre></td></tr>
5347*67e74705SXin Li
5348*67e74705SXin Li
5349*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgument1')"><a name="hasTemplateArgument1Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
5350*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
5351*67e74705SXin Limatches the given InnerMatcher.
5352*67e74705SXin Li
5353*67e74705SXin LiGiven
5354*67e74705SXin Li  template&lt;typename T, typename U&gt; class A {};
5355*67e74705SXin Li  A&lt;bool, int&gt; b;
5356*67e74705SXin Li  A&lt;int, bool&gt; c;
5357*67e74705SXin LiclassTemplateSpecializationDecl(hasTemplateArgument(
5358*67e74705SXin Li    1, refersToType(asString("int"))))
5359*67e74705SXin Li  matches the specialization A&lt;bool, int&gt;
5360*67e74705SXin Li</pre></td></tr>
5361*67e74705SXin Li
5362*67e74705SXin Li
5363*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5364*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
5365*67e74705SXin Limatches the given matcher.
5366*67e74705SXin Li
5367*67e74705SXin LiThe associated declaration is:
5368*67e74705SXin Li- for type nodes, the declaration of the underlying type
5369*67e74705SXin Li- for CallExpr, the declaration of the callee
5370*67e74705SXin Li- for MemberExpr, the declaration of the referenced member
5371*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor
5372*67e74705SXin Li
5373*67e74705SXin LiAlso usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5374*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions.
5375*67e74705SXin Li
5376*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
5377*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
5378*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
5379*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
5380*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
5381*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5382*67e74705SXin Li</pre></td></tr>
5383*67e74705SXin Li
5384*67e74705SXin Li
5385*67e74705SXin Li<tr><td>Matcher&lt;T&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher&lt;T&gt;  Matcher</td></tr>
5386*67e74705SXin Li<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5387*67e74705SXin Li
5388*67e74705SXin LiGenerates results for each match.
5389*67e74705SXin Li
5390*67e74705SXin LiFor example, in:
5391*67e74705SXin Li  class A { class B {}; class C {}; };
5392*67e74705SXin LiThe matcher:
5393*67e74705SXin Li  cxxRecordDecl(hasName("::A"),
5394*67e74705SXin Li                findAll(cxxRecordDecl(isDefinition()).bind("m")))
5395*67e74705SXin Liwill generate results for A, B and C.
5396*67e74705SXin Li
5397*67e74705SXin LiUsable as: Any Matcher
5398*67e74705SXin Li</pre></td></tr>
5399*67e74705SXin Li
5400*67e74705SXin Li
5401*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;</td><td class="name" onclick="toggle('hasType1')"><a name="hasType1Anchor">hasType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
5402*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
5403*67e74705SXin Limatcher.
5404*67e74705SXin Li
5405*67e74705SXin LiExample matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5406*67e74705SXin Li            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5407*67e74705SXin Li            and U (matcher = typedefDecl(hasType(asString("int")))
5408*67e74705SXin Li class X {};
5409*67e74705SXin Li void y(X &amp;x) { x; X z; }
5410*67e74705SXin Li typedef int U;
5411*67e74705SXin Li</pre></td></tr>
5412*67e74705SXin Li
5413*67e74705SXin Li
5414*67e74705SXin Li<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>
5415*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
5416*67e74705SXin Limatches the given matcher.
5417*67e74705SXin Li
5418*67e74705SXin LiThe associated declaration is:
5419*67e74705SXin Li- for type nodes, the declaration of the underlying type
5420*67e74705SXin Li- for CallExpr, the declaration of the callee
5421*67e74705SXin Li- for MemberExpr, the declaration of the referenced member
5422*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor
5423*67e74705SXin Li
5424*67e74705SXin LiAlso usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5425*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions.
5426*67e74705SXin Li
5427*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
5428*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
5429*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
5430*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
5431*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
5432*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5433*67e74705SXin Li</pre></td></tr>
5434*67e74705SXin Li
5435*67e74705SXin Li
5436*67e74705SXin Li<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>
5437*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
5438*67e74705SXin Li
5439*67e74705SXin LiGiven
5440*67e74705SXin Li  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
5441*67e74705SXin LiunaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
5442*67e74705SXin Li  matches sizeof(a) and alignof(c)
5443*67e74705SXin Li</pre></td></tr>
5444*67e74705SXin Li
5445*67e74705SXin Li
5446*67e74705SXin Li<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>
5447*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
5448*67e74705SXin Li
5449*67e74705SXin LiExample matches true (matcher = hasUnaryOperand(
5450*67e74705SXin Li                                  cxxBoolLiteral(equals(true))))
5451*67e74705SXin Li  !true
5452*67e74705SXin Li</pre></td></tr>
5453*67e74705SXin Li
5454*67e74705SXin Li
5455*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5456*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
5457*67e74705SXin Limatches the given matcher.
5458*67e74705SXin Li
5459*67e74705SXin LiThe associated declaration is:
5460*67e74705SXin Li- for type nodes, the declaration of the underlying type
5461*67e74705SXin Li- for CallExpr, the declaration of the callee
5462*67e74705SXin Li- for MemberExpr, the declaration of the referenced member
5463*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor
5464*67e74705SXin Li
5465*67e74705SXin LiAlso usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
5466*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions.
5467*67e74705SXin Li
5468*67e74705SXin LiUsable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
5469*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
5470*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;,
5471*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
5472*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
5473*67e74705SXin Li  Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5474*67e74705SXin Li</pre></td></tr>
5475*67e74705SXin Li
5476*67e74705SXin Li
5477*67e74705SXin Li<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>
5478*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
5479*67e74705SXin Li
5480*67e74705SXin LiGiven
5481*67e74705SXin Li  namespace X { void b(); }
5482*67e74705SXin Li  using X::b;
5483*67e74705SXin LiusingDecl(hasAnyUsingShadowDecl(hasName("b"))))
5484*67e74705SXin Li  matches using X::b </pre></td></tr>
5485*67e74705SXin Li
5486*67e74705SXin Li
5487*67e74705SXin Li<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>
5488*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
5489*67e74705SXin Limatched by the given matcher.
5490*67e74705SXin Li
5491*67e74705SXin LiGiven
5492*67e74705SXin Li  namespace X { int a; void b(); }
5493*67e74705SXin Li  using X::a;
5494*67e74705SXin Li  using X::b;
5495*67e74705SXin LiusingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
5496*67e74705SXin Li  matches using X::b but not using X::a </pre></td></tr>
5497*67e74705SXin Li
5498*67e74705SXin Li
5499*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
5500*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
5501*67e74705SXin Lideclaration's type.
5502*67e74705SXin Li
5503*67e74705SXin LiIn case of a value declaration (for example a variable declaration),
5504*67e74705SXin Lithis resolves one layer of indirection. For example, in the value
5505*67e74705SXin Lideclaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5506*67e74705SXin LiX, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5507*67e74705SXin Lideclaration of x.
5508*67e74705SXin Li
5509*67e74705SXin LiExample matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5510*67e74705SXin Li            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5511*67e74705SXin Li class X {};
5512*67e74705SXin Li void y(X &amp;x) { x; X z; }
5513*67e74705SXin Li
5514*67e74705SXin LiUsable 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;
5515*67e74705SXin Li</pre></td></tr>
5516*67e74705SXin Li
5517*67e74705SXin Li
5518*67e74705SXin Li<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
5519*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
5520*67e74705SXin Limatcher.
5521*67e74705SXin Li
5522*67e74705SXin LiExample matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5523*67e74705SXin Li            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5524*67e74705SXin Li            and U (matcher = typedefDecl(hasType(asString("int")))
5525*67e74705SXin Li class X {};
5526*67e74705SXin Li void y(X &amp;x) { x; X z; }
5527*67e74705SXin Li typedef int U;
5528*67e74705SXin Li</pre></td></tr>
5529*67e74705SXin Li
5530*67e74705SXin Li
5531*67e74705SXin Li<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>
5532*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
5533*67e74705SXin Lithat matches the given matcher.
5534*67e74705SXin Li
5535*67e74705SXin LiExample matches x (matcher = varDecl(hasInitializer(callExpr())))
5536*67e74705SXin Li  bool y() { return true; }
5537*67e74705SXin Li  bool x = y();
5538*67e74705SXin Li</pre></td></tr>
5539*67e74705SXin Li
5540*67e74705SXin Li
5541*67e74705SXin Li<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>
5542*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
5543*67e74705SXin Liexpression.
5544*67e74705SXin Li
5545*67e74705SXin LiGiven
5546*67e74705SXin Li  void f(int b) {
5547*67e74705SXin Li    int a[b];
5548*67e74705SXin Li  }
5549*67e74705SXin LivariableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
5550*67e74705SXin Li  varDecl(hasName("b")))))))
5551*67e74705SXin Li  matches "int a[b]"
5552*67e74705SXin Li</pre></td></tr>
5553*67e74705SXin Li
5554*67e74705SXin Li
5555*67e74705SXin Li<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>
5556*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
5557*67e74705SXin Lidefinition that has a given body.
5558*67e74705SXin Li
5559*67e74705SXin LiGiven
5560*67e74705SXin Li  for (;;) {}
5561*67e74705SXin LihasBody(compoundStmt())
5562*67e74705SXin Li  matches 'for (;;) {}'
5563*67e74705SXin Liwith compoundStmt()
5564*67e74705SXin Li  matching '{}'
5565*67e74705SXin Li</pre></td></tr>
5566*67e74705SXin Li
5567*67e74705SXin Li
5568*67e74705SXin Li<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>
5569*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
5570*67e74705SXin Liswitch statement or conditional operator.
5571*67e74705SXin Li
5572*67e74705SXin LiExample matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5573*67e74705SXin Li  if (true) {}
5574*67e74705SXin Li</pre></td></tr>
5575*67e74705SXin Li
5576*67e74705SXin Li
5577*67e74705SXin Li<tr><td>Matcher&lt;internal::BindableMatcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;&gt;</td><td class="name" onclick="toggle('loc1')"><a name="loc1Anchor">loc</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
5578*67e74705SXin Li<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
5579*67e74705SXin LiNestedNameSpecifier-matcher matches.
5580*67e74705SXin Li</pre></td></tr>
5581*67e74705SXin Li
5582*67e74705SXin Li
5583*67e74705SXin Li<tr><td>Matcher&lt;internal::BindableMatcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;&gt;</td><td class="name" onclick="toggle('loc0')"><a name="loc0Anchor">loc</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
5584*67e74705SXin Li<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
5585*67e74705SXin LiQualType-matcher matches.
5586*67e74705SXin Li</pre></td></tr>
5587*67e74705SXin Li
5588*67e74705SXin Li<!--END_TRAVERSAL_MATCHERS -->
5589*67e74705SXin Li</table>
5590*67e74705SXin Li
5591*67e74705SXin Li</div>
5592*67e74705SXin Li</body>
5593*67e74705SXin Li</html>
5594*67e74705SXin Li
5595*67e74705SXin Li
5596