LibASTMatchersReference.html revision 1.1 1 1.1 joerg <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2 1.1 joerg "http://www.w3.org/TR/html4/strict.dtd">
3 1.1 joerg <html>
4 1.1 joerg <head>
5 1.1 joerg <title>AST Matcher Reference</title>
6 1.1 joerg <link type="text/css" rel="stylesheet" href="../menu.css" />
7 1.1 joerg <link type="text/css" rel="stylesheet" href="../content.css" />
8 1.1 joerg <style type="text/css">
9 1.1 joerg td {
10 1.1 joerg padding: .33em;
11 1.1 joerg }
12 1.1 joerg td.doc {
13 1.1 joerg display: none;
14 1.1 joerg border-bottom: 1px solid black;
15 1.1 joerg }
16 1.1 joerg td.name:hover {
17 1.1 joerg color: blue;
18 1.1 joerg cursor: pointer;
19 1.1 joerg }
20 1.1 joerg </style>
21 1.1 joerg <script type="text/javascript">
22 1.1 joerg function toggle(id) {
23 1.1 joerg if (!id) return;
24 1.1 joerg row = document.getElementById(id);
25 1.1 joerg if (row.style.display != 'table-cell')
26 1.1 joerg row.style.display = 'table-cell';
27 1.1 joerg else
28 1.1 joerg row.style.display = 'none';
29 1.1 joerg }
30 1.1 joerg </script>
31 1.1 joerg </head>
32 1.1 joerg <body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
33 1.1 joerg
34 1.1 joerg <!--#include virtual="../menu.html.incl"-->
35 1.1 joerg
36 1.1 joerg <div id="content">
37 1.1 joerg
38 1.1 joerg <h1>AST Matcher Reference</h1>
39 1.1 joerg
40 1.1 joerg <p>This document shows all currently implemented matchers. The matchers are grouped
41 1.1 joerg by category and node type they match. You can click on matcher names to show the
42 1.1 joerg matcher's source documentation.</p>
43 1.1 joerg
44 1.1 joerg <p>There are three different basic categories of matchers:
45 1.1 joerg <ul>
46 1.1 joerg <li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
47 1.1 joerg <li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
48 1.1 joerg <li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
49 1.1 joerg </ul>
50 1.1 joerg </p>
51 1.1 joerg
52 1.1 joerg <p>Within each category the matchers are ordered by node type they match on.
53 1.1 joerg Note that if a matcher can match multiple node types, it will it will appear
54 1.1 joerg multiple times. This means that by searching for Matcher<Stmt> you can
55 1.1 joerg find all matchers that can be used to match on Stmt nodes.</p>
56 1.1 joerg
57 1.1 joerg <p>The exception to that rule are matchers that can match on any node. Those
58 1.1 joerg are marked with a * and are listed in the beginning of each category.</p>
59 1.1 joerg
60 1.1 joerg <p>Note that the categorization of matchers is a great help when you combine
61 1.1 joerg them into matcher expressions. You will usually want to form matcher expressions
62 1.1 joerg that read like english sentences by alternating between node matchers and
63 1.1 joerg narrowing or traversal matchers, like this:
64 1.1 joerg <pre>
65 1.1 joerg recordDecl(hasDescendant(
66 1.1 joerg ifStmt(hasTrueExpression(
67 1.1 joerg expr(hasDescendant(
68 1.1 joerg ifStmt()))))))
69 1.1 joerg </pre>
70 1.1 joerg </p>
71 1.1 joerg
72 1.1 joerg <!-- ======================================================================= -->
73 1.1 joerg <h2 id="decl-matchers">Node Matchers</h2>
74 1.1 joerg <!-- ======================================================================= -->
75 1.1 joerg
76 1.1 joerg <p>Node matchers are at the core of matcher expressions - they specify the type
77 1.1 joerg of node that is expected. Every match expression starts with a node matcher,
78 1.1 joerg which can then be further refined with a narrowing or traversal matcher. All
79 1.1 joerg traversal matchers take node matchers as their arguments.</p>
80 1.1 joerg
81 1.1 joerg <p>For convenience, all node matchers take an arbitrary number of arguments
82 1.1 joerg and implicitly act as allOf matchers.</p>
83 1.1 joerg
84 1.1 joerg <p>Node matchers are the only matchers that support the bind("id") call to
85 1.1 joerg bind the matched node to the given string, to be later retrieved from the
86 1.1 joerg match callback.</p>
87 1.1 joerg
88 1.1 joerg <p>It is important to remember that the arguments to node matchers are
89 1.1 joerg predicates on the same node, just with additional information about the type.
90 1.1 joerg This is often useful to make matcher expression more readable by inlining bind
91 1.1 joerg calls into redundant node matchers inside another node matcher:
92 1.1 joerg <pre>
93 1.1 joerg // This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
94 1.1 joerg // the same node.
95 1.1 joerg recordDecl(decl().bind("id"), hasName("::MyClass"))
96 1.1 joerg </pre>
97 1.1 joerg </p>
98 1.1 joerg
99 1.1 joerg <table>
100 1.1 joerg <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
101 1.1 joerg <!-- START_DECL_MATCHERS -->
102 1.1 joerg
103 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>...</td></tr>
104 1.1 joerg <tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
105 1.1 joerg
106 1.1 joerg Examples matches i(42).
107 1.1 joerg class C {
108 1.1 joerg C() : i(42) {}
109 1.1 joerg int i;
110 1.1 joerg };
111 1.1 joerg </pre></td></tr>
112 1.1 joerg
113 1.1 joerg
114 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>>...</td></tr>
115 1.1 joerg <tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
116 1.1 joerg
117 1.1 joerg Given
118 1.1 joerg class C {
119 1.1 joerg public:
120 1.1 joerg int a;
121 1.1 joerg };
122 1.1 joerg accessSpecDecl()
123 1.1 joerg matches 'public:'
124 1.1 joerg </pre></td></tr>
125 1.1 joerg
126 1.1 joerg
127 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>...</td></tr>
128 1.1 joerg <tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
129 1.1 joerg
130 1.1 joerg Example matches the declaration of the nameless block printing an input
131 1.1 joerg integer.
132 1.1 joerg
133 1.1 joerg myFunc(^(int p) {
134 1.1 joerg printf("%d", p);
135 1.1 joerg })
136 1.1 joerg </pre></td></tr>
137 1.1 joerg
138 1.1 joerg
139 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>>...</td></tr>
140 1.1 joerg <tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
141 1.1 joerg
142 1.1 joerg Example matches Z
143 1.1 joerg template<class T> class Z {};
144 1.1 joerg </pre></td></tr>
145 1.1 joerg
146 1.1 joerg
147 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>>...</td></tr>
148 1.1 joerg <tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
149 1.1 joerg
150 1.1 joerg Given
151 1.1 joerg template<class T1, class T2, int I>
152 1.1 joerg class A {};
153 1.1 joerg
154 1.1 joerg template<class T, int I>
155 1.1 joerg class A<T, T*, I> {};
156 1.1 joerg
157 1.1 joerg template<>
158 1.1 joerg class A<int, int, 1> {};
159 1.1 joerg classTemplatePartialSpecializationDecl()
160 1.1 joerg matches the specialization A<T,T*,I> but not A<int,int,1>
161 1.1 joerg </pre></td></tr>
162 1.1 joerg
163 1.1 joerg
164 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>...</td></tr>
165 1.1 joerg <tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
166 1.1 joerg
167 1.1 joerg Given
168 1.1 joerg template<typename T> class A {};
169 1.1 joerg template<> class A<double> {};
170 1.1 joerg A<int> a;
171 1.1 joerg classTemplateSpecializationDecl()
172 1.1 joerg matches the specializations A<int> and A<double>
173 1.1 joerg </pre></td></tr>
174 1.1 joerg
175 1.1 joerg
176 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>>...</td></tr>
177 1.1 joerg <tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
178 1.1 joerg
179 1.1 joerg Example matches Foo::Foo() and Foo::Foo(int)
180 1.1 joerg class Foo {
181 1.1 joerg public:
182 1.1 joerg Foo();
183 1.1 joerg Foo(int);
184 1.1 joerg int DoSomething();
185 1.1 joerg };
186 1.1 joerg </pre></td></tr>
187 1.1 joerg
188 1.1 joerg
189 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>>...</td></tr>
190 1.1 joerg <tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
191 1.1 joerg
192 1.1 joerg Example matches the operator.
193 1.1 joerg class X { operator int() const; };
194 1.1 joerg </pre></td></tr>
195 1.1 joerg
196 1.1 joerg
197 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>>...</td></tr>
198 1.1 joerg <tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
199 1.1 joerg
200 1.1 joerg Example matches the deduction guide.
201 1.1 joerg template<typename T>
202 1.1 joerg class X { X(int) };
203 1.1 joerg X(int) -> X<int>;
204 1.1 joerg </pre></td></tr>
205 1.1 joerg
206 1.1 joerg
207 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>>...</td></tr>
208 1.1 joerg <tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
209 1.1 joerg
210 1.1 joerg Example matches Foo::~Foo()
211 1.1 joerg class Foo {
212 1.1 joerg public:
213 1.1 joerg virtual ~Foo();
214 1.1 joerg };
215 1.1 joerg </pre></td></tr>
216 1.1 joerg
217 1.1 joerg
218 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>...</td></tr>
219 1.1 joerg <tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
220 1.1 joerg
221 1.1 joerg Example matches y
222 1.1 joerg class X { void y(); };
223 1.1 joerg </pre></td></tr>
224 1.1 joerg
225 1.1 joerg
226 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>...</td></tr>
227 1.1 joerg <tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
228 1.1 joerg
229 1.1 joerg Example matches X, Z
230 1.1 joerg class X;
231 1.1 joerg template<class T> class Z {};
232 1.1 joerg </pre></td></tr>
233 1.1 joerg
234 1.1 joerg
235 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>...</td></tr>
236 1.1 joerg <tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
237 1.1 joerg
238 1.1 joerg Examples matches X, C, and the friend declaration inside C;
239 1.1 joerg void X();
240 1.1 joerg class C {
241 1.1 joerg friend X;
242 1.1 joerg };
243 1.1 joerg </pre></td></tr>
244 1.1 joerg
245 1.1 joerg
246 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>...</td></tr>
247 1.1 joerg <tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
248 1.1 joerg and non-type template parameter declarations).
249 1.1 joerg
250 1.1 joerg Given
251 1.1 joerg class X { int y; };
252 1.1 joerg declaratorDecl()
253 1.1 joerg matches int y.
254 1.1 joerg </pre></td></tr>
255 1.1 joerg
256 1.1 joerg
257 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>>...</td></tr>
258 1.1 joerg <tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
259 1.1 joerg
260 1.1 joerg Example matches A, B, C
261 1.1 joerg enum X {
262 1.1 joerg A, B, C
263 1.1 joerg };
264 1.1 joerg </pre></td></tr>
265 1.1 joerg
266 1.1 joerg
267 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>>...</td></tr>
268 1.1 joerg <tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
269 1.1 joerg
270 1.1 joerg Example matches X
271 1.1 joerg enum X {
272 1.1 joerg A, B, C
273 1.1 joerg };
274 1.1 joerg </pre></td></tr>
275 1.1 joerg
276 1.1 joerg
277 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>>...</td></tr>
278 1.1 joerg <tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
279 1.1 joerg
280 1.1 joerg Given
281 1.1 joerg class X { int m; };
282 1.1 joerg fieldDecl()
283 1.1 joerg matches 'm'.
284 1.1 joerg </pre></td></tr>
285 1.1 joerg
286 1.1 joerg
287 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>...</td></tr>
288 1.1 joerg <tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
289 1.1 joerg
290 1.1 joerg Given
291 1.1 joerg class X { friend void foo(); };
292 1.1 joerg friendDecl()
293 1.1 joerg matches 'friend void foo()'.
294 1.1 joerg </pre></td></tr>
295 1.1 joerg
296 1.1 joerg
297 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>...</td></tr>
298 1.1 joerg <tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
299 1.1 joerg
300 1.1 joerg Example matches f
301 1.1 joerg void f();
302 1.1 joerg </pre></td></tr>
303 1.1 joerg
304 1.1 joerg
305 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>>...</td></tr>
306 1.1 joerg <tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
307 1.1 joerg
308 1.1 joerg Example matches f
309 1.1 joerg template<class T> void f(T t) {}
310 1.1 joerg </pre></td></tr>
311 1.1 joerg
312 1.1 joerg
313 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>>...</td></tr>
314 1.1 joerg <tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
315 1.1 joerg
316 1.1 joerg Given
317 1.1 joerg struct X { struct { int a; }; };
318 1.1 joerg indirectFieldDecl()
319 1.1 joerg matches 'a'.
320 1.1 joerg </pre></td></tr>
321 1.1 joerg
322 1.1 joerg
323 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>>...</td></tr>
324 1.1 joerg <tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
325 1.1 joerg
326 1.1 joerg Given
327 1.1 joerg goto FOO;
328 1.1 joerg FOO: bar();
329 1.1 joerg labelDecl()
330 1.1 joerg matches 'FOO:'
331 1.1 joerg </pre></td></tr>
332 1.1 joerg
333 1.1 joerg
334 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>>...</td></tr>
335 1.1 joerg <tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
336 1.1 joerg
337 1.1 joerg Given
338 1.1 joerg extern "C" {}
339 1.1 joerg linkageSpecDecl()
340 1.1 joerg matches "extern "C" {}"
341 1.1 joerg </pre></td></tr>
342 1.1 joerg
343 1.1 joerg
344 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>>...</td></tr>
345 1.1 joerg <tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
346 1.1 joerg
347 1.1 joerg Example matches X, S, the anonymous union type, i, and U;
348 1.1 joerg typedef int X;
349 1.1 joerg struct S {
350 1.1 joerg union {
351 1.1 joerg int i;
352 1.1 joerg } U;
353 1.1 joerg };
354 1.1 joerg </pre></td></tr>
355 1.1 joerg
356 1.1 joerg
357 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>>...</td></tr>
358 1.1 joerg <tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
359 1.1 joerg
360 1.1 joerg Given
361 1.1 joerg namespace test {}
362 1.1 joerg namespace alias = ::test;
363 1.1 joerg namespaceAliasDecl()
364 1.1 joerg matches "namespace alias" but not "namespace test"
365 1.1 joerg </pre></td></tr>
366 1.1 joerg
367 1.1 joerg
368 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>>...</td></tr>
369 1.1 joerg <tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
370 1.1 joerg
371 1.1 joerg Given
372 1.1 joerg namespace {}
373 1.1 joerg namespace test {}
374 1.1 joerg namespaceDecl()
375 1.1 joerg matches "namespace {}" and "namespace test {}"
376 1.1 joerg </pre></td></tr>
377 1.1 joerg
378 1.1 joerg
379 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>>...</td></tr>
380 1.1 joerg <tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
381 1.1 joerg
382 1.1 joerg Given
383 1.1 joerg template <typename T, int N> struct C {};
384 1.1 joerg nonTypeTemplateParmDecl()
385 1.1 joerg matches 'N', but not 'T'.
386 1.1 joerg </pre></td></tr>
387 1.1 joerg
388 1.1 joerg
389 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>>...</td></tr>
390 1.1 joerg <tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
391 1.1 joerg
392 1.1 joerg Example matches Foo (Additions)
393 1.1 joerg @interface Foo (Additions)
394 1.1 joerg @end
395 1.1 joerg </pre></td></tr>
396 1.1 joerg
397 1.1 joerg
398 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>>...</td></tr>
399 1.1 joerg <tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
400 1.1 joerg
401 1.1 joerg Example matches Foo (Additions)
402 1.1 joerg @implementation Foo (Additions)
403 1.1 joerg @end
404 1.1 joerg </pre></td></tr>
405 1.1 joerg
406 1.1 joerg
407 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>>...</td></tr>
408 1.1 joerg <tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
409 1.1 joerg
410 1.1 joerg Example matches Foo
411 1.1 joerg @implementation Foo
412 1.1 joerg @end
413 1.1 joerg </pre></td></tr>
414 1.1 joerg
415 1.1 joerg
416 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>...</td></tr>
417 1.1 joerg <tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
418 1.1 joerg
419 1.1 joerg Example matches Foo
420 1.1 joerg @interface Foo
421 1.1 joerg @end
422 1.1 joerg </pre></td></tr>
423 1.1 joerg
424 1.1 joerg
425 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>>...</td></tr>
426 1.1 joerg <tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
427 1.1 joerg
428 1.1 joerg Example matches _enabled
429 1.1 joerg @implementation Foo {
430 1.1 joerg BOOL _enabled;
431 1.1 joerg }
432 1.1 joerg @end
433 1.1 joerg </pre></td></tr>
434 1.1 joerg
435 1.1 joerg
436 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>...</td></tr>
437 1.1 joerg <tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
438 1.1 joerg
439 1.1 joerg Example matches both declaration and definition of -[Foo method]
440 1.1 joerg @interface Foo
441 1.1 joerg - (void)method;
442 1.1 joerg @end
443 1.1 joerg
444 1.1 joerg @implementation Foo
445 1.1 joerg - (void)method {}
446 1.1 joerg @end
447 1.1 joerg </pre></td></tr>
448 1.1 joerg
449 1.1 joerg
450 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>...</td></tr>
451 1.1 joerg <tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
452 1.1 joerg
453 1.1 joerg Example matches enabled
454 1.1 joerg @interface Foo
455 1.1 joerg @property BOOL enabled;
456 1.1 joerg @end
457 1.1 joerg </pre></td></tr>
458 1.1 joerg
459 1.1 joerg
460 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>>...</td></tr>
461 1.1 joerg <tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
462 1.1 joerg
463 1.1 joerg Example matches FooDelegate
464 1.1 joerg @protocol FooDelegate
465 1.1 joerg @end
466 1.1 joerg </pre></td></tr>
467 1.1 joerg
468 1.1 joerg
469 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>>...</td></tr>
470 1.1 joerg <tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
471 1.1 joerg
472 1.1 joerg Given
473 1.1 joerg void f(int x);
474 1.1 joerg parmVarDecl()
475 1.1 joerg matches int x.
476 1.1 joerg </pre></td></tr>
477 1.1 joerg
478 1.1 joerg
479 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>>...</td></tr>
480 1.1 joerg <tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
481 1.1 joerg
482 1.1 joerg Example matches X, Z, U, and S
483 1.1 joerg class X;
484 1.1 joerg template<class T> class Z {};
485 1.1 joerg struct S {};
486 1.1 joerg union U {};
487 1.1 joerg </pre></td></tr>
488 1.1 joerg
489 1.1 joerg
490 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>>...</td></tr>
491 1.1 joerg <tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
492 1.1 joerg
493 1.1 joerg Example:
494 1.1 joerg staticAssertExpr()
495 1.1 joerg matches
496 1.1 joerg static_assert(sizeof(S) == sizeof(int))
497 1.1 joerg in
498 1.1 joerg struct S {
499 1.1 joerg int x;
500 1.1 joerg };
501 1.1 joerg static_assert(sizeof(S) == sizeof(int));
502 1.1 joerg </pre></td></tr>
503 1.1 joerg
504 1.1 joerg
505 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>>...</td></tr>
506 1.1 joerg <tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
507 1.1 joerg
508 1.1 joerg Given
509 1.1 joerg template <typename T, int N> struct C {};
510 1.1 joerg templateTypeParmDecl()
511 1.1 joerg matches 'T', but not 'N'.
512 1.1 joerg </pre></td></tr>
513 1.1 joerg
514 1.1 joerg
515 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>>...</td></tr>
516 1.1 joerg <tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
517 1.1 joerg
518 1.1 joerg Given
519 1.1 joerg int X;
520 1.1 joerg namespace NS {
521 1.1 joerg int Y;
522 1.1 joerg } // namespace NS
523 1.1 joerg decl(hasDeclContext(translationUnitDecl()))
524 1.1 joerg matches "int X", but not "int Y".
525 1.1 joerg </pre></td></tr>
526 1.1 joerg
527 1.1 joerg
528 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>>...</td></tr>
529 1.1 joerg <tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
530 1.1 joerg
531 1.1 joerg Given
532 1.1 joerg typedef int X;
533 1.1 joerg using Y = int;
534 1.1 joerg typeAliasDecl()
535 1.1 joerg matches "using Y = int", but not "typedef int X"
536 1.1 joerg </pre></td></tr>
537 1.1 joerg
538 1.1 joerg
539 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>>...</td></tr>
540 1.1 joerg <tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
541 1.1 joerg
542 1.1 joerg typeAliasTemplateDecl() matches
543 1.1 joerg template <typename T>
544 1.1 joerg using Y = X<T>;
545 1.1 joerg </pre></td></tr>
546 1.1 joerg
547 1.1 joerg
548 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>>...</td></tr>
549 1.1 joerg <tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
550 1.1 joerg
551 1.1 joerg Given
552 1.1 joerg typedef int X;
553 1.1 joerg using Y = int;
554 1.1 joerg typedefDecl()
555 1.1 joerg matches "typedef int X", but not "using Y = int"
556 1.1 joerg </pre></td></tr>
557 1.1 joerg
558 1.1 joerg
559 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>...</td></tr>
560 1.1 joerg <tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
561 1.1 joerg
562 1.1 joerg Given
563 1.1 joerg typedef int X;
564 1.1 joerg using Y = int;
565 1.1 joerg typedefNameDecl()
566 1.1 joerg matches "typedef int X" and "using Y = int"
567 1.1 joerg </pre></td></tr>
568 1.1 joerg
569 1.1 joerg
570 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>>...</td></tr>
571 1.1 joerg <tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
572 1.1 joerg typename.
573 1.1 joerg
574 1.1 joerg Given
575 1.1 joerg template <typename T>
576 1.1 joerg struct Base { typedef T Foo; };
577 1.1 joerg
578 1.1 joerg template<typename T>
579 1.1 joerg struct S : private Base<T> {
580 1.1 joerg using typename Base<T>::Foo;
581 1.1 joerg };
582 1.1 joerg unresolvedUsingTypenameDecl()
583 1.1 joerg matches using Base<T>::Foo </pre></td></tr>
584 1.1 joerg
585 1.1 joerg
586 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>>...</td></tr>
587 1.1 joerg <tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
588 1.1 joerg
589 1.1 joerg Given
590 1.1 joerg template<typename X>
591 1.1 joerg class C : private X {
592 1.1 joerg using X::x;
593 1.1 joerg };
594 1.1 joerg unresolvedUsingValueDecl()
595 1.1 joerg matches using X::x </pre></td></tr>
596 1.1 joerg
597 1.1 joerg
598 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>>...</td></tr>
599 1.1 joerg <tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
600 1.1 joerg
601 1.1 joerg Given
602 1.1 joerg namespace X { int x; }
603 1.1 joerg using X::x;
604 1.1 joerg usingDecl()
605 1.1 joerg matches using X::x </pre></td></tr>
606 1.1 joerg
607 1.1 joerg
608 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>>...</td></tr>
609 1.1 joerg <tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
610 1.1 joerg
611 1.1 joerg Given
612 1.1 joerg namespace X { int x; }
613 1.1 joerg using namespace X;
614 1.1 joerg usingDirectiveDecl()
615 1.1 joerg matches using namespace X </pre></td></tr>
616 1.1 joerg
617 1.1 joerg
618 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>...</td></tr>
619 1.1 joerg <tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
620 1.1 joerg
621 1.1 joerg Example matches A, B, C and F
622 1.1 joerg enum X { A, B, C };
623 1.1 joerg void F();
624 1.1 joerg </pre></td></tr>
625 1.1 joerg
626 1.1 joerg
627 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>...</td></tr>
628 1.1 joerg <tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
629 1.1 joerg
630 1.1 joerg Note: this does not match declarations of member variables, which are
631 1.1 joerg "field" declarations in Clang parlance.
632 1.1 joerg
633 1.1 joerg Example matches a
634 1.1 joerg int a;
635 1.1 joerg </pre></td></tr>
636 1.1 joerg
637 1.1 joerg
638 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>>...</td></tr>
639 1.1 joerg <tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
640 1.1 joerg </pre></td></tr>
641 1.1 joerg
642 1.1 joerg
643 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>>...</td></tr>
644 1.1 joerg <tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
645 1.1 joerg
646 1.1 joerg Given
647 1.1 joerg namespace ns {
648 1.1 joerg struct A { static void f(); };
649 1.1 joerg void A::f() {}
650 1.1 joerg void g() { A::f(); }
651 1.1 joerg }
652 1.1 joerg ns::A a;
653 1.1 joerg nestedNameSpecifier()
654 1.1 joerg matches "ns::" and both "A::"
655 1.1 joerg </pre></td></tr>
656 1.1 joerg
657 1.1 joerg
658 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>></td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>>...</td></tr>
659 1.1 joerg <tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
660 1.1 joerg
661 1.1 joerg Given
662 1.1 joerg
663 1.1 joerg #pragma omp parallel default(none)
664 1.1 joerg #pragma omp parallel default(shared)
665 1.1 joerg #pragma omp parallel
666 1.1 joerg
667 1.1 joerg ``ompDefaultClause()`` matches ``default(none)`` and ``default(shared)``.
668 1.1 joerg </pre></td></tr>
669 1.1 joerg
670 1.1 joerg
671 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>...</td></tr>
672 1.1 joerg <tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
673 1.1 joerg </pre></td></tr>
674 1.1 joerg
675 1.1 joerg
676 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>...</td></tr>
677 1.1 joerg <tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
678 1.1 joerg
679 1.1 joerg Given
680 1.1 joerg FOO: bar();
681 1.1 joerg void *ptr = &&FOO;
682 1.1 joerg goto *bar;
683 1.1 joerg addrLabelExpr()
684 1.1 joerg matches '&&FOO'
685 1.1 joerg </pre></td></tr>
686 1.1 joerg
687 1.1 joerg
688 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>>...</td></tr>
689 1.1 joerg <tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
690 1.1 joerg
691 1.1 joerg Given
692 1.1 joerg int i = a[1];
693 1.1 joerg arraySubscriptExpr()
694 1.1 joerg matches "a[1]"
695 1.1 joerg </pre></td></tr>
696 1.1 joerg
697 1.1 joerg
698 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>>...</td></tr>
699 1.1 joerg <tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
700 1.1 joerg
701 1.1 joerg int i = 100;
702 1.1 joerg __asm("mov al, 2");
703 1.1 joerg asmStmt()
704 1.1 joerg matches '__asm("mov al, 2")'
705 1.1 joerg </pre></td></tr>
706 1.1 joerg
707 1.1 joerg
708 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>>...</td></tr>
709 1.1 joerg <tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
710 1.1 joerg Example matches __atomic_load_n(ptr, 1)
711 1.1 joerg void foo() { int *ptr; __atomic_load_n(ptr, 1); }
712 1.1 joerg </pre></td></tr>
713 1.1 joerg
714 1.1 joerg
715 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>>...</td></tr>
716 1.1 joerg <tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
717 1.1 joerg
718 1.1 joerg Given
719 1.1 joerg @autoreleasepool {
720 1.1 joerg int x = 0;
721 1.1 joerg }
722 1.1 joerg autoreleasePoolStmt(stmt()) matches the declaration of "x"
723 1.1 joerg inside the autorelease pool.
724 1.1 joerg </pre></td></tr>
725 1.1 joerg
726 1.1 joerg
727 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>>...</td></tr>
728 1.1 joerg <tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
729 1.1 joerg
730 1.1 joerg Example matches a ?: b
731 1.1 joerg (a ?: b) + 42;
732 1.1 joerg </pre></td></tr>
733 1.1 joerg
734 1.1 joerg
735 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>>...</td></tr>
736 1.1 joerg <tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
737 1.1 joerg
738 1.1 joerg Example matches a || b
739 1.1 joerg !(a || b)
740 1.1 joerg </pre></td></tr>
741 1.1 joerg
742 1.1 joerg
743 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>>...</td></tr>
744 1.1 joerg <tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
745 1.1 joerg
746 1.1 joerg Example: matches "^{}":
747 1.1 joerg void f() { ^{}(); }
748 1.1 joerg </pre></td></tr>
749 1.1 joerg
750 1.1 joerg
751 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>>...</td></tr>
752 1.1 joerg <tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
753 1.1 joerg
754 1.1 joerg Given
755 1.1 joerg while (true) { break; }
756 1.1 joerg breakStmt()
757 1.1 joerg matches 'break'
758 1.1 joerg </pre></td></tr>
759 1.1 joerg
760 1.1 joerg
761 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>>...</td></tr>
762 1.1 joerg <tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
763 1.1 joerg
764 1.1 joerg Example: Matches (int) 2.2f in
765 1.1 joerg int i = (int) 2.2f;
766 1.1 joerg </pre></td></tr>
767 1.1 joerg
768 1.1 joerg
769 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>...</td></tr>
770 1.1 joerg <tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
771 1.1 joerg
772 1.1 joerg Example matches x.y() and y()
773 1.1 joerg X x;
774 1.1 joerg x.y();
775 1.1 joerg y();
776 1.1 joerg </pre></td></tr>
777 1.1 joerg
778 1.1 joerg
779 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>>...</td></tr>
780 1.1 joerg <tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
781 1.1 joerg
782 1.1 joerg Given
783 1.1 joerg switch(a) { case 42: break; default: break; }
784 1.1 joerg caseStmt()
785 1.1 joerg matches 'case 42:'.
786 1.1 joerg </pre></td></tr>
787 1.1 joerg
788 1.1 joerg
789 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>>...</td></tr>
790 1.1 joerg <tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
791 1.1 joerg
792 1.1 joerg Example: castExpr() matches each of the following:
793 1.1 joerg (int) 3;
794 1.1 joerg const_cast<Expr *>(SubExpr);
795 1.1 joerg char c = 0;
796 1.1 joerg but does not match
797 1.1 joerg int i = (0);
798 1.1 joerg int k = 0;
799 1.1 joerg </pre></td></tr>
800 1.1 joerg
801 1.1 joerg
802 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>...</td></tr>
803 1.1 joerg <tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
804 1.1 joerg
805 1.1 joerg Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
806 1.1 joerg though.
807 1.1 joerg
808 1.1 joerg Example matches 'a', L'a'
809 1.1 joerg char ch = 'a';
810 1.1 joerg wchar_t chw = L'a';
811 1.1 joerg </pre></td></tr>
812 1.1 joerg
813 1.1 joerg
814 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>>...</td></tr>
815 1.1 joerg <tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
816 1.1 joerg </pre></td></tr>
817 1.1 joerg
818 1.1 joerg
819 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>...</td></tr>
820 1.1 joerg <tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
821 1.1 joerg
822 1.1 joerg Example match: {1}, (1, 2)
823 1.1 joerg int array[4] = {1};
824 1.1 joerg vector int myvec = (vector int)(1, 2);
825 1.1 joerg </pre></td></tr>
826 1.1 joerg
827 1.1 joerg
828 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>>...</td></tr>
829 1.1 joerg <tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
830 1.1 joerg
831 1.1 joerg Example matches '{}' and '{{}}' in 'for (;;) {{}}'
832 1.1 joerg for (;;) {{}}
833 1.1 joerg </pre></td></tr>
834 1.1 joerg
835 1.1 joerg
836 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>>...</td></tr>
837 1.1 joerg <tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
838 1.1 joerg
839 1.1 joerg Example matches a ? b : c
840 1.1 joerg (a ? b : c) + 42
841 1.1 joerg </pre></td></tr>
842 1.1 joerg
843 1.1 joerg
844 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>>...</td></tr>
845 1.1 joerg <tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
846 1.1 joerg
847 1.1 joerg Example matches the constant in the case statement:
848 1.1 joerg (matcher = constantExpr())
849 1.1 joerg switch (a) {
850 1.1 joerg case 37: break;
851 1.1 joerg }
852 1.1 joerg </pre></td></tr>
853 1.1 joerg
854 1.1 joerg
855 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>>...</td></tr>
856 1.1 joerg <tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
857 1.1 joerg
858 1.1 joerg Given
859 1.1 joerg while (true) { continue; }
860 1.1 joerg continueStmt()
861 1.1 joerg matches 'continue'
862 1.1 joerg </pre></td></tr>
863 1.1 joerg
864 1.1 joerg
865 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>>...</td></tr>
866 1.1 joerg <tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
867 1.1 joerg
868 1.1 joerg Example matches,
869 1.1 joerg kernel<<<i,j>>>();
870 1.1 joerg </pre></td></tr>
871 1.1 joerg
872 1.1 joerg
873 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>>...</td></tr>
874 1.1 joerg <tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
875 1.1 joerg
876 1.1 joerg Example matches FunctionTakesString(GetStringByValue())
877 1.1 joerg (matcher = cxxBindTemporaryExpr())
878 1.1 joerg FunctionTakesString(GetStringByValue());
879 1.1 joerg FunctionTakesStringByPointer(GetStringPointer());
880 1.1 joerg </pre></td></tr>
881 1.1 joerg
882 1.1 joerg
883 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>...</td></tr>
884 1.1 joerg <tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
885 1.1 joerg
886 1.1 joerg Example matches true
887 1.1 joerg true
888 1.1 joerg </pre></td></tr>
889 1.1 joerg
890 1.1 joerg
891 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>>...</td></tr>
892 1.1 joerg <tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
893 1.1 joerg
894 1.1 joerg try {} catch(int i) {}
895 1.1 joerg cxxCatchStmt()
896 1.1 joerg matches 'catch(int i)'
897 1.1 joerg </pre></td></tr>
898 1.1 joerg
899 1.1 joerg
900 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>>...</td></tr>
901 1.1 joerg <tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
902 1.1 joerg
903 1.1 joerg Example: Matches const_cast<int*>(&r) in
904 1.1 joerg int n = 42;
905 1.1 joerg const int &r(n);
906 1.1 joerg int* p = const_cast<int*>(&r);
907 1.1 joerg </pre></td></tr>
908 1.1 joerg
909 1.1 joerg
910 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>...</td></tr>
911 1.1 joerg <tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
912 1.1 joerg
913 1.1 joerg Example matches string(ptr, n) and ptr within arguments of f
914 1.1 joerg (matcher = cxxConstructExpr())
915 1.1 joerg void f(const string &a, const string &b);
916 1.1 joerg char *ptr;
917 1.1 joerg int n;
918 1.1 joerg f(string(ptr, n), ptr);
919 1.1 joerg </pre></td></tr>
920 1.1 joerg
921 1.1 joerg
922 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>>...</td></tr>
923 1.1 joerg <tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
924 1.1 joerg
925 1.1 joerg Example matches the CXXDefaultArgExpr placeholder inserted for the
926 1.1 joerg default value of the second parameter in the call expression f(42)
927 1.1 joerg (matcher = cxxDefaultArgExpr())
928 1.1 joerg void f(int x, int y = 0);
929 1.1 joerg f(42);
930 1.1 joerg </pre></td></tr>
931 1.1 joerg
932 1.1 joerg
933 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>>...</td></tr>
934 1.1 joerg <tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
935 1.1 joerg
936 1.1 joerg Given
937 1.1 joerg delete X;
938 1.1 joerg cxxDeleteExpr()
939 1.1 joerg matches 'delete X'.
940 1.1 joerg </pre></td></tr>
941 1.1 joerg
942 1.1 joerg
943 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>>...</td></tr>
944 1.1 joerg <tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
945 1.1 joerg resolved because the base expression or the member name was dependent.
946 1.1 joerg
947 1.1 joerg Given
948 1.1 joerg template <class T> void f() { T t; t.g(); }
949 1.1 joerg cxxDependentScopeMemberExpr()
950 1.1 joerg matches t.g
951 1.1 joerg </pre></td></tr>
952 1.1 joerg
953 1.1 joerg
954 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>>...</td></tr>
955 1.1 joerg <tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
956 1.1 joerg
957 1.1 joerg Example:
958 1.1 joerg cxxDynamicCastExpr()
959 1.1 joerg matches
960 1.1 joerg dynamic_cast<D*>(&b);
961 1.1 joerg in
962 1.1 joerg struct B { virtual ~B() {} }; struct D : B {};
963 1.1 joerg B b;
964 1.1 joerg D* p = dynamic_cast<D*>(&b);
965 1.1 joerg </pre></td></tr>
966 1.1 joerg
967 1.1 joerg
968 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>>...</td></tr>
969 1.1 joerg <tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
970 1.1 joerg
971 1.1 joerg cxxForRangeStmt() matches 'for (auto a : i)'
972 1.1 joerg int i[] = {1, 2, 3}; for (auto a : i);
973 1.1 joerg for(int j = 0; j < 5; ++j);
974 1.1 joerg </pre></td></tr>
975 1.1 joerg
976 1.1 joerg
977 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>...</td></tr>
978 1.1 joerg <tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
979 1.1 joerg
980 1.1 joerg Example: Matches Foo(bar);
981 1.1 joerg Foo f = bar;
982 1.1 joerg Foo g = (Foo) bar;
983 1.1 joerg Foo h = Foo(bar);
984 1.1 joerg </pre></td></tr>
985 1.1 joerg
986 1.1 joerg
987 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr>
988 1.1 joerg <tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
989 1.1 joerg
990 1.1 joerg Example matches x.y()
991 1.1 joerg X x;
992 1.1 joerg x.y();
993 1.1 joerg </pre></td></tr>
994 1.1 joerg
995 1.1 joerg
996 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>...</td></tr>
997 1.1 joerg <tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
998 1.1 joerg
999 1.1 joerg Given
1000 1.1 joerg new X;
1001 1.1 joerg cxxNewExpr()
1002 1.1 joerg matches 'new X'.
1003 1.1 joerg </pre></td></tr>
1004 1.1 joerg
1005 1.1 joerg
1006 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>>...</td></tr>
1007 1.1 joerg <tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
1008 1.1 joerg </pre></td></tr>
1009 1.1 joerg
1010 1.1 joerg
1011 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr>
1012 1.1 joerg <tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
1013 1.1 joerg
1014 1.1 joerg Note that if an operator isn't overloaded, it won't match. Instead, use
1015 1.1 joerg binaryOperator matcher.
1016 1.1 joerg Currently it does not match operators such as new delete.
1017 1.1 joerg FIXME: figure out why these do not match?
1018 1.1 joerg
1019 1.1 joerg Example matches both operator<<((o << b), c) and operator<<(o, b)
1020 1.1 joerg (matcher = cxxOperatorCallExpr())
1021 1.1 joerg ostream &operator<< (ostream &out, int i) { };
1022 1.1 joerg ostream &o; int b = 1, c = 1;
1023 1.1 joerg o << b << c;
1024 1.1 joerg </pre></td></tr>
1025 1.1 joerg
1026 1.1 joerg
1027 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>>...</td></tr>
1028 1.1 joerg <tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
1029 1.1 joerg
1030 1.1 joerg Either the source expression or the destination type can be matched
1031 1.1 joerg using has(), but hasDestinationType() is more specific and can be
1032 1.1 joerg more readable.
1033 1.1 joerg
1034 1.1 joerg Example matches reinterpret_cast<char*>(&p) in
1035 1.1 joerg void* p = reinterpret_cast<char*>(&p);
1036 1.1 joerg </pre></td></tr>
1037 1.1 joerg
1038 1.1 joerg
1039 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>>...</td></tr>
1040 1.1 joerg <tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
1041 1.1 joerg
1042 1.1 joerg See also: hasDestinationType
1043 1.1 joerg See also: reinterpretCast
1044 1.1 joerg
1045 1.1 joerg Example:
1046 1.1 joerg cxxStaticCastExpr()
1047 1.1 joerg matches
1048 1.1 joerg static_cast<long>(8)
1049 1.1 joerg in
1050 1.1 joerg long eight(static_cast<long>(8));
1051 1.1 joerg </pre></td></tr>
1052 1.1 joerg
1053 1.1 joerg
1054 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>>...</td></tr>
1055 1.1 joerg <tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
1056 1.1 joerg
1057 1.1 joerg Given
1058 1.1 joerg std::vector<int> a({ 1, 2, 3 });
1059 1.1 joerg std::vector<int> b = { 4, 5 };
1060 1.1 joerg int c[] = { 6, 7 };
1061 1.1 joerg std::pair<int, int> d = { 8, 9 };
1062 1.1 joerg cxxStdInitializerListExpr()
1063 1.1 joerg matches "{ 1, 2, 3 }" and "{ 4, 5 }"
1064 1.1 joerg </pre></td></tr>
1065 1.1 joerg
1066 1.1 joerg
1067 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>...</td></tr>
1068 1.1 joerg <tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
1069 1.1 joerg
1070 1.1 joerg Example: Matches Foo(bar, bar)
1071 1.1 joerg Foo h = Foo(bar, bar);
1072 1.1 joerg </pre></td></tr>
1073 1.1 joerg
1074 1.1 joerg
1075 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>>...</td></tr>
1076 1.1 joerg <tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
1077 1.1 joerg
1078 1.1 joerg Example matches the implicit this expression in "return i".
1079 1.1 joerg (matcher = cxxThisExpr())
1080 1.1 joerg struct foo {
1081 1.1 joerg int i;
1082 1.1 joerg int f() { return i; }
1083 1.1 joerg };
1084 1.1 joerg </pre></td></tr>
1085 1.1 joerg
1086 1.1 joerg
1087 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>>...</td></tr>
1088 1.1 joerg <tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
1089 1.1 joerg
1090 1.1 joerg try { throw 5; } catch(int i) {}
1091 1.1 joerg cxxThrowExpr()
1092 1.1 joerg matches 'throw 5'
1093 1.1 joerg </pre></td></tr>
1094 1.1 joerg
1095 1.1 joerg
1096 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>>...</td></tr>
1097 1.1 joerg <tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
1098 1.1 joerg
1099 1.1 joerg try {} catch(int i) {}
1100 1.1 joerg cxxTryStmt()
1101 1.1 joerg matches 'try {}'
1102 1.1 joerg </pre></td></tr>
1103 1.1 joerg
1104 1.1 joerg
1105 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>...</td></tr>
1106 1.1 joerg <tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1107 1.1 joerg
1108 1.1 joerg Example matches T(t) in return statement of f
1109 1.1 joerg (matcher = cxxUnresolvedConstructExpr())
1110 1.1 joerg template <typename T>
1111 1.1 joerg void f(const T& t) { return T(t); }
1112 1.1 joerg </pre></td></tr>
1113 1.1 joerg
1114 1.1 joerg
1115 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>...</td></tr>
1116 1.1 joerg <tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1117 1.1 joerg
1118 1.1 joerg Example matches x in if (x)
1119 1.1 joerg bool x;
1120 1.1 joerg if (x) {}
1121 1.1 joerg </pre></td></tr>
1122 1.1 joerg
1123 1.1 joerg
1124 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>>...</td></tr>
1125 1.1 joerg <tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1126 1.1 joerg
1127 1.1 joerg Given
1128 1.1 joerg int a;
1129 1.1 joerg declStmt()
1130 1.1 joerg matches 'int a'.
1131 1.1 joerg </pre></td></tr>
1132 1.1 joerg
1133 1.1 joerg
1134 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>>...</td></tr>
1135 1.1 joerg <tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1136 1.1 joerg
1137 1.1 joerg Given
1138 1.1 joerg switch(a) { case 42: break; default: break; }
1139 1.1 joerg defaultStmt()
1140 1.1 joerg matches 'default:'.
1141 1.1 joerg </pre></td></tr>
1142 1.1 joerg
1143 1.1 joerg
1144 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>>...</td></tr>
1145 1.1 joerg <tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1146 1.1 joerg
1147 1.1 joerg Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1148 1.1 joerg point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1149 1.1 joerg </pre></td></tr>
1150 1.1 joerg
1151 1.1 joerg
1152 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>>...</td></tr>
1153 1.1 joerg <tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1154 1.1 joerg
1155 1.1 joerg Given
1156 1.1 joerg do {} while (true);
1157 1.1 joerg doStmt()
1158 1.1 joerg matches 'do {} while(true)'
1159 1.1 joerg </pre></td></tr>
1160 1.1 joerg
1161 1.1 joerg
1162 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>...</td></tr>
1163 1.1 joerg <tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1164 1.1 joerg
1165 1.1 joerg Matches any cast expression written in user code, whether it be a
1166 1.1 joerg C-style cast, a functional-style cast, or a keyword cast.
1167 1.1 joerg
1168 1.1 joerg Does not match implicit conversions.
1169 1.1 joerg
1170 1.1 joerg Note: the name "explicitCast" is chosen to match Clang's terminology, as
1171 1.1 joerg Clang uses the term "cast" to apply to implicit conversions as well as to
1172 1.1 joerg actual cast expressions.
1173 1.1 joerg
1174 1.1 joerg See also: hasDestinationType.
1175 1.1 joerg
1176 1.1 joerg Example: matches all five of the casts in
1177 1.1 joerg int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42)))))
1178 1.1 joerg but does not match the implicit conversion in
1179 1.1 joerg long ell = 42;
1180 1.1 joerg </pre></td></tr>
1181 1.1 joerg
1182 1.1 joerg
1183 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>...</td></tr>
1184 1.1 joerg <tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1185 1.1 joerg
1186 1.1 joerg Example matches x()
1187 1.1 joerg void f() { x(); }
1188 1.1 joerg </pre></td></tr>
1189 1.1 joerg
1190 1.1 joerg
1191 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>>...</td></tr>
1192 1.1 joerg <tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1193 1.1 joerg of the sub-expression's evaluation.
1194 1.1 joerg
1195 1.1 joerg Example matches std::string()
1196 1.1 joerg const std::string str = std::string();
1197 1.1 joerg </pre></td></tr>
1198 1.1 joerg
1199 1.1 joerg
1200 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>...</td></tr>
1201 1.1 joerg <tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
1202 1.1 joerg 1.0, 1.0f, 1.0L and 1e10.
1203 1.1 joerg
1204 1.1 joerg Does not match implicit conversions such as
1205 1.1 joerg float a = 10;
1206 1.1 joerg </pre></td></tr>
1207 1.1 joerg
1208 1.1 joerg
1209 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>>...</td></tr>
1210 1.1 joerg <tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1211 1.1 joerg
1212 1.1 joerg Example matches 'for (;;) {}'
1213 1.1 joerg for (;;) {}
1214 1.1 joerg int i[] = {1, 2, 3}; for (auto a : i);
1215 1.1 joerg </pre></td></tr>
1216 1.1 joerg
1217 1.1 joerg
1218 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>>...</td></tr>
1219 1.1 joerg <tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1220 1.1 joerg </pre></td></tr>
1221 1.1 joerg
1222 1.1 joerg
1223 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>>...</td></tr>
1224 1.1 joerg <tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1225 1.1 joerg
1226 1.1 joerg Given
1227 1.1 joerg goto FOO;
1228 1.1 joerg FOO: bar();
1229 1.1 joerg gotoStmt()
1230 1.1 joerg matches 'goto FOO'
1231 1.1 joerg </pre></td></tr>
1232 1.1 joerg
1233 1.1 joerg
1234 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>>...</td></tr>
1235 1.1 joerg <tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1236 1.1 joerg
1237 1.1 joerg Example matches 'if (x) {}'
1238 1.1 joerg if (x) {}
1239 1.1 joerg </pre></td></tr>
1240 1.1 joerg
1241 1.1 joerg
1242 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>>...</td></tr>
1243 1.1 joerg <tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
1244 1.1 joerg point literals e.g.: 1i, 1.0i
1245 1.1 joerg </pre></td></tr>
1246 1.1 joerg
1247 1.1 joerg
1248 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>>...</td></tr>
1249 1.1 joerg <tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1250 1.1 joerg
1251 1.1 joerg This matches many different places, including function call return value
1252 1.1 joerg eliding, as well as any type conversions.
1253 1.1 joerg </pre></td></tr>
1254 1.1 joerg
1255 1.1 joerg
1256 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>>...</td></tr>
1257 1.1 joerg <tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1258 1.1 joerg
1259 1.1 joerg Given
1260 1.1 joerg point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1261 1.1 joerg implicitValueInitExpr()
1262 1.1 joerg matches "[0].y" (implicitly)
1263 1.1 joerg </pre></td></tr>
1264 1.1 joerg
1265 1.1 joerg
1266 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>>...</td></tr>
1267 1.1 joerg <tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1268 1.1 joerg
1269 1.1 joerg Given
1270 1.1 joerg int a[] = { 1, 2 };
1271 1.1 joerg struct B { int x, y; };
1272 1.1 joerg B b = { 5, 6 };
1273 1.1 joerg initListExpr()
1274 1.1 joerg matches "{ 1, 2 }" and "{ 5, 6 }"
1275 1.1 joerg </pre></td></tr>
1276 1.1 joerg
1277 1.1 joerg
1278 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>...</td></tr>
1279 1.1 joerg <tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
1280 1.1 joerg 1, 1L, 0x1 and 1U.
1281 1.1 joerg
1282 1.1 joerg Does not match character-encoded integers such as L'a'.
1283 1.1 joerg </pre></td></tr>
1284 1.1 joerg
1285 1.1 joerg
1286 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>...</td></tr>
1287 1.1 joerg <tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1288 1.1 joerg
1289 1.1 joerg Given
1290 1.1 joerg goto FOO;
1291 1.1 joerg FOO: bar();
1292 1.1 joerg labelStmt()
1293 1.1 joerg matches 'FOO:'
1294 1.1 joerg </pre></td></tr>
1295 1.1 joerg
1296 1.1 joerg
1297 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>>...</td></tr>
1298 1.1 joerg <tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1299 1.1 joerg
1300 1.1 joerg Example matches [&](){return 5;}
1301 1.1 joerg [&](){return 5;}
1302 1.1 joerg </pre></td></tr>
1303 1.1 joerg
1304 1.1 joerg
1305 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>>...</td></tr>
1306 1.1 joerg <tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1307 1.1 joerg
1308 1.1 joerg Example: Given
1309 1.1 joerg struct T {void func();};
1310 1.1 joerg T f();
1311 1.1 joerg void g(T);
1312 1.1 joerg materializeTemporaryExpr() matches 'f()' in these statements
1313 1.1 joerg T u(f());
1314 1.1 joerg g(f());
1315 1.1 joerg f().func();
1316 1.1 joerg but does not match
1317 1.1 joerg f();
1318 1.1 joerg </pre></td></tr>
1319 1.1 joerg
1320 1.1 joerg
1321 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>...</td></tr>
1322 1.1 joerg <tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1323 1.1 joerg
1324 1.1 joerg Given
1325 1.1 joerg class Y {
1326 1.1 joerg void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
1327 1.1 joerg int a; static int b;
1328 1.1 joerg };
1329 1.1 joerg memberExpr()
1330 1.1 joerg matches this->x, x, y.x, a, this->b
1331 1.1 joerg </pre></td></tr>
1332 1.1 joerg
1333 1.1 joerg
1334 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>>...</td></tr>
1335 1.1 joerg <tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1336 1.1 joerg
1337 1.1 joerg foo();;
1338 1.1 joerg nullStmt()
1339 1.1 joerg matches the second ';'
1340 1.1 joerg </pre></td></tr>
1341 1.1 joerg
1342 1.1 joerg
1343 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>>...</td></tr>
1344 1.1 joerg <tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1345 1.1 joerg
1346 1.1 joerg Example matches @catch
1347 1.1 joerg @try {}
1348 1.1 joerg @catch (...) {}
1349 1.1 joerg </pre></td></tr>
1350 1.1 joerg
1351 1.1 joerg
1352 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>>...</td></tr>
1353 1.1 joerg <tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
1354 1.1 joerg
1355 1.1 joerg Example matches @finally
1356 1.1 joerg @try {}
1357 1.1 joerg @finally {}
1358 1.1 joerg </pre></td></tr>
1359 1.1 joerg
1360 1.1 joerg
1361 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>>...</td></tr>
1362 1.1 joerg <tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
1363 1.1 joerg
1364 1.1 joerg Example: matches "a" in "init" method:
1365 1.1 joerg @implementation A {
1366 1.1 joerg NSString *a;
1367 1.1 joerg }
1368 1.1 joerg - (void) init {
1369 1.1 joerg a = @"hello";
1370 1.1 joerg }
1371 1.1 joerg </pre></td></tr>
1372 1.1 joerg
1373 1.1 joerg
1374 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>>...</td></tr>
1375 1.1 joerg <tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1376 1.1 joerg
1377 1.1 joerg The innermost message send invokes the "alloc" class method on the
1378 1.1 joerg NSString class, while the outermost message send invokes the
1379 1.1 joerg "initWithString" instance method on the object returned from
1380 1.1 joerg NSString's "alloc". This matcher should match both message sends.
1381 1.1 joerg [[NSString alloc] initWithString:@"Hello"]
1382 1.1 joerg </pre></td></tr>
1383 1.1 joerg
1384 1.1 joerg
1385 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>>...</td></tr>
1386 1.1 joerg <tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
1387 1.1 joerg
1388 1.1 joerg Example matches @throw obj;
1389 1.1 joerg </pre></td></tr>
1390 1.1 joerg
1391 1.1 joerg
1392 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>>...</td></tr>
1393 1.1 joerg <tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
1394 1.1 joerg
1395 1.1 joerg Example matches @try
1396 1.1 joerg @try {}
1397 1.1 joerg @catch (...) {}
1398 1.1 joerg </pre></td></tr>
1399 1.1 joerg
1400 1.1 joerg
1401 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>>...</td></tr>
1402 1.1 joerg <tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
1403 1.1 joerg
1404 1.1 joerg Given
1405 1.1 joerg
1406 1.1 joerg #pragma omp parallel
1407 1.1 joerg #pragma omp parallel default(none)
1408 1.1 joerg #pragma omp taskyield
1409 1.1 joerg
1410 1.1 joerg ``ompExecutableDirective()`` matches ``omp parallel``,
1411 1.1 joerg ``omp parallel default(none)`` and ``omp taskyield``.
1412 1.1 joerg </pre></td></tr>
1413 1.1 joerg
1414 1.1 joerg
1415 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>>...</td></tr>
1416 1.1 joerg <tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
1417 1.1 joerg to reference another expressions and can be met
1418 1.1 joerg in BinaryConditionalOperators, for example.
1419 1.1 joerg
1420 1.1 joerg Example matches 'a'
1421 1.1 joerg (a ?: c) + 42;
1422 1.1 joerg </pre></td></tr>
1423 1.1 joerg
1424 1.1 joerg
1425 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>>...</td></tr>
1426 1.1 joerg <tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
1427 1.1 joerg
1428 1.1 joerg Example matches (foo() + 1)
1429 1.1 joerg int foo() { return 1; }
1430 1.1 joerg int a = (foo() + 1);
1431 1.1 joerg </pre></td></tr>
1432 1.1 joerg
1433 1.1 joerg
1434 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>>...</td></tr>
1435 1.1 joerg <tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
1436 1.1 joerg ParenListExprs don't have a predefined type and are used for late parsing.
1437 1.1 joerg In the final AST, they can be met in template declarations.
1438 1.1 joerg
1439 1.1 joerg Given
1440 1.1 joerg template<typename T> class X {
1441 1.1 joerg void f() {
1442 1.1 joerg X x(*this);
1443 1.1 joerg int a = 0, b = 1; int i = (a, b);
1444 1.1 joerg }
1445 1.1 joerg };
1446 1.1 joerg parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
1447 1.1 joerg has a predefined type and is a ParenExpr, not a ParenListExpr.
1448 1.1 joerg </pre></td></tr>
1449 1.1 joerg
1450 1.1 joerg
1451 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>>...</td></tr>
1452 1.1 joerg <tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
1453 1.1 joerg
1454 1.1 joerg Example: Matches __func__
1455 1.1 joerg printf("%s", __func__);
1456 1.1 joerg </pre></td></tr>
1457 1.1 joerg
1458 1.1 joerg
1459 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>>...</td></tr>
1460 1.1 joerg <tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
1461 1.1 joerg
1462 1.1 joerg Given
1463 1.1 joerg return 1;
1464 1.1 joerg returnStmt()
1465 1.1 joerg matches 'return 1'
1466 1.1 joerg </pre></td></tr>
1467 1.1 joerg
1468 1.1 joerg
1469 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>...</td></tr>
1470 1.1 joerg <tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
1471 1.1 joerg
1472 1.1 joerg Given
1473 1.1 joerg { ++a; }
1474 1.1 joerg stmt()
1475 1.1 joerg matches both the compound statement '{ ++a; }' and '++a'.
1476 1.1 joerg </pre></td></tr>
1477 1.1 joerg
1478 1.1 joerg
1479 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>>...</td></tr>
1480 1.1 joerg <tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
1481 1.1 joerg
1482 1.1 joerg Example match: ({ int X = 4; X; })
1483 1.1 joerg int C = ({ int X = 4; X; });
1484 1.1 joerg </pre></td></tr>
1485 1.1 joerg
1486 1.1 joerg
1487 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>>...</td></tr>
1488 1.1 joerg <tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
1489 1.1 joerg
1490 1.1 joerg Example matches "abcd", L"abcd"
1491 1.1 joerg char *s = "abcd";
1492 1.1 joerg wchar_t *ws = L"abcd";
1493 1.1 joerg </pre></td></tr>
1494 1.1 joerg
1495 1.1 joerg
1496 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>>...</td></tr>
1497 1.1 joerg <tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
1498 1.1 joerg
1499 1.1 joerg Given
1500 1.1 joerg template <int N>
1501 1.1 joerg struct A { static const int n = N; };
1502 1.1 joerg struct B : public A<42> {};
1503 1.1 joerg substNonTypeTemplateParmExpr()
1504 1.1 joerg matches "N" in the right-hand side of "static const int n = N;"
1505 1.1 joerg </pre></td></tr>
1506 1.1 joerg
1507 1.1 joerg
1508 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>>...</td></tr>
1509 1.1 joerg <tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1510 1.1 joerg
1511 1.1 joerg Given
1512 1.1 joerg switch(a) { case 42: break; default: break; }
1513 1.1 joerg switchCase()
1514 1.1 joerg matches 'case 42:' and 'default:'.
1515 1.1 joerg </pre></td></tr>
1516 1.1 joerg
1517 1.1 joerg
1518 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>>...</td></tr>
1519 1.1 joerg <tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1520 1.1 joerg
1521 1.1 joerg Given
1522 1.1 joerg switch(a) { case 42: break; default: break; }
1523 1.1 joerg switchStmt()
1524 1.1 joerg matches 'switch(a)'.
1525 1.1 joerg </pre></td></tr>
1526 1.1 joerg
1527 1.1 joerg
1528 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>>...</td></tr>
1529 1.1 joerg <tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1530 1.1 joerg
1531 1.1 joerg Given
1532 1.1 joerg Foo x = bar;
1533 1.1 joerg int y = sizeof(x) + alignof(x);
1534 1.1 joerg unaryExprOrTypeTraitExpr()
1535 1.1 joerg matches sizeof(x) and alignof(x)
1536 1.1 joerg </pre></td></tr>
1537 1.1 joerg
1538 1.1 joerg
1539 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>>...</td></tr>
1540 1.1 joerg <tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1541 1.1 joerg
1542 1.1 joerg Example matches !a
1543 1.1 joerg !a || b
1544 1.1 joerg </pre></td></tr>
1545 1.1 joerg
1546 1.1 joerg
1547 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>>...</td></tr>
1548 1.1 joerg <tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
1549 1.1 joerg but could not be resolved to a specific declaration.
1550 1.1 joerg
1551 1.1 joerg Given
1552 1.1 joerg template<typename T>
1553 1.1 joerg T foo() { T a; return a; }
1554 1.1 joerg template<typename T>
1555 1.1 joerg void bar() {
1556 1.1 joerg foo<T>();
1557 1.1 joerg }
1558 1.1 joerg unresolvedLookupExpr()
1559 1.1 joerg matches foo<T>() </pre></td></tr>
1560 1.1 joerg
1561 1.1 joerg
1562 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>>...</td></tr>
1563 1.1 joerg <tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
1564 1.1 joerg
1565 1.1 joerg Given
1566 1.1 joerg struct X {
1567 1.1 joerg template <class T> void f();
1568 1.1 joerg void g();
1569 1.1 joerg };
1570 1.1 joerg template <class T> void h() { X x; x.f<T>(); x.g(); }
1571 1.1 joerg unresolvedMemberExpr()
1572 1.1 joerg matches x.f<T>
1573 1.1 joerg </pre></td></tr>
1574 1.1 joerg
1575 1.1 joerg
1576 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>>...</td></tr>
1577 1.1 joerg <tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1578 1.1 joerg
1579 1.1 joerg Example match: "foo"_suffix
1580 1.1 joerg </pre></td></tr>
1581 1.1 joerg
1582 1.1 joerg
1583 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>>...</td></tr>
1584 1.1 joerg <tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1585 1.1 joerg
1586 1.1 joerg Given
1587 1.1 joerg while (true) {}
1588 1.1 joerg whileStmt()
1589 1.1 joerg matches 'while (true) {}'.
1590 1.1 joerg </pre></td></tr>
1591 1.1 joerg
1592 1.1 joerg
1593 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>>...</td></tr>
1594 1.1 joerg <tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1595 1.1 joerg
1596 1.1 joerg Given
1597 1.1 joerg template <typename T> struct C {};
1598 1.1 joerg C<int> c;
1599 1.1 joerg templateArgument()
1600 1.1 joerg matches 'int' in C<int>.
1601 1.1 joerg </pre></td></tr>
1602 1.1 joerg
1603 1.1 joerg
1604 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>></td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>>...</td></tr>
1605 1.1 joerg <tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
1606 1.1 joerg
1607 1.1 joerg Given
1608 1.1 joerg template <typename T> class X { };
1609 1.1 joerg X<int> xi;
1610 1.1 joerg templateName()
1611 1.1 joerg matches 'X' in X<int>.
1612 1.1 joerg </pre></td></tr>
1613 1.1 joerg
1614 1.1 joerg
1615 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>...</td></tr>
1616 1.1 joerg <tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1617 1.1 joerg </pre></td></tr>
1618 1.1 joerg
1619 1.1 joerg
1620 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>...</td></tr>
1621 1.1 joerg <tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1622 1.1 joerg
1623 1.1 joerg Given
1624 1.1 joerg int a[] = { 2, 3 };
1625 1.1 joerg int b[4];
1626 1.1 joerg void f() { int c[a[0]]; }
1627 1.1 joerg arrayType()
1628 1.1 joerg matches "int a[]", "int b[4]" and "int c[a[0]]";
1629 1.1 joerg </pre></td></tr>
1630 1.1 joerg
1631 1.1 joerg
1632 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>>...</td></tr>
1633 1.1 joerg <tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1634 1.1 joerg
1635 1.1 joerg Given
1636 1.1 joerg _Atomic(int) i;
1637 1.1 joerg atomicType()
1638 1.1 joerg matches "_Atomic(int) i"
1639 1.1 joerg </pre></td></tr>
1640 1.1 joerg
1641 1.1 joerg
1642 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>>...</td></tr>
1643 1.1 joerg <tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1644 1.1 joerg
1645 1.1 joerg Given:
1646 1.1 joerg auto n = 4;
1647 1.1 joerg int v[] = { 2, 3 }
1648 1.1 joerg for (auto i : v) { }
1649 1.1 joerg autoType()
1650 1.1 joerg matches "auto n" and "auto i"
1651 1.1 joerg </pre></td></tr>
1652 1.1 joerg
1653 1.1 joerg
1654 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>...</td></tr>
1655 1.1 joerg <tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1656 1.1 joerg "void (^)(int)".
1657 1.1 joerg
1658 1.1 joerg The pointee is always required to be a FunctionType.
1659 1.1 joerg </pre></td></tr>
1660 1.1 joerg
1661 1.1 joerg
1662 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>>...</td></tr>
1663 1.1 joerg <tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1664 1.1 joerg
1665 1.1 joerg Given
1666 1.1 joerg struct A {};
1667 1.1 joerg A a;
1668 1.1 joerg int b;
1669 1.1 joerg float c;
1670 1.1 joerg bool d;
1671 1.1 joerg builtinType()
1672 1.1 joerg matches "int b", "float c" and "bool d"
1673 1.1 joerg </pre></td></tr>
1674 1.1 joerg
1675 1.1 joerg
1676 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>>...</td></tr>
1677 1.1 joerg <tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1678 1.1 joerg
1679 1.1 joerg Given
1680 1.1 joerg _Complex float f;
1681 1.1 joerg complexType()
1682 1.1 joerg matches "_Complex float f"
1683 1.1 joerg </pre></td></tr>
1684 1.1 joerg
1685 1.1 joerg
1686 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>>...</td></tr>
1687 1.1 joerg <tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1688 1.1 joerg
1689 1.1 joerg Given
1690 1.1 joerg void() {
1691 1.1 joerg int a[2];
1692 1.1 joerg int b[] = { 2, 3 };
1693 1.1 joerg int c[b[0]];
1694 1.1 joerg }
1695 1.1 joerg constantArrayType()
1696 1.1 joerg matches "int a[2]"
1697 1.1 joerg </pre></td></tr>
1698 1.1 joerg
1699 1.1 joerg
1700 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>>...</td></tr>
1701 1.1 joerg <tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1702 1.1 joerg Example matches i[] in declaration of f.
1703 1.1 joerg (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1704 1.1 joerg Example matches i[1].
1705 1.1 joerg (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1706 1.1 joerg void f(int i[]) {
1707 1.1 joerg i[1] = 0;
1708 1.1 joerg }
1709 1.1 joerg </pre></td></tr>
1710 1.1 joerg
1711 1.1 joerg
1712 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>>...</td></tr>
1713 1.1 joerg <tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(<expr>) types.
1714 1.1 joerg
1715 1.1 joerg Given:
1716 1.1 joerg short i = 1;
1717 1.1 joerg int j = 42;
1718 1.1 joerg decltype(i + j) result = i + j;
1719 1.1 joerg decltypeType()
1720 1.1 joerg matches "decltype(i + j)"
1721 1.1 joerg </pre></td></tr>
1722 1.1 joerg
1723 1.1 joerg
1724 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>>...</td></tr>
1725 1.1 joerg <tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1726 1.1 joerg
1727 1.1 joerg Given
1728 1.1 joerg template<typename T, int Size>
1729 1.1 joerg class array {
1730 1.1 joerg T data[Size];
1731 1.1 joerg };
1732 1.1 joerg dependentSizedArrayType
1733 1.1 joerg matches "T data[Size]"
1734 1.1 joerg </pre></td></tr>
1735 1.1 joerg
1736 1.1 joerg
1737 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>>...</td></tr>
1738 1.1 joerg <tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1739 1.1 joerg qualified name.
1740 1.1 joerg
1741 1.1 joerg Given
1742 1.1 joerg namespace N {
1743 1.1 joerg namespace M {
1744 1.1 joerg class D {};
1745 1.1 joerg }
1746 1.1 joerg }
1747 1.1 joerg class C {};
1748 1.1 joerg
1749 1.1 joerg class C c;
1750 1.1 joerg N::M::D d;
1751 1.1 joerg
1752 1.1 joerg elaboratedType() matches the type of the variable declarations of both
1753 1.1 joerg c and d.
1754 1.1 joerg </pre></td></tr>
1755 1.1 joerg
1756 1.1 joerg
1757 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>...</td></tr>
1758 1.1 joerg <tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
1759 1.1 joerg
1760 1.1 joerg Given
1761 1.1 joerg enum C { Green };
1762 1.1 joerg enum class S { Red };
1763 1.1 joerg
1764 1.1 joerg C c;
1765 1.1 joerg S s;
1766 1.1 joerg
1767 1.1 joerg enumType() matches the type of the variable declarations of both c and
1768 1.1 joerg s.
1769 1.1 joerg </pre></td></tr>
1770 1.1 joerg
1771 1.1 joerg
1772 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>>...</td></tr>
1773 1.1 joerg <tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1774 1.1 joerg
1775 1.1 joerg Given
1776 1.1 joerg int (*f)(int);
1777 1.1 joerg void g();
1778 1.1 joerg functionProtoType()
1779 1.1 joerg matches "int (*f)(int)" and the type of "g" in C++ mode.
1780 1.1 joerg In C mode, "g" is not matched because it does not contain a prototype.
1781 1.1 joerg </pre></td></tr>
1782 1.1 joerg
1783 1.1 joerg
1784 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>>...</td></tr>
1785 1.1 joerg <tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1786 1.1 joerg
1787 1.1 joerg Given
1788 1.1 joerg int (*f)(int);
1789 1.1 joerg void g();
1790 1.1 joerg functionType()
1791 1.1 joerg matches "int (*f)(int)" and the type of "g".
1792 1.1 joerg </pre></td></tr>
1793 1.1 joerg
1794 1.1 joerg
1795 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>>...</td></tr>
1796 1.1 joerg <tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1797 1.1 joerg
1798 1.1 joerg Given
1799 1.1 joerg int a[] = { 2, 3 };
1800 1.1 joerg int b[42];
1801 1.1 joerg void f(int c[]) { int d[a[0]]; };
1802 1.1 joerg incompleteArrayType()
1803 1.1 joerg matches "int a[]" and "int c[]"
1804 1.1 joerg </pre></td></tr>
1805 1.1 joerg
1806 1.1 joerg
1807 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>...</td></tr>
1808 1.1 joerg <tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1809 1.1 joerg
1810 1.1 joerg Example matches S s, but not S<T> s.
1811 1.1 joerg (matcher = parmVarDecl(hasType(injectedClassNameType())))
1812 1.1 joerg template <typename T> struct S {
1813 1.1 joerg void f(S s);
1814 1.1 joerg void g(S<T> s);
1815 1.1 joerg };
1816 1.1 joerg </pre></td></tr>
1817 1.1 joerg
1818 1.1 joerg
1819 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>>...</td></tr>
1820 1.1 joerg <tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1821 1.1 joerg
1822 1.1 joerg Given:
1823 1.1 joerg int *a;
1824 1.1 joerg int &b = *a;
1825 1.1 joerg int &&c = 1;
1826 1.1 joerg auto &d = b;
1827 1.1 joerg auto &&e = c;
1828 1.1 joerg auto &&f = 2;
1829 1.1 joerg int g = 5;
1830 1.1 joerg
1831 1.1 joerg lValueReferenceType() matches the types of b, d, and e. e is
1832 1.1 joerg matched since the type is deduced as int& by reference collapsing rules.
1833 1.1 joerg </pre></td></tr>
1834 1.1 joerg
1835 1.1 joerg
1836 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>...</td></tr>
1837 1.1 joerg <tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1838 1.1 joerg Given
1839 1.1 joerg struct A { int i; }
1840 1.1 joerg A::* ptr = A::i;
1841 1.1 joerg memberPointerType()
1842 1.1 joerg matches "A::* ptr"
1843 1.1 joerg </pre></td></tr>
1844 1.1 joerg
1845 1.1 joerg
1846 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>>...</td></tr>
1847 1.1 joerg <tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1848 1.1 joerg a pointer type, despite being syntactically similar.
1849 1.1 joerg
1850 1.1 joerg Given
1851 1.1 joerg int *a;
1852 1.1 joerg
1853 1.1 joerg @interface Foo
1854 1.1 joerg @end
1855 1.1 joerg Foo *f;
1856 1.1 joerg pointerType()
1857 1.1 joerg matches "Foo *f", but does not match "int *a".
1858 1.1 joerg </pre></td></tr>
1859 1.1 joerg
1860 1.1 joerg
1861 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>>...</td></tr>
1862 1.1 joerg <tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1863 1.1 joerg
1864 1.1 joerg Given
1865 1.1 joerg int (*ptr_to_array)[4];
1866 1.1 joerg int *array_of_ptrs[4];
1867 1.1 joerg
1868 1.1 joerg varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1869 1.1 joerg array_of_ptrs.
1870 1.1 joerg </pre></td></tr>
1871 1.1 joerg
1872 1.1 joerg
1873 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>...</td></tr>
1874 1.1 joerg <tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1875 1.1 joerg types.
1876 1.1 joerg
1877 1.1 joerg Given
1878 1.1 joerg int *a;
1879 1.1 joerg int &b = *a;
1880 1.1 joerg int c = 5;
1881 1.1 joerg
1882 1.1 joerg @interface Foo
1883 1.1 joerg @end
1884 1.1 joerg Foo *f;
1885 1.1 joerg pointerType()
1886 1.1 joerg matches "int *a", but does not match "Foo *f".
1887 1.1 joerg </pre></td></tr>
1888 1.1 joerg
1889 1.1 joerg
1890 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>>...</td></tr>
1891 1.1 joerg <tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1892 1.1 joerg
1893 1.1 joerg Given:
1894 1.1 joerg int *a;
1895 1.1 joerg int &b = *a;
1896 1.1 joerg int &&c = 1;
1897 1.1 joerg auto &d = b;
1898 1.1 joerg auto &&e = c;
1899 1.1 joerg auto &&f = 2;
1900 1.1 joerg int g = 5;
1901 1.1 joerg
1902 1.1 joerg rValueReferenceType() matches the types of c and f. e is not
1903 1.1 joerg matched as it is deduced to int& by reference collapsing rules.
1904 1.1 joerg </pre></td></tr>
1905 1.1 joerg
1906 1.1 joerg
1907 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>...</td></tr>
1908 1.1 joerg <tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1909 1.1 joerg
1910 1.1 joerg Given
1911 1.1 joerg class C {};
1912 1.1 joerg struct S {};
1913 1.1 joerg
1914 1.1 joerg C c;
1915 1.1 joerg S s;
1916 1.1 joerg
1917 1.1 joerg recordType() matches the type of the variable declarations of both c
1918 1.1 joerg and s.
1919 1.1 joerg </pre></td></tr>
1920 1.1 joerg
1921 1.1 joerg
1922 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>...</td></tr>
1923 1.1 joerg <tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1924 1.1 joerg
1925 1.1 joerg Given
1926 1.1 joerg int *a;
1927 1.1 joerg int &b = *a;
1928 1.1 joerg int &&c = 1;
1929 1.1 joerg auto &d = b;
1930 1.1 joerg auto &&e = c;
1931 1.1 joerg auto &&f = 2;
1932 1.1 joerg int g = 5;
1933 1.1 joerg
1934 1.1 joerg referenceType() matches the types of b, c, d, e, and f.
1935 1.1 joerg </pre></td></tr>
1936 1.1 joerg
1937 1.1 joerg
1938 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>>...</td></tr>
1939 1.1 joerg <tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
1940 1.1 joerg template type parameter.
1941 1.1 joerg
1942 1.1 joerg Given
1943 1.1 joerg template <typename T>
1944 1.1 joerg void F(T t) {
1945 1.1 joerg int i = 1 + t;
1946 1.1 joerg }
1947 1.1 joerg
1948 1.1 joerg substTemplateTypeParmType() matches the type of 't' but not '1'
1949 1.1 joerg </pre></td></tr>
1950 1.1 joerg
1951 1.1 joerg
1952 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>...</td></tr>
1953 1.1 joerg <tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
1954 1.1 joerg
1955 1.1 joerg Given
1956 1.1 joerg enum E {};
1957 1.1 joerg class C {};
1958 1.1 joerg
1959 1.1 joerg E e;
1960 1.1 joerg C c;
1961 1.1 joerg
1962 1.1 joerg tagType() matches the type of the variable declarations of both e
1963 1.1 joerg and c.
1964 1.1 joerg </pre></td></tr>
1965 1.1 joerg
1966 1.1 joerg
1967 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>...</td></tr>
1968 1.1 joerg <tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1969 1.1 joerg
1970 1.1 joerg Given
1971 1.1 joerg template <typename T>
1972 1.1 joerg class C { };
1973 1.1 joerg
1974 1.1 joerg template class C<int>; // A
1975 1.1 joerg C<char> var; // B
1976 1.1 joerg
1977 1.1 joerg templateSpecializationType() matches the type of the explicit
1978 1.1 joerg instantiation in A and the type of the variable declaration in B.
1979 1.1 joerg </pre></td></tr>
1980 1.1 joerg
1981 1.1 joerg
1982 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>...</td></tr>
1983 1.1 joerg <tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
1984 1.1 joerg
1985 1.1 joerg Example matches T, but not int.
1986 1.1 joerg (matcher = templateTypeParmType())
1987 1.1 joerg template <typename T> void f(int i);
1988 1.1 joerg </pre></td></tr>
1989 1.1 joerg
1990 1.1 joerg
1991 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>>...</td></tr>
1992 1.1 joerg <tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1993 1.1 joerg </pre></td></tr>
1994 1.1 joerg
1995 1.1 joerg
1996 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>...</td></tr>
1997 1.1 joerg <tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1998 1.1 joerg
1999 1.1 joerg Given
2000 1.1 joerg typedef int X;
2001 1.1 joerg typedefType()
2002 1.1 joerg matches "typedef int X"
2003 1.1 joerg </pre></td></tr>
2004 1.1 joerg
2005 1.1 joerg
2006 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>>...</td></tr>
2007 1.1 joerg <tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
2008 1.1 joerg
2009 1.1 joerg Given:
2010 1.1 joerg typedef __underlying_type(T) type;
2011 1.1 joerg unaryTransformType()
2012 1.1 joerg matches "__underlying_type(T)"
2013 1.1 joerg </pre></td></tr>
2014 1.1 joerg
2015 1.1 joerg
2016 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>>...</td></tr>
2017 1.1 joerg <tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
2018 1.1 joerg integer-constant-expression.
2019 1.1 joerg
2020 1.1 joerg Given
2021 1.1 joerg void f() {
2022 1.1 joerg int a[] = { 2, 3 }
2023 1.1 joerg int b[42];
2024 1.1 joerg int c[a[0]];
2025 1.1 joerg }
2026 1.1 joerg variableArrayType()
2027 1.1 joerg matches "int c[a[0]]"
2028 1.1 joerg </pre></td></tr>
2029 1.1 joerg
2030 1.1 joerg <!--END_DECL_MATCHERS -->
2031 1.1 joerg </table>
2032 1.1 joerg
2033 1.1 joerg <!-- ======================================================================= -->
2034 1.1 joerg <h2 id="narrowing-matchers">Narrowing Matchers</h2>
2035 1.1 joerg <!-- ======================================================================= -->
2036 1.1 joerg
2037 1.1 joerg <p>Narrowing matchers match certain attributes on the current node, thus
2038 1.1 joerg narrowing down the set of nodes of the current type to match on.</p>
2039 1.1 joerg
2040 1.1 joerg <p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
2041 1.1 joerg which allow users to create more powerful match expressions.</p>
2042 1.1 joerg
2043 1.1 joerg <table>
2044 1.1 joerg <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2045 1.1 joerg <!-- START_NARROWING_MATCHERS -->
2046 1.1 joerg
2047 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr>
2048 1.1 joerg <tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
2049 1.1 joerg
2050 1.1 joerg Usable as: Any Matcher
2051 1.1 joerg </pre></td></tr>
2052 1.1 joerg
2053 1.1 joerg
2054 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr>
2055 1.1 joerg <tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
2056 1.1 joerg
2057 1.1 joerg Usable as: Any Matcher
2058 1.1 joerg </pre></td></tr>
2059 1.1 joerg
2060 1.1 joerg
2061 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
2062 1.1 joerg <tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
2063 1.1 joerg
2064 1.1 joerg Useful when another matcher requires a child matcher, but there's no
2065 1.1 joerg additional constraint. This will often be used with an explicit conversion
2066 1.1 joerg to an internal::Matcher<> type such as TypeMatcher.
2067 1.1 joerg
2068 1.1 joerg Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
2069 1.1 joerg "int* p" and "void f()" in
2070 1.1 joerg int* p;
2071 1.1 joerg void f();
2072 1.1 joerg
2073 1.1 joerg Usable as: Any Matcher
2074 1.1 joerg </pre></td></tr>
2075 1.1 joerg
2076 1.1 joerg
2077 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr>
2078 1.1 joerg <tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
2079 1.1 joerg
2080 1.1 joerg Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
2081 1.1 joerg class X {};
2082 1.1 joerg class Y {};
2083 1.1 joerg
2084 1.1 joerg Usable as: Any Matcher
2085 1.1 joerg </pre></td></tr>
2086 1.1 joerg
2087 1.1 joerg
2088 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
2089 1.1 joerg <tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
2090 1.1 joerg unary).
2091 1.1 joerg
2092 1.1 joerg Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2093 1.1 joerg !(a || b)
2094 1.1 joerg </pre></td></tr>
2095 1.1 joerg
2096 1.1 joerg
2097 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr>
2098 1.1 joerg <tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
2099 1.1 joerg
2100 1.1 joerg Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2101 1.1 joerg if (a == b)
2102 1.1 joerg a += b;
2103 1.1 joerg
2104 1.1 joerg Example 2: matches s1 = s2
2105 1.1 joerg (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2106 1.1 joerg struct S { S& operator=(const S&); };
2107 1.1 joerg void x() { S s1, s2; s1 = s2; })
2108 1.1 joerg </pre></td></tr>
2109 1.1 joerg
2110 1.1 joerg
2111 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr>
2112 1.1 joerg <tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
2113 1.1 joerg
2114 1.1 joerg
2115 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT Value</td></tr>
2116 1.1 joerg <tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
2117 1.1 joerg
2118 1.1 joerg Given
2119 1.1 joerg f('false, 3.14, 42);
2120 1.1 joerg characterLiteral(equals(0))
2121 1.1 joerg matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2122 1.1 joerg match false
2123 1.1 joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2124 1.1 joerg match 3.14
2125 1.1 joerg integerLiteral(equals(42))
2126 1.1 joerg matches 42
2127 1.1 joerg
2128 1.1 joerg Note that you cannot directly match a negative numeric literal because the
2129 1.1 joerg minus sign is not part of the literal: It is a unary operator whose operand
2130 1.1 joerg is the positive numeric literal. Instead, you must use a unaryOperator()
2131 1.1 joerg matcher to match the minus sign:
2132 1.1 joerg
2133 1.1 joerg unaryOperator(hasOperatorName("-"),
2134 1.1 joerg hasUnaryOperand(integerLiteral(equals(13))))
2135 1.1 joerg
2136 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>,
2137 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>
2138 1.1 joerg </pre></td></tr>
2139 1.1 joerg
2140 1.1 joerg
2141 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr>
2142 1.1 joerg <tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
2143 1.1 joerg
2144 1.1 joerg
2145 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr>
2146 1.1 joerg <tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
2147 1.1 joerg
2148 1.1 joerg
2149 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>></td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr>
2150 1.1 joerg <tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
2151 1.1 joerg
2152 1.1 joerg Given
2153 1.1 joerg try {
2154 1.1 joerg // ...
2155 1.1 joerg } catch (int) {
2156 1.1 joerg // ...
2157 1.1 joerg } catch (...) {
2158 1.1 joerg // ...
2159 1.1 joerg }
2160 1.1 joerg cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
2161 1.1 joerg </pre></td></tr>
2162 1.1 joerg
2163 1.1 joerg
2164 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
2165 1.1 joerg <tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
2166 1.1 joerg a specific number of arguments (including absent default arguments).
2167 1.1 joerg
2168 1.1 joerg Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2169 1.1 joerg void f(int x, int y);
2170 1.1 joerg f(0, 0);
2171 1.1 joerg </pre></td></tr>
2172 1.1 joerg
2173 1.1 joerg
2174 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr>
2175 1.1 joerg <tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
2176 1.1 joerg </pre></td></tr>
2177 1.1 joerg
2178 1.1 joerg
2179 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr>
2180 1.1 joerg <tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
2181 1.1 joerg zero initialization.
2182 1.1 joerg
2183 1.1 joerg Given
2184 1.1 joerg void foo() {
2185 1.1 joerg struct point { double x; double y; };
2186 1.1 joerg point pt[2] = { { 1.0, 2.0 } };
2187 1.1 joerg }
2188 1.1 joerg initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
2189 1.1 joerg will match the implicit array filler for pt[1].
2190 1.1 joerg </pre></td></tr>
2191 1.1 joerg
2192 1.1 joerg
2193 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr>
2194 1.1 joerg <tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
2195 1.1 joerg
2196 1.1 joerg Given
2197 1.1 joerg struct S {
2198 1.1 joerg S(); // #1
2199 1.1 joerg S(const S &); // #2
2200 1.1 joerg S(S &&); // #3
2201 1.1 joerg };
2202 1.1 joerg cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
2203 1.1 joerg </pre></td></tr>
2204 1.1 joerg
2205 1.1 joerg
2206 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr>
2207 1.1 joerg <tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
2208 1.1 joerg
2209 1.1 joerg Given
2210 1.1 joerg struct S {
2211 1.1 joerg S(); // #1
2212 1.1 joerg S(const S &); // #2
2213 1.1 joerg S(S &&); // #3
2214 1.1 joerg };
2215 1.1 joerg cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
2216 1.1 joerg </pre></td></tr>
2217 1.1 joerg
2218 1.1 joerg
2219 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr>
2220 1.1 joerg <tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
2221 1.1 joerg
2222 1.1 joerg Given
2223 1.1 joerg struct S {
2224 1.1 joerg S(); // #1
2225 1.1 joerg S(int) {} // #2
2226 1.1 joerg S(S &&) : S() {} // #3
2227 1.1 joerg };
2228 1.1 joerg S::S() : S(0) {} // #4
2229 1.1 joerg cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
2230 1.1 joerg #1 or #2.
2231 1.1 joerg </pre></td></tr>
2232 1.1 joerg
2233 1.1 joerg
2234 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr>
2235 1.1 joerg <tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
2236 1.1 joerg that have an explicit specifier if this explicit specifier is resolved to
2237 1.1 joerg true.
2238 1.1 joerg
2239 1.1 joerg Given
2240 1.1 joerg template<bool b>
2241 1.1 joerg struct S {
2242 1.1 joerg S(int); // #1
2243 1.1 joerg explicit S(double); // #2
2244 1.1 joerg operator int(); // #3
2245 1.1 joerg explicit operator bool(); // #4
2246 1.1 joerg explicit(false) S(bool) // # 7
2247 1.1 joerg explicit(true) S(char) // # 8
2248 1.1 joerg explicit(b) S(S) // # 9
2249 1.1 joerg };
2250 1.1 joerg S(int) -> S<true> // #5
2251 1.1 joerg explicit S(double) -> S<false> // #6
2252 1.1 joerg cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
2253 1.1 joerg cxxConversionDecl(isExplicit()) will match #4, but not #3.
2254 1.1 joerg cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
2255 1.1 joerg </pre></td></tr>
2256 1.1 joerg
2257 1.1 joerg
2258 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr>
2259 1.1 joerg <tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
2260 1.1 joerg
2261 1.1 joerg Given
2262 1.1 joerg struct S {
2263 1.1 joerg S(); // #1
2264 1.1 joerg S(const S &); // #2
2265 1.1 joerg S(S &&); // #3
2266 1.1 joerg };
2267 1.1 joerg cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
2268 1.1 joerg </pre></td></tr>
2269 1.1 joerg
2270 1.1 joerg
2271 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>></td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr>
2272 1.1 joerg <tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
2273 1.1 joerg that have an explicit specifier if this explicit specifier is resolved to
2274 1.1 joerg true.
2275 1.1 joerg
2276 1.1 joerg Given
2277 1.1 joerg template<bool b>
2278 1.1 joerg struct S {
2279 1.1 joerg S(int); // #1
2280 1.1 joerg explicit S(double); // #2
2281 1.1 joerg operator int(); // #3
2282 1.1 joerg explicit operator bool(); // #4
2283 1.1 joerg explicit(false) S(bool) // # 7
2284 1.1 joerg explicit(true) S(char) // # 8
2285 1.1 joerg explicit(b) S(S) // # 9
2286 1.1 joerg };
2287 1.1 joerg S(int) -> S<true> // #5
2288 1.1 joerg explicit S(double) -> S<false> // #6
2289 1.1 joerg cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
2290 1.1 joerg cxxConversionDecl(isExplicit()) will match #4, but not #3.
2291 1.1 joerg cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
2292 1.1 joerg </pre></td></tr>
2293 1.1 joerg
2294 1.1 joerg
2295 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr>
2296 1.1 joerg <tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
2297 1.1 joerg opposed to a member.
2298 1.1 joerg
2299 1.1 joerg Given
2300 1.1 joerg struct B {};
2301 1.1 joerg struct D : B {
2302 1.1 joerg int I;
2303 1.1 joerg D(int i) : I(i) {}
2304 1.1 joerg };
2305 1.1 joerg struct E : B {
2306 1.1 joerg E() : B() {}
2307 1.1 joerg };
2308 1.1 joerg cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
2309 1.1 joerg will match E(), but not match D(int).
2310 1.1 joerg </pre></td></tr>
2311 1.1 joerg
2312 1.1 joerg
2313 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr>
2314 1.1 joerg <tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
2315 1.1 joerg opposed to a base.
2316 1.1 joerg
2317 1.1 joerg Given
2318 1.1 joerg struct B {};
2319 1.1 joerg struct D : B {
2320 1.1 joerg int I;
2321 1.1 joerg D(int i) : I(i) {}
2322 1.1 joerg };
2323 1.1 joerg struct E : B {
2324 1.1 joerg E() : B() {}
2325 1.1 joerg };
2326 1.1 joerg cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
2327 1.1 joerg will match D(int), but not match E().
2328 1.1 joerg </pre></td></tr>
2329 1.1 joerg
2330 1.1 joerg
2331 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr>
2332 1.1 joerg <tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
2333 1.1 joerg code (as opposed to implicitly added by the compiler).
2334 1.1 joerg
2335 1.1 joerg Given
2336 1.1 joerg struct Foo {
2337 1.1 joerg Foo() { }
2338 1.1 joerg Foo(int) : foo_("A") { }
2339 1.1 joerg string foo_;
2340 1.1 joerg };
2341 1.1 joerg cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
2342 1.1 joerg will match Foo(int), but not Foo()
2343 1.1 joerg </pre></td></tr>
2344 1.1 joerg
2345 1.1 joerg
2346 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>></td><td class="name" onclick="toggle('isExplicit2')"><a name="isExplicit2Anchor">isExplicit</a></td><td></td></tr>
2347 1.1 joerg <tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
2348 1.1 joerg that have an explicit specifier if this explicit specifier is resolved to
2349 1.1 joerg true.
2350 1.1 joerg
2351 1.1 joerg Given
2352 1.1 joerg template<bool b>
2353 1.1 joerg struct S {
2354 1.1 joerg S(int); // #1
2355 1.1 joerg explicit S(double); // #2
2356 1.1 joerg operator int(); // #3
2357 1.1 joerg explicit operator bool(); // #4
2358 1.1 joerg explicit(false) S(bool) // # 7
2359 1.1 joerg explicit(true) S(char) // # 8
2360 1.1 joerg explicit(b) S(S) // # 9
2361 1.1 joerg };
2362 1.1 joerg S(int) -> S<true> // #5
2363 1.1 joerg explicit S(double) -> S<false> // #6
2364 1.1 joerg cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
2365 1.1 joerg cxxConversionDecl(isExplicit()) will match #4, but not #3.
2366 1.1 joerg cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
2367 1.1 joerg </pre></td></tr>
2368 1.1 joerg
2369 1.1 joerg
2370 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr>
2371 1.1 joerg <tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed
2372 1.1 joerg to '.'.
2373 1.1 joerg
2374 1.1 joerg Member calls on the implicit this pointer match as called with '->'.
2375 1.1 joerg
2376 1.1 joerg Given
2377 1.1 joerg class Y {
2378 1.1 joerg void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
2379 1.1 joerg template <class T> void f() { this->f<T>(); f<T>(); }
2380 1.1 joerg int a;
2381 1.1 joerg static int b;
2382 1.1 joerg };
2383 1.1 joerg template <class T>
2384 1.1 joerg class Z {
2385 1.1 joerg void x() { this->m; }
2386 1.1 joerg };
2387 1.1 joerg memberExpr(isArrow())
2388 1.1 joerg matches this->x, x, y.x, a, this->b
2389 1.1 joerg cxxDependentScopeMemberExpr(isArrow())
2390 1.1 joerg matches this->m
2391 1.1 joerg unresolvedMemberExpr(isArrow())
2392 1.1 joerg matches this->f<T>, f<T>
2393 1.1 joerg </pre></td></tr>
2394 1.1 joerg
2395 1.1 joerg
2396 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr>
2397 1.1 joerg <tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
2398 1.1 joerg
2399 1.1 joerg Given
2400 1.1 joerg struct A {
2401 1.1 joerg void foo() const;
2402 1.1 joerg void bar();
2403 1.1 joerg };
2404 1.1 joerg
2405 1.1 joerg cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
2406 1.1 joerg </pre></td></tr>
2407 1.1 joerg
2408 1.1 joerg
2409 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr>
2410 1.1 joerg <tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
2411 1.1 joerg operator.
2412 1.1 joerg
2413 1.1 joerg Given
2414 1.1 joerg struct A {
2415 1.1 joerg A &operator=(const A &);
2416 1.1 joerg A &operator=(A &&);
2417 1.1 joerg };
2418 1.1 joerg
2419 1.1 joerg cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
2420 1.1 joerg the second one.
2421 1.1 joerg </pre></td></tr>
2422 1.1 joerg
2423 1.1 joerg
2424 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr>
2425 1.1 joerg <tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
2426 1.1 joerg
2427 1.1 joerg Given:
2428 1.1 joerg class A final {};
2429 1.1 joerg
2430 1.1 joerg struct B {
2431 1.1 joerg virtual void f();
2432 1.1 joerg };
2433 1.1 joerg
2434 1.1 joerg struct C : B {
2435 1.1 joerg void f() final;
2436 1.1 joerg };
2437 1.1 joerg matches A and C::f, but not B, C, or B::f
2438 1.1 joerg </pre></td></tr>
2439 1.1 joerg
2440 1.1 joerg
2441 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr>
2442 1.1 joerg <tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2443 1.1 joerg operator.
2444 1.1 joerg
2445 1.1 joerg Given
2446 1.1 joerg struct A {
2447 1.1 joerg A &operator=(const A &);
2448 1.1 joerg A &operator=(A &&);
2449 1.1 joerg };
2450 1.1 joerg
2451 1.1 joerg cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2452 1.1 joerg the first one.
2453 1.1 joerg </pre></td></tr>
2454 1.1 joerg
2455 1.1 joerg
2456 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr>
2457 1.1 joerg <tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2458 1.1 joerg
2459 1.1 joerg Given
2460 1.1 joerg class A {
2461 1.1 joerg public:
2462 1.1 joerg virtual void x();
2463 1.1 joerg };
2464 1.1 joerg class B : public A {
2465 1.1 joerg public:
2466 1.1 joerg virtual void x();
2467 1.1 joerg };
2468 1.1 joerg matches B::x
2469 1.1 joerg </pre></td></tr>
2470 1.1 joerg
2471 1.1 joerg
2472 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr>
2473 1.1 joerg <tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2474 1.1 joerg
2475 1.1 joerg Given
2476 1.1 joerg class A {
2477 1.1 joerg public:
2478 1.1 joerg virtual void x() = 0;
2479 1.1 joerg };
2480 1.1 joerg matches A::x
2481 1.1 joerg </pre></td></tr>
2482 1.1 joerg
2483 1.1 joerg
2484 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr>
2485 1.1 joerg <tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2486 1.1 joerg
2487 1.1 joerg Given
2488 1.1 joerg struct S {
2489 1.1 joerg S(); // #1
2490 1.1 joerg S(const S &) = default; // #2
2491 1.1 joerg S(S &&) = delete; // #3
2492 1.1 joerg };
2493 1.1 joerg cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2494 1.1 joerg </pre></td></tr>
2495 1.1 joerg
2496 1.1 joerg
2497 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr>
2498 1.1 joerg <tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
2499 1.1 joerg
2500 1.1 joerg Given
2501 1.1 joerg class A {
2502 1.1 joerg public:
2503 1.1 joerg virtual void x();
2504 1.1 joerg };
2505 1.1 joerg matches A::x
2506 1.1 joerg </pre></td></tr>
2507 1.1 joerg
2508 1.1 joerg
2509 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr>
2510 1.1 joerg <tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2511 1.1 joerg
2512 1.1 joerg Given
2513 1.1 joerg class A {
2514 1.1 joerg public:
2515 1.1 joerg virtual void x();
2516 1.1 joerg };
2517 1.1 joerg class B : public A {
2518 1.1 joerg public:
2519 1.1 joerg void x();
2520 1.1 joerg };
2521 1.1 joerg matches A::x but not B::x
2522 1.1 joerg </pre></td></tr>
2523 1.1 joerg
2524 1.1 joerg
2525 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr>
2526 1.1 joerg <tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
2527 1.1 joerg
2528 1.1 joerg Given:
2529 1.1 joerg MyClass *p1 = new MyClass[10];
2530 1.1 joerg cxxNewExpr(isArray())
2531 1.1 joerg matches the expression 'new MyClass[10]'.
2532 1.1 joerg </pre></td></tr>
2533 1.1 joerg
2534 1.1 joerg
2535 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
2536 1.1 joerg <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2537 1.1 joerg
2538 1.1 joerg Matches overloaded operator names specified in strings without the
2539 1.1 joerg "operator" prefix: e.g. "<<".
2540 1.1 joerg
2541 1.1 joerg Given:
2542 1.1 joerg class A { int operator*(); };
2543 1.1 joerg const A &operator<<(const A &a, const A &b);
2544 1.1 joerg A a;
2545 1.1 joerg a << a; // <-- This matches
2546 1.1 joerg
2547 1.1 joerg cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the
2548 1.1 joerg specified line and
2549 1.1 joerg cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2550 1.1 joerg matches the declaration of A.
2551 1.1 joerg
2552 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>
2553 1.1 joerg </pre></td></tr>
2554 1.1 joerg
2555 1.1 joerg
2556 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr>
2557 1.1 joerg <tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
2558 1.1 joerg
2559 1.1 joerg Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2560 1.1 joerg if (a == b)
2561 1.1 joerg a += b;
2562 1.1 joerg
2563 1.1 joerg Example 2: matches s1 = s2
2564 1.1 joerg (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2565 1.1 joerg struct S { S& operator=(const S&); };
2566 1.1 joerg void x() { S s1, s2; s1 = s2; })
2567 1.1 joerg </pre></td></tr>
2568 1.1 joerg
2569 1.1 joerg
2570 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr>
2571 1.1 joerg <tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
2572 1.1 joerg
2573 1.1 joerg Example matches x (matcher = cxxRecordDecl(hasDefinition()))
2574 1.1 joerg class x {};
2575 1.1 joerg class y;
2576 1.1 joerg </pre></td></tr>
2577 1.1 joerg
2578 1.1 joerg
2579 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom2')"><a name="isDerivedFrom2Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
2580 1.1 joerg <tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2581 1.1 joerg </pre></td></tr>
2582 1.1 joerg
2583 1.1 joerg
2584 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom2')"><a name="isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
2585 1.1 joerg <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
2586 1.1 joerg </pre></td></tr>
2587 1.1 joerg
2588 1.1 joerg
2589 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
2590 1.1 joerg <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2591 1.1 joerg static member variable template instantiations.
2592 1.1 joerg
2593 1.1 joerg Given
2594 1.1 joerg template<typename T> void A(T t) { }
2595 1.1 joerg template<> void A(int N) { }
2596 1.1 joerg functionDecl(isExplicitTemplateSpecialization())
2597 1.1 joerg matches the specialization A<int>().
2598 1.1 joerg
2599 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>
2600 1.1 joerg </pre></td></tr>
2601 1.1 joerg
2602 1.1 joerg
2603 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr>
2604 1.1 joerg <tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2605 1.1 joerg
2606 1.1 joerg Given:
2607 1.1 joerg class A final {};
2608 1.1 joerg
2609 1.1 joerg struct B {
2610 1.1 joerg virtual void f();
2611 1.1 joerg };
2612 1.1 joerg
2613 1.1 joerg struct C : B {
2614 1.1 joerg void f() final;
2615 1.1 joerg };
2616 1.1 joerg matches A and C::f, but not B, C, or B::f
2617 1.1 joerg </pre></td></tr>
2618 1.1 joerg
2619 1.1 joerg
2620 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr>
2621 1.1 joerg <tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2622 1.1 joerg
2623 1.1 joerg Given:
2624 1.1 joerg auto x = []{};
2625 1.1 joerg
2626 1.1 joerg cxxRecordDecl(isLambda()) matches the implicit class declaration of
2627 1.1 joerg decltype(x)
2628 1.1 joerg </pre></td></tr>
2629 1.1 joerg
2630 1.1 joerg
2631 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom2')"><a name="isSameOrDerivedFrom2Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
2632 1.1 joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
2633 1.1 joerg isSameOrDerivedFrom(hasName(...)).
2634 1.1 joerg </pre></td></tr>
2635 1.1 joerg
2636 1.1 joerg
2637 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr>
2638 1.1 joerg <tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2639 1.1 joerg member variable template instantiations.
2640 1.1 joerg
2641 1.1 joerg Given
2642 1.1 joerg template <typename T> class X {}; class A {}; X<A> x;
2643 1.1 joerg or
2644 1.1 joerg template <typename T> class X {}; class A {}; template class X<A>;
2645 1.1 joerg or
2646 1.1 joerg template <typename T> class X {}; class A {}; extern template class X<A>;
2647 1.1 joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2648 1.1 joerg matches the template instantiation of X<A>.
2649 1.1 joerg
2650 1.1 joerg But given
2651 1.1 joerg template <typename T> class X {}; class A {};
2652 1.1 joerg template <> class X<A> {}; X<A> x;
2653 1.1 joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2654 1.1 joerg does not match, as X<A> is an explicit template specialization.
2655 1.1 joerg
2656 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>
2657 1.1 joerg </pre></td></tr>
2658 1.1 joerg
2659 1.1 joerg
2660 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('argumentCountIs0')"><a name="argumentCountIs0Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
2661 1.1 joerg <tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2662 1.1 joerg a specific number of arguments (including absent default arguments).
2663 1.1 joerg
2664 1.1 joerg Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2665 1.1 joerg void f(int x, int y);
2666 1.1 joerg f(0, 0);
2667 1.1 joerg </pre></td></tr>
2668 1.1 joerg
2669 1.1 joerg
2670 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('usesADL0')"><a name="usesADL0Anchor">usesADL</a></td><td></td></tr>
2671 1.1 joerg <tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
2672 1.1 joerg
2673 1.1 joerg Example matches y(x) but not y(42) or NS::y(x).
2674 1.1 joerg namespace NS {
2675 1.1 joerg struct X {};
2676 1.1 joerg void y(X);
2677 1.1 joerg }
2678 1.1 joerg
2679 1.1 joerg void y(...);
2680 1.1 joerg
2681 1.1 joerg void test() {
2682 1.1 joerg NS::X x;
2683 1.1 joerg y(x); // Matches
2684 1.1 joerg NS::y(x); // Doesn't match
2685 1.1 joerg y(42); // Doesn't match
2686 1.1 joerg using NS::y;
2687 1.1 joerg y(x); // Found by both unqualified lookup and ADL, doesn't match
2688 1.1 joerg }
2689 1.1 joerg </pre></td></tr>
2690 1.1 joerg
2691 1.1 joerg
2692 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>></td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr>
2693 1.1 joerg <tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2694 1.1 joerg
2695 1.1 joerg Example: matches the implicit cast around 0
2696 1.1 joerg (matcher = castExpr(hasCastKind(CK_NullToPointer)))
2697 1.1 joerg int *p = 0;
2698 1.1 joerg
2699 1.1 joerg If the matcher is use from clang-query, CastKind parameter
2700 1.1 joerg should be passed as a quoted string. e.g., ofKind("CK_NullToPointer").
2701 1.1 joerg </pre></td></tr>
2702 1.1 joerg
2703 1.1 joerg
2704 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr>
2705 1.1 joerg <tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2706 1.1 joerg
2707 1.1 joerg
2708 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT Value</td></tr>
2709 1.1 joerg <tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
2710 1.1 joerg
2711 1.1 joerg Given
2712 1.1 joerg f('false, 3.14, 42);
2713 1.1 joerg characterLiteral(equals(0))
2714 1.1 joerg matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2715 1.1 joerg match false
2716 1.1 joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2717 1.1 joerg match 3.14
2718 1.1 joerg integerLiteral(equals(42))
2719 1.1 joerg matches 42
2720 1.1 joerg
2721 1.1 joerg Note that you cannot directly match a negative numeric literal because the
2722 1.1 joerg minus sign is not part of the literal: It is a unary operator whose operand
2723 1.1 joerg is the positive numeric literal. Instead, you must use a unaryOperator()
2724 1.1 joerg matcher to match the minus sign:
2725 1.1 joerg
2726 1.1 joerg unaryOperator(hasOperatorName("-"),
2727 1.1 joerg hasUnaryOperand(integerLiteral(equals(13))))
2728 1.1 joerg
2729 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>,
2730 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>
2731 1.1 joerg </pre></td></tr>
2732 1.1 joerg
2733 1.1 joerg
2734 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr>
2735 1.1 joerg <tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2736 1.1 joerg
2737 1.1 joerg
2738 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr>
2739 1.1 joerg <tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2740 1.1 joerg
2741 1.1 joerg
2742 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
2743 1.1 joerg <tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2744 1.1 joerg
2745 1.1 joerg Given
2746 1.1 joerg template<typename T> struct C {};
2747 1.1 joerg C<int> c;
2748 1.1 joerg classTemplateSpecializationDecl(templateArgumentCountIs(1))
2749 1.1 joerg matches C<int>.
2750 1.1 joerg </pre></td></tr>
2751 1.1 joerg
2752 1.1 joerg
2753 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>></td><td class="name" onclick="toggle('statementCountIs0')"><a name="statementCountIs0Anchor">statementCountIs</a></td><td>unsigned N</td></tr>
2754 1.1 joerg <tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2755 1.1 joerg child statements.
2756 1.1 joerg
2757 1.1 joerg Example: Given
2758 1.1 joerg { for (;;) {} }
2759 1.1 joerg compoundStmt(statementCountIs(0)))
2760 1.1 joerg matches '{}'
2761 1.1 joerg but does not match the outer compound statement.
2762 1.1 joerg </pre></td></tr>
2763 1.1 joerg
2764 1.1 joerg
2765 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>></td><td class="name" onclick="toggle('hasSize0')"><a name="hasSize0Anchor">hasSize</a></td><td>unsigned N</td></tr>
2766 1.1 joerg <tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
2767 1.1 joerg
2768 1.1 joerg Given
2769 1.1 joerg int a[42];
2770 1.1 joerg int b[2 * 21];
2771 1.1 joerg int c[41], d[43];
2772 1.1 joerg char *s = "abcd";
2773 1.1 joerg wchar_t *ws = L"abcd";
2774 1.1 joerg char *w = "a";
2775 1.1 joerg constantArrayType(hasSize(42))
2776 1.1 joerg matches "int a[42]" and "int b[2 * 21]"
2777 1.1 joerg stringLiteral(hasSize(4))
2778 1.1 joerg matches "abcd", L"abcd"
2779 1.1 joerg </pre></td></tr>
2780 1.1 joerg
2781 1.1 joerg
2782 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>></td><td class="name" onclick="toggle('declCountIs0')"><a name="declCountIs0Anchor">declCountIs</a></td><td>unsigned N</td></tr>
2783 1.1 joerg <tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2784 1.1 joerg declarations.
2785 1.1 joerg
2786 1.1 joerg Example: Given
2787 1.1 joerg int a, b;
2788 1.1 joerg int c;
2789 1.1 joerg int d = 2, e;
2790 1.1 joerg declCountIs(2)
2791 1.1 joerg matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2792 1.1 joerg </pre></td></tr>
2793 1.1 joerg
2794 1.1 joerg
2795 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
2796 1.1 joerg <tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2797 1.1 joerg
2798 1.1 joerg Matches a node if it equals the node previously bound to ID.
2799 1.1 joerg
2800 1.1 joerg Given
2801 1.1 joerg class X { int a; int b; };
2802 1.1 joerg cxxRecordDecl(
2803 1.1 joerg has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2804 1.1 joerg has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2805 1.1 joerg matches the class X, as a and b have the same type.
2806 1.1 joerg
2807 1.1 joerg Note that when multiple matches are involved via forEach* matchers,
2808 1.1 joerg equalsBoundNodes acts as a filter.
2809 1.1 joerg For example:
2810 1.1 joerg compoundStmt(
2811 1.1 joerg forEachDescendant(varDecl().bind("d")),
2812 1.1 joerg forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2813 1.1 joerg will trigger a match for each combination of variable declaration
2814 1.1 joerg and reference to that variable declaration within a compound statement.
2815 1.1 joerg </pre></td></tr>
2816 1.1 joerg
2817 1.1 joerg
2818 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr>
2819 1.1 joerg <tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2820 1.1 joerg
2821 1.1 joerg Decl has pointer identity in the AST.
2822 1.1 joerg </pre></td></tr>
2823 1.1 joerg
2824 1.1 joerg
2825 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr>
2826 1.1 joerg <tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2827 1.1 joerg
2828 1.1 joerg Given
2829 1.1 joerg __attribute__((device)) void f() { ... }
2830 1.1 joerg decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2831 1.1 joerg f. If the matcher is used from clang-query, attr::Kind parameter should be
2832 1.1 joerg passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2833 1.1 joerg </pre></td></tr>
2834 1.1 joerg
2835 1.1 joerg
2836 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
2837 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2838 1.1 joerg partially matching a given regex.
2839 1.1 joerg
2840 1.1 joerg Example matches Y but not X
2841 1.1 joerg (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2842 1.1 joerg #include "ASTMatcher.h"
2843 1.1 joerg class X {};
2844 1.1 joerg ASTMatcher.h:
2845 1.1 joerg class Y {};
2846 1.1 joerg
2847 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>
2848 1.1 joerg </pre></td></tr>
2849 1.1 joerg
2850 1.1 joerg
2851 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr>
2852 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2853 1.1 joerg
2854 1.1 joerg Example matches X but not Y
2855 1.1 joerg (matcher = cxxRecordDecl(isExpansionInMainFile())
2856 1.1 joerg #include <Y.h>
2857 1.1 joerg class X {};
2858 1.1 joerg Y.h:
2859 1.1 joerg class Y {};
2860 1.1 joerg
2861 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>
2862 1.1 joerg </pre></td></tr>
2863 1.1 joerg
2864 1.1 joerg
2865 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
2866 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2867 1.1 joerg
2868 1.1 joerg Example matches Y but not X
2869 1.1 joerg (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2870 1.1 joerg #include <SystemHeader.h>
2871 1.1 joerg class X {};
2872 1.1 joerg SystemHeader.h:
2873 1.1 joerg class Y {};
2874 1.1 joerg
2875 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>
2876 1.1 joerg </pre></td></tr>
2877 1.1 joerg
2878 1.1 joerg
2879 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
2880 1.1 joerg <tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2881 1.1 joerg by the compiler (eg. implicit default/copy constructors).
2882 1.1 joerg </pre></td></tr>
2883 1.1 joerg
2884 1.1 joerg
2885 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isInStdNamespace0')"><a name="isInStdNamespace0Anchor">isInStdNamespace</a></td><td></td></tr>
2886 1.1 joerg <tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
2887 1.1 joerg
2888 1.1 joerg Given
2889 1.1 joerg class vector {};
2890 1.1 joerg namespace foo {
2891 1.1 joerg class vector {};
2892 1.1 joerg namespace std {
2893 1.1 joerg class vector {};
2894 1.1 joerg }
2895 1.1 joerg }
2896 1.1 joerg namespace std {
2897 1.1 joerg inline namespace __1 {
2898 1.1 joerg class vector {}; // #1
2899 1.1 joerg namespace experimental {
2900 1.1 joerg class vector {};
2901 1.1 joerg }
2902 1.1 joerg }
2903 1.1 joerg }
2904 1.1 joerg cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
2905 1.1 joerg </pre></td></tr>
2906 1.1 joerg
2907 1.1 joerg
2908 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr>
2909 1.1 joerg <tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2910 1.1 joerg
2911 1.1 joerg Given
2912 1.1 joerg class C {
2913 1.1 joerg public: int a;
2914 1.1 joerg protected: int b;
2915 1.1 joerg private: int c;
2916 1.1 joerg };
2917 1.1 joerg fieldDecl(isPrivate())
2918 1.1 joerg matches 'int c;'
2919 1.1 joerg </pre></td></tr>
2920 1.1 joerg
2921 1.1 joerg
2922 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr>
2923 1.1 joerg <tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2924 1.1 joerg
2925 1.1 joerg Given
2926 1.1 joerg class C {
2927 1.1 joerg public: int a;
2928 1.1 joerg protected: int b;
2929 1.1 joerg private: int c;
2930 1.1 joerg };
2931 1.1 joerg fieldDecl(isProtected())
2932 1.1 joerg matches 'int b;'
2933 1.1 joerg </pre></td></tr>
2934 1.1 joerg
2935 1.1 joerg
2936 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr>
2937 1.1 joerg <tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2938 1.1 joerg
2939 1.1 joerg Given
2940 1.1 joerg class C {
2941 1.1 joerg public: int a;
2942 1.1 joerg protected: int b;
2943 1.1 joerg private: int c;
2944 1.1 joerg };
2945 1.1 joerg fieldDecl(isPublic())
2946 1.1 joerg matches 'int a;'
2947 1.1 joerg </pre></td></tr>
2948 1.1 joerg
2949 1.1 joerg
2950 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>></td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr>
2951 1.1 joerg <tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2952 1.1 joerg a specific number of designators.
2953 1.1 joerg
2954 1.1 joerg Example: Given
2955 1.1 joerg point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2956 1.1 joerg point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2957 1.1 joerg designatorCountIs(2)
2958 1.1 joerg matches '{ [2].y = 1.0, [0].x = 1.0 }',
2959 1.1 joerg but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2960 1.1 joerg </pre></td></tr>
2961 1.1 joerg
2962 1.1 joerg
2963 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>></td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr>
2964 1.1 joerg <tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
2965 1.1 joerg
2966 1.1 joerg Example matches Y (matcher = enumDecl(isScoped()))
2967 1.1 joerg enum X {};
2968 1.1 joerg enum class Y {};
2969 1.1 joerg </pre></td></tr>
2970 1.1 joerg
2971 1.1 joerg
2972 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isInstantiationDependent0')"><a name="isInstantiationDependent0Anchor">isInstantiationDependent</a></td><td></td></tr>
2973 1.1 joerg <tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
2974 1.1 joerg neither type- nor value-dependent.
2975 1.1 joerg
2976 1.1 joerg In the following example, the expression sizeof(sizeof(T() + T()))
2977 1.1 joerg is instantiation-dependent (since it involves a template parameter T),
2978 1.1 joerg but is neither type- nor value-dependent, since the type of the inner
2979 1.1 joerg sizeof is known (std::size_t) and therefore the size of the outer
2980 1.1 joerg sizeof is known.
2981 1.1 joerg template<typename T>
2982 1.1 joerg void f(T x, T y) { sizeof(sizeof(T() + T()); }
2983 1.1 joerg expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
2984 1.1 joerg </pre></td></tr>
2985 1.1 joerg
2986 1.1 joerg
2987 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr>
2988 1.1 joerg <tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
2989 1.1 joerg is not yet instantiated.
2990 1.1 joerg
2991 1.1 joerg For example, the expressions "x" and "x + y" are type-dependent in
2992 1.1 joerg the following code, but "y" is not type-dependent:
2993 1.1 joerg template<typename T>
2994 1.1 joerg void add(T x, int y) {
2995 1.1 joerg x + y;
2996 1.1 joerg }
2997 1.1 joerg expr(isTypeDependent()) matches x + y
2998 1.1 joerg </pre></td></tr>
2999 1.1 joerg
3000 1.1 joerg
3001 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr>
3002 1.1 joerg <tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
3003 1.1 joerg non-type template parameter.
3004 1.1 joerg
3005 1.1 joerg For example, the array bound of "Chars" in the following example is
3006 1.1 joerg value-dependent.
3007 1.1 joerg template<int Size> int f() { return Size; }
3008 1.1 joerg expr(isValueDependent()) matches return Size
3009 1.1 joerg </pre></td></tr>
3010 1.1 joerg
3011 1.1 joerg
3012 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr>
3013 1.1 joerg <tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
3014 1.1 joerg bit width.
3015 1.1 joerg
3016 1.1 joerg Given
3017 1.1 joerg class C {
3018 1.1 joerg int a : 2;
3019 1.1 joerg int b : 4;
3020 1.1 joerg int c : 2;
3021 1.1 joerg };
3022 1.1 joerg fieldDecl(hasBitWidth(2))
3023 1.1 joerg matches 'int a;' and 'int c;' but not 'int b;'.
3024 1.1 joerg </pre></td></tr>
3025 1.1 joerg
3026 1.1 joerg
3027 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr>
3028 1.1 joerg <tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
3029 1.1 joerg
3030 1.1 joerg Given
3031 1.1 joerg class C {
3032 1.1 joerg int a : 2;
3033 1.1 joerg int b;
3034 1.1 joerg };
3035 1.1 joerg fieldDecl(isBitField())
3036 1.1 joerg matches 'int a;' but not 'int b;'.
3037 1.1 joerg </pre></td></tr>
3038 1.1 joerg
3039 1.1 joerg
3040 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>const ValueT Value</td></tr>
3041 1.1 joerg <tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
3042 1.1 joerg
3043 1.1 joerg Given
3044 1.1 joerg f('false, 3.14, 42);
3045 1.1 joerg characterLiteral(equals(0))
3046 1.1 joerg matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3047 1.1 joerg match false
3048 1.1 joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3049 1.1 joerg match 3.14
3050 1.1 joerg integerLiteral(equals(42))
3051 1.1 joerg matches 42
3052 1.1 joerg
3053 1.1 joerg Note that you cannot directly match a negative numeric literal because the
3054 1.1 joerg minus sign is not part of the literal: It is a unary operator whose operand
3055 1.1 joerg is the positive numeric literal. Instead, you must use a unaryOperator()
3056 1.1 joerg matcher to match the minus sign:
3057 1.1 joerg
3058 1.1 joerg unaryOperator(hasOperatorName("-"),
3059 1.1 joerg hasUnaryOperand(integerLiteral(equals(13))))
3060 1.1 joerg
3061 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>,
3062 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>
3063 1.1 joerg </pre></td></tr>
3064 1.1 joerg
3065 1.1 joerg
3066 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name" onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr>
3067 1.1 joerg <tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
3068 1.1 joerg
3069 1.1 joerg
3070 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
3071 1.1 joerg <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
3072 1.1 joerg
3073 1.1 joerg Given:
3074 1.1 joerg void f();
3075 1.1 joerg void g() noexcept;
3076 1.1 joerg void h() noexcept(true);
3077 1.1 joerg void i() noexcept(false);
3078 1.1 joerg void j() throw();
3079 1.1 joerg void k() throw(int);
3080 1.1 joerg void l() throw(...);
3081 1.1 joerg functionDecl(hasDynamicExceptionSpec()) and
3082 1.1 joerg functionProtoType(hasDynamicExceptionSpec())
3083 1.1 joerg match the declarations of j, k, and l, but not f, g, h, or i.
3084 1.1 joerg </pre></td></tr>
3085 1.1 joerg
3086 1.1 joerg
3087 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
3088 1.1 joerg <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
3089 1.1 joerg
3090 1.1 joerg Matches overloaded operator names specified in strings without the
3091 1.1 joerg "operator" prefix: e.g. "<<".
3092 1.1 joerg
3093 1.1 joerg Given:
3094 1.1 joerg class A { int operator*(); };
3095 1.1 joerg const A &operator<<(const A &a, const A &b);
3096 1.1 joerg A a;
3097 1.1 joerg a << a; // <-- This matches
3098 1.1 joerg
3099 1.1 joerg cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the
3100 1.1 joerg specified line and
3101 1.1 joerg cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3102 1.1 joerg matches the declaration of A.
3103 1.1 joerg
3104 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>
3105 1.1 joerg </pre></td></tr>
3106 1.1 joerg
3107 1.1 joerg
3108 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr>
3109 1.1 joerg <tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
3110 1.1 joerg
3111 1.1 joerg Example matches Y (matcher = functionDecl(hasTrailingReturn()))
3112 1.1 joerg int X() {}
3113 1.1 joerg auto Y() -> int {}
3114 1.1 joerg </pre></td></tr>
3115 1.1 joerg
3116 1.1 joerg
3117 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr>
3118 1.1 joerg <tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
3119 1.1 joerg and if constexpr.
3120 1.1 joerg
3121 1.1 joerg Given:
3122 1.1 joerg constexpr int foo = 42;
3123 1.1 joerg constexpr int bar();
3124 1.1 joerg void baz() { if constexpr(1 > 0) {} }
3125 1.1 joerg varDecl(isConstexpr())
3126 1.1 joerg matches the declaration of foo.
3127 1.1 joerg functionDecl(isConstexpr())
3128 1.1 joerg matches the declaration of bar.
3129 1.1 joerg ifStmt(isConstexpr())
3130 1.1 joerg matches the if statement in baz.
3131 1.1 joerg </pre></td></tr>
3132 1.1 joerg
3133 1.1 joerg
3134 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr>
3135 1.1 joerg <tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
3136 1.1 joerg
3137 1.1 joerg Given:
3138 1.1 joerg class A { ~A(); };
3139 1.1 joerg class B { ~B() = default; };
3140 1.1 joerg functionDecl(isDefaulted())
3141 1.1 joerg matches the declaration of ~B, but not ~A.
3142 1.1 joerg </pre></td></tr>
3143 1.1 joerg
3144 1.1 joerg
3145 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr>
3146 1.1 joerg <tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
3147 1.1 joerg
3148 1.1 joerg Example matches A, va, fa
3149 1.1 joerg class A {};
3150 1.1 joerg class B; // Doesn't match, as it has no body.
3151 1.1 joerg int va;
3152 1.1 joerg extern int vb; // Doesn't match, as it doesn't define the variable.
3153 1.1 joerg void fa() {}
3154 1.1 joerg void fb(); // Doesn't match, as it has no body.
3155 1.1 joerg @interface X
3156 1.1 joerg - (void)ma; // Doesn't match, interface is declaration.
3157 1.1 joerg @end
3158 1.1 joerg @implementation X
3159 1.1 joerg - (void)ma {}
3160 1.1 joerg @end
3161 1.1 joerg
3162 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>,
3163 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>
3164 1.1 joerg </pre></td></tr>
3165 1.1 joerg
3166 1.1 joerg
3167 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr>
3168 1.1 joerg <tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
3169 1.1 joerg
3170 1.1 joerg Given:
3171 1.1 joerg void Func();
3172 1.1 joerg void DeletedFunc() = delete;
3173 1.1 joerg functionDecl(isDeleted())
3174 1.1 joerg matches the declaration of DeletedFunc, but not Func.
3175 1.1 joerg </pre></td></tr>
3176 1.1 joerg
3177 1.1 joerg
3178 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization0')"><a name="isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
3179 1.1 joerg <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
3180 1.1 joerg static member variable template instantiations.
3181 1.1 joerg
3182 1.1 joerg Given
3183 1.1 joerg template<typename T> void A(T t) { }
3184 1.1 joerg template<> void A(int N) { }
3185 1.1 joerg functionDecl(isExplicitTemplateSpecialization())
3186 1.1 joerg matches the specialization A<int>().
3187 1.1 joerg
3188 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>
3189 1.1 joerg </pre></td></tr>
3190 1.1 joerg
3191 1.1 joerg
3192 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr>
3193 1.1 joerg <tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
3194 1.1 joerg
3195 1.1 joerg Given:
3196 1.1 joerg extern "C" void f() {}
3197 1.1 joerg extern "C" { void g() {} }
3198 1.1 joerg void h() {}
3199 1.1 joerg extern "C" int x = 1;
3200 1.1 joerg extern "C" int y = 2;
3201 1.1 joerg int z = 3;
3202 1.1 joerg functionDecl(isExternC())
3203 1.1 joerg matches the declaration of f and g, but not the declaration of h.
3204 1.1 joerg varDecl(isExternC())
3205 1.1 joerg matches the declaration of x and y, but not the declaration of z.
3206 1.1 joerg </pre></td></tr>
3207 1.1 joerg
3208 1.1 joerg
3209 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr>
3210 1.1 joerg <tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
3211 1.1 joerg the inline keyword.
3212 1.1 joerg
3213 1.1 joerg Given
3214 1.1 joerg inline void f();
3215 1.1 joerg void g();
3216 1.1 joerg namespace n {
3217 1.1 joerg inline namespace m {}
3218 1.1 joerg }
3219 1.1 joerg functionDecl(isInline()) will match ::f().
3220 1.1 joerg namespaceDecl(isInline()) will match n::m.
3221 1.1 joerg </pre></td></tr>
3222 1.1 joerg
3223 1.1 joerg
3224 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isMain0')"><a name="isMain0Anchor">isMain</a></td><td></td></tr>
3225 1.1 joerg <tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
3226 1.1 joerg into an executable program.
3227 1.1 joerg </pre></td></tr>
3228 1.1 joerg
3229 1.1 joerg
3230 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr>
3231 1.1 joerg <tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
3232 1.1 joerg
3233 1.1 joerg Given
3234 1.1 joerg void nope();
3235 1.1 joerg [[noreturn]] void a();
3236 1.1 joerg __attribute__((noreturn)) void b();
3237 1.1 joerg struct c { [[noreturn]] c(); };
3238 1.1 joerg functionDecl(isNoReturn())
3239 1.1 joerg matches all of those except
3240 1.1 joerg void nope();
3241 1.1 joerg </pre></td></tr>
3242 1.1 joerg
3243 1.1 joerg
3244 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr>
3245 1.1 joerg <tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
3246 1.1 joerg
3247 1.1 joerg Given:
3248 1.1 joerg void f();
3249 1.1 joerg void g() noexcept;
3250 1.1 joerg void h() throw();
3251 1.1 joerg void i() throw(int);
3252 1.1 joerg void j() noexcept(false);
3253 1.1 joerg functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3254 1.1 joerg match the declarations of g, and h, but not f, i or j.
3255 1.1 joerg </pre></td></tr>
3256 1.1 joerg
3257 1.1 joerg
3258 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr>
3259 1.1 joerg <tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
3260 1.1 joerg class specifier ("static" keyword) written in the source.
3261 1.1 joerg
3262 1.1 joerg Given:
3263 1.1 joerg static void f() {}
3264 1.1 joerg static int i = 0;
3265 1.1 joerg extern int j;
3266 1.1 joerg int k;
3267 1.1 joerg functionDecl(isStaticStorageClass())
3268 1.1 joerg matches the function declaration f.
3269 1.1 joerg varDecl(isStaticStorageClass())
3270 1.1 joerg matches the variable declaration i.
3271 1.1 joerg </pre></td></tr>
3272 1.1 joerg
3273 1.1 joerg
3274 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr>
3275 1.1 joerg <tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
3276 1.1 joerg member variable template instantiations.
3277 1.1 joerg
3278 1.1 joerg Given
3279 1.1 joerg template <typename T> class X {}; class A {}; X<A> x;
3280 1.1 joerg or
3281 1.1 joerg template <typename T> class X {}; class A {}; template class X<A>;
3282 1.1 joerg or
3283 1.1 joerg template <typename T> class X {}; class A {}; extern template class X<A>;
3284 1.1 joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3285 1.1 joerg matches the template instantiation of X<A>.
3286 1.1 joerg
3287 1.1 joerg But given
3288 1.1 joerg template <typename T> class X {}; class A {};
3289 1.1 joerg template <> class X<A> {}; X<A> x;
3290 1.1 joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3291 1.1 joerg does not match, as X<A> is an explicit template specialization.
3292 1.1 joerg
3293 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>
3294 1.1 joerg </pre></td></tr>
3295 1.1 joerg
3296 1.1 joerg
3297 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr>
3298 1.1 joerg <tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
3299 1.1 joerg
3300 1.1 joerg Example matches f, but not g or h. The function i will not match, even when
3301 1.1 joerg compiled in C mode.
3302 1.1 joerg void f(...);
3303 1.1 joerg void g(int);
3304 1.1 joerg template <typename... Ts> void h(Ts...);
3305 1.1 joerg void i();
3306 1.1 joerg </pre></td></tr>
3307 1.1 joerg
3308 1.1 joerg
3309 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('parameterCountIs0')"><a name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
3310 1.1 joerg <tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3311 1.1 joerg specific parameter count.
3312 1.1 joerg
3313 1.1 joerg Given
3314 1.1 joerg void f(int i) {}
3315 1.1 joerg void g(int i, int j) {}
3316 1.1 joerg void h(int i, int j);
3317 1.1 joerg void j(int i);
3318 1.1 joerg void k(int x, int y, int z, ...);
3319 1.1 joerg functionDecl(parameterCountIs(2))
3320 1.1 joerg matches g and h
3321 1.1 joerg functionProtoType(parameterCountIs(2))
3322 1.1 joerg matches g and h
3323 1.1 joerg functionProtoType(parameterCountIs(3))
3324 1.1 joerg matches k
3325 1.1 joerg </pre></td></tr>
3326 1.1 joerg
3327 1.1 joerg
3328 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
3329 1.1 joerg <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
3330 1.1 joerg
3331 1.1 joerg Given:
3332 1.1 joerg void f();
3333 1.1 joerg void g() noexcept;
3334 1.1 joerg void h() noexcept(true);
3335 1.1 joerg void i() noexcept(false);
3336 1.1 joerg void j() throw();
3337 1.1 joerg void k() throw(int);
3338 1.1 joerg void l() throw(...);
3339 1.1 joerg functionDecl(hasDynamicExceptionSpec()) and
3340 1.1 joerg functionProtoType(hasDynamicExceptionSpec())
3341 1.1 joerg match the declarations of j, k, and l, but not f, g, h, or i.
3342 1.1 joerg </pre></td></tr>
3343 1.1 joerg
3344 1.1 joerg
3345 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr>
3346 1.1 joerg <tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
3347 1.1 joerg
3348 1.1 joerg Given:
3349 1.1 joerg void f();
3350 1.1 joerg void g() noexcept;
3351 1.1 joerg void h() throw();
3352 1.1 joerg void i() throw(int);
3353 1.1 joerg void j() noexcept(false);
3354 1.1 joerg functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3355 1.1 joerg match the declarations of g, and h, but not f, i or j.
3356 1.1 joerg </pre></td></tr>
3357 1.1 joerg
3358 1.1 joerg
3359 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
3360 1.1 joerg <tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3361 1.1 joerg specific parameter count.
3362 1.1 joerg
3363 1.1 joerg Given
3364 1.1 joerg void f(int i) {}
3365 1.1 joerg void g(int i, int j) {}
3366 1.1 joerg void h(int i, int j);
3367 1.1 joerg void j(int i);
3368 1.1 joerg void k(int x, int y, int z, ...);
3369 1.1 joerg functionDecl(parameterCountIs(2))
3370 1.1 joerg matches g and h
3371 1.1 joerg functionProtoType(parameterCountIs(2))
3372 1.1 joerg matches g and h
3373 1.1 joerg functionProtoType(parameterCountIs(3))
3374 1.1 joerg matches k
3375 1.1 joerg </pre></td></tr>
3376 1.1 joerg
3377 1.1 joerg
3378 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('isConstexpr2')"><a name="isConstexpr2Anchor">isConstexpr</a></td><td></td></tr>
3379 1.1 joerg <tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
3380 1.1 joerg and if constexpr.
3381 1.1 joerg
3382 1.1 joerg Given:
3383 1.1 joerg constexpr int foo = 42;
3384 1.1 joerg constexpr int bar();
3385 1.1 joerg void baz() { if constexpr(1 > 0) {} }
3386 1.1 joerg varDecl(isConstexpr())
3387 1.1 joerg matches the declaration of foo.
3388 1.1 joerg functionDecl(isConstexpr())
3389 1.1 joerg matches the declaration of bar.
3390 1.1 joerg ifStmt(isConstexpr())
3391 1.1 joerg matches the if statement in baz.
3392 1.1 joerg </pre></td></tr>
3393 1.1 joerg
3394 1.1 joerg
3395 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr>
3396 1.1 joerg <tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
3397 1.1 joerg
3398 1.1 joerg
3399 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>const ValueT Value</td></tr>
3400 1.1 joerg <tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
3401 1.1 joerg
3402 1.1 joerg Given
3403 1.1 joerg f('false, 3.14, 42);
3404 1.1 joerg characterLiteral(equals(0))
3405 1.1 joerg matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3406 1.1 joerg match false
3407 1.1 joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3408 1.1 joerg match 3.14
3409 1.1 joerg integerLiteral(equals(42))
3410 1.1 joerg matches 42
3411 1.1 joerg
3412 1.1 joerg Note that you cannot directly match a negative numeric literal because the
3413 1.1 joerg minus sign is not part of the literal: It is a unary operator whose operand
3414 1.1 joerg is the positive numeric literal. Instead, you must use a unaryOperator()
3415 1.1 joerg matcher to match the minus sign:
3416 1.1 joerg
3417 1.1 joerg unaryOperator(hasOperatorName("-"),
3418 1.1 joerg hasUnaryOperand(integerLiteral(equals(13))))
3419 1.1 joerg
3420 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>,
3421 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>
3422 1.1 joerg </pre></td></tr>
3423 1.1 joerg
3424 1.1 joerg
3425 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr>
3426 1.1 joerg <tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
3427 1.1 joerg
3428 1.1 joerg
3429 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned Value</td></tr>
3430 1.1 joerg <tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
3431 1.1 joerg
3432 1.1 joerg
3433 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('isArrow0')"><a name="isArrow0Anchor">isArrow</a></td><td></td></tr>
3434 1.1 joerg <tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed
3435 1.1 joerg to '.'.
3436 1.1 joerg
3437 1.1 joerg Member calls on the implicit this pointer match as called with '->'.
3438 1.1 joerg
3439 1.1 joerg Given
3440 1.1 joerg class Y {
3441 1.1 joerg void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
3442 1.1 joerg template <class T> void f() { this->f<T>(); f<T>(); }
3443 1.1 joerg int a;
3444 1.1 joerg static int b;
3445 1.1 joerg };
3446 1.1 joerg template <class T>
3447 1.1 joerg class Z {
3448 1.1 joerg void x() { this->m; }
3449 1.1 joerg };
3450 1.1 joerg memberExpr(isArrow())
3451 1.1 joerg matches this->x, x, y.x, a, this->b
3452 1.1 joerg cxxDependentScopeMemberExpr(isArrow())
3453 1.1 joerg matches this->m
3454 1.1 joerg unresolvedMemberExpr(isArrow())
3455 1.1 joerg matches this->f<T>, f<T>
3456 1.1 joerg </pre></td></tr>
3457 1.1 joerg
3458 1.1 joerg
3459 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasExternalFormalLinkage0')"><a name="hasExternalFormalLinkage0Anchor">hasExternalFormalLinkage</a></td><td></td></tr>
3460 1.1 joerg <tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
3461 1.1 joerg
3462 1.1 joerg Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
3463 1.1 joerg void f() {
3464 1.1 joerg int x;
3465 1.1 joerg static int y;
3466 1.1 joerg }
3467 1.1 joerg int z;
3468 1.1 joerg
3469 1.1 joerg Example matches f() because it has external formal linkage despite being
3470 1.1 joerg unique to the translation unit as though it has internal likage
3471 1.1 joerg (matcher = functionDecl(hasExternalFormalLinkage()))
3472 1.1 joerg
3473 1.1 joerg namespace {
3474 1.1 joerg void f() {}
3475 1.1 joerg }
3476 1.1 joerg </pre></td></tr>
3477 1.1 joerg
3478 1.1 joerg
3479 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>const std::string Name</td></tr>
3480 1.1 joerg <tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
3481 1.1 joerg
3482 1.1 joerg Supports specifying enclosing namespaces or classes by prefixing the name
3483 1.1 joerg with '<enclosing>::'.
3484 1.1 joerg Does not match typedefs of an underlying type with the given name.
3485 1.1 joerg
3486 1.1 joerg Example matches X (Name == "X")
3487 1.1 joerg class X;
3488 1.1 joerg
3489 1.1 joerg Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
3490 1.1 joerg namespace a { namespace b { class X; } }
3491 1.1 joerg </pre></td></tr>
3492 1.1 joerg
3493 1.1 joerg
3494 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>std::string RegExp</td></tr>
3495 1.1 joerg <tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
3496 1.1 joerg a substring matched by the given RegExp.
3497 1.1 joerg
3498 1.1 joerg Supports specifying enclosing namespaces or classes by
3499 1.1 joerg prefixing the name with '<enclosing>::'. Does not match typedefs
3500 1.1 joerg of an underlying type with the given name.
3501 1.1 joerg
3502 1.1 joerg Example matches X (regexp == "::X")
3503 1.1 joerg class X;
3504 1.1 joerg
3505 1.1 joerg Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3506 1.1 joerg namespace foo { namespace bar { class X; } }
3507 1.1 joerg </pre></td></tr>
3508 1.1 joerg
3509 1.1 joerg
3510 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>></td><td class="name" onclick="toggle('isAnonymous0')"><a name="isAnonymous0Anchor">isAnonymous</a></td><td></td></tr>
3511 1.1 joerg <tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3512 1.1 joerg
3513 1.1 joerg Given
3514 1.1 joerg namespace n {
3515 1.1 joerg namespace {} // #1
3516 1.1 joerg }
3517 1.1 joerg namespaceDecl(isAnonymous()) will match #1 but not ::n.
3518 1.1 joerg </pre></td></tr>
3519 1.1 joerg
3520 1.1 joerg
3521 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>></td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr>
3522 1.1 joerg <tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3523 1.1 joerg the inline keyword.
3524 1.1 joerg
3525 1.1 joerg Given
3526 1.1 joerg inline void f();
3527 1.1 joerg void g();
3528 1.1 joerg namespace n {
3529 1.1 joerg inline namespace m {}
3530 1.1 joerg }
3531 1.1 joerg functionDecl(isInline()) will match ::f().
3532 1.1 joerg namespaceDecl(isInline()) will match n::m.
3533 1.1 joerg </pre></td></tr>
3534 1.1 joerg
3535 1.1 joerg
3536 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>></td><td class="name" onclick="toggle('isNoneKind0')"><a name="isNoneKind0Anchor">isNoneKind</a></td><td></td></tr>
3537 1.1 joerg <tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
3538 1.1 joerg
3539 1.1 joerg Given
3540 1.1 joerg
3541 1.1 joerg #pragma omp parallel
3542 1.1 joerg #pragma omp parallel default(none)
3543 1.1 joerg #pragma omp parallel default(shared)
3544 1.1 joerg
3545 1.1 joerg ``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
3546 1.1 joerg </pre></td></tr>
3547 1.1 joerg
3548 1.1 joerg
3549 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>></td><td class="name" onclick="toggle('isSharedKind0')"><a name="isSharedKind0Anchor">isSharedKind</a></td><td></td></tr>
3550 1.1 joerg <tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
3551 1.1 joerg
3552 1.1 joerg Given
3553 1.1 joerg
3554 1.1 joerg #pragma omp parallel
3555 1.1 joerg #pragma omp parallel default(none)
3556 1.1 joerg #pragma omp parallel default(shared)
3557 1.1 joerg
3558 1.1 joerg ``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
3559 1.1 joerg </pre></td></tr>
3560 1.1 joerg
3561 1.1 joerg
3562 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('isAllowedToContainClauseKind0')"><a name="isAllowedToContainClauseKind0Anchor">isAllowedToContainClauseKind</a></td><td>OpenMPClauseKind CKind</td></tr>
3563 1.1 joerg <tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
3564 1.1 joerg clause kind.
3565 1.1 joerg
3566 1.1 joerg Given
3567 1.1 joerg
3568 1.1 joerg #pragma omp parallel
3569 1.1 joerg #pragma omp parallel for
3570 1.1 joerg #pragma omp for
3571 1.1 joerg
3572 1.1 joerg `ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
3573 1.1 joerg ``omp parallel`` and ``omp parallel for``.
3574 1.1 joerg
3575 1.1 joerg If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
3576 1.1 joerg should be passed as a quoted string. e.g.,
3577 1.1 joerg ``isAllowedToContainClauseKind("OMPC_default").``
3578 1.1 joerg </pre></td></tr>
3579 1.1 joerg
3580 1.1 joerg
3581 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('isStandaloneDirective0')"><a name="isStandaloneDirective0Anchor">isStandaloneDirective</a></td><td></td></tr>
3582 1.1 joerg <tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
3583 1.1 joerg i.e., directives that can't have a structured block.
3584 1.1 joerg
3585 1.1 joerg Given
3586 1.1 joerg
3587 1.1 joerg #pragma omp parallel
3588 1.1 joerg {}
3589 1.1 joerg #pragma omp taskyield
3590 1.1 joerg
3591 1.1 joerg ``ompExecutableDirective(isStandaloneDirective()))`` matches
3592 1.1 joerg ``omp taskyield``.
3593 1.1 joerg </pre></td></tr>
3594 1.1 joerg
3595 1.1 joerg
3596 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom3')"><a name="isDerivedFrom3Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
3597 1.1 joerg <tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
3598 1.1 joerg </pre></td></tr>
3599 1.1 joerg
3600 1.1 joerg
3601 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom3')"><a name="isDirectlyDerivedFrom3Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
3602 1.1 joerg <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
3603 1.1 joerg </pre></td></tr>
3604 1.1 joerg
3605 1.1 joerg
3606 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom3')"><a name="isSameOrDerivedFrom3Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
3607 1.1 joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
3608 1.1 joerg isSameOrDerivedFrom(hasName(...)).
3609 1.1 joerg </pre></td></tr>
3610 1.1 joerg
3611 1.1 joerg
3612 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
3613 1.1 joerg <tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3614 1.1 joerg a specific number of arguments (including absent default arguments).
3615 1.1 joerg
3616 1.1 joerg Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3617 1.1 joerg void f(int x, int y);
3618 1.1 joerg f(0, 0);
3619 1.1 joerg </pre></td></tr>
3620 1.1 joerg
3621 1.1 joerg
3622 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr>
3623 1.1 joerg <tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3624 1.1 joerg
3625 1.1 joerg objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3626 1.1 joerg message expression in
3627 1.1 joerg
3628 1.1 joerg UIWebView *webView = ...;
3629 1.1 joerg CGRect bodyFrame = webView.frame;
3630 1.1 joerg bodyFrame.size.height = self.bodyContentHeight;
3631 1.1 joerg webView.frame = bodyFrame;
3632 1.1 joerg // ^---- matches here
3633 1.1 joerg </pre></td></tr>
3634 1.1 joerg
3635 1.1 joerg
3636 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr>
3637 1.1 joerg <tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3638 1.1 joerg
3639 1.1 joerg Matches only when the selector of the objCMessageExpr is NULL. This may
3640 1.1 joerg represent an error condition in the tree!
3641 1.1 joerg </pre></td></tr>
3642 1.1 joerg
3643 1.1 joerg
3644 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasSelector0')"><a name="hasSelector0Anchor">hasSelector</a></td><td>std::string BaseName</td></tr>
3645 1.1 joerg <tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3646 1.1 joerg
3647 1.1 joerg matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3648 1.1 joerg matches the outer message expr in the code below, but NOT the message
3649 1.1 joerg invocation for self.bodyView.
3650 1.1 joerg [self.bodyView loadHTMLString:html baseURL:NULL];
3651 1.1 joerg </pre></td></tr>
3652 1.1 joerg
3653 1.1 joerg
3654 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasUnarySelector0')"><a name="hasUnarySelector0Anchor">hasUnarySelector</a></td><td></td></tr>
3655 1.1 joerg <tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3656 1.1 joerg
3657 1.1 joerg matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3658 1.1 joerg matches self.bodyView in the code below, but NOT the outer message
3659 1.1 joerg invocation of "loadHTMLString:baseURL:".
3660 1.1 joerg [self.bodyView loadHTMLString:html baseURL:NULL];
3661 1.1 joerg </pre></td></tr>
3662 1.1 joerg
3663 1.1 joerg
3664 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('isClassMessage0')"><a name="isClassMessage0Anchor">isClassMessage</a></td><td></td></tr>
3665 1.1 joerg <tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
3666 1.1 joerg
3667 1.1 joerg Example
3668 1.1 joerg matcher = objcMessageExpr(isClassMessage())
3669 1.1 joerg matches
3670 1.1 joerg [NSString stringWithFormat:@"format"];
3671 1.1 joerg but not
3672 1.1 joerg NSString *x = @"hello";
3673 1.1 joerg [x containsString:@"h"];
3674 1.1 joerg </pre></td></tr>
3675 1.1 joerg
3676 1.1 joerg
3677 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('isInstanceMessage0')"><a name="isInstanceMessage0Anchor">isInstanceMessage</a></td><td></td></tr>
3678 1.1 joerg <tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
3679 1.1 joerg
3680 1.1 joerg Example
3681 1.1 joerg matcher = objcMessageExpr(isInstanceMessage())
3682 1.1 joerg matches
3683 1.1 joerg NSString *x = @"hello";
3684 1.1 joerg [x containsString:@"h"];
3685 1.1 joerg but not
3686 1.1 joerg [NSString stringWithFormat:@"format"];
3687 1.1 joerg </pre></td></tr>
3688 1.1 joerg
3689 1.1 joerg
3690 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>std::string RegExp</td></tr>
3691 1.1 joerg <tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3692 1.1 joerg a substring matched by the given RegExp.
3693 1.1 joerg matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3694 1.1 joerg invocation for self.bodyView.
3695 1.1 joerg [self.bodyView loadHTMLString:html baseURL:NULL];
3696 1.1 joerg </pre></td></tr>
3697 1.1 joerg
3698 1.1 joerg
3699 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr>
3700 1.1 joerg <tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3701 1.1 joerg
3702 1.1 joerg matcher = objCMessageExpr(numSelectorArgs(0));
3703 1.1 joerg matches self.bodyView in the code below
3704 1.1 joerg
3705 1.1 joerg matcher = objCMessageExpr(numSelectorArgs(2));
3706 1.1 joerg matches the invocation of "loadHTMLString:baseURL:" but not that
3707 1.1 joerg of self.bodyView
3708 1.1 joerg [self.bodyView loadHTMLString:html baseURL:NULL];
3709 1.1 joerg </pre></td></tr>
3710 1.1 joerg
3711 1.1 joerg
3712 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isClassMethod0')"><a name="isClassMethod0Anchor">isClassMethod</a></td><td></td></tr>
3713 1.1 joerg <tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
3714 1.1 joerg
3715 1.1 joerg Example
3716 1.1 joerg matcher = objcMethodDecl(isClassMethod())
3717 1.1 joerg matches
3718 1.1 joerg @interface I + (void)foo; @end
3719 1.1 joerg but not
3720 1.1 joerg @interface I - (void)bar; @end
3721 1.1 joerg </pre></td></tr>
3722 1.1 joerg
3723 1.1 joerg
3724 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
3725 1.1 joerg <tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
3726 1.1 joerg
3727 1.1 joerg Example matches A, va, fa
3728 1.1 joerg class A {};
3729 1.1 joerg class B; // Doesn't match, as it has no body.
3730 1.1 joerg int va;
3731 1.1 joerg extern int vb; // Doesn't match, as it doesn't define the variable.
3732 1.1 joerg void fa() {}
3733 1.1 joerg void fb(); // Doesn't match, as it has no body.
3734 1.1 joerg @interface X
3735 1.1 joerg - (void)ma; // Doesn't match, interface is declaration.
3736 1.1 joerg @end
3737 1.1 joerg @implementation X
3738 1.1 joerg - (void)ma {}
3739 1.1 joerg @end
3740 1.1 joerg
3741 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>,
3742 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>
3743 1.1 joerg </pre></td></tr>
3744 1.1 joerg
3745 1.1 joerg
3746 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isInstanceMethod0')"><a name="isInstanceMethod0Anchor">isInstanceMethod</a></td><td></td></tr>
3747 1.1 joerg <tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
3748 1.1 joerg
3749 1.1 joerg Example
3750 1.1 joerg matcher = objcMethodDecl(isInstanceMethod())
3751 1.1 joerg matches
3752 1.1 joerg @interface I - (void)bar; @end
3753 1.1 joerg but not
3754 1.1 joerg @interface I + (void)foo; @end
3755 1.1 joerg </pre></td></tr>
3756 1.1 joerg
3757 1.1 joerg
3758 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>></td><td class="name" onclick="toggle('hasDefaultArgument0')"><a name="hasDefaultArgument0Anchor">hasDefaultArgument</a></td><td></td></tr>
3759 1.1 joerg <tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
3760 1.1 joerg
3761 1.1 joerg Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
3762 1.1 joerg void x(int val) {}
3763 1.1 joerg void y(int val = 0) {}
3764 1.1 joerg </pre></td></tr>
3765 1.1 joerg
3766 1.1 joerg
3767 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('asString0')"><a name="asString0Anchor">asString</a></td><td>std::string Name</td></tr>
3768 1.1 joerg <tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3769 1.1 joerg
3770 1.1 joerg Given
3771 1.1 joerg class Y { public: void x(); };
3772 1.1 joerg void z() { Y* y; y->x(); }
3773 1.1 joerg cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3774 1.1 joerg matches y->x()
3775 1.1 joerg </pre></td></tr>
3776 1.1 joerg
3777 1.1 joerg
3778 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
3779 1.1 joerg <tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3780 1.1 joerg
3781 1.1 joerg Matches a node if it equals the node previously bound to ID.
3782 1.1 joerg
3783 1.1 joerg Given
3784 1.1 joerg class X { int a; int b; };
3785 1.1 joerg cxxRecordDecl(
3786 1.1 joerg has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3787 1.1 joerg has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3788 1.1 joerg matches the class X, as a and b have the same type.
3789 1.1 joerg
3790 1.1 joerg Note that when multiple matches are involved via forEach* matchers,
3791 1.1 joerg equalsBoundNodes acts as a filter.
3792 1.1 joerg For example:
3793 1.1 joerg compoundStmt(
3794 1.1 joerg forEachDescendant(varDecl().bind("d")),
3795 1.1 joerg forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3796 1.1 joerg will trigger a match for each combination of variable declaration
3797 1.1 joerg and reference to that variable declaration within a compound statement.
3798 1.1 joerg </pre></td></tr>
3799 1.1 joerg
3800 1.1 joerg
3801 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('hasLocalQualifiers0')"><a name="hasLocalQualifiers0Anchor">hasLocalQualifiers</a></td><td></td></tr>
3802 1.1 joerg <tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3803 1.1 joerg the node, not hidden within a typedef.
3804 1.1 joerg
3805 1.1 joerg Given
3806 1.1 joerg typedef const int const_int;
3807 1.1 joerg const_int i;
3808 1.1 joerg int *const j;
3809 1.1 joerg int *volatile k;
3810 1.1 joerg int m;
3811 1.1 joerg varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3812 1.1 joerg i is const-qualified but the qualifier is not local.
3813 1.1 joerg </pre></td></tr>
3814 1.1 joerg
3815 1.1 joerg
3816 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr>
3817 1.1 joerg <tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3818 1.1 joerg
3819 1.1 joerg Given
3820 1.1 joerg void a(char);
3821 1.1 joerg void b(wchar_t);
3822 1.1 joerg void c(double);
3823 1.1 joerg functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3824 1.1 joerg matches "a(char)", "b(wchar_t)", but not "c(double)".
3825 1.1 joerg </pre></td></tr>
3826 1.1 joerg
3827 1.1 joerg
3828 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr>
3829 1.1 joerg <tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3830 1.1 joerg the Objective-C object pointer type, which is different despite being
3831 1.1 joerg syntactically similar.
3832 1.1 joerg
3833 1.1 joerg Given
3834 1.1 joerg int *i = nullptr;
3835 1.1 joerg
3836 1.1 joerg @interface Foo
3837 1.1 joerg @end
3838 1.1 joerg Foo *f;
3839 1.1 joerg
3840 1.1 joerg int j;
3841 1.1 joerg varDecl(hasType(isAnyPointer()))
3842 1.1 joerg matches "int *i" and "Foo *f", but not "int j".
3843 1.1 joerg </pre></td></tr>
3844 1.1 joerg
3845 1.1 joerg
3846 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isConstQualified0')"><a name="isConstQualified0Anchor">isConstQualified</a></td><td></td></tr>
3847 1.1 joerg <tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3848 1.1 joerg include "top-level" const.
3849 1.1 joerg
3850 1.1 joerg Given
3851 1.1 joerg void a(int);
3852 1.1 joerg void b(int const);
3853 1.1 joerg void c(const int);
3854 1.1 joerg void d(const int*);
3855 1.1 joerg void e(int const) {};
3856 1.1 joerg functionDecl(hasAnyParameter(hasType(isConstQualified())))
3857 1.1 joerg matches "void b(int const)", "void c(const int)" and
3858 1.1 joerg "void e(int const) {}". It does not match d as there
3859 1.1 joerg is no top-level const on the parameter type "const int *".
3860 1.1 joerg </pre></td></tr>
3861 1.1 joerg
3862 1.1 joerg
3863 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isInteger0')"><a name="isInteger0Anchor">isInteger</a></td><td></td></tr>
3864 1.1 joerg <tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3865 1.1 joerg
3866 1.1 joerg Given
3867 1.1 joerg void a(int);
3868 1.1 joerg void b(long);
3869 1.1 joerg void c(double);
3870 1.1 joerg functionDecl(hasAnyParameter(hasType(isInteger())))
3871 1.1 joerg matches "a(int)", "b(long)", but not "c(double)".
3872 1.1 joerg </pre></td></tr>
3873 1.1 joerg
3874 1.1 joerg
3875 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr>
3876 1.1 joerg <tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3877 1.1 joerg
3878 1.1 joerg Given
3879 1.1 joerg void a(int);
3880 1.1 joerg void b(unsigned long);
3881 1.1 joerg void c(double);
3882 1.1 joerg functionDecl(hasAnyParameter(hasType(isSignedInteger())))
3883 1.1 joerg matches "a(int)", but not "b(unsigned long)" and "c(double)".
3884 1.1 joerg </pre></td></tr>
3885 1.1 joerg
3886 1.1 joerg
3887 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr>
3888 1.1 joerg <tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3889 1.1 joerg
3890 1.1 joerg Given
3891 1.1 joerg void a(int);
3892 1.1 joerg void b(unsigned long);
3893 1.1 joerg void c(double);
3894 1.1 joerg functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
3895 1.1 joerg matches "b(unsigned long)", but not "a(int)" and "c(double)".
3896 1.1 joerg </pre></td></tr>
3897 1.1 joerg
3898 1.1 joerg
3899 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr>
3900 1.1 joerg <tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3901 1.1 joerg include "top-level" volatile.
3902 1.1 joerg
3903 1.1 joerg Given
3904 1.1 joerg void a(int);
3905 1.1 joerg void b(int volatile);
3906 1.1 joerg void c(volatile int);
3907 1.1 joerg void d(volatile int*);
3908 1.1 joerg void e(int volatile) {};
3909 1.1 joerg functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3910 1.1 joerg matches "void b(int volatile)", "void c(volatile int)" and
3911 1.1 joerg "void e(int volatile) {}". It does not match d as there
3912 1.1 joerg is no top-level volatile on the parameter type "volatile int *".
3913 1.1 joerg </pre></td></tr>
3914 1.1 joerg
3915 1.1 joerg
3916 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>></td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr>
3917 1.1 joerg <tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3918 1.1 joerg
3919 1.1 joerg Example matches C, but not S or U.
3920 1.1 joerg struct S {};
3921 1.1 joerg class C {};
3922 1.1 joerg union U {};
3923 1.1 joerg </pre></td></tr>
3924 1.1 joerg
3925 1.1 joerg
3926 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>></td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr>
3927 1.1 joerg <tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3928 1.1 joerg
3929 1.1 joerg Example matches S, but not C or U.
3930 1.1 joerg struct S {};
3931 1.1 joerg class C {};
3932 1.1 joerg union U {};
3933 1.1 joerg </pre></td></tr>
3934 1.1 joerg
3935 1.1 joerg
3936 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>></td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr>
3937 1.1 joerg <tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3938 1.1 joerg
3939 1.1 joerg Example matches U, but not C or S.
3940 1.1 joerg struct S {};
3941 1.1 joerg class C {};
3942 1.1 joerg union U {};
3943 1.1 joerg </pre></td></tr>
3944 1.1 joerg
3945 1.1 joerg
3946 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
3947 1.1 joerg <tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3948 1.1 joerg
3949 1.1 joerg Matches a node if it equals the node previously bound to ID.
3950 1.1 joerg
3951 1.1 joerg Given
3952 1.1 joerg class X { int a; int b; };
3953 1.1 joerg cxxRecordDecl(
3954 1.1 joerg has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3955 1.1 joerg has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3956 1.1 joerg matches the class X, as a and b have the same type.
3957 1.1 joerg
3958 1.1 joerg Note that when multiple matches are involved via forEach* matchers,
3959 1.1 joerg equalsBoundNodes acts as a filter.
3960 1.1 joerg For example:
3961 1.1 joerg compoundStmt(
3962 1.1 joerg forEachDescendant(varDecl().bind("d")),
3963 1.1 joerg forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3964 1.1 joerg will trigger a match for each combination of variable declaration
3965 1.1 joerg and reference to that variable declaration within a compound statement.
3966 1.1 joerg </pre></td></tr>
3967 1.1 joerg
3968 1.1 joerg
3969 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>const Stmt* Other</td></tr>
3970 1.1 joerg <tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3971 1.1 joerg
3972 1.1 joerg Stmt has pointer identity in the AST.
3973 1.1 joerg </pre></td></tr>
3974 1.1 joerg
3975 1.1 joerg
3976 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
3977 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3978 1.1 joerg partially matching a given regex.
3979 1.1 joerg
3980 1.1 joerg Example matches Y but not X
3981 1.1 joerg (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3982 1.1 joerg #include "ASTMatcher.h"
3983 1.1 joerg class X {};
3984 1.1 joerg ASTMatcher.h:
3985 1.1 joerg class Y {};
3986 1.1 joerg
3987 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>
3988 1.1 joerg </pre></td></tr>
3989 1.1 joerg
3990 1.1 joerg
3991 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr>
3992 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3993 1.1 joerg
3994 1.1 joerg Example matches X but not Y
3995 1.1 joerg (matcher = cxxRecordDecl(isExpansionInMainFile())
3996 1.1 joerg #include <Y.h>
3997 1.1 joerg class X {};
3998 1.1 joerg Y.h:
3999 1.1 joerg class Y {};
4000 1.1 joerg
4001 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>
4002 1.1 joerg </pre></td></tr>
4003 1.1 joerg
4004 1.1 joerg
4005 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
4006 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
4007 1.1 joerg
4008 1.1 joerg Example matches Y but not X
4009 1.1 joerg (matcher = cxxRecordDecl(isExpansionInSystemHeader())
4010 1.1 joerg #include <SystemHeader.h>
4011 1.1 joerg class X {};
4012 1.1 joerg SystemHeader.h:
4013 1.1 joerg class Y {};
4014 1.1 joerg
4015 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>
4016 1.1 joerg </pre></td></tr>
4017 1.1 joerg
4018 1.1 joerg
4019 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isOMPStructuredBlock0')"><a name="isOMPStructuredBlock0Anchor">isOMPStructuredBlock</a></td><td></td></tr>
4020 1.1 joerg <tr><td colspan="4" class="doc" id="isOMPStructuredBlock0"><pre>Matches the Stmt AST node that is marked as being the structured-block
4021 1.1 joerg of an OpenMP executable directive.
4022 1.1 joerg
4023 1.1 joerg Given
4024 1.1 joerg
4025 1.1 joerg #pragma omp parallel
4026 1.1 joerg {}
4027 1.1 joerg
4028 1.1 joerg ``stmt(isOMPStructuredBlock()))`` matches ``{}``.
4029 1.1 joerg </pre></td></tr>
4030 1.1 joerg
4031 1.1 joerg
4032 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>></td><td class="name" onclick="toggle('hasSize1')"><a name="hasSize1Anchor">hasSize</a></td><td>unsigned N</td></tr>
4033 1.1 joerg <tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
4034 1.1 joerg
4035 1.1 joerg Given
4036 1.1 joerg int a[42];
4037 1.1 joerg int b[2 * 21];
4038 1.1 joerg int c[41], d[43];
4039 1.1 joerg char *s = "abcd";
4040 1.1 joerg wchar_t *ws = L"abcd";
4041 1.1 joerg char *w = "a";
4042 1.1 joerg constantArrayType(hasSize(42))
4043 1.1 joerg matches "int a[42]" and "int b[2 * 21]"
4044 1.1 joerg stringLiteral(hasSize(4))
4045 1.1 joerg matches "abcd", L"abcd"
4046 1.1 joerg </pre></td></tr>
4047 1.1 joerg
4048 1.1 joerg
4049 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isDefinition0')"><a name="isDefinition0Anchor">isDefinition</a></td><td></td></tr>
4050 1.1 joerg <tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
4051 1.1 joerg
4052 1.1 joerg Example matches A, va, fa
4053 1.1 joerg class A {};
4054 1.1 joerg class B; // Doesn't match, as it has no body.
4055 1.1 joerg int va;
4056 1.1 joerg extern int vb; // Doesn't match, as it doesn't define the variable.
4057 1.1 joerg void fa() {}
4058 1.1 joerg void fb(); // Doesn't match, as it has no body.
4059 1.1 joerg @interface X
4060 1.1 joerg - (void)ma; // Doesn't match, interface is declaration.
4061 1.1 joerg @end
4062 1.1 joerg @implementation X
4063 1.1 joerg - (void)ma {}
4064 1.1 joerg @end
4065 1.1 joerg
4066 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>,
4067 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>
4068 1.1 joerg </pre></td></tr>
4069 1.1 joerg
4070 1.1 joerg
4071 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr>
4072 1.1 joerg <tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
4073 1.1 joerg
4074 1.1 joerg Note that 'Value' is a string as the template argument's value is
4075 1.1 joerg an arbitrary precision integer. 'Value' must be euqal to the canonical
4076 1.1 joerg representation of that integral value in base 10.
4077 1.1 joerg
4078 1.1 joerg Given
4079 1.1 joerg template<int T> struct C {};
4080 1.1 joerg C<42> c;
4081 1.1 joerg classTemplateSpecializationDecl(
4082 1.1 joerg hasAnyTemplateArgument(equalsIntegralValue("42")))
4083 1.1 joerg matches the implicit instantiation of C in C<42>.
4084 1.1 joerg </pre></td></tr>
4085 1.1 joerg
4086 1.1 joerg
4087 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr>
4088 1.1 joerg <tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
4089 1.1 joerg
4090 1.1 joerg Given
4091 1.1 joerg template<int T> struct C {};
4092 1.1 joerg C<42> c;
4093 1.1 joerg classTemplateSpecializationDecl(
4094 1.1 joerg hasAnyTemplateArgument(isIntegral()))
4095 1.1 joerg matches the implicit instantiation of C in C<42>
4096 1.1 joerg with isIntegral() matching 42.
4097 1.1 joerg </pre></td></tr>
4098 1.1 joerg
4099 1.1 joerg
4100 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('templateArgumentCountIs1')"><a name="templateArgumentCountIs1Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
4101 1.1 joerg <tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
4102 1.1 joerg
4103 1.1 joerg Given
4104 1.1 joerg template<typename T> struct C {};
4105 1.1 joerg C<int> c;
4106 1.1 joerg classTemplateSpecializationDecl(templateArgumentCountIs(1))
4107 1.1 joerg matches C<int>.
4108 1.1 joerg </pre></td></tr>
4109 1.1 joerg
4110 1.1 joerg
4111 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
4112 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
4113 1.1 joerg partially matching a given regex.
4114 1.1 joerg
4115 1.1 joerg Example matches Y but not X
4116 1.1 joerg (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
4117 1.1 joerg #include "ASTMatcher.h"
4118 1.1 joerg class X {};
4119 1.1 joerg ASTMatcher.h:
4120 1.1 joerg class Y {};
4121 1.1 joerg
4122 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>
4123 1.1 joerg </pre></td></tr>
4124 1.1 joerg
4125 1.1 joerg
4126 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr>
4127 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
4128 1.1 joerg
4129 1.1 joerg Example matches X but not Y
4130 1.1 joerg (matcher = cxxRecordDecl(isExpansionInMainFile())
4131 1.1 joerg #include <Y.h>
4132 1.1 joerg class X {};
4133 1.1 joerg Y.h:
4134 1.1 joerg class Y {};
4135 1.1 joerg
4136 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>
4137 1.1 joerg </pre></td></tr>
4138 1.1 joerg
4139 1.1 joerg
4140 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader2')"><a name="isExpansionInSystemHeader2Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
4141 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
4142 1.1 joerg
4143 1.1 joerg Example matches Y but not X
4144 1.1 joerg (matcher = cxxRecordDecl(isExpansionInSystemHeader())
4145 1.1 joerg #include <SystemHeader.h>
4146 1.1 joerg class X {};
4147 1.1 joerg SystemHeader.h:
4148 1.1 joerg class Y {};
4149 1.1 joerg
4150 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>
4151 1.1 joerg </pre></td></tr>
4152 1.1 joerg
4153 1.1 joerg
4154 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr>
4155 1.1 joerg <tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
4156 1.1 joerg
4157 1.1 joerg Given
4158 1.1 joerg struct S { bool func(); };
4159 1.1 joerg functionDecl(returns(booleanType()))
4160 1.1 joerg matches "bool func();"
4161 1.1 joerg </pre></td></tr>
4162 1.1 joerg
4163 1.1 joerg
4164 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('equalsBoundNode2')"><a name="equalsBoundNode2Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
4165 1.1 joerg <tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
4166 1.1 joerg
4167 1.1 joerg Matches a node if it equals the node previously bound to ID.
4168 1.1 joerg
4169 1.1 joerg Given
4170 1.1 joerg class X { int a; int b; };
4171 1.1 joerg cxxRecordDecl(
4172 1.1 joerg has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4173 1.1 joerg has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4174 1.1 joerg matches the class X, as a and b have the same type.
4175 1.1 joerg
4176 1.1 joerg Note that when multiple matches are involved via forEach* matchers,
4177 1.1 joerg equalsBoundNodes acts as a filter.
4178 1.1 joerg For example:
4179 1.1 joerg compoundStmt(
4180 1.1 joerg forEachDescendant(varDecl().bind("d")),
4181 1.1 joerg forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4182 1.1 joerg will trigger a match for each combination of variable declaration
4183 1.1 joerg and reference to that variable declaration within a compound statement.
4184 1.1 joerg </pre></td></tr>
4185 1.1 joerg
4186 1.1 joerg
4187 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('equalsNode2')"><a name="equalsNode2Anchor">equalsNode</a></td><td>const Type* Other</td></tr>
4188 1.1 joerg <tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
4189 1.1 joerg
4190 1.1 joerg Type has pointer identity in the AST.
4191 1.1 joerg </pre></td></tr>
4192 1.1 joerg
4193 1.1 joerg
4194 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr>
4195 1.1 joerg <tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
4196 1.1 joerg
4197 1.1 joerg Given
4198 1.1 joerg int i;
4199 1.1 joerg float f;
4200 1.1 joerg realFloatingPointType()
4201 1.1 joerg matches "float f" but not "int i"
4202 1.1 joerg </pre></td></tr>
4203 1.1 joerg
4204 1.1 joerg
4205 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr>
4206 1.1 joerg <tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
4207 1.1 joerg
4208 1.1 joerg Given
4209 1.1 joerg struct S { void func(); };
4210 1.1 joerg functionDecl(returns(voidType()))
4211 1.1 joerg matches "void func();"
4212 1.1 joerg </pre></td></tr>
4213 1.1 joerg
4214 1.1 joerg
4215 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>></td><td class="name" onclick="toggle('ofKind0')"><a name="ofKind0Anchor">ofKind</a></td><td>UnaryExprOrTypeTrait Kind</td></tr>
4216 1.1 joerg <tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
4217 1.1 joerg
4218 1.1 joerg Given
4219 1.1 joerg int x;
4220 1.1 joerg int s = sizeof(x) + alignof(x)
4221 1.1 joerg unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
4222 1.1 joerg matches sizeof(x)
4223 1.1 joerg
4224 1.1 joerg If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
4225 1.1 joerg should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
4226 1.1 joerg </pre></td></tr>
4227 1.1 joerg
4228 1.1 joerg
4229 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
4230 1.1 joerg <tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
4231 1.1 joerg unary).
4232 1.1 joerg
4233 1.1 joerg Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
4234 1.1 joerg !(a || b)
4235 1.1 joerg </pre></td></tr>
4236 1.1 joerg
4237 1.1 joerg
4238 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>></td><td class="name" onclick="toggle('isArrow1')"><a name="isArrow1Anchor">isArrow</a></td><td></td></tr>
4239 1.1 joerg <tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed
4240 1.1 joerg to '.'.
4241 1.1 joerg
4242 1.1 joerg Member calls on the implicit this pointer match as called with '->'.
4243 1.1 joerg
4244 1.1 joerg Given
4245 1.1 joerg class Y {
4246 1.1 joerg void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
4247 1.1 joerg template <class T> void f() { this->f<T>(); f<T>(); }
4248 1.1 joerg int a;
4249 1.1 joerg static int b;
4250 1.1 joerg };
4251 1.1 joerg template <class T>
4252 1.1 joerg class Z {
4253 1.1 joerg void x() { this->m; }
4254 1.1 joerg };
4255 1.1 joerg memberExpr(isArrow())
4256 1.1 joerg matches this->x, x, y.x, a, this->b
4257 1.1 joerg cxxDependentScopeMemberExpr(isArrow())
4258 1.1 joerg matches this->m
4259 1.1 joerg unresolvedMemberExpr(isArrow())
4260 1.1 joerg matches this->f<T>, f<T>
4261 1.1 joerg </pre></td></tr>
4262 1.1 joerg
4263 1.1 joerg
4264 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr>
4265 1.1 joerg <tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
4266 1.1 joerg
4267 1.1 joerg Example matches x, but not y, z, or a.
4268 1.1 joerg (matcher = varDecl(hasAutomaticStorageDuration())
4269 1.1 joerg void f() {
4270 1.1 joerg int x;
4271 1.1 joerg static int y;
4272 1.1 joerg thread_local int z;
4273 1.1 joerg }
4274 1.1 joerg int a;
4275 1.1 joerg </pre></td></tr>
4276 1.1 joerg
4277 1.1 joerg
4278 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr>
4279 1.1 joerg <tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
4280 1.1 joerg
4281 1.1 joerg Example matches y and z (matcher = varDecl(hasGlobalStorage())
4282 1.1 joerg void f() {
4283 1.1 joerg int x;
4284 1.1 joerg static int y;
4285 1.1 joerg }
4286 1.1 joerg int z;
4287 1.1 joerg </pre></td></tr>
4288 1.1 joerg
4289 1.1 joerg
4290 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr>
4291 1.1 joerg <tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
4292 1.1 joerg non-static local variable.
4293 1.1 joerg
4294 1.1 joerg Example matches x (matcher = varDecl(hasLocalStorage())
4295 1.1 joerg void f() {
4296 1.1 joerg int x;
4297 1.1 joerg static int y;
4298 1.1 joerg }
4299 1.1 joerg int z;
4300 1.1 joerg </pre></td></tr>
4301 1.1 joerg
4302 1.1 joerg
4303 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr>
4304 1.1 joerg <tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
4305 1.1 joerg It includes the variable declared at namespace scope and those declared
4306 1.1 joerg with "static" and "extern" storage class specifiers.
4307 1.1 joerg
4308 1.1 joerg void f() {
4309 1.1 joerg int x;
4310 1.1 joerg static int y;
4311 1.1 joerg thread_local int z;
4312 1.1 joerg }
4313 1.1 joerg int a;
4314 1.1 joerg static int b;
4315 1.1 joerg extern int c;
4316 1.1 joerg varDecl(hasStaticStorageDuration())
4317 1.1 joerg matches the function declaration y, a, b and c.
4318 1.1 joerg </pre></td></tr>
4319 1.1 joerg
4320 1.1 joerg
4321 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr>
4322 1.1 joerg <tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
4323 1.1 joerg
4324 1.1 joerg Example matches z, but not x, z, or a.
4325 1.1 joerg (matcher = varDecl(hasThreadStorageDuration())
4326 1.1 joerg void f() {
4327 1.1 joerg int x;
4328 1.1 joerg static int y;
4329 1.1 joerg thread_local int z;
4330 1.1 joerg }
4331 1.1 joerg int a;
4332 1.1 joerg </pre></td></tr>
4333 1.1 joerg
4334 1.1 joerg
4335 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr>
4336 1.1 joerg <tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
4337 1.1 joerg and if constexpr.
4338 1.1 joerg
4339 1.1 joerg Given:
4340 1.1 joerg constexpr int foo = 42;
4341 1.1 joerg constexpr int bar();
4342 1.1 joerg void baz() { if constexpr(1 > 0) {} }
4343 1.1 joerg varDecl(isConstexpr())
4344 1.1 joerg matches the declaration of foo.
4345 1.1 joerg functionDecl(isConstexpr())
4346 1.1 joerg matches the declaration of bar.
4347 1.1 joerg ifStmt(isConstexpr())
4348 1.1 joerg matches the if statement in baz.
4349 1.1 joerg </pre></td></tr>
4350 1.1 joerg
4351 1.1 joerg
4352 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isDefinition1')"><a name="isDefinition1Anchor">isDefinition</a></td><td></td></tr>
4353 1.1 joerg <tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
4354 1.1 joerg
4355 1.1 joerg Example matches A, va, fa
4356 1.1 joerg class A {};
4357 1.1 joerg class B; // Doesn't match, as it has no body.
4358 1.1 joerg int va;
4359 1.1 joerg extern int vb; // Doesn't match, as it doesn't define the variable.
4360 1.1 joerg void fa() {}
4361 1.1 joerg void fb(); // Doesn't match, as it has no body.
4362 1.1 joerg @interface X
4363 1.1 joerg - (void)ma; // Doesn't match, interface is declaration.
4364 1.1 joerg @end
4365 1.1 joerg @implementation X
4366 1.1 joerg - (void)ma {}
4367 1.1 joerg @end
4368 1.1 joerg
4369 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>,
4370 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>
4371 1.1 joerg </pre></td></tr>
4372 1.1 joerg
4373 1.1 joerg
4374 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr>
4375 1.1 joerg <tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
4376 1.1 joerg a C++ catch block, or an Objective-C statement.
4377 1.1 joerg
4378 1.1 joerg Example matches x (matcher = varDecl(isExceptionVariable())
4379 1.1 joerg void f(int y) {
4380 1.1 joerg try {
4381 1.1 joerg } catch (int x) {
4382 1.1 joerg }
4383 1.1 joerg }
4384 1.1 joerg </pre></td></tr>
4385 1.1 joerg
4386 1.1 joerg
4387 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization1')"><a name="isExplicitTemplateSpecialization1Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
4388 1.1 joerg <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
4389 1.1 joerg static member variable template instantiations.
4390 1.1 joerg
4391 1.1 joerg Given
4392 1.1 joerg template<typename T> void A(T t) { }
4393 1.1 joerg template<> void A(int N) { }
4394 1.1 joerg functionDecl(isExplicitTemplateSpecialization())
4395 1.1 joerg matches the specialization A<int>().
4396 1.1 joerg
4397 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>
4398 1.1 joerg </pre></td></tr>
4399 1.1 joerg
4400 1.1 joerg
4401 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr>
4402 1.1 joerg <tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
4403 1.1 joerg
4404 1.1 joerg Given:
4405 1.1 joerg extern "C" void f() {}
4406 1.1 joerg extern "C" { void g() {} }
4407 1.1 joerg void h() {}
4408 1.1 joerg extern "C" int x = 1;
4409 1.1 joerg extern "C" int y = 2;
4410 1.1 joerg int z = 3;
4411 1.1 joerg functionDecl(isExternC())
4412 1.1 joerg matches the declaration of f and g, but not the declaration of h.
4413 1.1 joerg varDecl(isExternC())
4414 1.1 joerg matches the declaration of x and y, but not the declaration of z.
4415 1.1 joerg </pre></td></tr>
4416 1.1 joerg
4417 1.1 joerg
4418 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isStaticLocal0')"><a name="isStaticLocal0Anchor">isStaticLocal</a></td><td></td></tr>
4419 1.1 joerg <tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
4420 1.1 joerg
4421 1.1 joerg Example matches y (matcher = varDecl(isStaticLocal()))
4422 1.1 joerg void f() {
4423 1.1 joerg int x;
4424 1.1 joerg static int y;
4425 1.1 joerg }
4426 1.1 joerg static int z;
4427 1.1 joerg </pre></td></tr>
4428 1.1 joerg
4429 1.1 joerg
4430 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr>
4431 1.1 joerg <tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
4432 1.1 joerg class specifier ("static" keyword) written in the source.
4433 1.1 joerg
4434 1.1 joerg Given:
4435 1.1 joerg static void f() {}
4436 1.1 joerg static int i = 0;
4437 1.1 joerg extern int j;
4438 1.1 joerg int k;
4439 1.1 joerg functionDecl(isStaticStorageClass())
4440 1.1 joerg matches the function declaration f.
4441 1.1 joerg varDecl(isStaticStorageClass())
4442 1.1 joerg matches the variable declaration i.
4443 1.1 joerg </pre></td></tr>
4444 1.1 joerg
4445 1.1 joerg
4446 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation1')"><a name="isTemplateInstantiation1Anchor">isTemplateInstantiation</a></td><td></td></tr>
4447 1.1 joerg <tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
4448 1.1 joerg member variable template instantiations.
4449 1.1 joerg
4450 1.1 joerg Given
4451 1.1 joerg template <typename T> class X {}; class A {}; X<A> x;
4452 1.1 joerg or
4453 1.1 joerg template <typename T> class X {}; class A {}; template class X<A>;
4454 1.1 joerg or
4455 1.1 joerg template <typename T> class X {}; class A {}; extern template class X<A>;
4456 1.1 joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4457 1.1 joerg matches the template instantiation of X<A>.
4458 1.1 joerg
4459 1.1 joerg But given
4460 1.1 joerg template <typename T> class X {}; class A {};
4461 1.1 joerg template <> class X<A> {}; X<A> x;
4462 1.1 joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4463 1.1 joerg does not match, as X<A> is an explicit template specialization.
4464 1.1 joerg
4465 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>
4466 1.1 joerg </pre></td></tr>
4467 1.1 joerg
4468 1.1 joerg
4469 1.1 joerg <tr><td>Matcher<internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>></td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
4470 1.1 joerg <tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
4471 1.1 joerg template instantiations.
4472 1.1 joerg
4473 1.1 joerg Given
4474 1.1 joerg template<typename T> void A(T t) { T i; }
4475 1.1 joerg A(0);
4476 1.1 joerg A(0U);
4477 1.1 joerg functionDecl(isInstantiated())
4478 1.1 joerg matches 'A(int) {...};' and 'A(unsigned) {...}'.
4479 1.1 joerg </pre></td></tr>
4480 1.1 joerg
4481 1.1 joerg
4482 1.1 joerg <tr><td>Matcher<internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>></td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr>
4483 1.1 joerg <tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
4484 1.1 joerg GNU's __null, C++11's nullptr, or C's NULL macro.
4485 1.1 joerg
4486 1.1 joerg Given:
4487 1.1 joerg void *v1 = NULL;
4488 1.1 joerg void *v2 = nullptr;
4489 1.1 joerg void *v3 = __null; // GNU extension
4490 1.1 joerg char *cp = (char *)0;
4491 1.1 joerg int *ip = 0;
4492 1.1 joerg int i = 0;
4493 1.1 joerg expr(nullPointerConstant())
4494 1.1 joerg matches the initializer for v1, v2, v3, cp, and ip. Does not match the
4495 1.1 joerg initializer for i.
4496 1.1 joerg </pre></td></tr>
4497 1.1 joerg
4498 1.1 joerg
4499 1.1 joerg <tr><td>Matcher<internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>>></td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr>
4500 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4501 1.1 joerg
4502 1.1 joerg This matcher is only provided as a performance optimization of hasName.
4503 1.1 joerg hasAnyName(a, b, c)
4504 1.1 joerg is equivalent to, but faster than
4505 1.1 joerg anyOf(hasName(a), hasName(b), hasName(c))
4506 1.1 joerg </pre></td></tr>
4507 1.1 joerg
4508 1.1 joerg
4509 1.1 joerg <tr><td>Matcher<internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>>></td><td class="name" onclick="toggle('hasAnySelector0')"><a name="hasAnySelector0Anchor">hasAnySelector</a></td><td>StringRef, ..., StringRef</td></tr>
4510 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
4511 1.1 joerg Selector.getAsString()
4512 1.1 joerg
4513 1.1 joerg matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
4514 1.1 joerg matches both of the expressions below:
4515 1.1 joerg [myObj methodA:argA];
4516 1.1 joerg [myObj methodB:argB];
4517 1.1 joerg </pre></td></tr>
4518 1.1 joerg
4519 1.1 joerg
4520 1.1 joerg <tr><td>Matcher<internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>></td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr>
4521 1.1 joerg <tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
4522 1.1 joerg
4523 1.1 joerg Given
4524 1.1 joerg int j;
4525 1.1 joerg template<typename T> void A(T t) { T i; j += 42;}
4526 1.1 joerg A(0);
4527 1.1 joerg A(0U);
4528 1.1 joerg declStmt(isInTemplateInstantiation())
4529 1.1 joerg matches 'int i;' and 'unsigned i'.
4530 1.1 joerg unless(stmt(isInTemplateInstantiation()))
4531 1.1 joerg will NOT match j += 42; as it's shared between the template definition and
4532 1.1 joerg instantiation.
4533 1.1 joerg </pre></td></tr>
4534 1.1 joerg
4535 1.1 joerg <!--END_NARROWING_MATCHERS -->
4536 1.1 joerg </table>
4537 1.1 joerg
4538 1.1 joerg <!-- ======================================================================= -->
4539 1.1 joerg <h2 id="traversal-matchers">AST Traversal Matchers</h2>
4540 1.1 joerg <!-- ======================================================================= -->
4541 1.1 joerg
4542 1.1 joerg <p>Traversal matchers specify the relationship to other nodes that are
4543 1.1 joerg reachable from the current node.</p>
4544 1.1 joerg
4545 1.1 joerg <p>Note that there are special traversal matchers (has, hasDescendant, forEach and
4546 1.1 joerg forEachDescendant) which work on all nodes and allow users to write more generic
4547 1.1 joerg match expressions.</p>
4548 1.1 joerg
4549 1.1 joerg <table>
4550 1.1 joerg <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
4551 1.1 joerg <!-- START_TRAVERSAL_MATCHERS -->
4552 1.1 joerg
4553 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr>
4554 1.1 joerg <tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
4555 1.1 joerg
4556 1.1 joerg Unlike anyOf, eachOf will generate a match result for each
4557 1.1 joerg matching submatcher.
4558 1.1 joerg
4559 1.1 joerg For example, in:
4560 1.1 joerg class A { int a; int b; };
4561 1.1 joerg The matcher:
4562 1.1 joerg cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
4563 1.1 joerg has(fieldDecl(hasName("b")).bind("v"))))
4564 1.1 joerg will generate two results binding "v", the first of which binds
4565 1.1 joerg the field declaration of a, the second the field declaration of
4566 1.1 joerg b.
4567 1.1 joerg
4568 1.1 joerg Usable as: Any Matcher
4569 1.1 joerg </pre></td></tr>
4570 1.1 joerg
4571 1.1 joerg
4572 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr>
4573 1.1 joerg <tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4574 1.1 joerg provided matcher.
4575 1.1 joerg
4576 1.1 joerg Example matches X, A, A::X, B, B::C, B::C::X
4577 1.1 joerg (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
4578 1.1 joerg class X {};
4579 1.1 joerg class A { class X {}; }; // Matches A, because A::X is a class of name
4580 1.1 joerg // X inside A.
4581 1.1 joerg class B { class C { class X {}; }; };
4582 1.1 joerg
4583 1.1 joerg DescendantT must be an AST base type.
4584 1.1 joerg
4585 1.1 joerg As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
4586 1.1 joerg each result that matches instead of only on the first one.
4587 1.1 joerg
4588 1.1 joerg Note: Recursively combined ForEachDescendant can cause many matches:
4589 1.1 joerg cxxRecordDecl(forEachDescendant(cxxRecordDecl(
4590 1.1 joerg forEachDescendant(cxxRecordDecl())
4591 1.1 joerg )))
4592 1.1 joerg will match 10 times (plus injected class name matches) on:
4593 1.1 joerg class A { class B { class C { class D { class E {}; }; }; }; };
4594 1.1 joerg
4595 1.1 joerg Usable as: Any Matcher
4596 1.1 joerg </pre></td></tr>
4597 1.1 joerg
4598 1.1 joerg
4599 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr>
4600 1.1 joerg <tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
4601 1.1 joerg provided matcher.
4602 1.1 joerg
4603 1.1 joerg Example matches X, Y, Y::X, Z::Y, Z::Y::X
4604 1.1 joerg (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
4605 1.1 joerg class X {};
4606 1.1 joerg class Y { class X {}; }; // Matches Y, because Y::X is a class of name X
4607 1.1 joerg // inside Y.
4608 1.1 joerg class Z { class Y { class X {}; }; }; // Does not match Z.
4609 1.1 joerg
4610 1.1 joerg ChildT must be an AST base type.
4611 1.1 joerg
4612 1.1 joerg As opposed to 'has', 'forEach' will cause a match for each result that
4613 1.1 joerg matches instead of only on the first one.
4614 1.1 joerg
4615 1.1 joerg Usable as: Any Matcher
4616 1.1 joerg </pre></td></tr>
4617 1.1 joerg
4618 1.1 joerg
4619 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr>
4620 1.1 joerg <tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
4621 1.1 joerg matcher.
4622 1.1 joerg
4623 1.1 joerg Given
4624 1.1 joerg void f() { if (true) { int x = 42; } }
4625 1.1 joerg void g() { for (;;) { int x = 43; } }
4626 1.1 joerg expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
4627 1.1 joerg
4628 1.1 joerg Usable as: Any Matcher
4629 1.1 joerg </pre></td></tr>
4630 1.1 joerg
4631 1.1 joerg
4632 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr>
4633 1.1 joerg <tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4634 1.1 joerg provided matcher.
4635 1.1 joerg
4636 1.1 joerg Example matches X, Y, Z
4637 1.1 joerg (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
4638 1.1 joerg class X {}; // Matches X, because X::X is a class of name X inside X.
4639 1.1 joerg class Y { class X {}; };
4640 1.1 joerg class Z { class Y { class X {}; }; };
4641 1.1 joerg
4642 1.1 joerg DescendantT must be an AST base type.
4643 1.1 joerg
4644 1.1 joerg Usable as: Any Matcher
4645 1.1 joerg </pre></td></tr>
4646 1.1 joerg
4647 1.1 joerg
4648 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr>
4649 1.1 joerg <tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
4650 1.1 joerg provided matcher.
4651 1.1 joerg
4652 1.1 joerg Example matches X, Y
4653 1.1 joerg (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
4654 1.1 joerg class X {}; // Matches X, because X::X is a class of name X inside X.
4655 1.1 joerg class Y { class X {}; };
4656 1.1 joerg class Z { class Y { class X {}; }; }; // Does not match Z.
4657 1.1 joerg
4658 1.1 joerg ChildT must be an AST base type.
4659 1.1 joerg
4660 1.1 joerg Usable as: Any Matcher
4661 1.1 joerg Note that has is direct matcher, so it also matches things like implicit
4662 1.1 joerg casts and paren casts. If you are matching with expr then you should
4663 1.1 joerg probably consider using ignoringParenImpCasts like:
4664 1.1 joerg has(ignoringParenImpCasts(expr())).
4665 1.1 joerg </pre></td></tr>
4666 1.1 joerg
4667 1.1 joerg
4668 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr>
4669 1.1 joerg <tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
4670 1.1 joerg matcher.
4671 1.1 joerg
4672 1.1 joerg Given
4673 1.1 joerg void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
4674 1.1 joerg compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
4675 1.1 joerg
4676 1.1 joerg Usable as: Any Matcher
4677 1.1 joerg </pre></td></tr>
4678 1.1 joerg
4679 1.1 joerg
4680 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasCondition5')"><a name="hasCondition5Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
4681 1.1 joerg <tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
4682 1.1 joerg switch statement or conditional operator.
4683 1.1 joerg
4684 1.1 joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4685 1.1 joerg if (true) {}
4686 1.1 joerg </pre></td></tr>
4687 1.1 joerg
4688 1.1 joerg
4689 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasFalseExpression0')"><a name="hasFalseExpression0Anchor">hasFalseExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
4690 1.1 joerg <tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
4691 1.1 joerg (binary or ternary).
4692 1.1 joerg
4693 1.1 joerg Example matches b
4694 1.1 joerg condition ? a : b
4695 1.1 joerg condition ?: b
4696 1.1 joerg </pre></td></tr>
4697 1.1 joerg
4698 1.1 joerg
4699 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasTrueExpression0')"><a name="hasTrueExpression0Anchor">hasTrueExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
4700 1.1 joerg <tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
4701 1.1 joerg
4702 1.1 joerg Example 1 (conditional ternary operator): matches a
4703 1.1 joerg condition ? a : b
4704 1.1 joerg
4705 1.1 joerg Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
4706 1.1 joerg condition ?: b
4707 1.1 joerg </pre></td></tr>
4708 1.1 joerg
4709 1.1 joerg
4710 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>></td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
4711 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
4712 1.1 joerg matches the given matcher.
4713 1.1 joerg
4714 1.1 joerg The associated declaration is:
4715 1.1 joerg - for type nodes, the declaration of the underlying type
4716 1.1 joerg - for CallExpr, the declaration of the callee
4717 1.1 joerg - for MemberExpr, the declaration of the referenced member
4718 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
4719 1.1 joerg - for CXXNewExpr, the declaration of the operator new
4720 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
4721 1.1 joerg
4722 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
4723 1.1 joerg sugared type. Given
4724 1.1 joerg class X {};
4725 1.1 joerg typedef X Y;
4726 1.1 joerg Y y;
4727 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4728 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
4729 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4730 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
4731 1.1 joerg recordType(hasDeclaration(decl())))))
4732 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
4733 1.1 joerg
4734 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
4735 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
4736 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
4737 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
4738 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
4739 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
4740 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
4741 1.1 joerg </pre></td></tr>
4742 1.1 joerg
4743 1.1 joerg
4744 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasBase0')"><a name="hasBase0Anchor">hasBase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
4745 1.1 joerg <tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
4746 1.1 joerg
4747 1.1 joerg Given
4748 1.1 joerg int i[5];
4749 1.1 joerg void f() { i[1] = 42; }
4750 1.1 joerg arraySubscriptExpression(hasBase(implicitCastExpr(
4751 1.1 joerg hasSourceExpression(declRefExpr()))))
4752 1.1 joerg matches i[1] with the declRefExpr() matching i
4753 1.1 joerg </pre></td></tr>
4754 1.1 joerg
4755 1.1 joerg
4756 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasIndex0')"><a name="hasIndex0Anchor">hasIndex</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
4757 1.1 joerg <tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
4758 1.1 joerg
4759 1.1 joerg Given
4760 1.1 joerg int i[5];
4761 1.1 joerg void f() { i[1] = 42; }
4762 1.1 joerg arraySubscriptExpression(hasIndex(integerLiteral()))
4763 1.1 joerg matches i[1] with the integerLiteral() matching 1
4764 1.1 joerg </pre></td></tr>
4765 1.1 joerg
4766 1.1 joerg
4767 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasLHS1')"><a name="hasLHS1Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
4768 1.1 joerg <tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
4769 1.1 joerg
4770 1.1 joerg Example matches a (matcher = binaryOperator(hasLHS()))
4771 1.1 joerg a || b
4772 1.1 joerg </pre></td></tr>
4773 1.1 joerg
4774 1.1 joerg
4775 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasRHS1')"><a name="hasRHS1Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
4776 1.1 joerg <tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
4777 1.1 joerg
4778 1.1 joerg Example matches b (matcher = binaryOperator(hasRHS()))
4779 1.1 joerg a || b
4780 1.1 joerg </pre></td></tr>
4781 1.1 joerg
4782 1.1 joerg
4783 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>></td><td class="name" onclick="toggle('hasElementType0')"><a name="hasElementType0Anchor">hasElementType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
4784 1.1 joerg <tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
4785 1.1 joerg type.
4786 1.1 joerg
4787 1.1 joerg Given
4788 1.1 joerg struct A {};
4789 1.1 joerg A a[7];
4790 1.1 joerg int b[7];
4791 1.1 joerg arrayType(hasElementType(builtinType()))
4792 1.1 joerg matches "int b[7]"
4793 1.1 joerg
4794 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>>
4795 1.1 joerg </pre></td></tr>
4796 1.1 joerg
4797 1.1 joerg
4798 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>></td><td class="name" onclick="toggle('hasValueType0')"><a name="hasValueType0Anchor">hasValueType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
4799 1.1 joerg <tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4800 1.1 joerg
4801 1.1 joerg Given
4802 1.1 joerg _Atomic(int) i;
4803 1.1 joerg _Atomic(float) f;
4804 1.1 joerg atomicType(hasValueType(isInteger()))
4805 1.1 joerg matches "_Atomic(int) i"
4806 1.1 joerg
4807 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>>
4808 1.1 joerg </pre></td></tr>
4809 1.1 joerg
4810 1.1 joerg
4811 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>></td><td class="name" onclick="toggle('hasDeducedType0')"><a name="hasDeducedType0Anchor">hasDeducedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
4812 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4813 1.1 joerg
4814 1.1 joerg Note: There is no TypeLoc for the deduced type and thus no
4815 1.1 joerg getDeducedLoc() matcher.
4816 1.1 joerg
4817 1.1 joerg Given
4818 1.1 joerg auto a = 1;
4819 1.1 joerg auto b = 2.0;
4820 1.1 joerg autoType(hasDeducedType(isInteger()))
4821 1.1 joerg matches "auto a"
4822 1.1 joerg
4823 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>>
4824 1.1 joerg </pre></td></tr>
4825 1.1 joerg
4826 1.1 joerg
4827 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
4828 1.1 joerg <tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4829 1.1 joerg binary operator matches.
4830 1.1 joerg </pre></td></tr>
4831 1.1 joerg
4832 1.1 joerg
4833 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasLHS0')"><a name="hasLHS0Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
4834 1.1 joerg <tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
4835 1.1 joerg
4836 1.1 joerg Example matches a (matcher = binaryOperator(hasLHS()))
4837 1.1 joerg a || b
4838 1.1 joerg </pre></td></tr>
4839 1.1 joerg
4840 1.1 joerg
4841 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasRHS0')"><a name="hasRHS0Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
4842 1.1 joerg <tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
4843 1.1 joerg
4844 1.1 joerg Example matches b (matcher = binaryOperator(hasRHS()))
4845 1.1 joerg a || b
4846 1.1 joerg </pre></td></tr>
4847 1.1 joerg
4848 1.1 joerg
4849 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>></td><td class="name" onclick="toggle('hasAnyParameter2')"><a name="hasAnyParameter2Anchor">hasAnyParameter</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr>
4850 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
4851 1.1 joerg block.
4852 1.1 joerg
4853 1.1 joerg Does not match the 'this' parameter of a method.
4854 1.1 joerg
4855 1.1 joerg Given
4856 1.1 joerg class X { void f(int x, int y, int z) {} };
4857 1.1 joerg cxxMethodDecl(hasAnyParameter(hasName("y")))
4858 1.1 joerg matches f(int x, int y, int z) {}
4859 1.1 joerg with hasAnyParameter(...)
4860 1.1 joerg matching int y
4861 1.1 joerg
4862 1.1 joerg For ObjectiveC, given
4863 1.1 joerg @interface I - (void) f:(int) y; @end
4864 1.1 joerg
4865 1.1 joerg the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
4866 1.1 joerg matches the declaration of method f with hasParameter
4867 1.1 joerg matching y.
4868 1.1 joerg
4869 1.1 joerg For blocks, given
4870 1.1 joerg b = ^(int y) { printf("%d", y) };
4871 1.1 joerg
4872 1.1 joerg the matcher blockDecl(hasAnyParameter(hasName("y")))
4873 1.1 joerg matches the declaration of the block b with hasParameter
4874 1.1 joerg matching y.
4875 1.1 joerg </pre></td></tr>
4876 1.1 joerg
4877 1.1 joerg
4878 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>></td><td class="name" onclick="toggle('hasParameter2')"><a name="hasParameter2Anchor">hasParameter</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr>
4879 1.1 joerg <tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
4880 1.1 joerg declaration or a block.
4881 1.1 joerg
4882 1.1 joerg Given
4883 1.1 joerg class X { void f(int x) {} };
4884 1.1 joerg cxxMethodDecl(hasParameter(0, hasType(varDecl())))
4885 1.1 joerg matches f(int x) {}
4886 1.1 joerg with hasParameter(...)
4887 1.1 joerg matching int x
4888 1.1 joerg
4889 1.1 joerg For ObjectiveC, given
4890 1.1 joerg @interface I - (void) f:(int) y; @end
4891 1.1 joerg
4892 1.1 joerg the matcher objcMethodDecl(hasParameter(0, hasName("y")))
4893 1.1 joerg matches the declaration of method f with hasParameter
4894 1.1 joerg matching y.
4895 1.1 joerg </pre></td></tr>
4896 1.1 joerg
4897 1.1 joerg
4898 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>></td><td class="name" onclick="toggle('pointee0')"><a name="pointee0Anchor">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
4899 1.1 joerg <tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4900 1.1 joerg pointee matches a given matcher.
4901 1.1 joerg
4902 1.1 joerg Given
4903 1.1 joerg int *a;
4904 1.1 joerg int const *b;
4905 1.1 joerg float const *f;
4906 1.1 joerg pointerType(pointee(isConstQualified(), isInteger()))
4907 1.1 joerg matches "int const *b"
4908 1.1 joerg
4909 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>,
4910 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>
4911 1.1 joerg </pre></td></tr>
4912 1.1 joerg
4913 1.1 joerg
4914 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParam1')"><a name="forEachArgumentWithParam1Anchor">forEachArgumentWithParam</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> ParamMatcher</td></tr>
4915 1.1 joerg <tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4916 1.1 joerg
4917 1.1 joerg Given
4918 1.1 joerg void f(int i);
4919 1.1 joerg int y;
4920 1.1 joerg f(y);
4921 1.1 joerg callExpr(
4922 1.1 joerg forEachArgumentWithParam(
4923 1.1 joerg declRefExpr(to(varDecl(hasName("y")))),
4924 1.1 joerg parmVarDecl(hasType(isInteger()))
4925 1.1 joerg ))
4926 1.1 joerg matches f(y);
4927 1.1 joerg with declRefExpr(...)
4928 1.1 joerg matching int y
4929 1.1 joerg and parmVarDecl(...)
4930 1.1 joerg matching int i
4931 1.1 joerg </pre></td></tr>
4932 1.1 joerg
4933 1.1 joerg
4934 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument1')"><a name="hasAnyArgument1Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
4935 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
4936 1.1 joerg expression, or an ObjC-message-send expression.
4937 1.1 joerg
4938 1.1 joerg Given
4939 1.1 joerg void x(int, int, int) { int y; x(1, y, 42); }
4940 1.1 joerg callExpr(hasAnyArgument(declRefExpr()))
4941 1.1 joerg matches x(1, y, 42)
4942 1.1 joerg with hasAnyArgument(...)
4943 1.1 joerg matching y
4944 1.1 joerg
4945 1.1 joerg For ObjectiveC, given
4946 1.1 joerg @interface I - (void) f:(int) y; @end
4947 1.1 joerg void foo(I *i) { [i f:12]; }
4948 1.1 joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
4949 1.1 joerg matches [i f:12]
4950 1.1 joerg </pre></td></tr>
4951 1.1 joerg
4952 1.1 joerg
4953 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasArgument1')"><a name="hasArgument1Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
4954 1.1 joerg <tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4955 1.1 joerg call expression.
4956 1.1 joerg
4957 1.1 joerg Example matches y in x(y)
4958 1.1 joerg (matcher = callExpr(hasArgument(0, declRefExpr())))
4959 1.1 joerg void x(int) { int y; x(y); }
4960 1.1 joerg </pre></td></tr>
4961 1.1 joerg
4962 1.1 joerg
4963 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
4964 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
4965 1.1 joerg matches the given matcher.
4966 1.1 joerg
4967 1.1 joerg The associated declaration is:
4968 1.1 joerg - for type nodes, the declaration of the underlying type
4969 1.1 joerg - for CallExpr, the declaration of the callee
4970 1.1 joerg - for MemberExpr, the declaration of the referenced member
4971 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
4972 1.1 joerg - for CXXNewExpr, the declaration of the operator new
4973 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
4974 1.1 joerg
4975 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
4976 1.1 joerg sugared type. Given
4977 1.1 joerg class X {};
4978 1.1 joerg typedef X Y;
4979 1.1 joerg Y y;
4980 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4981 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
4982 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4983 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
4984 1.1 joerg recordType(hasDeclaration(decl())))))
4985 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
4986 1.1 joerg
4987 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
4988 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
4989 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
4990 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
4991 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
4992 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
4993 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
4994 1.1 joerg </pre></td></tr>
4995 1.1 joerg
4996 1.1 joerg
4997 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('forEachConstructorInitializer0')"><a name="forEachConstructorInitializer0Anchor">forEachConstructorInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>> InnerMatcher</td></tr>
4998 1.1 joerg <tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4999 1.1 joerg
5000 1.1 joerg Given
5001 1.1 joerg class A { A() : i(42), j(42) {} int i; int j; };
5002 1.1 joerg cxxConstructorDecl(forEachConstructorInitializer(
5003 1.1 joerg forField(decl().bind("x"))
5004 1.1 joerg ))
5005 1.1 joerg will trigger two matches, binding for 'i' and 'j' respectively.
5006 1.1 joerg </pre></td></tr>
5007 1.1 joerg
5008 1.1 joerg
5009 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('hasAnyConstructorInitializer0')"><a name="hasAnyConstructorInitializer0Anchor">hasAnyConstructorInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>> InnerMatcher</td></tr>
5010 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
5011 1.1 joerg
5012 1.1 joerg Given
5013 1.1 joerg struct Foo {
5014 1.1 joerg Foo() : foo_(1) { }
5015 1.1 joerg int foo_;
5016 1.1 joerg };
5017 1.1 joerg cxxRecordDecl(has(cxxConstructorDecl(
5018 1.1 joerg hasAnyConstructorInitializer(anything())
5019 1.1 joerg )))
5020 1.1 joerg record matches Foo, hasAnyConstructorInitializer matches foo_(1)
5021 1.1 joerg </pre></td></tr>
5022 1.1 joerg
5023 1.1 joerg
5024 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('forField0')"><a name="forField0Anchor">forField</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>> InnerMatcher</td></tr>
5025 1.1 joerg <tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
5026 1.1 joerg
5027 1.1 joerg Given
5028 1.1 joerg struct Foo {
5029 1.1 joerg Foo() : foo_(1) { }
5030 1.1 joerg int foo_;
5031 1.1 joerg };
5032 1.1 joerg cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
5033 1.1 joerg forField(hasName("foo_"))))))
5034 1.1 joerg matches Foo
5035 1.1 joerg with forField matching foo_
5036 1.1 joerg </pre></td></tr>
5037 1.1 joerg
5038 1.1 joerg
5039 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('withInitializer0')"><a name="withInitializer0Anchor">withInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5040 1.1 joerg <tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
5041 1.1 joerg
5042 1.1 joerg Given
5043 1.1 joerg struct Foo {
5044 1.1 joerg Foo() : foo_(1) { }
5045 1.1 joerg int foo_;
5046 1.1 joerg };
5047 1.1 joerg cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
5048 1.1 joerg withInitializer(integerLiteral(equals(1)))))))
5049 1.1 joerg matches Foo
5050 1.1 joerg with withInitializer matching (1)
5051 1.1 joerg </pre></td></tr>
5052 1.1 joerg
5053 1.1 joerg
5054 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('hasObjectExpression2')"><a name="hasObjectExpression2Anchor">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5055 1.1 joerg <tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
5056 1.1 joerg given matcher. Implicit object expressions are included; that is, it matches
5057 1.1 joerg use of implicit `this`.
5058 1.1 joerg
5059 1.1 joerg Given
5060 1.1 joerg struct X {
5061 1.1 joerg int m;
5062 1.1 joerg int f(X x) { x.m; return m; }
5063 1.1 joerg };
5064 1.1 joerg memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
5065 1.1 joerg matches `x.m`, but not `m`; however,
5066 1.1 joerg memberExpr(hasObjectExpression(hasType(pointsTo(
5067 1.1 joerg cxxRecordDecl(hasName("X"))))))
5068 1.1 joerg matches `m` (aka. `this->m`), but not `x.m`.
5069 1.1 joerg </pre></td></tr>
5070 1.1 joerg
5071 1.1 joerg
5072 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasBody3')"><a name="hasBody3Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
5073 1.1 joerg <tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
5074 1.1 joerg definition that has a given body.
5075 1.1 joerg
5076 1.1 joerg Given
5077 1.1 joerg for (;;) {}
5078 1.1 joerg hasBody(compoundStmt())
5079 1.1 joerg matches 'for (;;) {}'
5080 1.1 joerg with compoundStmt()
5081 1.1 joerg matching '{}'
5082 1.1 joerg </pre></td></tr>
5083 1.1 joerg
5084 1.1 joerg
5085 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasLoopVariable0')"><a name="hasLoopVariable0Anchor">hasLoopVariable</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>> InnerMatcher</td></tr>
5086 1.1 joerg <tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
5087 1.1 joerg
5088 1.1 joerg Example:
5089 1.1 joerg forStmt(hasLoopVariable(anything()))
5090 1.1 joerg matches 'int x' in
5091 1.1 joerg for (int x : a) { }
5092 1.1 joerg </pre></td></tr>
5093 1.1 joerg
5094 1.1 joerg
5095 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasRangeInit0')"><a name="hasRangeInit0Anchor">hasRangeInit</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5096 1.1 joerg <tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
5097 1.1 joerg
5098 1.1 joerg Example:
5099 1.1 joerg forStmt(hasRangeInit(anything()))
5100 1.1 joerg matches 'a' in
5101 1.1 joerg for (int x : a) { }
5102 1.1 joerg </pre></td></tr>
5103 1.1 joerg
5104 1.1 joerg
5105 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('onImplicitObjectArgument0')"><a name="onImplicitObjectArgument0Anchor">onImplicitObjectArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5106 1.1 joerg <tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
5107 1.1 joerg `on`, matches the argument directly without stripping away anything.
5108 1.1 joerg
5109 1.1 joerg Given
5110 1.1 joerg class Y { public: void m(); };
5111 1.1 joerg Y g();
5112 1.1 joerg class X : public Y { void g(); };
5113 1.1 joerg void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
5114 1.1 joerg cxxMemberCallExpr(onImplicitObjectArgument(hasType(
5115 1.1 joerg cxxRecordDecl(hasName("Y")))))
5116 1.1 joerg matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
5117 1.1 joerg cxxMemberCallExpr(on(callExpr()))
5118 1.1 joerg does not match `(g()).m()`, because the parens are not ignored.
5119 1.1 joerg
5120 1.1 joerg FIXME: Overload to allow directly matching types?
5121 1.1 joerg </pre></td></tr>
5122 1.1 joerg
5123 1.1 joerg
5124 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('on0')"><a name="on0Anchor">on</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5125 1.1 joerg <tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
5126 1.1 joerg stripping off any parentheses or implicit casts.
5127 1.1 joerg
5128 1.1 joerg Given
5129 1.1 joerg class Y { public: void m(); };
5130 1.1 joerg Y g();
5131 1.1 joerg class X : public Y {};
5132 1.1 joerg void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
5133 1.1 joerg cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
5134 1.1 joerg matches `y.m()` and `(g()).m()`.
5135 1.1 joerg cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
5136 1.1 joerg matches `x.m()`.
5137 1.1 joerg cxxMemberCallExpr(on(callExpr()))
5138 1.1 joerg matches `(g()).m()`.
5139 1.1 joerg
5140 1.1 joerg FIXME: Overload to allow directly matching types?
5141 1.1 joerg </pre></td></tr>
5142 1.1 joerg
5143 1.1 joerg
5144 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('thisPointerType1')"><a name="thisPointerType1Anchor">thisPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
5145 1.1 joerg <tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
5146 1.1 joerg </pre></td></tr>
5147 1.1 joerg
5148 1.1 joerg
5149 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('thisPointerType0')"><a name="thisPointerType0Anchor">thisPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
5150 1.1 joerg <tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
5151 1.1 joerg matches the InnerMatcher, or is a pointer to a type that matches the
5152 1.1 joerg InnerMatcher.
5153 1.1 joerg
5154 1.1 joerg Given
5155 1.1 joerg class Y { public: void m(); };
5156 1.1 joerg class X : public Y { void g(); };
5157 1.1 joerg void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); }
5158 1.1 joerg cxxMemberCallExpr(thisPointerType(hasDeclaration(
5159 1.1 joerg cxxRecordDecl(hasName("Y")))))
5160 1.1 joerg matches `y.m()`, `p->m()` and `x.m()`.
5161 1.1 joerg cxxMemberCallExpr(thisPointerType(hasDeclaration(
5162 1.1 joerg cxxRecordDecl(hasName("X")))))
5163 1.1 joerg matches `x.g()`.
5164 1.1 joerg </pre></td></tr>
5165 1.1 joerg
5166 1.1 joerg
5167 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('forEachOverridden0')"><a name="forEachOverridden0Anchor">forEachOverridden</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>> InnerMatcher</td></tr>
5168 1.1 joerg <tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
5169 1.1 joerg produce multiple matches.
5170 1.1 joerg
5171 1.1 joerg Given
5172 1.1 joerg class A { virtual void f(); };
5173 1.1 joerg class B : public A { void f(); };
5174 1.1 joerg class C : public B { void f(); };
5175 1.1 joerg cxxMethodDecl(ofClass(hasName("C")),
5176 1.1 joerg forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5177 1.1 joerg matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
5178 1.1 joerg that B::f is not overridden by C::f).
5179 1.1 joerg
5180 1.1 joerg The check can produce multiple matches in case of multiple inheritance, e.g.
5181 1.1 joerg class A1 { virtual void f(); };
5182 1.1 joerg class A2 { virtual void f(); };
5183 1.1 joerg class C : public A1, public A2 { void f(); };
5184 1.1 joerg cxxMethodDecl(ofClass(hasName("C")),
5185 1.1 joerg forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5186 1.1 joerg matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
5187 1.1 joerg once with "b" binding "A2::f" and "d" binding "C::f".
5188 1.1 joerg </pre></td></tr>
5189 1.1 joerg
5190 1.1 joerg
5191 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('ofClass0')"><a name="ofClass0Anchor">ofClass</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> InnerMatcher</td></tr>
5192 1.1 joerg <tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
5193 1.1 joerg belongs to.
5194 1.1 joerg
5195 1.1 joerg FIXME: Generalize this for other kinds of declarations.
5196 1.1 joerg FIXME: What other kind of declarations would we need to generalize
5197 1.1 joerg this to?
5198 1.1 joerg
5199 1.1 joerg Example matches A() in the last line
5200 1.1 joerg (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
5201 1.1 joerg ofClass(hasName("A"))))))
5202 1.1 joerg class A {
5203 1.1 joerg public:
5204 1.1 joerg A();
5205 1.1 joerg };
5206 1.1 joerg A a = A();
5207 1.1 joerg </pre></td></tr>
5208 1.1 joerg
5209 1.1 joerg
5210 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasArraySize0')"><a name="hasArraySize0Anchor">hasArraySize</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5211 1.1 joerg <tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
5212 1.1 joerg
5213 1.1 joerg Given:
5214 1.1 joerg MyClass *p1 = new MyClass[10];
5215 1.1 joerg cxxNewExpr(hasArraySize(intgerLiteral(equals(10))))
5216 1.1 joerg matches the expression 'new MyClass[10]'.
5217 1.1 joerg </pre></td></tr>
5218 1.1 joerg
5219 1.1 joerg
5220 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
5221 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
5222 1.1 joerg matches the given matcher.
5223 1.1 joerg
5224 1.1 joerg The associated declaration is:
5225 1.1 joerg - for type nodes, the declaration of the underlying type
5226 1.1 joerg - for CallExpr, the declaration of the callee
5227 1.1 joerg - for MemberExpr, the declaration of the referenced member
5228 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
5229 1.1 joerg - for CXXNewExpr, the declaration of the operator new
5230 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
5231 1.1 joerg
5232 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
5233 1.1 joerg sugared type. Given
5234 1.1 joerg class X {};
5235 1.1 joerg typedef X Y;
5236 1.1 joerg Y y;
5237 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5238 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
5239 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5240 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
5241 1.1 joerg recordType(hasDeclaration(decl())))))
5242 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
5243 1.1 joerg
5244 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
5245 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
5246 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
5247 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
5248 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
5249 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
5250 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
5251 1.1 joerg </pre></td></tr>
5252 1.1 joerg
5253 1.1 joerg
5254 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasMethod0')"><a name="hasMethod0Anchor">hasMethod</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>> InnerMatcher</td></tr>
5255 1.1 joerg <tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
5256 1.1 joerg
5257 1.1 joerg Given:
5258 1.1 joerg class A { void func(); };
5259 1.1 joerg class B { void member(); };
5260 1.1 joerg
5261 1.1 joerg cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
5262 1.1 joerg A but not B.
5263 1.1 joerg </pre></td></tr>
5264 1.1 joerg
5265 1.1 joerg
5266 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom0')"><a name="isDerivedFrom0Anchor">isDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr>
5267 1.1 joerg <tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
5268 1.1 joerg matching Base, or Objective-C classes that directly or indirectly
5269 1.1 joerg subclass a class matching Base.
5270 1.1 joerg
5271 1.1 joerg Note that a class is not considered to be derived from itself.
5272 1.1 joerg
5273 1.1 joerg Example matches Y, Z, C (Base == hasName("X"))
5274 1.1 joerg class X;
5275 1.1 joerg class Y : public X {}; // directly derived
5276 1.1 joerg class Z : public Y {}; // indirectly derived
5277 1.1 joerg typedef X A;
5278 1.1 joerg typedef A B;
5279 1.1 joerg class C : public B {}; // derived from a typedef of X
5280 1.1 joerg
5281 1.1 joerg In the following example, Bar matches isDerivedFrom(hasName("X")):
5282 1.1 joerg class Foo;
5283 1.1 joerg typedef Foo X;
5284 1.1 joerg class Bar : public Foo {}; // derived from a type that X is a typedef of
5285 1.1 joerg
5286 1.1 joerg In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
5287 1.1 joerg @interface NSObject @end
5288 1.1 joerg @interface Bar : NSObject @end
5289 1.1 joerg
5290 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>
5291 1.1 joerg </pre></td></tr>
5292 1.1 joerg
5293 1.1 joerg
5294 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom0')"><a name="isDirectlyDerivedFrom0Anchor">isDirectlyDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr>
5295 1.1 joerg <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
5296 1.1 joerg matching Base.
5297 1.1 joerg
5298 1.1 joerg Note that a class is not considered to be derived from itself.
5299 1.1 joerg
5300 1.1 joerg Example matches Y, C (Base == hasName("X"))
5301 1.1 joerg class X;
5302 1.1 joerg class Y : public X {}; // directly derived
5303 1.1 joerg class Z : public Y {}; // indirectly derived
5304 1.1 joerg typedef X A;
5305 1.1 joerg typedef A B;
5306 1.1 joerg class C : public B {}; // derived from a typedef of X
5307 1.1 joerg
5308 1.1 joerg In the following example, Bar matches isDerivedFrom(hasName("X")):
5309 1.1 joerg class Foo;
5310 1.1 joerg typedef Foo X;
5311 1.1 joerg class Bar : public Foo {}; // derived from a type that X is a typedef of
5312 1.1 joerg </pre></td></tr>
5313 1.1 joerg
5314 1.1 joerg
5315 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom0')"><a name="isSameOrDerivedFrom0Anchor">isSameOrDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr>
5316 1.1 joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
5317 1.1 joerg match Base.
5318 1.1 joerg </pre></td></tr>
5319 1.1 joerg
5320 1.1 joerg
5321 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument2')"><a name="hasAnyArgument2Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5322 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
5323 1.1 joerg expression, or an ObjC-message-send expression.
5324 1.1 joerg
5325 1.1 joerg Given
5326 1.1 joerg void x(int, int, int) { int y; x(1, y, 42); }
5327 1.1 joerg callExpr(hasAnyArgument(declRefExpr()))
5328 1.1 joerg matches x(1, y, 42)
5329 1.1 joerg with hasAnyArgument(...)
5330 1.1 joerg matching y
5331 1.1 joerg
5332 1.1 joerg For ObjectiveC, given
5333 1.1 joerg @interface I - (void) f:(int) y; @end
5334 1.1 joerg void foo(I *i) { [i f:12]; }
5335 1.1 joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5336 1.1 joerg matches [i f:12]
5337 1.1 joerg </pre></td></tr>
5338 1.1 joerg
5339 1.1 joerg
5340 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('callee1')"><a name="callee1Anchor">callee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
5341 1.1 joerg <tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
5342 1.1 joerg given matcher.
5343 1.1 joerg
5344 1.1 joerg Example matches y.x() (matcher = callExpr(callee(
5345 1.1 joerg cxxMethodDecl(hasName("x")))))
5346 1.1 joerg class Y { public: void x(); };
5347 1.1 joerg void z() { Y y; y.x(); }
5348 1.1 joerg </pre></td></tr>
5349 1.1 joerg
5350 1.1 joerg
5351 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('callee0')"><a name="callee0Anchor">callee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
5352 1.1 joerg <tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
5353 1.1 joerg
5354 1.1 joerg Given
5355 1.1 joerg class Y { void x() { this->x(); x(); Y y; y.x(); } };
5356 1.1 joerg void f() { f(); }
5357 1.1 joerg callExpr(callee(expr()))
5358 1.1 joerg matches this->x(), x(), y.x(), f()
5359 1.1 joerg with callee(...)
5360 1.1 joerg matching this->x, x, y.x, f respectively
5361 1.1 joerg
5362 1.1 joerg Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>
5363 1.1 joerg because this introduces ambiguous overloads with calls to Callee taking a
5364 1.1 joerg internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely
5365 1.1 joerg implemented in terms of implicit casts.
5366 1.1 joerg </pre></td></tr>
5367 1.1 joerg
5368 1.1 joerg
5369 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParam0')"><a name="forEachArgumentWithParam0Anchor">forEachArgumentWithParam</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> ParamMatcher</td></tr>
5370 1.1 joerg <tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
5371 1.1 joerg
5372 1.1 joerg Given
5373 1.1 joerg void f(int i);
5374 1.1 joerg int y;
5375 1.1 joerg f(y);
5376 1.1 joerg callExpr(
5377 1.1 joerg forEachArgumentWithParam(
5378 1.1 joerg declRefExpr(to(varDecl(hasName("y")))),
5379 1.1 joerg parmVarDecl(hasType(isInteger()))
5380 1.1 joerg ))
5381 1.1 joerg matches f(y);
5382 1.1 joerg with declRefExpr(...)
5383 1.1 joerg matching int y
5384 1.1 joerg and parmVarDecl(...)
5385 1.1 joerg matching int i
5386 1.1 joerg </pre></td></tr>
5387 1.1 joerg
5388 1.1 joerg
5389 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument0')"><a name="hasAnyArgument0Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5390 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
5391 1.1 joerg expression, or an ObjC-message-send expression.
5392 1.1 joerg
5393 1.1 joerg Given
5394 1.1 joerg void x(int, int, int) { int y; x(1, y, 42); }
5395 1.1 joerg callExpr(hasAnyArgument(declRefExpr()))
5396 1.1 joerg matches x(1, y, 42)
5397 1.1 joerg with hasAnyArgument(...)
5398 1.1 joerg matching y
5399 1.1 joerg
5400 1.1 joerg For ObjectiveC, given
5401 1.1 joerg @interface I - (void) f:(int) y; @end
5402 1.1 joerg void foo(I *i) { [i f:12]; }
5403 1.1 joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5404 1.1 joerg matches [i f:12]
5405 1.1 joerg </pre></td></tr>
5406 1.1 joerg
5407 1.1 joerg
5408 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasArgument0')"><a name="hasArgument0Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5409 1.1 joerg <tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
5410 1.1 joerg call expression.
5411 1.1 joerg
5412 1.1 joerg Example matches y in x(y)
5413 1.1 joerg (matcher = callExpr(hasArgument(0, declRefExpr())))
5414 1.1 joerg void x(int) { int y; x(y); }
5415 1.1 joerg </pre></td></tr>
5416 1.1 joerg
5417 1.1 joerg
5418 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
5419 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
5420 1.1 joerg matches the given matcher.
5421 1.1 joerg
5422 1.1 joerg The associated declaration is:
5423 1.1 joerg - for type nodes, the declaration of the underlying type
5424 1.1 joerg - for CallExpr, the declaration of the callee
5425 1.1 joerg - for MemberExpr, the declaration of the referenced member
5426 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
5427 1.1 joerg - for CXXNewExpr, the declaration of the operator new
5428 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
5429 1.1 joerg
5430 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
5431 1.1 joerg sugared type. Given
5432 1.1 joerg class X {};
5433 1.1 joerg typedef X Y;
5434 1.1 joerg Y y;
5435 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5436 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
5437 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5438 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
5439 1.1 joerg recordType(hasDeclaration(decl())))))
5440 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
5441 1.1 joerg
5442 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
5443 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
5444 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
5445 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
5446 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
5447 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
5448 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
5449 1.1 joerg </pre></td></tr>
5450 1.1 joerg
5451 1.1 joerg
5452 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>></td><td class="name" onclick="toggle('hasCaseConstant0')"><a name="hasCaseConstant0Anchor">hasCaseConstant</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5453 1.1 joerg <tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
5454 1.1 joerg extension, matches the constant given in the statement.
5455 1.1 joerg
5456 1.1 joerg Given
5457 1.1 joerg switch (1) { case 1: case 1+1: case 3 ... 4: ; }
5458 1.1 joerg caseStmt(hasCaseConstant(integerLiteral()))
5459 1.1 joerg matches "case 1:"
5460 1.1 joerg </pre></td></tr>
5461 1.1 joerg
5462 1.1 joerg
5463 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>></td><td class="name" onclick="toggle('hasSourceExpression0')"><a name="hasSourceExpression0Anchor">hasSourceExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5464 1.1 joerg <tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
5465 1.1 joerg or opaque value's source expression matches the given matcher.
5466 1.1 joerg
5467 1.1 joerg Example 1: matches "a string"
5468 1.1 joerg (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
5469 1.1 joerg class URL { URL(string); };
5470 1.1 joerg URL url = "a string";
5471 1.1 joerg
5472 1.1 joerg Example 2: matches 'b' (matcher =
5473 1.1 joerg opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
5474 1.1 joerg int a = b ?: 1;
5475 1.1 joerg </pre></td></tr>
5476 1.1 joerg
5477 1.1 joerg
5478 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument0')"><a name="hasAnyTemplateArgument0Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr>
5479 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5480 1.1 joerg functionDecl that have at least one TemplateArgument matching the given
5481 1.1 joerg InnerMatcher.
5482 1.1 joerg
5483 1.1 joerg Given
5484 1.1 joerg template<typename T> class A {};
5485 1.1 joerg template<> class A<double> {};
5486 1.1 joerg A<int> a;
5487 1.1 joerg
5488 1.1 joerg template<typename T> f() {};
5489 1.1 joerg void func() { f<int>(); };
5490 1.1 joerg
5491 1.1 joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
5492 1.1 joerg refersToType(asString("int"))))
5493 1.1 joerg matches the specialization A<int>
5494 1.1 joerg
5495 1.1 joerg functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5496 1.1 joerg matches the specialization f<int>
5497 1.1 joerg </pre></td></tr>
5498 1.1 joerg
5499 1.1 joerg
5500 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasSpecializedTemplate0')"><a name="hasSpecializedTemplate0Anchor">hasSpecializedTemplate</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>> InnerMatcher</td></tr>
5501 1.1 joerg <tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
5502 1.1 joerg
5503 1.1 joerg Given
5504 1.1 joerg template<typename T> class A {}; #1
5505 1.1 joerg template<> class A<int> {}; #2
5506 1.1 joerg classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
5507 1.1 joerg matches '#2' with classTemplateDecl() matching the class template
5508 1.1 joerg declaration of 'A' at #1.
5509 1.1 joerg </pre></td></tr>
5510 1.1 joerg
5511 1.1 joerg
5512 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasTemplateArgument0')"><a name="hasTemplateArgument0Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr>
5513 1.1 joerg <tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5514 1.1 joerg functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5515 1.1 joerg
5516 1.1 joerg Given
5517 1.1 joerg template<typename T, typename U> class A {};
5518 1.1 joerg A<bool, int> b;
5519 1.1 joerg A<int, bool> c;
5520 1.1 joerg
5521 1.1 joerg template<typename T> void f() {}
5522 1.1 joerg void func() { f<int>(); };
5523 1.1 joerg classTemplateSpecializationDecl(hasTemplateArgument(
5524 1.1 joerg 1, refersToType(asString("int"))))
5525 1.1 joerg matches the specialization A<bool, int>
5526 1.1 joerg
5527 1.1 joerg functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5528 1.1 joerg matches the specialization f<int>
5529 1.1 joerg </pre></td></tr>
5530 1.1 joerg
5531 1.1 joerg
5532 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>></td><td class="name" onclick="toggle('hasElementType1')"><a name="hasElementType1Anchor">hasElementType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
5533 1.1 joerg <tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
5534 1.1 joerg type.
5535 1.1 joerg
5536 1.1 joerg Given
5537 1.1 joerg struct A {};
5538 1.1 joerg A a[7];
5539 1.1 joerg int b[7];
5540 1.1 joerg arrayType(hasElementType(builtinType()))
5541 1.1 joerg matches "int b[7]"
5542 1.1 joerg
5543 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>>
5544 1.1 joerg </pre></td></tr>
5545 1.1 joerg
5546 1.1 joerg
5547 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>></td><td class="name" onclick="toggle('hasAnySubstatement0')"><a name="hasAnySubstatement0Anchor">hasAnySubstatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
5548 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
5549 1.1 joerg a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5550 1.1 joerg
5551 1.1 joerg Given
5552 1.1 joerg { {}; 1+2; }
5553 1.1 joerg hasAnySubstatement(compoundStmt())
5554 1.1 joerg matches '{ {}; 1+2; }'
5555 1.1 joerg with compoundStmt()
5556 1.1 joerg matching '{}'
5557 1.1 joerg </pre></td></tr>
5558 1.1 joerg
5559 1.1 joerg
5560 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>></td><td class="name" onclick="toggle('hasDecayedType0')"><a name="hasDecayedType0Anchor">hasDecayedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerType</td></tr>
5561 1.1 joerg <tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
5562 1.1 joerg </pre></td></tr>
5563 1.1 joerg
5564 1.1 joerg
5565 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
5566 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
5567 1.1 joerg matches the given matcher.
5568 1.1 joerg
5569 1.1 joerg The associated declaration is:
5570 1.1 joerg - for type nodes, the declaration of the underlying type
5571 1.1 joerg - for CallExpr, the declaration of the callee
5572 1.1 joerg - for MemberExpr, the declaration of the referenced member
5573 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
5574 1.1 joerg - for CXXNewExpr, the declaration of the operator new
5575 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
5576 1.1 joerg
5577 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
5578 1.1 joerg sugared type. Given
5579 1.1 joerg class X {};
5580 1.1 joerg typedef X Y;
5581 1.1 joerg Y y;
5582 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5583 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
5584 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5585 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
5586 1.1 joerg recordType(hasDeclaration(decl())))))
5587 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
5588 1.1 joerg
5589 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
5590 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
5591 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
5592 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
5593 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
5594 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
5595 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
5596 1.1 joerg </pre></td></tr>
5597 1.1 joerg
5598 1.1 joerg
5599 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('throughUsingDecl0')"><a name="throughUsingDecl0Anchor">throughUsingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr>
5600 1.1 joerg <tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
5601 1.1 joerg specific using shadow declaration.
5602 1.1 joerg
5603 1.1 joerg Given
5604 1.1 joerg namespace a { void f() {} }
5605 1.1 joerg using a::f;
5606 1.1 joerg void g() {
5607 1.1 joerg f(); // Matches this ..
5608 1.1 joerg a::f(); // .. but not this.
5609 1.1 joerg }
5610 1.1 joerg declRefExpr(throughUsingDecl(anything()))
5611 1.1 joerg matches f()
5612 1.1 joerg </pre></td></tr>
5613 1.1 joerg
5614 1.1 joerg
5615 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('to0')"><a name="to0Anchor">to</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
5616 1.1 joerg <tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
5617 1.1 joerg specified matcher.
5618 1.1 joerg
5619 1.1 joerg Example matches x in if(x)
5620 1.1 joerg (matcher = declRefExpr(to(varDecl(hasName("x")))))
5621 1.1 joerg bool x;
5622 1.1 joerg if (x) {}
5623 1.1 joerg </pre></td></tr>
5624 1.1 joerg
5625 1.1 joerg
5626 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>></td><td class="name" onclick="toggle('containsDeclaration0')"><a name="containsDeclaration0Anchor">containsDeclaration</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
5627 1.1 joerg <tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
5628 1.1 joerg
5629 1.1 joerg Note that this does not work for global declarations because the AST
5630 1.1 joerg breaks up multiple-declaration DeclStmt's into multiple single-declaration
5631 1.1 joerg DeclStmt's.
5632 1.1 joerg Example: Given non-global declarations
5633 1.1 joerg int a, b = 0;
5634 1.1 joerg int c;
5635 1.1 joerg int d = 2, e;
5636 1.1 joerg declStmt(containsDeclaration(
5637 1.1 joerg 0, varDecl(hasInitializer(anything()))))
5638 1.1 joerg matches only 'int d = 2, e;', and
5639 1.1 joerg declStmt(containsDeclaration(1, varDecl()))
5640 1.1 joerg matches 'int a, b = 0' as well as 'int d = 2, e;'
5641 1.1 joerg but 'int c;' is not matched.
5642 1.1 joerg </pre></td></tr>
5643 1.1 joerg
5644 1.1 joerg
5645 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>></td><td class="name" onclick="toggle('hasSingleDecl0')"><a name="hasSingleDecl0Anchor">hasSingleDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
5646 1.1 joerg <tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
5647 1.1 joerg
5648 1.1 joerg Given
5649 1.1 joerg int a, b;
5650 1.1 joerg int c;
5651 1.1 joerg declStmt(hasSingleDecl(anything()))
5652 1.1 joerg matches 'int c;' but not 'int a, b;'.
5653 1.1 joerg </pre></td></tr>
5654 1.1 joerg
5655 1.1 joerg
5656 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc0')"><a name="hasTypeLoc0Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr>
5657 1.1 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
5658 1.1 joerg the inner matcher.
5659 1.1 joerg
5660 1.1 joerg Given
5661 1.1 joerg int x;
5662 1.1 joerg declaratorDecl(hasTypeLoc(loc(asString("int"))))
5663 1.1 joerg matches int x
5664 1.1 joerg </pre></td></tr>
5665 1.1 joerg
5666 1.1 joerg
5667 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('hasDeclContext0')"><a name="hasDeclContext0Anchor">hasDeclContext</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
5668 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
5669 1.1 joerg Decl, matches InnerMatcher.
5670 1.1 joerg
5671 1.1 joerg Given
5672 1.1 joerg namespace N {
5673 1.1 joerg namespace M {
5674 1.1 joerg class D {};
5675 1.1 joerg }
5676 1.1 joerg }
5677 1.1 joerg
5678 1.1 joerg cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
5679 1.1 joerg declaration of class D.
5680 1.1 joerg </pre></td></tr>
5681 1.1 joerg
5682 1.1 joerg
5683 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>></td><td class="name" onclick="toggle('hasUnderlyingType0')"><a name="hasUnderlyingType0Anchor">hasUnderlyingType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
5684 1.1 joerg <tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
5685 1.1 joerg
5686 1.1 joerg Given
5687 1.1 joerg decltype(1) a = 1;
5688 1.1 joerg decltype(2.0) b = 2.0;
5689 1.1 joerg decltypeType(hasUnderlyingType(isInteger()))
5690 1.1 joerg matches the type of "a"
5691 1.1 joerg
5692 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>>
5693 1.1 joerg </pre></td></tr>
5694 1.1 joerg
5695 1.1 joerg
5696 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>></td><td class="name" onclick="toggle('hasBody0')"><a name="hasBody0Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
5697 1.1 joerg <tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
5698 1.1 joerg definition that has a given body.
5699 1.1 joerg
5700 1.1 joerg Given
5701 1.1 joerg for (;;) {}
5702 1.1 joerg hasBody(compoundStmt())
5703 1.1 joerg matches 'for (;;) {}'
5704 1.1 joerg with compoundStmt()
5705 1.1 joerg matching '{}'
5706 1.1 joerg </pre></td></tr>
5707 1.1 joerg
5708 1.1 joerg
5709 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>></td><td class="name" onclick="toggle('hasCondition3')"><a name="hasCondition3Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5710 1.1 joerg <tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
5711 1.1 joerg switch statement or conditional operator.
5712 1.1 joerg
5713 1.1 joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5714 1.1 joerg if (true) {}
5715 1.1 joerg </pre></td></tr>
5716 1.1 joerg
5717 1.1 joerg
5718 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>></td><td class="name" onclick="toggle('hasQualifier0')"><a name="hasQualifier0Anchor">hasQualifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr>
5719 1.1 joerg <tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
5720 1.1 joerg matches InnerMatcher if the qualifier exists.
5721 1.1 joerg
5722 1.1 joerg Given
5723 1.1 joerg namespace N {
5724 1.1 joerg namespace M {
5725 1.1 joerg class D {};
5726 1.1 joerg }
5727 1.1 joerg }
5728 1.1 joerg N::M::D d;
5729 1.1 joerg
5730 1.1 joerg elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
5731 1.1 joerg matches the type of the variable declaration of d.
5732 1.1 joerg </pre></td></tr>
5733 1.1 joerg
5734 1.1 joerg
5735 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>></td><td class="name" onclick="toggle('namesType0')"><a name="namesType0Anchor">namesType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
5736 1.1 joerg <tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
5737 1.1 joerg
5738 1.1 joerg Given
5739 1.1 joerg namespace N {
5740 1.1 joerg namespace M {
5741 1.1 joerg class D {};
5742 1.1 joerg }
5743 1.1 joerg }
5744 1.1 joerg N::M::D d;
5745 1.1 joerg
5746 1.1 joerg elaboratedType(namesType(recordType(
5747 1.1 joerg hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
5748 1.1 joerg declaration of d.
5749 1.1 joerg </pre></td></tr>
5750 1.1 joerg
5751 1.1 joerg
5752 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>></td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
5753 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
5754 1.1 joerg matches the given matcher.
5755 1.1 joerg
5756 1.1 joerg The associated declaration is:
5757 1.1 joerg - for type nodes, the declaration of the underlying type
5758 1.1 joerg - for CallExpr, the declaration of the callee
5759 1.1 joerg - for MemberExpr, the declaration of the referenced member
5760 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
5761 1.1 joerg - for CXXNewExpr, the declaration of the operator new
5762 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
5763 1.1 joerg
5764 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
5765 1.1 joerg sugared type. Given
5766 1.1 joerg class X {};
5767 1.1 joerg typedef X Y;
5768 1.1 joerg Y y;
5769 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5770 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
5771 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5772 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
5773 1.1 joerg recordType(hasDeclaration(decl())))))
5774 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
5775 1.1 joerg
5776 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
5777 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
5778 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
5779 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
5780 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
5781 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
5782 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
5783 1.1 joerg </pre></td></tr>
5784 1.1 joerg
5785 1.1 joerg
5786 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>></td><td class="name" onclick="toggle('hasDestinationType0')"><a name="hasDestinationType0Anchor">hasDestinationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
5787 1.1 joerg <tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
5788 1.1 joerg
5789 1.1 joerg (Note: Clang's AST refers to other conversions as "casts" too, and calls
5790 1.1 joerg actual casts "explicit" casts.)
5791 1.1 joerg </pre></td></tr>
5792 1.1 joerg
5793 1.1 joerg
5794 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
5795 1.1 joerg <tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
5796 1.1 joerg declaration's type.
5797 1.1 joerg
5798 1.1 joerg In case of a value declaration (for example a variable declaration),
5799 1.1 joerg this resolves one layer of indirection. For example, in the value
5800 1.1 joerg declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5801 1.1 joerg X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5802 1.1 joerg declaration of x.
5803 1.1 joerg
5804 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5805 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5806 1.1 joerg and friend class X (matcher = friendDecl(hasType("X"))
5807 1.1 joerg class X {};
5808 1.1 joerg void y(X &x) { x; X z; }
5809 1.1 joerg class Y { friend class X; };
5810 1.1 joerg
5811 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>
5812 1.1 joerg </pre></td></tr>
5813 1.1 joerg
5814 1.1 joerg
5815 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('hasType0')"><a name="hasType0Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
5816 1.1 joerg <tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
5817 1.1 joerg matcher.
5818 1.1 joerg
5819 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5820 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5821 1.1 joerg and U (matcher = typedefDecl(hasType(asString("int")))
5822 1.1 joerg and friend class X (matcher = friendDecl(hasType("X"))
5823 1.1 joerg class X {};
5824 1.1 joerg void y(X &x) { x; X z; }
5825 1.1 joerg typedef int U;
5826 1.1 joerg class Y { friend class X; };
5827 1.1 joerg </pre></td></tr>
5828 1.1 joerg
5829 1.1 joerg
5830 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringElidableConstructorCall0')"><a name="ignoringElidableConstructorCall0Anchor">ignoringElidableConstructorCall</a></td><td>ast_matchers::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5831 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
5832 1.1 joerg elidable constructor and other corresponding bookkeeping nodes.
5833 1.1 joerg
5834 1.1 joerg In C++17, elidable copy constructors are no longer being generated in the
5835 1.1 joerg AST as it is not permitted by the standard. They are, however, part of the
5836 1.1 joerg AST in C++14 and earlier. So, a matcher must abstract over these differences
5837 1.1 joerg to work in all language modes. This matcher skips elidable constructor-call
5838 1.1 joerg AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
5839 1.1 joerg various implicit nodes inside the constructor calls, all of which will not
5840 1.1 joerg appear in the C++17 AST.
5841 1.1 joerg
5842 1.1 joerg Given
5843 1.1 joerg
5844 1.1 joerg struct H {};
5845 1.1 joerg H G();
5846 1.1 joerg void f() {
5847 1.1 joerg H D = G();
5848 1.1 joerg }
5849 1.1 joerg
5850 1.1 joerg ``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
5851 1.1 joerg matches ``H D = G()`` in C++11 through C++17 (and beyond).
5852 1.1 joerg </pre></td></tr>
5853 1.1 joerg
5854 1.1 joerg
5855 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringImpCasts0')"><a name="ignoringImpCasts0Anchor">ignoringImpCasts</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5856 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
5857 1.1 joerg are stripped off.
5858 1.1 joerg
5859 1.1 joerg Parentheses and explicit casts are not discarded.
5860 1.1 joerg Given
5861 1.1 joerg int arr[5];
5862 1.1 joerg int a = 0;
5863 1.1 joerg char b = 0;
5864 1.1 joerg const int c = a;
5865 1.1 joerg int *d = arr;
5866 1.1 joerg long e = (long) 0l;
5867 1.1 joerg The matchers
5868 1.1 joerg varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
5869 1.1 joerg varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
5870 1.1 joerg would match the declarations for a, b, c, and d, but not e.
5871 1.1 joerg While
5872 1.1 joerg varDecl(hasInitializer(integerLiteral()))
5873 1.1 joerg varDecl(hasInitializer(declRefExpr()))
5874 1.1 joerg only match the declarations for b, c, and d.
5875 1.1 joerg </pre></td></tr>
5876 1.1 joerg
5877 1.1 joerg
5878 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringImplicit0')"><a name="ignoringImplicit0Anchor">ignoringImplicit</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5879 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
5880 1.1 joerg nodes are stripped off.
5881 1.1 joerg
5882 1.1 joerg Parentheses and explicit casts are not discarded.
5883 1.1 joerg Given
5884 1.1 joerg class C {};
5885 1.1 joerg C a = C();
5886 1.1 joerg C b;
5887 1.1 joerg C c = b;
5888 1.1 joerg The matchers
5889 1.1 joerg varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
5890 1.1 joerg would match the declarations for a, b, and c.
5891 1.1 joerg While
5892 1.1 joerg varDecl(hasInitializer(cxxConstructExpr()))
5893 1.1 joerg only match the declarations for b and c.
5894 1.1 joerg </pre></td></tr>
5895 1.1 joerg
5896 1.1 joerg
5897 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringParenCasts0')"><a name="ignoringParenCasts0Anchor">ignoringParenCasts</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5898 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
5899 1.1 joerg casts are stripped off.
5900 1.1 joerg
5901 1.1 joerg Implicit and non-C Style casts are also discarded.
5902 1.1 joerg Given
5903 1.1 joerg int a = 0;
5904 1.1 joerg char b = (0);
5905 1.1 joerg void* c = reinterpret_cast<char*>(0);
5906 1.1 joerg char d = char(0);
5907 1.1 joerg The matcher
5908 1.1 joerg varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
5909 1.1 joerg would match the declarations for a, b, c, and d.
5910 1.1 joerg while
5911 1.1 joerg varDecl(hasInitializer(integerLiteral()))
5912 1.1 joerg only match the declaration for a.
5913 1.1 joerg </pre></td></tr>
5914 1.1 joerg
5915 1.1 joerg
5916 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringParenImpCasts0')"><a name="ignoringParenImpCasts0Anchor">ignoringParenImpCasts</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5917 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
5918 1.1 joerg parentheses are stripped off.
5919 1.1 joerg
5920 1.1 joerg Explicit casts are not discarded.
5921 1.1 joerg Given
5922 1.1 joerg int arr[5];
5923 1.1 joerg int a = 0;
5924 1.1 joerg char b = (0);
5925 1.1 joerg const int c = a;
5926 1.1 joerg int *d = (arr);
5927 1.1 joerg long e = ((long) 0l);
5928 1.1 joerg The matchers
5929 1.1 joerg varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
5930 1.1 joerg varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
5931 1.1 joerg would match the declarations for a, b, c, and d, but not e.
5932 1.1 joerg while
5933 1.1 joerg varDecl(hasInitializer(integerLiteral()))
5934 1.1 joerg varDecl(hasInitializer(declRefExpr()))
5935 1.1 joerg would only match the declaration for a.
5936 1.1 joerg </pre></td></tr>
5937 1.1 joerg
5938 1.1 joerg
5939 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringParens1')"><a name="ignoringParens1Anchor">ignoringParens</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5940 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
5941 1.1 joerg
5942 1.1 joerg Given
5943 1.1 joerg const char* str = ("my-string");
5944 1.1 joerg The matcher
5945 1.1 joerg implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
5946 1.1 joerg would match the implicit cast resulting from the assignment.
5947 1.1 joerg </pre></td></tr>
5948 1.1 joerg
5949 1.1 joerg
5950 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasInClassInitializer0')"><a name="hasInClassInitializer0Anchor">hasInClassInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5951 1.1 joerg <tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
5952 1.1 joerg
5953 1.1 joerg Given
5954 1.1 joerg class C {
5955 1.1 joerg int a = 2;
5956 1.1 joerg int b = 3;
5957 1.1 joerg int c;
5958 1.1 joerg };
5959 1.1 joerg fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
5960 1.1 joerg matches 'int a;' but not 'int b;'.
5961 1.1 joerg fieldDecl(hasInClassInitializer(anything()))
5962 1.1 joerg matches 'int a;' and 'int b;' but not 'int c;'.
5963 1.1 joerg </pre></td></tr>
5964 1.1 joerg
5965 1.1 joerg
5966 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasBody1')"><a name="hasBody1Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
5967 1.1 joerg <tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
5968 1.1 joerg definition that has a given body.
5969 1.1 joerg
5970 1.1 joerg Given
5971 1.1 joerg for (;;) {}
5972 1.1 joerg hasBody(compoundStmt())
5973 1.1 joerg matches 'for (;;) {}'
5974 1.1 joerg with compoundStmt()
5975 1.1 joerg matching '{}'
5976 1.1 joerg </pre></td></tr>
5977 1.1 joerg
5978 1.1 joerg
5979 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasCondition1')"><a name="hasCondition1Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
5980 1.1 joerg <tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
5981 1.1 joerg switch statement or conditional operator.
5982 1.1 joerg
5983 1.1 joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5984 1.1 joerg if (true) {}
5985 1.1 joerg </pre></td></tr>
5986 1.1 joerg
5987 1.1 joerg
5988 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasIncrement0')"><a name="hasIncrement0Anchor">hasIncrement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
5989 1.1 joerg <tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
5990 1.1 joerg
5991 1.1 joerg Example:
5992 1.1 joerg forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
5993 1.1 joerg matches '++x' in
5994 1.1 joerg for (x; x < N; ++x) { }
5995 1.1 joerg </pre></td></tr>
5996 1.1 joerg
5997 1.1 joerg
5998 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasLoopInit0')"><a name="hasLoopInit0Anchor">hasLoopInit</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
5999 1.1 joerg <tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
6000 1.1 joerg
6001 1.1 joerg Example:
6002 1.1 joerg forStmt(hasLoopInit(declStmt()))
6003 1.1 joerg matches 'int x = 0' in
6004 1.1 joerg for (int x = 0; x < N; ++x) { }
6005 1.1 joerg </pre></td></tr>
6006 1.1 joerg
6007 1.1 joerg
6008 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>></td><td class="name" onclick="toggle('hasType5')"><a name="hasType5Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
6009 1.1 joerg <tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
6010 1.1 joerg declaration's type.
6011 1.1 joerg
6012 1.1 joerg In case of a value declaration (for example a variable declaration),
6013 1.1 joerg this resolves one layer of indirection. For example, in the value
6014 1.1 joerg declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6015 1.1 joerg X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6016 1.1 joerg declaration of x.
6017 1.1 joerg
6018 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6019 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6020 1.1 joerg and friend class X (matcher = friendDecl(hasType("X"))
6021 1.1 joerg class X {};
6022 1.1 joerg void y(X &x) { x; X z; }
6023 1.1 joerg class Y { friend class X; };
6024 1.1 joerg
6025 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>
6026 1.1 joerg </pre></td></tr>
6027 1.1 joerg
6028 1.1 joerg
6029 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>></td><td class="name" onclick="toggle('hasType1')"><a name="hasType1Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
6030 1.1 joerg <tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
6031 1.1 joerg matcher.
6032 1.1 joerg
6033 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6034 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6035 1.1 joerg and U (matcher = typedefDecl(hasType(asString("int")))
6036 1.1 joerg and friend class X (matcher = friendDecl(hasType("X"))
6037 1.1 joerg class X {};
6038 1.1 joerg void y(X &x) { x; X z; }
6039 1.1 joerg typedef int U;
6040 1.1 joerg class Y { friend class X; };
6041 1.1 joerg </pre></td></tr>
6042 1.1 joerg
6043 1.1 joerg
6044 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyParameter0')"><a name="hasAnyParameter0Anchor">hasAnyParameter</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr>
6045 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
6046 1.1 joerg block.
6047 1.1 joerg
6048 1.1 joerg Does not match the 'this' parameter of a method.
6049 1.1 joerg
6050 1.1 joerg Given
6051 1.1 joerg class X { void f(int x, int y, int z) {} };
6052 1.1 joerg cxxMethodDecl(hasAnyParameter(hasName("y")))
6053 1.1 joerg matches f(int x, int y, int z) {}
6054 1.1 joerg with hasAnyParameter(...)
6055 1.1 joerg matching int y
6056 1.1 joerg
6057 1.1 joerg For ObjectiveC, given
6058 1.1 joerg @interface I - (void) f:(int) y; @end
6059 1.1 joerg
6060 1.1 joerg the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6061 1.1 joerg matches the declaration of method f with hasParameter
6062 1.1 joerg matching y.
6063 1.1 joerg
6064 1.1 joerg For blocks, given
6065 1.1 joerg b = ^(int y) { printf("%d", y) };
6066 1.1 joerg
6067 1.1 joerg the matcher blockDecl(hasAnyParameter(hasName("y")))
6068 1.1 joerg matches the declaration of the block b with hasParameter
6069 1.1 joerg matching y.
6070 1.1 joerg </pre></td></tr>
6071 1.1 joerg
6072 1.1 joerg
6073 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument2')"><a name="hasAnyTemplateArgument2Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr>
6074 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6075 1.1 joerg functionDecl that have at least one TemplateArgument matching the given
6076 1.1 joerg InnerMatcher.
6077 1.1 joerg
6078 1.1 joerg Given
6079 1.1 joerg template<typename T> class A {};
6080 1.1 joerg template<> class A<double> {};
6081 1.1 joerg A<int> a;
6082 1.1 joerg
6083 1.1 joerg template<typename T> f() {};
6084 1.1 joerg void func() { f<int>(); };
6085 1.1 joerg
6086 1.1 joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
6087 1.1 joerg refersToType(asString("int"))))
6088 1.1 joerg matches the specialization A<int>
6089 1.1 joerg
6090 1.1 joerg functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6091 1.1 joerg matches the specialization f<int>
6092 1.1 joerg </pre></td></tr>
6093 1.1 joerg
6094 1.1 joerg
6095 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasBody4')"><a name="hasBody4Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
6096 1.1 joerg <tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
6097 1.1 joerg definition that has a given body.
6098 1.1 joerg
6099 1.1 joerg Given
6100 1.1 joerg for (;;) {}
6101 1.1 joerg hasBody(compoundStmt())
6102 1.1 joerg matches 'for (;;) {}'
6103 1.1 joerg with compoundStmt()
6104 1.1 joerg matching '{}'
6105 1.1 joerg </pre></td></tr>
6106 1.1 joerg
6107 1.1 joerg
6108 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasExplicitSpecifier0')"><a name="hasExplicitSpecifier0Anchor">hasExplicitSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6109 1.1 joerg <tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
6110 1.1 joerg declaration.
6111 1.1 joerg
6112 1.1 joerg Given
6113 1.1 joerg template<bool b>
6114 1.1 joerg struct S {
6115 1.1 joerg S(int); // #1
6116 1.1 joerg explicit S(double); // #2
6117 1.1 joerg operator int(); // #3
6118 1.1 joerg explicit operator bool(); // #4
6119 1.1 joerg explicit(false) S(bool) // # 7
6120 1.1 joerg explicit(true) S(char) // # 8
6121 1.1 joerg explicit(b) S(S) // # 9
6122 1.1 joerg };
6123 1.1 joerg S(int) -> S<true> // #5
6124 1.1 joerg explicit S(double) -> S<false> // #6
6125 1.1 joerg cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
6126 1.1 joerg cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
6127 1.1 joerg cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
6128 1.1 joerg </pre></td></tr>
6129 1.1 joerg
6130 1.1 joerg
6131 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasParameter0')"><a name="hasParameter0Anchor">hasParameter</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr>
6132 1.1 joerg <tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
6133 1.1 joerg declaration or a block.
6134 1.1 joerg
6135 1.1 joerg Given
6136 1.1 joerg class X { void f(int x) {} };
6137 1.1 joerg cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6138 1.1 joerg matches f(int x) {}
6139 1.1 joerg with hasParameter(...)
6140 1.1 joerg matching int x
6141 1.1 joerg
6142 1.1 joerg For ObjectiveC, given
6143 1.1 joerg @interface I - (void) f:(int) y; @end
6144 1.1 joerg
6145 1.1 joerg the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6146 1.1 joerg matches the declaration of method f with hasParameter
6147 1.1 joerg matching y.
6148 1.1 joerg </pre></td></tr>
6149 1.1 joerg
6150 1.1 joerg
6151 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasTemplateArgument2')"><a name="hasTemplateArgument2Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr>
6152 1.1 joerg <tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6153 1.1 joerg functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
6154 1.1 joerg
6155 1.1 joerg Given
6156 1.1 joerg template<typename T, typename U> class A {};
6157 1.1 joerg A<bool, int> b;
6158 1.1 joerg A<int, bool> c;
6159 1.1 joerg
6160 1.1 joerg template<typename T> void f() {}
6161 1.1 joerg void func() { f<int>(); };
6162 1.1 joerg classTemplateSpecializationDecl(hasTemplateArgument(
6163 1.1 joerg 1, refersToType(asString("int"))))
6164 1.1 joerg matches the specialization A<bool, int>
6165 1.1 joerg
6166 1.1 joerg functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6167 1.1 joerg matches the specialization f<int>
6168 1.1 joerg </pre></td></tr>
6169 1.1 joerg
6170 1.1 joerg
6171 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('returns0')"><a name="returns0Anchor">returns</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
6172 1.1 joerg <tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
6173 1.1 joerg
6174 1.1 joerg Given:
6175 1.1 joerg class X { int f() { return 1; } };
6176 1.1 joerg cxxMethodDecl(returns(asString("int")))
6177 1.1 joerg matches int f() { return 1; }
6178 1.1 joerg </pre></td></tr>
6179 1.1 joerg
6180 1.1 joerg
6181 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasCondition0')"><a name="hasCondition0Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6182 1.1 joerg <tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
6183 1.1 joerg switch statement or conditional operator.
6184 1.1 joerg
6185 1.1 joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6186 1.1 joerg if (true) {}
6187 1.1 joerg </pre></td></tr>
6188 1.1 joerg
6189 1.1 joerg
6190 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasConditionVariableStatement0')"><a name="hasConditionVariableStatement0Anchor">hasConditionVariableStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>> InnerMatcher</td></tr>
6191 1.1 joerg <tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
6192 1.1 joerg
6193 1.1 joerg Given
6194 1.1 joerg if (A* a = GetAPointer()) {}
6195 1.1 joerg hasConditionVariableStatement(...)
6196 1.1 joerg matches 'A* a = GetAPointer()'.
6197 1.1 joerg </pre></td></tr>
6198 1.1 joerg
6199 1.1 joerg
6200 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasElse0')"><a name="hasElse0Anchor">hasElse</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
6201 1.1 joerg <tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
6202 1.1 joerg
6203 1.1 joerg Examples matches the if statement
6204 1.1 joerg (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
6205 1.1 joerg if (false) false; else true;
6206 1.1 joerg </pre></td></tr>
6207 1.1 joerg
6208 1.1 joerg
6209 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasThen0')"><a name="hasThen0Anchor">hasThen</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
6210 1.1 joerg <tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
6211 1.1 joerg
6212 1.1 joerg Examples matches the if statement
6213 1.1 joerg (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
6214 1.1 joerg if (false) true; else false;
6215 1.1 joerg </pre></td></tr>
6216 1.1 joerg
6217 1.1 joerg
6218 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>></td><td class="name" onclick="toggle('hasImplicitDestinationType0')"><a name="hasImplicitDestinationType0Anchor">hasImplicitDestinationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
6219 1.1 joerg <tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
6220 1.1 joerg matcher.
6221 1.1 joerg
6222 1.1 joerg FIXME: Unit test this matcher
6223 1.1 joerg </pre></td></tr>
6224 1.1 joerg
6225 1.1 joerg
6226 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>></td><td class="name" onclick="toggle('hasInit0')"><a name="hasInit0Anchor">hasInit</a></td><td>unsigned N, ast_matchers::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6227 1.1 joerg <tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
6228 1.1 joerg
6229 1.1 joerg Example matches y.
6230 1.1 joerg (matcher = initListExpr(hasInit(0, expr())))
6231 1.1 joerg int x{y}.
6232 1.1 joerg </pre></td></tr>
6233 1.1 joerg
6234 1.1 joerg
6235 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>></td><td class="name" onclick="toggle('hasSyntacticForm0')"><a name="hasSyntacticForm0Anchor">hasSyntacticForm</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6236 1.1 joerg <tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
6237 1.1 joerg (if expression have it).
6238 1.1 joerg </pre></td></tr>
6239 1.1 joerg
6240 1.1 joerg
6241 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>></td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
6242 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
6243 1.1 joerg matches the given matcher.
6244 1.1 joerg
6245 1.1 joerg The associated declaration is:
6246 1.1 joerg - for type nodes, the declaration of the underlying type
6247 1.1 joerg - for CallExpr, the declaration of the callee
6248 1.1 joerg - for MemberExpr, the declaration of the referenced member
6249 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
6250 1.1 joerg - for CXXNewExpr, the declaration of the operator new
6251 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
6252 1.1 joerg
6253 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
6254 1.1 joerg sugared type. Given
6255 1.1 joerg class X {};
6256 1.1 joerg typedef X Y;
6257 1.1 joerg Y y;
6258 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6259 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
6260 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6261 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
6262 1.1 joerg recordType(hasDeclaration(decl())))))
6263 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
6264 1.1 joerg
6265 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
6266 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
6267 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
6268 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
6269 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
6270 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
6271 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
6272 1.1 joerg </pre></td></tr>
6273 1.1 joerg
6274 1.1 joerg
6275 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>></td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
6276 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
6277 1.1 joerg matches the given matcher.
6278 1.1 joerg
6279 1.1 joerg The associated declaration is:
6280 1.1 joerg - for type nodes, the declaration of the underlying type
6281 1.1 joerg - for CallExpr, the declaration of the callee
6282 1.1 joerg - for MemberExpr, the declaration of the referenced member
6283 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
6284 1.1 joerg - for CXXNewExpr, the declaration of the operator new
6285 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
6286 1.1 joerg
6287 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
6288 1.1 joerg sugared type. Given
6289 1.1 joerg class X {};
6290 1.1 joerg typedef X Y;
6291 1.1 joerg Y y;
6292 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6293 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
6294 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6295 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
6296 1.1 joerg recordType(hasDeclaration(decl())))))
6297 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
6298 1.1 joerg
6299 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
6300 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
6301 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
6302 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
6303 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
6304 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
6305 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
6306 1.1 joerg </pre></td></tr>
6307 1.1 joerg
6308 1.1 joerg
6309 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
6310 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
6311 1.1 joerg matches the given matcher.
6312 1.1 joerg
6313 1.1 joerg The associated declaration is:
6314 1.1 joerg - for type nodes, the declaration of the underlying type
6315 1.1 joerg - for CallExpr, the declaration of the callee
6316 1.1 joerg - for MemberExpr, the declaration of the referenced member
6317 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
6318 1.1 joerg - for CXXNewExpr, the declaration of the operator new
6319 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
6320 1.1 joerg
6321 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
6322 1.1 joerg sugared type. Given
6323 1.1 joerg class X {};
6324 1.1 joerg typedef X Y;
6325 1.1 joerg Y y;
6326 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6327 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
6328 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6329 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
6330 1.1 joerg recordType(hasDeclaration(decl())))))
6331 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
6332 1.1 joerg
6333 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
6334 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
6335 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
6336 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
6337 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
6338 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
6339 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
6340 1.1 joerg </pre></td></tr>
6341 1.1 joerg
6342 1.1 joerg
6343 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('hasObjectExpression0')"><a name="hasObjectExpression0Anchor">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6344 1.1 joerg <tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
6345 1.1 joerg given matcher. Implicit object expressions are included; that is, it matches
6346 1.1 joerg use of implicit `this`.
6347 1.1 joerg
6348 1.1 joerg Given
6349 1.1 joerg struct X {
6350 1.1 joerg int m;
6351 1.1 joerg int f(X x) { x.m; return m; }
6352 1.1 joerg };
6353 1.1 joerg memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6354 1.1 joerg matches `x.m`, but not `m`; however,
6355 1.1 joerg memberExpr(hasObjectExpression(hasType(pointsTo(
6356 1.1 joerg cxxRecordDecl(hasName("X"))))))
6357 1.1 joerg matches `m` (aka. `this->m`), but not `x.m`.
6358 1.1 joerg </pre></td></tr>
6359 1.1 joerg
6360 1.1 joerg
6361 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('member0')"><a name="member0Anchor">member</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> InnerMatcher</td></tr>
6362 1.1 joerg <tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
6363 1.1 joerg given matcher.
6364 1.1 joerg
6365 1.1 joerg Given
6366 1.1 joerg struct { int first, second; } first, second;
6367 1.1 joerg int i(second.first);
6368 1.1 joerg int j(first.second);
6369 1.1 joerg memberExpr(member(hasName("first")))
6370 1.1 joerg matches second.first
6371 1.1 joerg but not first.second (because the member name there is "second").
6372 1.1 joerg </pre></td></tr>
6373 1.1 joerg
6374 1.1 joerg
6375 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>></td><td class="name" onclick="toggle('pointee1')"><a name="pointee1Anchor">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
6376 1.1 joerg <tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
6377 1.1 joerg pointee matches a given matcher.
6378 1.1 joerg
6379 1.1 joerg Given
6380 1.1 joerg int *a;
6381 1.1 joerg int const *b;
6382 1.1 joerg float const *f;
6383 1.1 joerg pointerType(pointee(isConstQualified(), isInteger()))
6384 1.1 joerg matches "int const *b"
6385 1.1 joerg
6386 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>,
6387 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>
6388 1.1 joerg </pre></td></tr>
6389 1.1 joerg
6390 1.1 joerg
6391 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasUnderlyingDecl0')"><a name="hasUnderlyingDecl0Anchor">hasUnderlyingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> InnerMatcher</td></tr>
6392 1.1 joerg <tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
6393 1.1 joerg matcher.
6394 1.1 joerg
6395 1.1 joerg Given
6396 1.1 joerg namespace N { template<class T> void f(T t); }
6397 1.1 joerg template <class T> void g() { using N::f; f(T()); }
6398 1.1 joerg unresolvedLookupExpr(hasAnyDeclaration(
6399 1.1 joerg namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
6400 1.1 joerg matches the use of f in g() .
6401 1.1 joerg </pre></td></tr>
6402 1.1 joerg
6403 1.1 joerg
6404 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('hasPrefix1')"><a name="hasPrefix1Anchor">hasPrefix</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>> InnerMatcher</td></tr>
6405 1.1 joerg <tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
6406 1.1 joerg
6407 1.1 joerg Given
6408 1.1 joerg struct A { struct B { struct C {}; }; };
6409 1.1 joerg A::B::C c;
6410 1.1 joerg nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
6411 1.1 joerg matches "A::"
6412 1.1 joerg </pre></td></tr>
6413 1.1 joerg
6414 1.1 joerg
6415 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('specifiesTypeLoc0')"><a name="specifiesTypeLoc0Anchor">specifiesTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> InnerMatcher</td></tr>
6416 1.1 joerg <tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
6417 1.1 joerg given TypeLoc.
6418 1.1 joerg
6419 1.1 joerg Given
6420 1.1 joerg struct A { struct B { struct C {}; }; };
6421 1.1 joerg A::B::C c;
6422 1.1 joerg nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
6423 1.1 joerg hasDeclaration(cxxRecordDecl(hasName("A")))))))
6424 1.1 joerg matches "A::"
6425 1.1 joerg </pre></td></tr>
6426 1.1 joerg
6427 1.1 joerg
6428 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('hasPrefix0')"><a name="hasPrefix0Anchor">hasPrefix</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr>
6429 1.1 joerg <tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
6430 1.1 joerg
6431 1.1 joerg Given
6432 1.1 joerg struct A { struct B { struct C {}; }; };
6433 1.1 joerg A::B::C c;
6434 1.1 joerg nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
6435 1.1 joerg matches "A::"
6436 1.1 joerg </pre></td></tr>
6437 1.1 joerg
6438 1.1 joerg
6439 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('specifiesNamespace0')"><a name="specifiesNamespace0Anchor">specifiesNamespace</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>> InnerMatcher</td></tr>
6440 1.1 joerg <tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
6441 1.1 joerg given namespace matcher.
6442 1.1 joerg
6443 1.1 joerg Given
6444 1.1 joerg namespace ns { struct A {}; }
6445 1.1 joerg ns::A a;
6446 1.1 joerg nestedNameSpecifier(specifiesNamespace(hasName("ns")))
6447 1.1 joerg matches "ns::"
6448 1.1 joerg </pre></td></tr>
6449 1.1 joerg
6450 1.1 joerg
6451 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('specifiesType0')"><a name="specifiesType0Anchor">specifiesType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
6452 1.1 joerg <tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
6453 1.1 joerg given QualType matcher without qualifiers.
6454 1.1 joerg
6455 1.1 joerg Given
6456 1.1 joerg struct A { struct B { struct C {}; }; };
6457 1.1 joerg A::B::C c;
6458 1.1 joerg nestedNameSpecifier(specifiesType(
6459 1.1 joerg hasDeclaration(cxxRecordDecl(hasName("A")))
6460 1.1 joerg ))
6461 1.1 joerg matches "A::"
6462 1.1 joerg </pre></td></tr>
6463 1.1 joerg
6464 1.1 joerg
6465 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('hasAnyClause0')"><a name="hasAnyClause0Anchor">hasAnyClause</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>> InnerMatcher</td></tr>
6466 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
6467 1.1 joerg
6468 1.1 joerg Given
6469 1.1 joerg
6470 1.1 joerg #pragma omp parallel
6471 1.1 joerg #pragma omp parallel default(none)
6472 1.1 joerg
6473 1.1 joerg ``ompExecutableDirective(hasAnyClause(anything()))`` matches
6474 1.1 joerg ``omp parallel default(none)``.
6475 1.1 joerg </pre></td></tr>
6476 1.1 joerg
6477 1.1 joerg
6478 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('hasStructuredBlock0')"><a name="hasStructuredBlock0Anchor">hasStructuredBlock</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
6479 1.1 joerg <tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
6480 1.1 joerg
6481 1.1 joerg Prerequisite: the executable directive must not be standalone directive.
6482 1.1 joerg If it is, it will never match.
6483 1.1 joerg
6484 1.1 joerg Given
6485 1.1 joerg
6486 1.1 joerg #pragma omp parallel
6487 1.1 joerg ;
6488 1.1 joerg #pragma omp parallel
6489 1.1 joerg {}
6490 1.1 joerg
6491 1.1 joerg ``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
6492 1.1 joerg </pre></td></tr>
6493 1.1 joerg
6494 1.1 joerg
6495 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr>
6496 1.1 joerg <tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
6497 1.1 joerg matching Base, or Objective-C classes that directly or indirectly
6498 1.1 joerg subclass a class matching Base.
6499 1.1 joerg
6500 1.1 joerg Note that a class is not considered to be derived from itself.
6501 1.1 joerg
6502 1.1 joerg Example matches Y, Z, C (Base == hasName("X"))
6503 1.1 joerg class X;
6504 1.1 joerg class Y : public X {}; // directly derived
6505 1.1 joerg class Z : public Y {}; // indirectly derived
6506 1.1 joerg typedef X A;
6507 1.1 joerg typedef A B;
6508 1.1 joerg class C : public B {}; // derived from a typedef of X
6509 1.1 joerg
6510 1.1 joerg In the following example, Bar matches isDerivedFrom(hasName("X")):
6511 1.1 joerg class Foo;
6512 1.1 joerg typedef Foo X;
6513 1.1 joerg class Bar : public Foo {}; // derived from a type that X is a typedef of
6514 1.1 joerg
6515 1.1 joerg In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
6516 1.1 joerg @interface NSObject @end
6517 1.1 joerg @interface Bar : NSObject @end
6518 1.1 joerg
6519 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>
6520 1.1 joerg </pre></td></tr>
6521 1.1 joerg
6522 1.1 joerg
6523 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom1')"><a name="isDirectlyDerivedFrom1Anchor">isDirectlyDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr>
6524 1.1 joerg <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
6525 1.1 joerg matching Base.
6526 1.1 joerg
6527 1.1 joerg Note that a class is not considered to be derived from itself.
6528 1.1 joerg
6529 1.1 joerg Example matches Y, C (Base == hasName("X"))
6530 1.1 joerg class X;
6531 1.1 joerg class Y : public X {}; // directly derived
6532 1.1 joerg class Z : public Y {}; // indirectly derived
6533 1.1 joerg typedef X A;
6534 1.1 joerg typedef A B;
6535 1.1 joerg class C : public B {}; // derived from a typedef of X
6536 1.1 joerg
6537 1.1 joerg In the following example, Bar matches isDerivedFrom(hasName("X")):
6538 1.1 joerg class Foo;
6539 1.1 joerg typedef Foo X;
6540 1.1 joerg class Bar : public Foo {}; // derived from a type that X is a typedef of
6541 1.1 joerg </pre></td></tr>
6542 1.1 joerg
6543 1.1 joerg
6544 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr>
6545 1.1 joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
6546 1.1 joerg match Base.
6547 1.1 joerg </pre></td></tr>
6548 1.1 joerg
6549 1.1 joerg
6550 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument3')"><a name="hasAnyArgument3Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6551 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
6552 1.1 joerg expression, or an ObjC-message-send expression.
6553 1.1 joerg
6554 1.1 joerg Given
6555 1.1 joerg void x(int, int, int) { int y; x(1, y, 42); }
6556 1.1 joerg callExpr(hasAnyArgument(declRefExpr()))
6557 1.1 joerg matches x(1, y, 42)
6558 1.1 joerg with hasAnyArgument(...)
6559 1.1 joerg matching y
6560 1.1 joerg
6561 1.1 joerg For ObjectiveC, given
6562 1.1 joerg @interface I - (void) f:(int) y; @end
6563 1.1 joerg void foo(I *i) { [i f:12]; }
6564 1.1 joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6565 1.1 joerg matches [i f:12]
6566 1.1 joerg </pre></td></tr>
6567 1.1 joerg
6568 1.1 joerg
6569 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasArgument2')"><a name="hasArgument2Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6570 1.1 joerg <tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
6571 1.1 joerg call expression.
6572 1.1 joerg
6573 1.1 joerg Example matches y in x(y)
6574 1.1 joerg (matcher = callExpr(hasArgument(0, declRefExpr())))
6575 1.1 joerg void x(int) { int y; x(y); }
6576 1.1 joerg </pre></td></tr>
6577 1.1 joerg
6578 1.1 joerg
6579 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasReceiver0')"><a name="hasReceiver0Anchor">hasReceiver</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6580 1.1 joerg <tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
6581 1.1 joerg and the inner matcher matches on that instance.
6582 1.1 joerg
6583 1.1 joerg For example the method call in
6584 1.1 joerg NSString *x = @"hello";
6585 1.1 joerg [x containsString:@"h"];
6586 1.1 joerg is matched by
6587 1.1 joerg objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
6588 1.1 joerg </pre></td></tr>
6589 1.1 joerg
6590 1.1 joerg
6591 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasReceiverType0')"><a name="hasReceiverType0Anchor">hasReceiverType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
6592 1.1 joerg <tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
6593 1.1 joerg
6594 1.1 joerg Example
6595 1.1 joerg matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
6596 1.1 joerg matches the [webView ...] message invocation.
6597 1.1 joerg NSString *webViewJavaScript = ...
6598 1.1 joerg UIWebView *webView = ...
6599 1.1 joerg [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
6600 1.1 joerg </pre></td></tr>
6601 1.1 joerg
6602 1.1 joerg
6603 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('hasAnyParameter1')"><a name="hasAnyParameter1Anchor">hasAnyParameter</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr>
6604 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
6605 1.1 joerg block.
6606 1.1 joerg
6607 1.1 joerg Does not match the 'this' parameter of a method.
6608 1.1 joerg
6609 1.1 joerg Given
6610 1.1 joerg class X { void f(int x, int y, int z) {} };
6611 1.1 joerg cxxMethodDecl(hasAnyParameter(hasName("y")))
6612 1.1 joerg matches f(int x, int y, int z) {}
6613 1.1 joerg with hasAnyParameter(...)
6614 1.1 joerg matching int y
6615 1.1 joerg
6616 1.1 joerg For ObjectiveC, given
6617 1.1 joerg @interface I - (void) f:(int) y; @end
6618 1.1 joerg
6619 1.1 joerg the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6620 1.1 joerg matches the declaration of method f with hasParameter
6621 1.1 joerg matching y.
6622 1.1 joerg
6623 1.1 joerg For blocks, given
6624 1.1 joerg b = ^(int y) { printf("%d", y) };
6625 1.1 joerg
6626 1.1 joerg the matcher blockDecl(hasAnyParameter(hasName("y")))
6627 1.1 joerg matches the declaration of the block b with hasParameter
6628 1.1 joerg matching y.
6629 1.1 joerg </pre></td></tr>
6630 1.1 joerg
6631 1.1 joerg
6632 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('hasParameter1')"><a name="hasParameter1Anchor">hasParameter</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr>
6633 1.1 joerg <tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
6634 1.1 joerg declaration or a block.
6635 1.1 joerg
6636 1.1 joerg Given
6637 1.1 joerg class X { void f(int x) {} };
6638 1.1 joerg cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6639 1.1 joerg matches f(int x) {}
6640 1.1 joerg with hasParameter(...)
6641 1.1 joerg matching int x
6642 1.1 joerg
6643 1.1 joerg For ObjectiveC, given
6644 1.1 joerg @interface I - (void) f:(int) y; @end
6645 1.1 joerg
6646 1.1 joerg the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6647 1.1 joerg matches the declaration of method f with hasParameter
6648 1.1 joerg matching y.
6649 1.1 joerg </pre></td></tr>
6650 1.1 joerg
6651 1.1 joerg
6652 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>></td><td class="name" onclick="toggle('hasSourceExpression1')"><a name="hasSourceExpression1Anchor">hasSourceExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6653 1.1 joerg <tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
6654 1.1 joerg or opaque value's source expression matches the given matcher.
6655 1.1 joerg
6656 1.1 joerg Example 1: matches "a string"
6657 1.1 joerg (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
6658 1.1 joerg class URL { URL(string); };
6659 1.1 joerg URL url = "a string";
6660 1.1 joerg
6661 1.1 joerg Example 2: matches 'b' (matcher =
6662 1.1 joerg opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
6663 1.1 joerg int a = b ?: 1;
6664 1.1 joerg </pre></td></tr>
6665 1.1 joerg
6666 1.1 joerg
6667 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OverloadExpr.html">OverloadExpr</a>></td><td class="name" onclick="toggle('hasAnyDeclaration0')"><a name="hasAnyDeclaration0Anchor">hasAnyDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
6668 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
6669 1.1 joerg overloads matches the given matcher.
6670 1.1 joerg
6671 1.1 joerg Given
6672 1.1 joerg template <typename T> void foo(T);
6673 1.1 joerg template <typename T> void bar(T);
6674 1.1 joerg template <typename T> void baz(T t) {
6675 1.1 joerg foo(t);
6676 1.1 joerg bar(t);
6677 1.1 joerg }
6678 1.1 joerg unresolvedLookupExpr(hasAnyDeclaration(
6679 1.1 joerg functionTemplateDecl(hasName("foo"))))
6680 1.1 joerg matches foo in foo(t); but not bar in bar(t);
6681 1.1 joerg </pre></td></tr>
6682 1.1 joerg
6683 1.1 joerg
6684 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>></td><td class="name" onclick="toggle('innerType0')"><a name="innerType0Anchor">innerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
6685 1.1 joerg <tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
6686 1.1 joerg
6687 1.1 joerg Given
6688 1.1 joerg int (*ptr_to_array)[4];
6689 1.1 joerg int (*ptr_to_func)(int);
6690 1.1 joerg
6691 1.1 joerg varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
6692 1.1 joerg ptr_to_func but not ptr_to_array.
6693 1.1 joerg
6694 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>>
6695 1.1 joerg </pre></td></tr>
6696 1.1 joerg
6697 1.1 joerg
6698 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>></td><td class="name" onclick="toggle('pointee2')"><a name="pointee2Anchor">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
6699 1.1 joerg <tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
6700 1.1 joerg pointee matches a given matcher.
6701 1.1 joerg
6702 1.1 joerg Given
6703 1.1 joerg int *a;
6704 1.1 joerg int const *b;
6705 1.1 joerg float const *f;
6706 1.1 joerg pointerType(pointee(isConstQualified(), isInteger()))
6707 1.1 joerg matches "int const *b"
6708 1.1 joerg
6709 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>,
6710 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>
6711 1.1 joerg </pre></td></tr>
6712 1.1 joerg
6713 1.1 joerg
6714 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('hasCanonicalType0')"><a name="hasCanonicalType0Anchor">hasCanonicalType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
6715 1.1 joerg <tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
6716 1.1 joerg
6717 1.1 joerg Given:
6718 1.1 joerg typedef int &int_ref;
6719 1.1 joerg int a;
6720 1.1 joerg int_ref b = a;
6721 1.1 joerg
6722 1.1 joerg varDecl(hasType(qualType(referenceType()))))) will not match the
6723 1.1 joerg declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
6724 1.1 joerg </pre></td></tr>
6725 1.1 joerg
6726 1.1 joerg
6727 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
6728 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
6729 1.1 joerg matches the given matcher.
6730 1.1 joerg
6731 1.1 joerg The associated declaration is:
6732 1.1 joerg - for type nodes, the declaration of the underlying type
6733 1.1 joerg - for CallExpr, the declaration of the callee
6734 1.1 joerg - for MemberExpr, the declaration of the referenced member
6735 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
6736 1.1 joerg - for CXXNewExpr, the declaration of the operator new
6737 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
6738 1.1 joerg
6739 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
6740 1.1 joerg sugared type. Given
6741 1.1 joerg class X {};
6742 1.1 joerg typedef X Y;
6743 1.1 joerg Y y;
6744 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6745 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
6746 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6747 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
6748 1.1 joerg recordType(hasDeclaration(decl())))))
6749 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
6750 1.1 joerg
6751 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
6752 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
6753 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
6754 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
6755 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
6756 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
6757 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
6758 1.1 joerg </pre></td></tr>
6759 1.1 joerg
6760 1.1 joerg
6761 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('ignoringParens0')"><a name="ignoringParens0Anchor">ignoringParens</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
6762 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
6763 1.1 joerg
6764 1.1 joerg Given
6765 1.1 joerg void (*fp)(void);
6766 1.1 joerg The matcher
6767 1.1 joerg varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
6768 1.1 joerg would match the declaration for fp.
6769 1.1 joerg </pre></td></tr>
6770 1.1 joerg
6771 1.1 joerg
6772 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('pointsTo1')"><a name="pointsTo1Anchor">pointsTo</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
6773 1.1 joerg <tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
6774 1.1 joerg </pre></td></tr>
6775 1.1 joerg
6776 1.1 joerg
6777 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('pointsTo0')"><a name="pointsTo0Anchor">pointsTo</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
6778 1.1 joerg <tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
6779 1.1 joerg matches the specified matcher.
6780 1.1 joerg
6781 1.1 joerg Example matches y->x()
6782 1.1 joerg (matcher = cxxMemberCallExpr(on(hasType(pointsTo
6783 1.1 joerg cxxRecordDecl(hasName("Y")))))))
6784 1.1 joerg class Y { public: void x(); };
6785 1.1 joerg void z() { Y *y; y->x(); }
6786 1.1 joerg </pre></td></tr>
6787 1.1 joerg
6788 1.1 joerg
6789 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('references1')"><a name="references1Anchor">references</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
6790 1.1 joerg <tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
6791 1.1 joerg </pre></td></tr>
6792 1.1 joerg
6793 1.1 joerg
6794 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('references0')"><a name="references0Anchor">references</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
6795 1.1 joerg <tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
6796 1.1 joerg type matches the specified matcher.
6797 1.1 joerg
6798 1.1 joerg Example matches X &x and const X &y
6799 1.1 joerg (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
6800 1.1 joerg class X {
6801 1.1 joerg void a(X b) {
6802 1.1 joerg X &x = b;
6803 1.1 joerg const X &y = b;
6804 1.1 joerg }
6805 1.1 joerg };
6806 1.1 joerg </pre></td></tr>
6807 1.1 joerg
6808 1.1 joerg
6809 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>></td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
6810 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
6811 1.1 joerg matches the given matcher.
6812 1.1 joerg
6813 1.1 joerg The associated declaration is:
6814 1.1 joerg - for type nodes, the declaration of the underlying type
6815 1.1 joerg - for CallExpr, the declaration of the callee
6816 1.1 joerg - for MemberExpr, the declaration of the referenced member
6817 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
6818 1.1 joerg - for CXXNewExpr, the declaration of the operator new
6819 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
6820 1.1 joerg
6821 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
6822 1.1 joerg sugared type. Given
6823 1.1 joerg class X {};
6824 1.1 joerg typedef X Y;
6825 1.1 joerg Y y;
6826 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6827 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
6828 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6829 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
6830 1.1 joerg recordType(hasDeclaration(decl())))))
6831 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
6832 1.1 joerg
6833 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
6834 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
6835 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
6836 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
6837 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
6838 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
6839 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
6840 1.1 joerg </pre></td></tr>
6841 1.1 joerg
6842 1.1 joerg
6843 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>></td><td class="name" onclick="toggle('pointee3')"><a name="pointee3Anchor">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
6844 1.1 joerg <tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
6845 1.1 joerg pointee matches a given matcher.
6846 1.1 joerg
6847 1.1 joerg Given
6848 1.1 joerg int *a;
6849 1.1 joerg int const *b;
6850 1.1 joerg float const *f;
6851 1.1 joerg pointerType(pointee(isConstQualified(), isInteger()))
6852 1.1 joerg matches "int const *b"
6853 1.1 joerg
6854 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>,
6855 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>
6856 1.1 joerg </pre></td></tr>
6857 1.1 joerg
6858 1.1 joerg
6859 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>></td><td class="name" onclick="toggle('hasReturnValue0')"><a name="hasReturnValue0Anchor">hasReturnValue</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6860 1.1 joerg <tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
6861 1.1 joerg
6862 1.1 joerg Given
6863 1.1 joerg return a + b;
6864 1.1 joerg hasReturnValue(binaryOperator())
6865 1.1 joerg matches 'return a + b'
6866 1.1 joerg with binaryOperator()
6867 1.1 joerg matching 'a + b'
6868 1.1 joerg </pre></td></tr>
6869 1.1 joerg
6870 1.1 joerg
6871 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>></td><td class="name" onclick="toggle('hasAnySubstatement1')"><a name="hasAnySubstatement1Anchor">hasAnySubstatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
6872 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
6873 1.1 joerg a given matcher. Also matches StmtExprs that have CompoundStmt as children.
6874 1.1 joerg
6875 1.1 joerg Given
6876 1.1 joerg { {}; 1+2; }
6877 1.1 joerg hasAnySubstatement(compoundStmt())
6878 1.1 joerg matches '{ {}; 1+2; }'
6879 1.1 joerg with compoundStmt()
6880 1.1 joerg matching '{}'
6881 1.1 joerg </pre></td></tr>
6882 1.1 joerg
6883 1.1 joerg
6884 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('alignOfExpr0')"><a name="alignOfExpr0Anchor">alignOfExpr</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr>
6885 1.1 joerg <tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
6886 1.1 joerg alignof.
6887 1.1 joerg </pre></td></tr>
6888 1.1 joerg
6889 1.1 joerg
6890 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forFunction0')"><a name="forFunction0Anchor">forFunction</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> InnerMatcher</td></tr>
6891 1.1 joerg <tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to
6892 1.1 joerg
6893 1.1 joerg Given:
6894 1.1 joerg F& operator=(const F& o) {
6895 1.1 joerg std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; });
6896 1.1 joerg return *this;
6897 1.1 joerg }
6898 1.1 joerg returnStmt(forFunction(hasName("operator=")))
6899 1.1 joerg matches 'return *this'
6900 1.1 joerg but does not match 'return v > 0'
6901 1.1 joerg </pre></td></tr>
6902 1.1 joerg
6903 1.1 joerg
6904 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('sizeOfExpr0')"><a name="sizeOfExpr0Anchor">sizeOfExpr</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr>
6905 1.1 joerg <tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
6906 1.1 joerg sizeof.
6907 1.1 joerg </pre></td></tr>
6908 1.1 joerg
6909 1.1 joerg
6910 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>></td><td class="name" onclick="toggle('hasReplacementType0')"><a name="hasReplacementType0Anchor">hasReplacementType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
6911 1.1 joerg <tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
6912 1.1 joerg type that matches the provided matcher.
6913 1.1 joerg
6914 1.1 joerg Given
6915 1.1 joerg template <typename T>
6916 1.1 joerg double F(T t);
6917 1.1 joerg int i;
6918 1.1 joerg double j = F(i);
6919 1.1 joerg
6920 1.1 joerg substTemplateTypeParmType(hasReplacementType(type())) matches int
6921 1.1 joerg </pre></td></tr>
6922 1.1 joerg
6923 1.1 joerg
6924 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>></td><td class="name" onclick="toggle('forEachSwitchCase0')"><a name="forEachSwitchCase0Anchor">forEachSwitchCase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>> InnerMatcher</td></tr>
6925 1.1 joerg <tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
6926 1.1 joerg statement. This matcher may produce multiple matches.
6927 1.1 joerg
6928 1.1 joerg Given
6929 1.1 joerg switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
6930 1.1 joerg switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
6931 1.1 joerg matches four times, with "c" binding each of "case 1:", "case 2:",
6932 1.1 joerg "case 3:" and "case 4:", and "s" respectively binding "switch (1)",
6933 1.1 joerg "switch (1)", "switch (2)" and "switch (2)".
6934 1.1 joerg </pre></td></tr>
6935 1.1 joerg
6936 1.1 joerg
6937 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>></td><td class="name" onclick="toggle('hasCondition4')"><a name="hasCondition4Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6938 1.1 joerg <tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
6939 1.1 joerg switch statement or conditional operator.
6940 1.1 joerg
6941 1.1 joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6942 1.1 joerg if (true) {}
6943 1.1 joerg </pre></td></tr>
6944 1.1 joerg
6945 1.1 joerg
6946 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>></td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
6947 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
6948 1.1 joerg matches the given matcher.
6949 1.1 joerg
6950 1.1 joerg The associated declaration is:
6951 1.1 joerg - for type nodes, the declaration of the underlying type
6952 1.1 joerg - for CallExpr, the declaration of the callee
6953 1.1 joerg - for MemberExpr, the declaration of the referenced member
6954 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
6955 1.1 joerg - for CXXNewExpr, the declaration of the operator new
6956 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
6957 1.1 joerg
6958 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
6959 1.1 joerg sugared type. Given
6960 1.1 joerg class X {};
6961 1.1 joerg typedef X Y;
6962 1.1 joerg Y y;
6963 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6964 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
6965 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6966 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
6967 1.1 joerg recordType(hasDeclaration(decl())))))
6968 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
6969 1.1 joerg
6970 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
6971 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
6972 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
6973 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
6974 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
6975 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
6976 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
6977 1.1 joerg </pre></td></tr>
6978 1.1 joerg
6979 1.1 joerg
6980 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('isExpr0')"><a name="isExpr0Anchor">isExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
6981 1.1 joerg <tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
6982 1.1 joerg
6983 1.1 joerg Given
6984 1.1 joerg struct B { int next; };
6985 1.1 joerg template<int(B::*next_ptr)> struct A {};
6986 1.1 joerg A<&B::next> a;
6987 1.1 joerg templateSpecializationType(hasAnyTemplateArgument(
6988 1.1 joerg isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
6989 1.1 joerg matches the specialization A<&B::next> with fieldDecl(...) matching
6990 1.1 joerg B::next
6991 1.1 joerg </pre></td></tr>
6992 1.1 joerg
6993 1.1 joerg
6994 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToDeclaration0')"><a name="refersToDeclaration0Anchor">refersToDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
6995 1.1 joerg <tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
6996 1.1 joerg declaration.
6997 1.1 joerg
6998 1.1 joerg Given
6999 1.1 joerg struct B { int next; };
7000 1.1 joerg template<int(B::*next_ptr)> struct A {};
7001 1.1 joerg A<&B::next> a;
7002 1.1 joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
7003 1.1 joerg refersToDeclaration(fieldDecl(hasName("next")))))
7004 1.1 joerg matches the specialization A<&B::next> with fieldDecl(...) matching
7005 1.1 joerg B::next
7006 1.1 joerg </pre></td></tr>
7007 1.1 joerg
7008 1.1 joerg
7009 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToIntegralType0')"><a name="refersToIntegralType0Anchor">refersToIntegralType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
7010 1.1 joerg <tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
7011 1.1 joerg
7012 1.1 joerg Given
7013 1.1 joerg template<int T> struct C {};
7014 1.1 joerg C<42> c;
7015 1.1 joerg classTemplateSpecializationDecl(
7016 1.1 joerg hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
7017 1.1 joerg matches the implicit instantiation of C in C<42>.
7018 1.1 joerg </pre></td></tr>
7019 1.1 joerg
7020 1.1 joerg
7021 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToTemplate0')"><a name="refersToTemplate0Anchor">refersToTemplate</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>> InnerMatcher</td></tr>
7022 1.1 joerg <tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
7023 1.1 joerg
7024 1.1 joerg Given
7025 1.1 joerg template<template <typename> class S> class X {};
7026 1.1 joerg template<typename T> class Y {};
7027 1.1 joerg X<Y> xi;
7028 1.1 joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
7029 1.1 joerg refersToTemplate(templateName())))
7030 1.1 joerg matches the specialization X<Y>
7031 1.1 joerg </pre></td></tr>
7032 1.1 joerg
7033 1.1 joerg
7034 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToType0')"><a name="refersToType0Anchor">refersToType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
7035 1.1 joerg <tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
7036 1.1 joerg
7037 1.1 joerg Given
7038 1.1 joerg struct X {};
7039 1.1 joerg template<typename T> struct A {};
7040 1.1 joerg A<X> a;
7041 1.1 joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
7042 1.1 joerg refersToType(class(hasName("X")))))
7043 1.1 joerg matches the specialization A<X>
7044 1.1 joerg </pre></td></tr>
7045 1.1 joerg
7046 1.1 joerg
7047 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument1')"><a name="hasAnyTemplateArgument1Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr>
7048 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7049 1.1 joerg functionDecl that have at least one TemplateArgument matching the given
7050 1.1 joerg InnerMatcher.
7051 1.1 joerg
7052 1.1 joerg Given
7053 1.1 joerg template<typename T> class A {};
7054 1.1 joerg template<> class A<double> {};
7055 1.1 joerg A<int> a;
7056 1.1 joerg
7057 1.1 joerg template<typename T> f() {};
7058 1.1 joerg void func() { f<int>(); };
7059 1.1 joerg
7060 1.1 joerg classTemplateSpecializationDecl(hasAnyTemplateArgument(
7061 1.1 joerg refersToType(asString("int"))))
7062 1.1 joerg matches the specialization A<int>
7063 1.1 joerg
7064 1.1 joerg functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7065 1.1 joerg matches the specialization f<int>
7066 1.1 joerg </pre></td></tr>
7067 1.1 joerg
7068 1.1 joerg
7069 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
7070 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
7071 1.1 joerg matches the given matcher.
7072 1.1 joerg
7073 1.1 joerg The associated declaration is:
7074 1.1 joerg - for type nodes, the declaration of the underlying type
7075 1.1 joerg - for CallExpr, the declaration of the callee
7076 1.1 joerg - for MemberExpr, the declaration of the referenced member
7077 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
7078 1.1 joerg - for CXXNewExpr, the declaration of the operator new
7079 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
7080 1.1 joerg
7081 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
7082 1.1 joerg sugared type. Given
7083 1.1 joerg class X {};
7084 1.1 joerg typedef X Y;
7085 1.1 joerg Y y;
7086 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7087 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
7088 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7089 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
7090 1.1 joerg recordType(hasDeclaration(decl())))))
7091 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
7092 1.1 joerg
7093 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
7094 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
7095 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
7096 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
7097 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
7098 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
7099 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
7100 1.1 joerg </pre></td></tr>
7101 1.1 joerg
7102 1.1 joerg
7103 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('hasTemplateArgument1')"><a name="hasTemplateArgument1Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr>
7104 1.1 joerg <tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7105 1.1 joerg functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7106 1.1 joerg
7107 1.1 joerg Given
7108 1.1 joerg template<typename T, typename U> class A {};
7109 1.1 joerg A<bool, int> b;
7110 1.1 joerg A<int, bool> c;
7111 1.1 joerg
7112 1.1 joerg template<typename T> void f() {}
7113 1.1 joerg void func() { f<int>(); };
7114 1.1 joerg classTemplateSpecializationDecl(hasTemplateArgument(
7115 1.1 joerg 1, refersToType(asString("int"))))
7116 1.1 joerg matches the specialization A<bool, int>
7117 1.1 joerg
7118 1.1 joerg functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7119 1.1 joerg matches the specialization f<int>
7120 1.1 joerg </pre></td></tr>
7121 1.1 joerg
7122 1.1 joerg
7123 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>></td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
7124 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
7125 1.1 joerg matches the given matcher.
7126 1.1 joerg
7127 1.1 joerg The associated declaration is:
7128 1.1 joerg - for type nodes, the declaration of the underlying type
7129 1.1 joerg - for CallExpr, the declaration of the callee
7130 1.1 joerg - for MemberExpr, the declaration of the referenced member
7131 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
7132 1.1 joerg - for CXXNewExpr, the declaration of the operator new
7133 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
7134 1.1 joerg
7135 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
7136 1.1 joerg sugared type. Given
7137 1.1 joerg class X {};
7138 1.1 joerg typedef X Y;
7139 1.1 joerg Y y;
7140 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7141 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
7142 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7143 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
7144 1.1 joerg recordType(hasDeclaration(decl())))))
7145 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
7146 1.1 joerg
7147 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
7148 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
7149 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
7150 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
7151 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
7152 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
7153 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
7154 1.1 joerg </pre></td></tr>
7155 1.1 joerg
7156 1.1 joerg
7157 1.1 joerg <tr><td>Matcher<T></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>const Matcher<T> Matcher</td></tr>
7158 1.1 joerg <tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
7159 1.1 joerg
7160 1.1 joerg Generates results for each match.
7161 1.1 joerg
7162 1.1 joerg For example, in:
7163 1.1 joerg class A { class B {}; class C {}; };
7164 1.1 joerg The matcher:
7165 1.1 joerg cxxRecordDecl(hasName("::A"),
7166 1.1 joerg findAll(cxxRecordDecl(isDefinition()).bind("m")))
7167 1.1 joerg will generate results for A, B and C.
7168 1.1 joerg
7169 1.1 joerg Usable as: Any Matcher
7170 1.1 joerg </pre></td></tr>
7171 1.1 joerg
7172 1.1 joerg
7173 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>></td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
7174 1.1 joerg <tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
7175 1.1 joerg matcher.
7176 1.1 joerg
7177 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7178 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7179 1.1 joerg and U (matcher = typedefDecl(hasType(asString("int")))
7180 1.1 joerg and friend class X (matcher = friendDecl(hasType("X"))
7181 1.1 joerg class X {};
7182 1.1 joerg void y(X &x) { x; X z; }
7183 1.1 joerg typedef int U;
7184 1.1 joerg class Y { friend class X; };
7185 1.1 joerg </pre></td></tr>
7186 1.1 joerg
7187 1.1 joerg
7188 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>></td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
7189 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
7190 1.1 joerg matches the given matcher.
7191 1.1 joerg
7192 1.1 joerg The associated declaration is:
7193 1.1 joerg - for type nodes, the declaration of the underlying type
7194 1.1 joerg - for CallExpr, the declaration of the callee
7195 1.1 joerg - for MemberExpr, the declaration of the referenced member
7196 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
7197 1.1 joerg - for CXXNewExpr, the declaration of the operator new
7198 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
7199 1.1 joerg
7200 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
7201 1.1 joerg sugared type. Given
7202 1.1 joerg class X {};
7203 1.1 joerg typedef X Y;
7204 1.1 joerg Y y;
7205 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7206 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
7207 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7208 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
7209 1.1 joerg recordType(hasDeclaration(decl())))))
7210 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
7211 1.1 joerg
7212 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
7213 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
7214 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
7215 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
7216 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
7217 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
7218 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
7219 1.1 joerg </pre></td></tr>
7220 1.1 joerg
7221 1.1 joerg
7222 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('hasUnqualifiedDesugaredType0')"><a name="hasUnqualifiedDesugaredType0Anchor">hasUnqualifiedDesugaredType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>> InnerMatcher</td></tr>
7223 1.1 joerg <tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
7224 1.1 joerg type of the matched node.
7225 1.1 joerg
7226 1.1 joerg For example, in:
7227 1.1 joerg class A {};
7228 1.1 joerg using B = A;
7229 1.1 joerg The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
7230 1.1 joerg both B and A.
7231 1.1 joerg </pre></td></tr>
7232 1.1 joerg
7233 1.1 joerg
7234 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>></td><td class="name" onclick="toggle('hasArgumentOfType0')"><a name="hasArgumentOfType0Anchor">hasArgumentOfType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
7235 1.1 joerg <tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
7236 1.1 joerg
7237 1.1 joerg Given
7238 1.1 joerg int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
7239 1.1 joerg unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
7240 1.1 joerg matches sizeof(a) and alignof(c)
7241 1.1 joerg </pre></td></tr>
7242 1.1 joerg
7243 1.1 joerg
7244 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasUnaryOperand0')"><a name="hasUnaryOperand0Anchor">hasUnaryOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7245 1.1 joerg <tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
7246 1.1 joerg
7247 1.1 joerg Example matches true (matcher = hasUnaryOperand(
7248 1.1 joerg cxxBoolLiteral(equals(true))))
7249 1.1 joerg !true
7250 1.1 joerg </pre></td></tr>
7251 1.1 joerg
7252 1.1 joerg
7253 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>></td><td class="name" onclick="toggle('hasObjectExpression1')"><a name="hasObjectExpression1Anchor">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7254 1.1 joerg <tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
7255 1.1 joerg given matcher. Implicit object expressions are included; that is, it matches
7256 1.1 joerg use of implicit `this`.
7257 1.1 joerg
7258 1.1 joerg Given
7259 1.1 joerg struct X {
7260 1.1 joerg int m;
7261 1.1 joerg int f(X x) { x.m; return m; }
7262 1.1 joerg };
7263 1.1 joerg memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
7264 1.1 joerg matches `x.m`, but not `m`; however,
7265 1.1 joerg memberExpr(hasObjectExpression(hasType(pointsTo(
7266 1.1 joerg cxxRecordDecl(hasName("X"))))))
7267 1.1 joerg matches `m` (aka. `this->m`), but not `x.m`.
7268 1.1 joerg </pre></td></tr>
7269 1.1 joerg
7270 1.1 joerg
7271 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>></td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>const Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
7272 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
7273 1.1 joerg matches the given matcher.
7274 1.1 joerg
7275 1.1 joerg The associated declaration is:
7276 1.1 joerg - for type nodes, the declaration of the underlying type
7277 1.1 joerg - for CallExpr, the declaration of the callee
7278 1.1 joerg - for MemberExpr, the declaration of the referenced member
7279 1.1 joerg - for CXXConstructExpr, the declaration of the constructor
7280 1.1 joerg - for CXXNewExpr, the declaration of the operator new
7281 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar
7282 1.1 joerg
7283 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the
7284 1.1 joerg sugared type. Given
7285 1.1 joerg class X {};
7286 1.1 joerg typedef X Y;
7287 1.1 joerg Y y;
7288 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7289 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type.
7290 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7291 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType(
7292 1.1 joerg recordType(hasDeclaration(decl())))))
7293 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X.
7294 1.1 joerg
7295 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>,
7296 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>,
7297 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>,
7298 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>,
7299 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>,
7300 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>,
7301 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>>
7302 1.1 joerg </pre></td></tr>
7303 1.1 joerg
7304 1.1 joerg
7305 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>></td><td class="name" onclick="toggle('hasAnyUsingShadowDecl0')"><a name="hasAnyUsingShadowDecl0Anchor">hasAnyUsingShadowDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr>
7306 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
7307 1.1 joerg
7308 1.1 joerg Given
7309 1.1 joerg namespace X { void b(); }
7310 1.1 joerg using X::b;
7311 1.1 joerg usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
7312 1.1 joerg matches using X::b </pre></td></tr>
7313 1.1 joerg
7314 1.1 joerg
7315 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>></td><td class="name" onclick="toggle('hasTargetDecl0')"><a name="hasTargetDecl0Anchor">hasTargetDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> InnerMatcher</td></tr>
7316 1.1 joerg <tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
7317 1.1 joerg matched by the given matcher.
7318 1.1 joerg
7319 1.1 joerg Given
7320 1.1 joerg namespace X { int a; void b(); }
7321 1.1 joerg using X::a;
7322 1.1 joerg using X::b;
7323 1.1 joerg usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
7324 1.1 joerg matches using X::b but not using X::a </pre></td></tr>
7325 1.1 joerg
7326 1.1 joerg
7327 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>></td><td class="name" onclick="toggle('hasType6')"><a name="hasType6Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr>
7328 1.1 joerg <tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
7329 1.1 joerg declaration's type.
7330 1.1 joerg
7331 1.1 joerg In case of a value declaration (for example a variable declaration),
7332 1.1 joerg this resolves one layer of indirection. For example, in the value
7333 1.1 joerg declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7334 1.1 joerg X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7335 1.1 joerg declaration of x.
7336 1.1 joerg
7337 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7338 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7339 1.1 joerg and friend class X (matcher = friendDecl(hasType("X"))
7340 1.1 joerg class X {};
7341 1.1 joerg void y(X &x) { x; X z; }
7342 1.1 joerg class Y { friend class X; };
7343 1.1 joerg
7344 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>
7345 1.1 joerg </pre></td></tr>
7346 1.1 joerg
7347 1.1 joerg
7348 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>></td><td class="name" onclick="toggle('hasType3')"><a name="hasType3Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
7349 1.1 joerg <tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
7350 1.1 joerg matcher.
7351 1.1 joerg
7352 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7353 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7354 1.1 joerg and U (matcher = typedefDecl(hasType(asString("int")))
7355 1.1 joerg and friend class X (matcher = friendDecl(hasType("X"))
7356 1.1 joerg class X {};
7357 1.1 joerg void y(X &x) { x; X z; }
7358 1.1 joerg typedef int U;
7359 1.1 joerg class Y { friend class X; };
7360 1.1 joerg </pre></td></tr>
7361 1.1 joerg
7362 1.1 joerg
7363 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasInitializer0')"><a name="hasInitializer0Anchor">hasInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7364 1.1 joerg <tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
7365 1.1 joerg that matches the given matcher.
7366 1.1 joerg
7367 1.1 joerg Example matches x (matcher = varDecl(hasInitializer(callExpr())))
7368 1.1 joerg bool y() { return true; }
7369 1.1 joerg bool x = y();
7370 1.1 joerg </pre></td></tr>
7371 1.1 joerg
7372 1.1 joerg
7373 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>></td><td class="name" onclick="toggle('hasSizeExpr0')"><a name="hasSizeExpr0Anchor">hasSizeExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7374 1.1 joerg <tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
7375 1.1 joerg expression.
7376 1.1 joerg
7377 1.1 joerg Given
7378 1.1 joerg void f(int b) {
7379 1.1 joerg int a[b];
7380 1.1 joerg }
7381 1.1 joerg variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
7382 1.1 joerg varDecl(hasName("b")))))))
7383 1.1 joerg matches "int a[b]"
7384 1.1 joerg </pre></td></tr>
7385 1.1 joerg
7386 1.1 joerg
7387 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>></td><td class="name" onclick="toggle('hasBody2')"><a name="hasBody2Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr>
7388 1.1 joerg <tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
7389 1.1 joerg definition that has a given body.
7390 1.1 joerg
7391 1.1 joerg Given
7392 1.1 joerg for (;;) {}
7393 1.1 joerg hasBody(compoundStmt())
7394 1.1 joerg matches 'for (;;) {}'
7395 1.1 joerg with compoundStmt()
7396 1.1 joerg matching '{}'
7397 1.1 joerg </pre></td></tr>
7398 1.1 joerg
7399 1.1 joerg
7400 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>></td><td class="name" onclick="toggle('hasCondition2')"><a name="hasCondition2Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
7401 1.1 joerg <tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
7402 1.1 joerg switch statement or conditional operator.
7403 1.1 joerg
7404 1.1 joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7405 1.1 joerg if (true) {}
7406 1.1 joerg </pre></td></tr>
7407 1.1 joerg
7408 1.1 joerg
7409 1.1 joerg <tr><td>Matcher<internal::BindableMatcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>>></td><td class="name" onclick="toggle('loc1')"><a name="loc1Anchor">loc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr>
7410 1.1 joerg <tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
7411 1.1 joerg NestedNameSpecifier-matcher matches.
7412 1.1 joerg </pre></td></tr>
7413 1.1 joerg
7414 1.1 joerg
7415 1.1 joerg <tr><td>Matcher<internal::BindableMatcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>></td><td class="name" onclick="toggle('loc0')"><a name="loc0Anchor">loc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
7416 1.1 joerg <tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
7417 1.1 joerg QualType-matcher matches.
7418 1.1 joerg </pre></td></tr>
7419 1.1 joerg
7420 1.1 joerg <!--END_TRAVERSAL_MATCHERS -->
7421 1.1 joerg </table>
7422 1.1 joerg
7423 1.1 joerg </div>
7424 1.1 joerg </body>
7425 1.1 joerg </html>
7426 1.1 joerg
7427 1.1 joerg
7428