1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 2 "http://www.w3.org/TR/html4/strict.dtd"> 3<html> 4<head> 5<title>AST Matcher Reference</title> 6<link type="text/css" rel="stylesheet" href="../menu.css" /> 7<link type="text/css" rel="stylesheet" href="../content.css" /> 8<style type="text/css"> 9td { 10 padding: .33em; 11} 12td.doc { 13 display: none; 14 border-bottom: 1px solid black; 15} 16td.name:hover { 17 color: blue; 18 cursor: pointer; 19} 20</style> 21<script type="text/javascript"> 22function toggle(id) { 23 if (!id) return; 24 row = document.getElementById(id); 25 if (row.style.display != 'table-cell') 26 row.style.display = 'table-cell'; 27 else 28 row.style.display = 'none'; 29} 30</script> 31</head> 32<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))"> 33 34<!--#include virtual="../menu.html.incl"--> 35 36<div id="content"> 37 38<h1>AST Matcher Reference</h1> 39 40<p>This document shows all currently implemented matchers. The matchers are grouped 41by category and node type they match. You can click on matcher names to show the 42matcher's source documentation.</p> 43 44<p>There are three different basic categories of matchers: 45<ul> 46<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li> 47<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li> 48<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li> 49</ul> 50</p> 51 52<p>Within each category the matchers are ordered by node type they match on. 53Note that if a matcher can match multiple node types, it will appear 54multiple times. This means that by searching for Matcher<Stmt> you can 55find all matchers that can be used to match on Stmt nodes.</p> 56 57<p>The exception to that rule are matchers that can match on any node. Those 58are marked with a * and are listed in the beginning of each category.</p> 59 60<p>Note that the categorization of matchers is a great help when you combine 61them into matcher expressions. You will usually want to form matcher expressions 62that read like english sentences by alternating between node matchers and 63narrowing or traversal matchers, like this: 64<pre> 65recordDecl(hasDescendant( 66 ifStmt(hasTrueExpression( 67 expr(hasDescendant( 68 ifStmt())))))) 69</pre> 70</p> 71 72<!-- ======================================================================= --> 73<h2 id="decl-matchers">Node Matchers</h2> 74<!-- ======================================================================= --> 75 76<p>Node matchers are at the core of matcher expressions - they specify the type 77of node that is expected. Every match expression starts with a node matcher, 78which can then be further refined with a narrowing or traversal matcher. All 79traversal matchers take node matchers as their arguments.</p> 80 81<p>For convenience, all node matchers take an arbitrary number of arguments 82and implicitly act as allOf matchers.</p> 83 84<p>Node matchers are the only matchers that support the bind("id") call to 85bind the matched node to the given string, to be later retrieved from the 86match callback.</p> 87 88<p>It is important to remember that the arguments to node matchers are 89predicates on the same node, just with additional information about the type. 90This is often useful to make matcher expression more readable by inlining bind 91calls into redundant node matchers inside another node matcher: 92<pre> 93// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on 94// the same node. 95recordDecl(decl().bind("id"), hasName("::MyClass")) 96</pre> 97</p> 98 99<table> 100<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 101<!-- START_DECL_MATCHERS --> 102 103<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<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers. 105 106Examples matches i(42). 107 class C { 108 C() : i(42) {} 109 int i; 110 }; 111</pre></td></tr> 112 113 114<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<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations. 116 117Given 118 class C { 119 public: 120 int a; 121 }; 122accessSpecDecl() 123 matches 'public:' 124</pre></td></tr> 125 126 127<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<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations. 129 130Example matches the declaration of the nameless block printing an input 131integer. 132 133 myFunc(^(int p) { 134 printf("%d", p); 135 }) 136</pre></td></tr> 137 138 139<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<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations. 141 142Example matches Z 143 template<class T> class Z {}; 144</pre></td></tr> 145 146 147<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<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations. 149 150Given 151 template<class T1, class T2, int I> 152 class A {}; 153 154 template<class T, int I> 155 class A<T, T*, I> {}; 156 157 template<> 158 class A<int, int, 1> {}; 159classTemplatePartialSpecializationDecl() 160 matches the specialization A<T,T*,I> but not A<int,int,1> 161</pre></td></tr> 162 163 164<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<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations. 166 167Given 168 template<typename T> class A {}; 169 template<> class A<double> {}; 170 A<int> a; 171classTemplateSpecializationDecl() 172 matches the specializations A<int> and A<double> 173</pre></td></tr> 174 175 176<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<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. 178 179Example matches Foo::Foo() and Foo::Foo(int) 180 class Foo { 181 public: 182 Foo(); 183 Foo(int); 184 int DoSomething(); 185 }; 186</pre></td></tr> 187 188 189<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<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations. 191 192Example matches the operator. 193 class X { operator int() const; }; 194</pre></td></tr> 195 196 197<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<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide. 199 200Example matches the deduction guide. 201 template<typename T> 202 class X { X(int) }; 203 X(int) -> X<int>; 204</pre></td></tr> 205 206 207<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<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations. 209 210Example matches Foo::~Foo() 211 class Foo { 212 public: 213 virtual ~Foo(); 214 }; 215</pre></td></tr> 216 217 218<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<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations. 220 221Example matches y 222 class X { void y(); }; 223</pre></td></tr> 224 225 226<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<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations. 228 229Example matches X, Z 230 class X; 231 template<class T> class Z {}; 232</pre></td></tr> 233 234 235<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<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 237 238Examples matches X, C, and the friend declaration inside C; 239 void X(); 240 class C { 241 friend X; 242 }; 243</pre></td></tr> 244 245 246<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<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 248and non-type template parameter declarations). 249 250Given 251 class X { int y; }; 252declaratorDecl() 253 matches int y. 254</pre></td></tr> 255 256 257<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<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 259 260Example matches A, B, C 261 enum X { 262 A, B, C 263 }; 264</pre></td></tr> 265 266 267<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<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 269 270Example matches X 271 enum X { 272 A, B, C 273 }; 274</pre></td></tr> 275 276 277<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<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 279 280Given 281 class X { int m; }; 282fieldDecl() 283 matches 'm'. 284</pre></td></tr> 285 286 287<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<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 289 290Given 291 class X { friend void foo(); }; 292friendDecl() 293 matches 'friend void foo()'. 294</pre></td></tr> 295 296 297<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<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 299 300Example matches f 301 void f(); 302</pre></td></tr> 303 304 305<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<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 307 308Example matches f 309 template<class T> void f(T t) {} 310</pre></td></tr> 311 312 313<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<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations. 315 316Given 317 struct X { struct { int a; }; }; 318indirectFieldDecl() 319 matches 'a'. 320</pre></td></tr> 321 322 323<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<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label. 325 326Given 327 goto FOO; 328 FOO: bar(); 329labelDecl() 330 matches 'FOO:' 331</pre></td></tr> 332 333 334<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<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification. 336 337Given 338 extern "C" {} 339linkageSpecDecl() 340 matches "extern "C" {}" 341</pre></td></tr> 342 343 344<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<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 346 347Example matches X, S, the anonymous union type, i, and U; 348 typedef int X; 349 struct S { 350 union { 351 int i; 352 } U; 353 }; 354</pre></td></tr> 355 356 357<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<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias. 359 360Given 361 namespace test {} 362 namespace alias = ::test; 363namespaceAliasDecl() 364 matches "namespace alias" but not "namespace test" 365</pre></td></tr> 366 367 368<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<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 370 371Given 372 namespace {} 373 namespace test {} 374namespaceDecl() 375 matches "namespace {}" and "namespace test {}" 376</pre></td></tr> 377 378 379<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<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations. 381 382Given 383 template <typename T, int N> struct C {}; 384nonTypeTemplateParmDecl() 385 matches 'N', but not 'T'. 386</pre></td></tr> 387 388 389<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<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations. 391 392Example matches Foo (Additions) 393 @interface Foo (Additions) 394 @end 395</pre></td></tr> 396 397 398<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<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions. 400 401Example matches Foo (Additions) 402 @implementation Foo (Additions) 403 @end 404</pre></td></tr> 405 406 407<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<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations. 409 410Example matches Foo 411 @implementation Foo 412 @end 413</pre></td></tr> 414 415 416<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<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 418 419Example matches Foo 420 @interface Foo 421 @end 422</pre></td></tr> 423 424 425<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<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations. 427 428Example matches _enabled 429 @implementation Foo { 430 BOOL _enabled; 431 } 432 @end 433</pre></td></tr> 434 435 436<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<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations. 438 439Example matches both declaration and definition of -[Foo method] 440 @interface Foo 441 - (void)method; 442 @end 443 444 @implementation Foo 445 - (void)method {} 446 @end 447</pre></td></tr> 448 449 450<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<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations. 452 453Example matches enabled 454 @interface Foo 455 @property BOOL enabled; 456 @end 457</pre></td></tr> 458 459 460<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<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations. 462 463Example matches FooDelegate 464 @protocol FooDelegate 465 @end 466</pre></td></tr> 467 468 469<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<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 471 472Given 473 void f(int x); 474parmVarDecl() 475 matches int x. 476</pre></td></tr> 477 478 479<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<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 481 482Example matches X, Z, U, and S 483 class X; 484 template<class T> class Z {}; 485 struct S {}; 486 union U {}; 487</pre></td></tr> 488 489 490<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<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 492 493Example: 494 staticAssertExpr() 495matches 496 static_assert(sizeof(S) == sizeof(int)) 497in 498 struct S { 499 int x; 500 }; 501 static_assert(sizeof(S) == sizeof(int)); 502</pre></td></tr> 503 504 505<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>...</td></tr> 506<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations. 507 508Example matches X, Z, U, S, E 509 class X; 510 template<class T> class Z {}; 511 struct S {}; 512 union U {}; 513 enum E { 514 A, B, C 515 }; 516</pre></td></tr> 517 518 519<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> 520<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 521 522Given 523 template <typename T, int N> struct C {}; 524templateTypeParmDecl() 525 matches 'T', but not 'N'. 526</pre></td></tr> 527 528 529<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> 530<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 531 532Given 533 int X; 534 namespace NS { 535 int Y; 536 } // namespace NS 537decl(hasDeclContext(translationUnitDecl())) 538 matches "int X", but not "int Y". 539</pre></td></tr> 540 541 542<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> 543<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations. 544 545Given 546 typedef int X; 547 using Y = int; 548typeAliasDecl() 549 matches "using Y = int", but not "typedef int X" 550</pre></td></tr> 551 552 553<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> 554<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations. 555 556typeAliasTemplateDecl() matches 557 template <typename T> 558 using Y = X<T>; 559</pre></td></tr> 560 561 562<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> 563<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 564 565Given 566 typedef int X; 567 using Y = int; 568typedefDecl() 569 matches "typedef int X", but not "using Y = int" 570</pre></td></tr> 571 572 573<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> 574<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations. 575 576Given 577 typedef int X; 578 using Y = int; 579typedefNameDecl() 580 matches "typedef int X" and "using Y = int" 581</pre></td></tr> 582 583 584<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> 585<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 586typename. 587 588Given 589 template <typename T> 590 struct Base { typedef T Foo; }; 591 592 template<typename T> 593 struct S : private Base<T> { 594 using typename Base<T>::Foo; 595 }; 596unresolvedUsingTypenameDecl() 597 matches using Base<T>::Foo </pre></td></tr> 598 599 600<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> 601<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 602 603Given 604 template<typename X> 605 class C : private X { 606 using X::x; 607 }; 608unresolvedUsingValueDecl() 609 matches using X::x </pre></td></tr> 610 611 612<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> 613<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 614 615Given 616 namespace X { int x; } 617 using X::x; 618usingDecl() 619 matches using X::x </pre></td></tr> 620 621 622<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> 623<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 624 625Given 626 namespace X { int x; } 627 using namespace X; 628usingDirectiveDecl() 629 matches using namespace X </pre></td></tr> 630 631 632<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> 633<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 634 635Example matches A, B, C and F 636 enum X { A, B, C }; 637 void F(); 638</pre></td></tr> 639 640 641<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> 642<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 643 644Note: this does not match declarations of member variables, which are 645"field" declarations in Clang parlance. 646 647Example matches a 648 int a; 649</pre></td></tr> 650 651 652<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> 653<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 654</pre></td></tr> 655 656 657<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> 658<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 659 660Given 661 namespace ns { 662 struct A { static void f(); }; 663 void A::f() {} 664 void g() { A::f(); } 665 } 666 ns::A a; 667nestedNameSpecifier() 668 matches "ns::" and both "A::" 669</pre></td></tr> 670 671 672<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> 673<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause. 674 675Given 676 677 #pragma omp parallel default(none) 678 #pragma omp parallel default(shared) 679 #pragma omp parallel 680 681``ompDefaultClause()`` matches ``default(none)`` and ``default(shared)``. 682</pre></td></tr> 683 684 685<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> 686<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 687</pre></td></tr> 688 689 690<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> 691<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension). 692 693Given 694 FOO: bar(); 695 void *ptr = &&FOO; 696 goto *bar; 697addrLabelExpr() 698 matches '&&FOO' 699</pre></td></tr> 700 701 702<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> 703<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 704 705Given 706 int i = a[1]; 707arraySubscriptExpr() 708 matches "a[1]" 709</pre></td></tr> 710 711 712<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> 713<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 714 715 int i = 100; 716 __asm("mov al, 2"); 717asmStmt() 718 matches '__asm("mov al, 2")' 719</pre></td></tr> 720 721 722<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> 723<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins. 724Example matches __atomic_load_n(ptr, 1) 725 void foo() { int *ptr; __atomic_load_n(ptr, 1); } 726</pre></td></tr> 727 728 729<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> 730<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement. 731 732Given 733 @autoreleasepool { 734 int x = 0; 735 } 736autoreleasePoolStmt(stmt()) matches the declaration of "x" 737inside the autorelease pool. 738</pre></td></tr> 739 740 741<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> 742<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension). 743 744Example matches a ?: b 745 (a ?: b) + 42; 746</pre></td></tr> 747 748 749<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> 750<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 751 752Example matches a || b 753 !(a || b) 754</pre></td></tr> 755 756 757<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> 758<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block. 759 760Example: matches "^{}": 761 void f() { ^{}(); } 762</pre></td></tr> 763 764 765<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> 766<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 767 768Given 769 while (true) { break; } 770breakStmt() 771 matches 'break' 772</pre></td></tr> 773 774 775<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> 776<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 777 778Example: Matches (int) 2.2f in 779 int i = (int) 2.2f; 780</pre></td></tr> 781 782 783<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> 784<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 785 786Example matches x.y() and y() 787 X x; 788 x.y(); 789 y(); 790</pre></td></tr> 791 792 793<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> 794<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 795 796Given 797 switch(a) { case 42: break; default: break; } 798caseStmt() 799 matches 'case 42:'. 800</pre></td></tr> 801 802 803<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> 804<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 805 806Example: castExpr() matches each of the following: 807 (int) 3; 808 const_cast<Expr *>(SubExpr); 809 char c = 0; 810but does not match 811 int i = (0); 812 int k = 0; 813</pre></td></tr> 814 815 816<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> 817<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 818 819Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 820though. 821 822Example matches 'a', L'a' 823 char ch = 'a'; 824 wchar_t chw = L'a'; 825</pre></td></tr> 826 827 828<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> 829<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr. 830</pre></td></tr> 831 832 833<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> 834<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 835 836Example match: {1}, (1, 2) 837 int array[4] = {1}; 838 vector int myvec = (vector int)(1, 2); 839</pre></td></tr> 840 841 842<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> 843<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 844 845Example matches '{}' and '{{}}' in 'for (;;) {{}}' 846 for (;;) {{}} 847</pre></td></tr> 848 849 850<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> 851<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 852 853Example matches a ? b : c 854 (a ? b : c) + 42 855</pre></td></tr> 856 857 858<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> 859<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper. 860 861Example matches the constant in the case statement: 862 (matcher = constantExpr()) 863 switch (a) { 864 case 37: break; 865 } 866</pre></td></tr> 867 868 869<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> 870<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 871 872Given 873 while (true) { continue; } 874continueStmt() 875 matches 'continue' 876</pre></td></tr> 877 878 879<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> 880<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 881 882Example matches, 883 kernel<<<i,j>>>(); 884</pre></td></tr> 885 886 887<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> 888<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 889 890Example matches FunctionTakesString(GetStringByValue()) 891 (matcher = cxxBindTemporaryExpr()) 892 FunctionTakesString(GetStringByValue()); 893 FunctionTakesStringByPointer(GetStringPointer()); 894</pre></td></tr> 895 896 897<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> 898<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 899 900Example matches true 901 true 902</pre></td></tr> 903 904 905<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> 906<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 907 908 try {} catch(int i) {} 909cxxCatchStmt() 910 matches 'catch(int i)' 911</pre></td></tr> 912 913 914<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> 915<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 916 917Example: Matches const_cast<int*>(&r) in 918 int n = 42; 919 const int &r(n); 920 int* p = const_cast<int*>(&r); 921</pre></td></tr> 922 923 924<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> 925<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 926 927Example matches string(ptr, n) and ptr within arguments of f 928 (matcher = cxxConstructExpr()) 929 void f(const string &a, const string &b); 930 char *ptr; 931 int n; 932 f(string(ptr, n), ptr); 933</pre></td></tr> 934 935 936<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> 937<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 938 939Example matches the CXXDefaultArgExpr placeholder inserted for the 940 default value of the second parameter in the call expression f(42) 941 (matcher = cxxDefaultArgExpr()) 942 void f(int x, int y = 0); 943 f(42); 944</pre></td></tr> 945 946 947<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> 948<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 949 950Given 951 delete X; 952cxxDeleteExpr() 953 matches 'delete X'. 954</pre></td></tr> 955 956 957<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> 958<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be 959resolved because the base expression or the member name was dependent. 960 961Given 962 template <class T> void f() { T t; t.g(); } 963cxxDependentScopeMemberExpr() 964 matches t.g 965</pre></td></tr> 966 967 968<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> 969<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 970 971Example: 972 cxxDynamicCastExpr() 973matches 974 dynamic_cast<D*>(&b); 975in 976 struct B { virtual ~B() {} }; struct D : B {}; 977 B b; 978 D* p = dynamic_cast<D*>(&b); 979</pre></td></tr> 980 981 982<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> 983<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 984 985cxxForRangeStmt() matches 'for (auto a : i)' 986 int i[] = {1, 2, 3}; for (auto a : i); 987 for(int j = 0; j < 5; ++j); 988</pre></td></tr> 989 990 991<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> 992<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 993 994Example: Matches Foo(bar); 995 Foo f = bar; 996 Foo g = (Foo) bar; 997 Foo h = Foo(bar); 998</pre></td></tr> 999 1000 1001<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> 1002<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 1003 1004Example matches x.y() 1005 X x; 1006 x.y(); 1007</pre></td></tr> 1008 1009 1010<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> 1011<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 1012 1013Given 1014 new X; 1015cxxNewExpr() 1016 matches 'new X'. 1017</pre></td></tr> 1018 1019 1020<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>>...</td></tr> 1021<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions. 1022 1023Given 1024 bool a() noexcept; 1025 bool b() noexcept(true); 1026 bool c() noexcept(false); 1027 bool d() noexcept(noexcept(a())); 1028 bool e = noexcept(b()) || noexcept(c()); 1029cxxNoexceptExpr() 1030 matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`. 1031 doesn't match the noexcept specifier in the declarations a, b, c or d. 1032</pre></td></tr> 1033 1034 1035<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> 1036<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 1037</pre></td></tr> 1038 1039 1040<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> 1041<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 1042 1043Note that if an operator isn't overloaded, it won't match. Instead, use 1044binaryOperator matcher. 1045Currently it does not match operators such as new delete. 1046FIXME: figure out why these do not match? 1047 1048Example matches both operator<<((o << b), c) and operator<<(o, b) 1049 (matcher = cxxOperatorCallExpr()) 1050 ostream &operator<< (ostream &out, int i) { }; 1051 ostream &o; int b = 1, c = 1; 1052 o << b << c; 1053</pre></td></tr> 1054 1055 1056<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> 1057<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 1058 1059Either the source expression or the destination type can be matched 1060using has(), but hasDestinationType() is more specific and can be 1061more readable. 1062 1063Example matches reinterpret_cast<char*>(&p) in 1064 void* p = reinterpret_cast<char*>(&p); 1065</pre></td></tr> 1066 1067 1068<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> 1069<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 1070 1071See also: hasDestinationType 1072See also: reinterpretCast 1073 1074Example: 1075 cxxStaticCastExpr() 1076matches 1077 static_cast<long>(8) 1078in 1079 long eight(static_cast<long>(8)); 1080</pre></td></tr> 1081 1082 1083<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> 1084<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions. 1085 1086Given 1087 std::vector<int> a({ 1, 2, 3 }); 1088 std::vector<int> b = { 4, 5 }; 1089 int c[] = { 6, 7 }; 1090 std::pair<int, int> d = { 8, 9 }; 1091cxxStdInitializerListExpr() 1092 matches "{ 1, 2, 3 }" and "{ 4, 5 }" 1093</pre></td></tr> 1094 1095 1096<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> 1097<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 1098 1099Example: Matches Foo(bar, bar) 1100 Foo h = Foo(bar, bar); 1101</pre></td></tr> 1102 1103 1104<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> 1105<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 1106 1107Example matches the implicit this expression in "return i". 1108 (matcher = cxxThisExpr()) 1109struct foo { 1110 int i; 1111 int f() { return i; } 1112}; 1113</pre></td></tr> 1114 1115 1116<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> 1117<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 1118 1119 try { throw 5; } catch(int i) {} 1120cxxThrowExpr() 1121 matches 'throw 5' 1122</pre></td></tr> 1123 1124 1125<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> 1126<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 1127 1128 try {} catch(int i) {} 1129cxxTryStmt() 1130 matches 'try {}' 1131</pre></td></tr> 1132 1133 1134<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> 1135<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 1136 1137Example matches T(t) in return statement of f 1138 (matcher = cxxUnresolvedConstructExpr()) 1139 template <typename T> 1140 void f(const T& t) { return T(t); } 1141</pre></td></tr> 1142 1143 1144<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> 1145<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 1146 1147Example matches x in if (x) 1148 bool x; 1149 if (x) {} 1150</pre></td></tr> 1151 1152 1153<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> 1154<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 1155 1156Given 1157 int a; 1158declStmt() 1159 matches 'int a'. 1160</pre></td></tr> 1161 1162 1163<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> 1164<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 1165 1166Given 1167 switch(a) { case 42: break; default: break; } 1168defaultStmt() 1169 matches 'default:'. 1170</pre></td></tr> 1171 1172 1173<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> 1174<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8]. 1175 1176Example: Matches { [2].y = 1.0, [0].x = 1.0 } 1177 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 1178</pre></td></tr> 1179 1180 1181<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> 1182<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 1183 1184Given 1185 do {} while (true); 1186doStmt() 1187 matches 'do {} while(true)' 1188</pre></td></tr> 1189 1190 1191<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> 1192<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 1193 1194Matches any cast expression written in user code, whether it be a 1195C-style cast, a functional-style cast, or a keyword cast. 1196 1197Does not match implicit conversions. 1198 1199Note: the name "explicitCast" is chosen to match Clang's terminology, as 1200Clang uses the term "cast" to apply to implicit conversions as well as to 1201actual cast expressions. 1202 1203See also: hasDestinationType. 1204 1205Example: matches all five of the casts in 1206 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 1207but does not match the implicit conversion in 1208 long ell = 42; 1209</pre></td></tr> 1210 1211 1212<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> 1213<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 1214 1215Example matches x() 1216 void f() { x(); } 1217</pre></td></tr> 1218 1219 1220<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> 1221<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 1222of the sub-expression's evaluation. 1223 1224Example matches std::string() 1225 const std::string str = std::string(); 1226</pre></td></tr> 1227 1228 1229<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('fixedPointLiteral0')"><a name="fixedPointLiteral0Anchor">fixedPointLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FixedPointLiteral.html">FixedPointLiteral</a>>...</td></tr> 1230<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals 1231</pre></td></tr> 1232 1233 1234<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> 1235<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g. 12361.0, 1.0f, 1.0L and 1e10. 1237 1238Does not match implicit conversions such as 1239 float a = 10; 1240</pre></td></tr> 1241 1242 1243<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> 1244<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 1245 1246Example matches 'for (;;) {}' 1247 for (;;) {} 1248 int i[] = {1, 2, 3}; for (auto a : i); 1249</pre></td></tr> 1250 1251 1252<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> 1253<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 1254</pre></td></tr> 1255 1256 1257<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> 1258<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 1259 1260Given 1261 goto FOO; 1262 FOO: bar(); 1263gotoStmt() 1264 matches 'goto FOO' 1265</pre></td></tr> 1266 1267 1268<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> 1269<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 1270 1271Example matches 'if (x) {}' 1272 if (x) {} 1273</pre></td></tr> 1274 1275 1276<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> 1277<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating 1278point literals e.g.: 1i, 1.0i 1279</pre></td></tr> 1280 1281 1282<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> 1283<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 1284 1285This matches many different places, including function call return value 1286eliding, as well as any type conversions. 1287</pre></td></tr> 1288 1289 1290<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> 1291<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions. 1292 1293Given 1294 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 1295implicitValueInitExpr() 1296 matches "[0].y" (implicitly) 1297</pre></td></tr> 1298 1299 1300<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> 1301<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 1302 1303Given 1304 int a[] = { 1, 2 }; 1305 struct B { int x, y; }; 1306 B b = { 5, 6 }; 1307initListExpr() 1308 matches "{ 1, 2 }" and "{ 5, 6 }" 1309</pre></td></tr> 1310 1311 1312<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> 1313<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g. 13141, 1L, 0x1 and 1U. 1315 1316Does not match character-encoded integers such as L'a'. 1317</pre></td></tr> 1318 1319 1320<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> 1321<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 1322 1323Given 1324 goto FOO; 1325 FOO: bar(); 1326labelStmt() 1327 matches 'FOO:' 1328</pre></td></tr> 1329 1330 1331<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> 1332<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1333 1334Example matches [&](){return 5;} 1335 [&](){return 5;} 1336</pre></td></tr> 1337 1338 1339<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> 1340<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1341 1342Example: Given 1343 struct T {void func();}; 1344 T f(); 1345 void g(T); 1346materializeTemporaryExpr() matches 'f()' in these statements 1347 T u(f()); 1348 g(f()); 1349 f().func(); 1350but does not match 1351 f(); 1352</pre></td></tr> 1353 1354 1355<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> 1356<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1357 1358Given 1359 class Y { 1360 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1361 int a; static int b; 1362 }; 1363memberExpr() 1364 matches this->x, x, y.x, a, this->b 1365</pre></td></tr> 1366 1367 1368<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> 1369<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1370 1371 foo();; 1372nullStmt() 1373 matches the second ';' 1374</pre></td></tr> 1375 1376 1377<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> 1378<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements. 1379 1380Example matches @catch 1381 @try {} 1382 @catch (...) {} 1383</pre></td></tr> 1384 1385 1386<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> 1387<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements. 1388 1389Example matches @finally 1390 @try {} 1391 @finally {} 1392</pre></td></tr> 1393 1394 1395<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> 1396<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar. 1397 1398Example: matches "a" in "init" method: 1399@implementation A { 1400 NSString *a; 1401} 1402- (void) init { 1403 a = @"hello"; 1404} 1405</pre></td></tr> 1406 1407 1408<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> 1409<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 1410 1411The innermost message send invokes the "alloc" class method on the 1412NSString class, while the outermost message send invokes the 1413"initWithString" instance method on the object returned from 1414NSString's "alloc". This matcher should match both message sends. 1415 [[NSString alloc] initWithString:@"Hello"] 1416</pre></td></tr> 1417 1418 1419<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> 1420<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements. 1421 1422Example matches @throw obj; 1423</pre></td></tr> 1424 1425 1426<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> 1427<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements. 1428 1429Example matches @try 1430 @try {} 1431 @catch (...) {} 1432</pre></td></tr> 1433 1434 1435<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> 1436<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive. 1437 1438Given 1439 1440 #pragma omp parallel 1441 #pragma omp parallel default(none) 1442 #pragma omp taskyield 1443 1444``ompExecutableDirective()`` matches ``omp parallel``, 1445``omp parallel default(none)`` and ``omp taskyield``. 1446</pre></td></tr> 1447 1448 1449<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> 1450<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers 1451to reference another expressions and can be met 1452in BinaryConditionalOperators, for example. 1453 1454Example matches 'a' 1455 (a ?: c) + 42; 1456</pre></td></tr> 1457 1458 1459<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> 1460<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions. 1461 1462Example matches (foo() + 1) 1463 int foo() { return 1; } 1464 int a = (foo() + 1); 1465</pre></td></tr> 1466 1467 1468<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> 1469<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions. 1470ParenListExprs don't have a predefined type and are used for late parsing. 1471In the final AST, they can be met in template declarations. 1472 1473Given 1474 template<typename T> class X { 1475 void f() { 1476 X x(*this); 1477 int a = 0, b = 1; int i = (a, b); 1478 } 1479 }; 1480parenListExpr() matches "*this" but NOT matches (a, b) because (a, b) 1481has a predefined type and is a ParenExpr, not a ParenListExpr. 1482</pre></td></tr> 1483 1484 1485<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> 1486<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2]. 1487 1488Example: Matches __func__ 1489 printf("%s", __func__); 1490</pre></td></tr> 1491 1492 1493<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> 1494<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 1495 1496Given 1497 return 1; 1498returnStmt() 1499 matches 'return 1' 1500</pre></td></tr> 1501 1502 1503<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> 1504<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 1505 1506Given 1507 { ++a; } 1508stmt() 1509 matches both the compound statement '{ ++a; }' and '++a'. 1510</pre></td></tr> 1511 1512 1513<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> 1514<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension). 1515 1516Example match: ({ int X = 4; X; }) 1517 int C = ({ int X = 4; X; }); 1518</pre></td></tr> 1519 1520 1521<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> 1522<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 1523 1524Example matches "abcd", L"abcd" 1525 char *s = "abcd"; 1526 wchar_t *ws = L"abcd"; 1527</pre></td></tr> 1528 1529 1530<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> 1531<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 1532 1533Given 1534 template <int N> 1535 struct A { static const int n = N; }; 1536 struct B : public A<42> {}; 1537substNonTypeTemplateParmExpr() 1538 matches "N" in the right-hand side of "static const int n = N;" 1539</pre></td></tr> 1540 1541 1542<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> 1543<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 1544 1545Given 1546 switch(a) { case 42: break; default: break; } 1547switchCase() 1548 matches 'case 42:' and 'default:'. 1549</pre></td></tr> 1550 1551 1552<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> 1553<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 1554 1555Given 1556 switch(a) { case 42: break; default: break; } 1557switchStmt() 1558 matches 'switch(a)'. 1559</pre></td></tr> 1560 1561 1562<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> 1563<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 1564 1565Given 1566 Foo x = bar; 1567 int y = sizeof(x) + alignof(x); 1568unaryExprOrTypeTraitExpr() 1569 matches sizeof(x) and alignof(x) 1570</pre></td></tr> 1571 1572 1573<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> 1574<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 1575 1576Example matches !a 1577 !a || b 1578</pre></td></tr> 1579 1580 1581<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> 1582<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing 1583but could not be resolved to a specific declaration. 1584 1585Given 1586 template<typename T> 1587 T foo() { T a; return a; } 1588 template<typename T> 1589 void bar() { 1590 foo<T>(); 1591 } 1592unresolvedLookupExpr() 1593 matches foo<T>() </pre></td></tr> 1594 1595 1596<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> 1597<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions. 1598 1599Given 1600 struct X { 1601 template <class T> void f(); 1602 void g(); 1603 }; 1604 template <class T> void h() { X x; x.f<T>(); x.g(); } 1605unresolvedMemberExpr() 1606 matches x.f<T> 1607</pre></td></tr> 1608 1609 1610<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> 1611<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 1612 1613Example match: "foo"_suffix 1614</pre></td></tr> 1615 1616 1617<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> 1618<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 1619 1620Given 1621 while (true) {} 1622whileStmt() 1623 matches 'while (true) {}'. 1624</pre></td></tr> 1625 1626 1627<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> 1628<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 1629 1630Given 1631 template <typename T> struct C {}; 1632 C<int> c; 1633templateArgument() 1634 matches 'int' in C<int>. 1635</pre></td></tr> 1636 1637 1638<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> 1639<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name. 1640 1641Given 1642 template <typename T> class X { }; 1643 X<int> xi; 1644templateName() 1645 matches 'X' in X<int>. 1646</pre></td></tr> 1647 1648 1649<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> 1650<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 1651</pre></td></tr> 1652 1653 1654<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> 1655<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 1656 1657Given 1658 int a[] = { 2, 3 }; 1659 int b[4]; 1660 void f() { int c[a[0]]; } 1661arrayType() 1662 matches "int a[]", "int b[4]" and "int c[a[0]]"; 1663</pre></td></tr> 1664 1665 1666<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> 1667<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 1668 1669Given 1670 _Atomic(int) i; 1671atomicType() 1672 matches "_Atomic(int) i" 1673</pre></td></tr> 1674 1675 1676<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> 1677<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 1678 1679Given: 1680 auto n = 4; 1681 int v[] = { 2, 3 } 1682 for (auto i : v) { } 1683autoType() 1684 matches "auto n" and "auto i" 1685</pre></td></tr> 1686 1687 1688<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> 1689<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 1690"void (^)(int)". 1691 1692The pointee is always required to be a FunctionType. 1693</pre></td></tr> 1694 1695 1696<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> 1697<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 1698 1699Given 1700 struct A {}; 1701 A a; 1702 int b; 1703 float c; 1704 bool d; 1705builtinType() 1706 matches "int b", "float c" and "bool d" 1707</pre></td></tr> 1708 1709 1710<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> 1711<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 1712 1713Given 1714 _Complex float f; 1715complexType() 1716 matches "_Complex float f" 1717</pre></td></tr> 1718 1719 1720<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> 1721<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 1722 1723Given 1724 void() { 1725 int a[2]; 1726 int b[] = { 2, 3 }; 1727 int c[b[0]]; 1728 } 1729constantArrayType() 1730 matches "int a[2]" 1731</pre></td></tr> 1732 1733 1734<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> 1735<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 1736Example matches i[] in declaration of f. 1737 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 1738Example matches i[1]. 1739 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 1740 void f(int i[]) { 1741 i[1] = 0; 1742 } 1743</pre></td></tr> 1744 1745 1746<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> 1747<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(<expr>) types. 1748 1749Given: 1750 short i = 1; 1751 int j = 42; 1752 decltype(i + j) result = i + j; 1753decltypeType() 1754 matches "decltype(i + j)" 1755</pre></td></tr> 1756 1757 1758<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>>...</td></tr> 1759<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class 1760template types. 1761 1762Given 1763 template <typename T> 1764 class C { public: C(T); }; 1765 1766 C c(123); 1767deducedTemplateSpecializationType() matches the type in the declaration 1768of the variable c. 1769</pre></td></tr> 1770 1771 1772<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> 1773<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 1774 1775Given 1776 template<typename T, int Size> 1777 class array { 1778 T data[Size]; 1779 }; 1780dependentSizedArrayType 1781 matches "T data[Size]" 1782</pre></td></tr> 1783 1784 1785<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> 1786<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 1787qualified name. 1788 1789Given 1790 namespace N { 1791 namespace M { 1792 class D {}; 1793 } 1794 } 1795 class C {}; 1796 1797 class C c; 1798 N::M::D d; 1799 1800elaboratedType() matches the type of the variable declarations of both 1801c and d. 1802</pre></td></tr> 1803 1804 1805<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> 1806<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types. 1807 1808Given 1809 enum C { Green }; 1810 enum class S { Red }; 1811 1812 C c; 1813 S s; 1814 1815enumType() matches the type of the variable declarations of both c and 1816s. 1817</pre></td></tr> 1818 1819 1820<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> 1821<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes. 1822 1823Given 1824 int (*f)(int); 1825 void g(); 1826functionProtoType() 1827 matches "int (*f)(int)" and the type of "g" in C++ mode. 1828 In C mode, "g" is not matched because it does not contain a prototype. 1829</pre></td></tr> 1830 1831 1832<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> 1833<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 1834 1835Given 1836 int (*f)(int); 1837 void g(); 1838functionType() 1839 matches "int (*f)(int)" and the type of "g". 1840</pre></td></tr> 1841 1842 1843<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> 1844<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 1845 1846Given 1847 int a[] = { 2, 3 }; 1848 int b[42]; 1849 void f(int c[]) { int d[a[0]]; }; 1850incompleteArrayType() 1851 matches "int a[]" and "int c[]" 1852</pre></td></tr> 1853 1854 1855<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> 1856<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 1857 1858Example matches S s, but not S<T> s. 1859 (matcher = parmVarDecl(hasType(injectedClassNameType()))) 1860 template <typename T> struct S { 1861 void f(S s); 1862 void g(S<T> s); 1863 }; 1864</pre></td></tr> 1865 1866 1867<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> 1868<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 1869 1870Given: 1871 int *a; 1872 int &b = *a; 1873 int &&c = 1; 1874 auto &d = b; 1875 auto &&e = c; 1876 auto &&f = 2; 1877 int g = 5; 1878 1879lValueReferenceType() matches the types of b, d, and e. e is 1880matched since the type is deduced as int& by reference collapsing rules. 1881</pre></td></tr> 1882 1883 1884<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> 1885<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 1886Given 1887 struct A { int i; } 1888 A::* ptr = A::i; 1889memberPointerType() 1890 matches "A::* ptr" 1891</pre></td></tr> 1892 1893 1894<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> 1895<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 1896a pointer type, despite being syntactically similar. 1897 1898Given 1899 int *a; 1900 1901 @interface Foo 1902 @end 1903 Foo *f; 1904pointerType() 1905 matches "Foo *f", but does not match "int *a". 1906</pre></td></tr> 1907 1908 1909<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> 1910<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 1911 1912Given 1913 int (*ptr_to_array)[4]; 1914 int *array_of_ptrs[4]; 1915 1916varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 1917array_of_ptrs. 1918</pre></td></tr> 1919 1920 1921<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> 1922<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 1923types. 1924 1925Given 1926 int *a; 1927 int &b = *a; 1928 int c = 5; 1929 1930 @interface Foo 1931 @end 1932 Foo *f; 1933pointerType() 1934 matches "int *a", but does not match "Foo *f". 1935</pre></td></tr> 1936 1937 1938<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> 1939<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 1940 1941Given: 1942 int *a; 1943 int &b = *a; 1944 int &&c = 1; 1945 auto &d = b; 1946 auto &&e = c; 1947 auto &&f = 2; 1948 int g = 5; 1949 1950rValueReferenceType() matches the types of c and f. e is not 1951matched as it is deduced to int& by reference collapsing rules. 1952</pre></td></tr> 1953 1954 1955<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> 1956<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 1957 1958Given 1959 class C {}; 1960 struct S {}; 1961 1962 C c; 1963 S s; 1964 1965recordType() matches the type of the variable declarations of both c 1966and s. 1967</pre></td></tr> 1968 1969 1970<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> 1971<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 1972 1973Given 1974 int *a; 1975 int &b = *a; 1976 int &&c = 1; 1977 auto &d = b; 1978 auto &&e = c; 1979 auto &&f = 2; 1980 int g = 5; 1981 1982referenceType() matches the types of b, c, d, e, and f. 1983</pre></td></tr> 1984 1985 1986<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> 1987<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 1988template type parameter. 1989 1990Given 1991 template <typename T> 1992 void F(T t) { 1993 int i = 1 + t; 1994 } 1995 1996substTemplateTypeParmType() matches the type of 't' but not '1' 1997</pre></td></tr> 1998 1999 2000<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> 2001<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types). 2002 2003Given 2004 enum E {}; 2005 class C {}; 2006 2007 E e; 2008 C c; 2009 2010tagType() matches the type of the variable declarations of both e 2011and c. 2012</pre></td></tr> 2013 2014 2015<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> 2016<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 2017 2018Given 2019 template <typename T> 2020 class C { }; 2021 2022 template class C<int>; // A 2023 C<char> var; // B 2024 2025templateSpecializationType() matches the type of the explicit 2026instantiation in A and the type of the variable declaration in B. 2027</pre></td></tr> 2028 2029 2030<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> 2031<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 2032 2033Example matches T, but not int. 2034 (matcher = templateTypeParmType()) 2035 template <typename T> void f(int i); 2036</pre></td></tr> 2037 2038 2039<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> 2040<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 2041</pre></td></tr> 2042 2043 2044<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> 2045<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 2046 2047Given 2048 typedef int X; 2049typedefType() 2050 matches "typedef int X" 2051</pre></td></tr> 2052 2053 2054<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> 2055<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 2056 2057Given: 2058 typedef __underlying_type(T) type; 2059unaryTransformType() 2060 matches "__underlying_type(T)" 2061</pre></td></tr> 2062 2063 2064<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> 2065<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 2066integer-constant-expression. 2067 2068Given 2069 void f() { 2070 int a[] = { 2, 3 } 2071 int b[42]; 2072 int c[a[0]]; 2073 } 2074variableArrayType() 2075 matches "int c[a[0]]" 2076</pre></td></tr> 2077 2078<!--END_DECL_MATCHERS --> 2079</table> 2080 2081<!-- ======================================================================= --> 2082<h2 id="narrowing-matchers">Narrowing Matchers</h2> 2083<!-- ======================================================================= --> 2084 2085<p>Narrowing matchers match certain attributes on the current node, thus 2086narrowing down the set of nodes of the current type to match on.</p> 2087 2088<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 2089which allow users to create more powerful match expressions.</p> 2090 2091<table> 2092<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 2093<!-- START_NARROWING_MATCHERS --> 2094 2095<tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2096<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 2097 2098Usable as: Any Matcher 2099</pre></td></tr> 2100 2101 2102<tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2103<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 2104 2105Usable as: Any Matcher 2106</pre></td></tr> 2107 2108 2109<tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 2110<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 2111 2112Useful when another matcher requires a child matcher, but there's no 2113additional constraint. This will often be used with an explicit conversion 2114to an internal::Matcher<> type such as TypeMatcher. 2115 2116Example: DeclarationMatcher(anything()) matches all declarations, e.g., 2117"int* p" and "void f()" in 2118 int* p; 2119 void f(); 2120 2121Usable as: Any Matcher 2122</pre></td></tr> 2123 2124 2125<tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 2126<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 2127 2128Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 2129 class X {}; 2130 class Y {}; 2131 2132Usable as: Any Matcher 2133</pre></td></tr> 2134 2135 2136<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName0')"><a name="hasAnyOperatorName0Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 2137<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the 2138specified names. 2139 2140 hasAnyOperatorName("+", "-") 2141 Is equivalent to 2142 anyOf(hasOperatorName("+"), hasOperatorName("-")) 2143</pre></td></tr> 2144 2145 2146<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> 2147<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 2148unary). 2149 2150Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 2151 !(a || b) 2152</pre></td></tr> 2153 2154 2155<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> 2156<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators. 2157 2158Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2159 if (a == b) 2160 a += b; 2161 2162Example 2: matches s1 = s2 2163 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2164 struct S { S& operator=(const S&); }; 2165 void x() { S s1, s2; s1 = s2; } 2166</pre></td></tr> 2167 2168 2169<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('isComparisonOperator0')"><a name="isComparisonOperator0Anchor">isComparisonOperator</a></td><td></td></tr> 2170<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators. 2171 2172Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 2173 if (a == b) 2174 a += b; 2175 2176Example 2: matches s1 < s2 2177 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 2178 struct S { bool operator<(const S& other); }; 2179 void x(S s1, S s2) { bool b1 = s1 < s2; } 2180</pre></td></tr> 2181 2182 2183<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isPrivate1')"><a name="isPrivate1Anchor">isPrivate</a></td><td></td></tr> 2184<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private 2185inheritance. 2186 2187Examples: 2188 class C { 2189 public: int a; 2190 protected: int b; 2191 private: int c; // fieldDecl(isPrivate()) matches 'c' 2192 }; 2193 2194 struct Base {}; 2195 struct Derived1 : private Base {}; // matches 'Base' 2196 class Derived2 : Base {}; // matches 'Base' 2197</pre></td></tr> 2198 2199 2200<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isProtected1')"><a name="isProtected1Anchor">isProtected</a></td><td></td></tr> 2201<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify 2202protected inheritance. 2203 2204Examples: 2205 class C { 2206 public: int a; 2207 protected: int b; // fieldDecl(isProtected()) matches 'b' 2208 private: int c; 2209 }; 2210 2211 class Base {}; 2212 class Derived : protected Base {}; // matches 'Base' 2213</pre></td></tr> 2214 2215 2216<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isPublic1')"><a name="isPublic1Anchor">isPublic</a></td><td></td></tr> 2217<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public 2218inheritance. 2219 2220Examples: 2221 class C { 2222 public: int a; // fieldDecl(isPublic()) matches 'a' 2223 protected: int b; 2224 private: int c; 2225 }; 2226 2227 class Base {}; 2228 class Derived1 : public Base {}; // matches 'Base' 2229 struct Derived2 : Base {}; // matches 'Base' 2230</pre></td></tr> 2231 2232 2233<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isVirtual1')"><a name="isVirtual1Anchor">isVirtual</a></td><td></td></tr> 2234<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify 2235virtual inheritance. 2236 2237Example: 2238 class A { 2239 public: 2240 virtual void x(); // matches x 2241 }; 2242 2243Example: 2244 class Base {}; 2245 class DirectlyDerived : virtual Base {}; // matches Base 2246 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 2247 2248Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 2249</pre></td></tr> 2250 2251 2252<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> 2253<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr> 2254 2255 2256<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> 2257<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT. 2258 2259Given 2260 f('false, 3.14, 42); 2261characterLiteral(equals(0)) 2262 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2263 match false 2264floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2265 match 3.14 2266integerLiteral(equals(42)) 2267 matches 42 2268 2269Note that you cannot directly match a negative numeric literal because the 2270minus sign is not part of the literal: It is a unary operator whose operand 2271is the positive numeric literal. Instead, you must use a unaryOperator() 2272matcher to match the minus sign: 2273 2274unaryOperator(hasOperatorName("-"), 2275 hasUnaryOperand(integerLiteral(equals(13)))) 2276 2277Usable 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>>, 2278 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>> 2279</pre></td></tr> 2280 2281 2282<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> 2283<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr> 2284 2285 2286<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> 2287<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr> 2288 2289 2290<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> 2291<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 2292 2293Given 2294 try { 2295 // ... 2296 } catch (int) { 2297 // ... 2298 } catch (...) { 2299 // ... 2300 } 2301cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 2302</pre></td></tr> 2303 2304 2305<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> 2306<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 2307a specific number of arguments (including absent default arguments). 2308 2309Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2310 void f(int x, int y); 2311 f(0, 0); 2312</pre></td></tr> 2313 2314 2315<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> 2316<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 2317</pre></td></tr> 2318 2319 2320<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> 2321<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 2322zero initialization. 2323 2324Given 2325void foo() { 2326 struct point { double x; double y; }; 2327 point pt[2] = { { 1.0, 2.0 } }; 2328} 2329initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 2330will match the implicit array filler for pt[1]. 2331</pre></td></tr> 2332 2333 2334<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> 2335<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 2336 2337Given 2338 struct S { 2339 S(); // #1 2340 S(const S &); // #2 2341 S(S &&); // #3 2342 }; 2343cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 2344</pre></td></tr> 2345 2346 2347<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> 2348<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 2349 2350Given 2351 struct S { 2352 S(); // #1 2353 S(const S &); // #2 2354 S(S &&); // #3 2355 }; 2356cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 2357</pre></td></tr> 2358 2359 2360<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> 2361<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 2362 2363Given 2364 struct S { 2365 S(); // #1 2366 S(int) {} // #2 2367 S(S &&) : S() {} // #3 2368 }; 2369 S::S() : S(0) {} // #4 2370cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 2371#1 or #2. 2372</pre></td></tr> 2373 2374 2375<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> 2376<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations 2377that have an explicit specifier if this explicit specifier is resolved to 2378true. 2379 2380Given 2381 template<bool b> 2382 struct S { 2383 S(int); // #1 2384 explicit S(double); // #2 2385 operator int(); // #3 2386 explicit operator bool(); // #4 2387 explicit(false) S(bool) // # 7 2388 explicit(true) S(char) // # 8 2389 explicit(b) S(S) // # 9 2390 }; 2391 S(int) -> S<true> // #5 2392 explicit S(double) -> S<false> // #6 2393cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2394cxxConversionDecl(isExplicit()) will match #4, but not #3. 2395cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2396</pre></td></tr> 2397 2398 2399<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> 2400<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 2401 2402Given 2403 struct S { 2404 S(); // #1 2405 S(const S &); // #2 2406 S(S &&); // #3 2407 }; 2408cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 2409</pre></td></tr> 2410 2411 2412<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> 2413<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations 2414that have an explicit specifier if this explicit specifier is resolved to 2415true. 2416 2417Given 2418 template<bool b> 2419 struct S { 2420 S(int); // #1 2421 explicit S(double); // #2 2422 operator int(); // #3 2423 explicit operator bool(); // #4 2424 explicit(false) S(bool) // # 7 2425 explicit(true) S(char) // # 8 2426 explicit(b) S(S) // # 9 2427 }; 2428 S(int) -> S<true> // #5 2429 explicit S(double) -> S<false> // #6 2430cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2431cxxConversionDecl(isExplicit()) will match #4, but not #3. 2432cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2433</pre></td></tr> 2434 2435 2436<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> 2437<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 2438opposed to a member. 2439 2440Given 2441 struct B {}; 2442 struct D : B { 2443 int I; 2444 D(int i) : I(i) {} 2445 }; 2446 struct E : B { 2447 E() : B() {} 2448 }; 2449cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 2450 will match E(), but not match D(int). 2451</pre></td></tr> 2452 2453 2454<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> 2455<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 2456opposed to a base. 2457 2458Given 2459 struct B {}; 2460 struct D : B { 2461 int I; 2462 D(int i) : I(i) {} 2463 }; 2464 struct E : B { 2465 E() : B() {} 2466 }; 2467cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 2468 will match D(int), but not match E(). 2469</pre></td></tr> 2470 2471 2472<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> 2473<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 2474code (as opposed to implicitly added by the compiler). 2475 2476Given 2477 struct Foo { 2478 Foo() { } 2479 Foo(int) : foo_("A") { } 2480 string foo_; 2481 }; 2482cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 2483 will match Foo(int), but not Foo() 2484</pre></td></tr> 2485 2486 2487<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> 2488<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations 2489that have an explicit specifier if this explicit specifier is resolved to 2490true. 2491 2492Given 2493 template<bool b> 2494 struct S { 2495 S(int); // #1 2496 explicit S(double); // #2 2497 operator int(); // #3 2498 explicit operator bool(); // #4 2499 explicit(false) S(bool) // # 7 2500 explicit(true) S(char) // # 8 2501 explicit(b) S(S) // # 9 2502 }; 2503 S(int) -> S<true> // #5 2504 explicit S(double) -> S<false> // #6 2505cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2506cxxConversionDecl(isExplicit()) will match #4, but not #3. 2507cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2508</pre></td></tr> 2509 2510 2511<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> 2512<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed 2513to '.'. 2514 2515Member calls on the implicit this pointer match as called with '->'. 2516 2517Given 2518 class Y { 2519 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 2520 template <class T> void f() { this->f<T>(); f<T>(); } 2521 int a; 2522 static int b; 2523 }; 2524 template <class T> 2525 class Z { 2526 void x() { this->m; } 2527 }; 2528memberExpr(isArrow()) 2529 matches this->x, x, y.x, a, this->b 2530cxxDependentScopeMemberExpr(isArrow()) 2531 matches this->m 2532unresolvedMemberExpr(isArrow()) 2533 matches this->f<T>, f<T> 2534</pre></td></tr> 2535 2536 2537<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> 2538<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 2539 2540Given 2541struct A { 2542 void foo() const; 2543 void bar(); 2544}; 2545 2546cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 2547</pre></td></tr> 2548 2549 2550<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> 2551<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 2552operator. 2553 2554Given 2555struct A { 2556 A &operator=(const A &); 2557 A &operator=(A &&); 2558}; 2559 2560cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 2561the second one. 2562</pre></td></tr> 2563 2564 2565<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> 2566<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 2567 2568Given: 2569 class A final {}; 2570 2571 struct B { 2572 virtual void f(); 2573 }; 2574 2575 struct C : B { 2576 void f() final; 2577 }; 2578matches A and C::f, but not B, C, or B::f 2579</pre></td></tr> 2580 2581 2582<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> 2583<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 2584operator. 2585 2586Given 2587struct A { 2588 A &operator=(const A &); 2589 A &operator=(A &&); 2590}; 2591 2592cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 2593the first one. 2594</pre></td></tr> 2595 2596 2597<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> 2598<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 2599 2600Given 2601 class A { 2602 public: 2603 virtual void x(); 2604 }; 2605 class B : public A { 2606 public: 2607 virtual void x(); 2608 }; 2609 matches B::x 2610</pre></td></tr> 2611 2612 2613<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> 2614<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 2615 2616Given 2617 class A { 2618 public: 2619 virtual void x() = 0; 2620 }; 2621 matches A::x 2622</pre></td></tr> 2623 2624 2625<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> 2626<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 2627 2628Given 2629 struct S { 2630 S(); // #1 2631 S(const S &) = default; // #2 2632 S(S &&) = delete; // #3 2633 }; 2634cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 2635</pre></td></tr> 2636 2637 2638<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> 2639<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify 2640virtual inheritance. 2641 2642Example: 2643 class A { 2644 public: 2645 virtual void x(); // matches x 2646 }; 2647 2648Example: 2649 class Base {}; 2650 class DirectlyDerived : virtual Base {}; // matches Base 2651 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 2652 2653Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 2654</pre></td></tr> 2655 2656 2657<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> 2658<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 2659 2660Given 2661 class A { 2662 public: 2663 virtual void x(); 2664 }; 2665 class B : public A { 2666 public: 2667 void x(); 2668 }; 2669 matches A::x but not B::x 2670</pre></td></tr> 2671 2672 2673<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> 2674<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions. 2675 2676Given: 2677 MyClass *p1 = new MyClass[10]; 2678cxxNewExpr(isArray()) 2679 matches the expression 'new MyClass[10]'. 2680</pre></td></tr> 2681 2682 2683<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName0')"><a name="hasAnyOverloadedOperatorName0Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 2684<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names. 2685 2686Matches overloaded operator names specified in strings without the 2687"operator" prefix: e.g. "<<". 2688 2689 hasAnyOverloadesOperatorName("+", "-") 2690Is equivalent to 2691 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 2692</pre></td></tr> 2693 2694 2695<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> 2696<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 2697 2698Matches overloaded operator names specified in strings without the 2699"operator" prefix: e.g. "<<". 2700 2701Given: 2702 class A { int operator*(); }; 2703 const A &operator<<(const A &a, const A &b); 2704 A a; 2705 a << a; // <-- This matches 2706 2707cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 2708specified line and 2709cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 2710matches the declaration of A. 2711 2712Usable 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>> 2713</pre></td></tr> 2714 2715 2716<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> 2717<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators. 2718 2719Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2720 if (a == b) 2721 a += b; 2722 2723Example 2: matches s1 = s2 2724 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2725 struct S { S& operator=(const S&); }; 2726 void x() { S s1, s2; s1 = s2; } 2727</pre></td></tr> 2728 2729 2730<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('isComparisonOperator1')"><a name="isComparisonOperator1Anchor">isComparisonOperator</a></td><td></td></tr> 2731<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators. 2732 2733Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 2734 if (a == b) 2735 a += b; 2736 2737Example 2: matches s1 < s2 2738 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 2739 struct S { bool operator<(const S& other); }; 2740 void x(S s1, S s2) { bool b1 = s1 < s2; } 2741</pre></td></tr> 2742 2743 2744<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> 2745<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined. 2746 2747Example matches x (matcher = cxxRecordDecl(hasDefinition())) 2748class x {}; 2749class y; 2750</pre></td></tr> 2751 2752 2753<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> 2754<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 2755</pre></td></tr> 2756 2757 2758<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> 2759<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 2760</pre></td></tr> 2761 2762 2763<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> 2764<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 2765static member variable template instantiations. 2766 2767Given 2768 template<typename T> void A(T t) { } 2769 template<> void A(int N) { } 2770functionDecl(isExplicitTemplateSpecialization()) 2771 matches the specialization A<int>(). 2772 2773Usable 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>> 2774</pre></td></tr> 2775 2776 2777<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> 2778<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 2779 2780Given: 2781 class A final {}; 2782 2783 struct B { 2784 virtual void f(); 2785 }; 2786 2787 struct C : B { 2788 void f() final; 2789 }; 2790matches A and C::f, but not B, C, or B::f 2791</pre></td></tr> 2792 2793 2794<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> 2795<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 2796 2797Given: 2798 auto x = []{}; 2799 2800cxxRecordDecl(isLambda()) matches the implicit class declaration of 2801decltype(x) 2802</pre></td></tr> 2803 2804 2805<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> 2806<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for 2807isSameOrDerivedFrom(hasName(...)). 2808</pre></td></tr> 2809 2810 2811<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> 2812<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 2813member variable template instantiations. 2814 2815Given 2816 template <typename T> class X {}; class A {}; X<A> x; 2817or 2818 template <typename T> class X {}; class A {}; template class X<A>; 2819or 2820 template <typename T> class X {}; class A {}; extern template class X<A>; 2821cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2822 matches the template instantiation of X<A>. 2823 2824But given 2825 template <typename T> class X {}; class A {}; 2826 template <> class X<A> {}; X<A> x; 2827cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2828 does not match, as X<A> is an explicit template specialization. 2829 2830Usable 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>> 2831</pre></td></tr> 2832 2833 2834<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> 2835<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 2836a specific number of arguments (including absent default arguments). 2837 2838Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2839 void f(int x, int y); 2840 f(0, 0); 2841</pre></td></tr> 2842 2843 2844<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> 2845<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL. 2846 2847Example matches y(x) but not y(42) or NS::y(x). 2848 namespace NS { 2849 struct X {}; 2850 void y(X); 2851 } 2852 2853 void y(...); 2854 2855 void test() { 2856 NS::X x; 2857 y(x); // Matches 2858 NS::y(x); // Doesn't match 2859 y(42); // Doesn't match 2860 using NS::y; 2861 y(x); // Found by both unqualified lookup and ADL, doesn't match 2862 } 2863</pre></td></tr> 2864 2865 2866<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> 2867<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 2868 2869Example: matches the implicit cast around 0 2870(matcher = castExpr(hasCastKind(CK_NullToPointer))) 2871 int *p = 0; 2872 2873If the matcher is use from clang-query, CastKind parameter 2874should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer"). 2875</pre></td></tr> 2876 2877 2878<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> 2879<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr> 2880 2881 2882<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> 2883<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT. 2884 2885Given 2886 f('false, 3.14, 42); 2887characterLiteral(equals(0)) 2888 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2889 match false 2890floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2891 match 3.14 2892integerLiteral(equals(42)) 2893 matches 42 2894 2895Note that you cannot directly match a negative numeric literal because the 2896minus sign is not part of the literal: It is a unary operator whose operand 2897is the positive numeric literal. Instead, you must use a unaryOperator() 2898matcher to match the minus sign: 2899 2900unaryOperator(hasOperatorName("-"), 2901 hasUnaryOperand(integerLiteral(equals(13)))) 2902 2903Usable 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>>, 2904 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>> 2905</pre></td></tr> 2906 2907 2908<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> 2909<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr> 2910 2911 2912<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> 2913<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr> 2914 2915 2916<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> 2917<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 2918 2919Given 2920 template<typename T> struct C {}; 2921 C<int> c; 2922classTemplateSpecializationDecl(templateArgumentCountIs(1)) 2923 matches C<int>. 2924</pre></td></tr> 2925 2926 2927<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> 2928<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 2929child statements. 2930 2931Example: Given 2932 { for (;;) {} } 2933compoundStmt(statementCountIs(0))) 2934 matches '{}' 2935 but does not match the outer compound statement. 2936</pre></td></tr> 2937 2938 2939<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> 2940<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 2941 2942Given 2943 int a[42]; 2944 int b[2 * 21]; 2945 int c[41], d[43]; 2946 char *s = "abcd"; 2947 wchar_t *ws = L"abcd"; 2948 char *w = "a"; 2949constantArrayType(hasSize(42)) 2950 matches "int a[42]" and "int b[2 * 21]" 2951stringLiteral(hasSize(4)) 2952 matches "abcd", L"abcd" 2953</pre></td></tr> 2954 2955 2956<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> 2957<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 2958declarations. 2959 2960Example: Given 2961 int a, b; 2962 int c; 2963 int d = 2, e; 2964declCountIs(2) 2965 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 2966</pre></td></tr> 2967 2968 2969<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> 2970<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 2971 2972Matches a node if it equals the node previously bound to ID. 2973 2974Given 2975 class X { int a; int b; }; 2976cxxRecordDecl( 2977 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 2978 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 2979 matches the class X, as a and b have the same type. 2980 2981Note that when multiple matches are involved via forEach* matchers, 2982equalsBoundNodes acts as a filter. 2983For example: 2984compoundStmt( 2985 forEachDescendant(varDecl().bind("d")), 2986 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 2987will trigger a match for each combination of variable declaration 2988and reference to that variable declaration within a compound statement. 2989</pre></td></tr> 2990 2991 2992<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> 2993<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 2994 2995Decl has pointer identity in the AST. 2996</pre></td></tr> 2997 2998 2999<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> 3000<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 3001 3002Given 3003 __attribute__((device)) void f() { ... } 3004decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 3005f. If the matcher is used from clang-query, attr::Kind parameter should be 3006passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 3007</pre></td></tr> 3008 3009 3010<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> 3011<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 3012partially matching a given regex. 3013 3014Example matches Y but not X 3015 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3016 #include "ASTMatcher.h" 3017 class X {}; 3018ASTMatcher.h: 3019 class Y {}; 3020 3021Usable 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>> 3022</pre></td></tr> 3023 3024 3025<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> 3026<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 3027 3028Example matches X but not Y 3029 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3030 #include <Y.h> 3031 class X {}; 3032Y.h: 3033 class Y {}; 3034 3035Usable 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>> 3036</pre></td></tr> 3037 3038 3039<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> 3040<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 3041 3042Example matches Y but not X 3043 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3044 #include <SystemHeader.h> 3045 class X {}; 3046SystemHeader.h: 3047 class Y {}; 3048 3049Usable 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>> 3050</pre></td></tr> 3051 3052 3053<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> 3054<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added 3055by the compiler (eg. implicit default/copy constructors). 3056</pre></td></tr> 3057 3058 3059<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> 3060<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces. 3061 3062Given 3063 class vector {}; 3064 namespace foo { 3065 class vector {}; 3066 namespace std { 3067 class vector {}; 3068 } 3069 } 3070 namespace std { 3071 inline namespace __1 { 3072 class vector {}; // #1 3073 namespace experimental { 3074 class vector {}; 3075 } 3076 } 3077 } 3078cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1. 3079</pre></td></tr> 3080 3081 3082<tr><td>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> 3083<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3084template instantiations. 3085 3086Given 3087 template<typename T> void A(T t) { T i; } 3088 A(0); 3089 A(0U); 3090functionDecl(isInstantiated()) 3091 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3092</pre></td></tr> 3093 3094 3095<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> 3096<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private 3097inheritance. 3098 3099Examples: 3100 class C { 3101 public: int a; 3102 protected: int b; 3103 private: int c; // fieldDecl(isPrivate()) matches 'c' 3104 }; 3105 3106 struct Base {}; 3107 struct Derived1 : private Base {}; // matches 'Base' 3108 class Derived2 : Base {}; // matches 'Base' 3109</pre></td></tr> 3110 3111 3112<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> 3113<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify 3114protected inheritance. 3115 3116Examples: 3117 class C { 3118 public: int a; 3119 protected: int b; // fieldDecl(isProtected()) matches 'b' 3120 private: int c; 3121 }; 3122 3123 class Base {}; 3124 class Derived : protected Base {}; // matches 'Base' 3125</pre></td></tr> 3126 3127 3128<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> 3129<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public 3130inheritance. 3131 3132Examples: 3133 class C { 3134 public: int a; // fieldDecl(isPublic()) matches 'a' 3135 protected: int b; 3136 private: int c; 3137 }; 3138 3139 class Base {}; 3140 class Derived1 : public Base {}; // matches 'Base' 3141 struct Derived2 : Base {}; // matches 'Base' 3142</pre></td></tr> 3143 3144 3145<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> 3146<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 3147a specific number of designators. 3148 3149Example: Given 3150 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 3151 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 3152designatorCountIs(2) 3153 matches '{ [2].y = 1.0, [0].x = 1.0 }', 3154 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 3155</pre></td></tr> 3156 3157 3158<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> 3159<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration. 3160 3161Example matches Y (matcher = enumDecl(isScoped())) 3162enum X {}; 3163enum class Y {}; 3164</pre></td></tr> 3165 3166 3167<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> 3168<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is 3169neither type- nor value-dependent. 3170 3171In the following example, the expression sizeof(sizeof(T() + T())) 3172is instantiation-dependent (since it involves a template parameter T), 3173but is neither type- nor value-dependent, since the type of the inner 3174sizeof is known (std::size_t) and therefore the size of the outer 3175sizeof is known. 3176 template<typename T> 3177 void f(T x, T y) { sizeof(sizeof(T() + T()); } 3178expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T()) 3179</pre></td></tr> 3180 3181 3182<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> 3183<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type 3184is not yet instantiated. 3185 3186For example, the expressions "x" and "x + y" are type-dependent in 3187the following code, but "y" is not type-dependent: 3188 template<typename T> 3189 void add(T x, int y) { 3190 x + y; 3191 } 3192expr(isTypeDependent()) matches x + y 3193</pre></td></tr> 3194 3195 3196<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> 3197<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a 3198non-type template parameter. 3199 3200For example, the array bound of "Chars" in the following example is 3201value-dependent. 3202 template<int Size> int f() { return Size; } 3203expr(isValueDependent()) matches return Size 3204</pre></td></tr> 3205 3206 3207<tr><td>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> 3208<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 3209GNU's __null, C++11's nullptr, or C's NULL macro. 3210 3211Given: 3212 void *v1 = NULL; 3213 void *v2 = nullptr; 3214 void *v3 = __null; // GNU extension 3215 char *cp = (char *)0; 3216 int *ip = 0; 3217 int i = 0; 3218expr(nullPointerConstant()) 3219 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 3220 initializer for i. 3221</pre></td></tr> 3222 3223 3224<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> 3225<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 3226bit width. 3227 3228Given 3229 class C { 3230 int a : 2; 3231 int b : 4; 3232 int c : 2; 3233 }; 3234fieldDecl(hasBitWidth(2)) 3235 matches 'int a;' and 'int c;' but not 'int b;'. 3236</pre></td></tr> 3237 3238 3239<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> 3240<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 3241 3242Given 3243 class C { 3244 int a : 2; 3245 int b; 3246 }; 3247fieldDecl(isBitField()) 3248 matches 'int a;' but not 'int b;'. 3249</pre></td></tr> 3250 3251 3252<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> 3253<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 3254 3255Given 3256 f('false, 3.14, 42); 3257characterLiteral(equals(0)) 3258 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3259 match false 3260floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3261 match 3.14 3262integerLiteral(equals(42)) 3263 matches 42 3264 3265Note that you cannot directly match a negative numeric literal because the 3266minus sign is not part of the literal: It is a unary operator whose operand 3267is the positive numeric literal. Instead, you must use a unaryOperator() 3268matcher to match the minus sign: 3269 3270unaryOperator(hasOperatorName("-"), 3271 hasUnaryOperand(integerLiteral(equals(13)))) 3272 3273Usable 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>>, 3274 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>> 3275</pre></td></tr> 3276 3277 3278<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> 3279<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr> 3280 3281 3282<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName1')"><a name="hasAnyOverloadedOperatorName1Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 3283<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names. 3284 3285Matches overloaded operator names specified in strings without the 3286"operator" prefix: e.g. "<<". 3287 3288 hasAnyOverloadesOperatorName("+", "-") 3289Is equivalent to 3290 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3291</pre></td></tr> 3292 3293 3294<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> 3295<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 3296 3297Given: 3298 void f(); 3299 void g() noexcept; 3300 void h() noexcept(true); 3301 void i() noexcept(false); 3302 void j() throw(); 3303 void k() throw(int); 3304 void l() throw(...); 3305functionDecl(hasDynamicExceptionSpec()) and 3306 functionProtoType(hasDynamicExceptionSpec()) 3307 match the declarations of j, k, and l, but not f, g, h, or i. 3308</pre></td></tr> 3309 3310 3311<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> 3312<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 3313 3314Matches overloaded operator names specified in strings without the 3315"operator" prefix: e.g. "<<". 3316 3317Given: 3318 class A { int operator*(); }; 3319 const A &operator<<(const A &a, const A &b); 3320 A a; 3321 a << a; // <-- This matches 3322 3323cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3324specified line and 3325cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3326matches the declaration of A. 3327 3328Usable 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>> 3329</pre></td></tr> 3330 3331 3332<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> 3333<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 3334 3335Example matches Y (matcher = functionDecl(hasTrailingReturn())) 3336int X() {} 3337auto Y() -> int {} 3338</pre></td></tr> 3339 3340 3341<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> 3342<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations, 3343 and if constexpr. 3344 3345Given: 3346 constexpr int foo = 42; 3347 constexpr int bar(); 3348 void baz() { if constexpr(1 > 0) {} } 3349varDecl(isConstexpr()) 3350 matches the declaration of foo. 3351functionDecl(isConstexpr()) 3352 matches the declaration of bar. 3353ifStmt(isConstexpr()) 3354 matches the if statement in baz. 3355</pre></td></tr> 3356 3357 3358<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> 3359<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 3360 3361Given: 3362 class A { ~A(); }; 3363 class B { ~B() = default; }; 3364functionDecl(isDefaulted()) 3365 matches the declaration of ~B, but not ~A. 3366</pre></td></tr> 3367 3368 3369<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> 3370<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 3371 3372Example matches A, va, fa 3373 class A {}; 3374 class B; // Doesn't match, as it has no body. 3375 int va; 3376 extern int vb; // Doesn't match, as it doesn't define the variable. 3377 void fa() {} 3378 void fb(); // Doesn't match, as it has no body. 3379 @interface X 3380 - (void)ma; // Doesn't match, interface is declaration. 3381 @end 3382 @implementation X 3383 - (void)ma {} 3384 @end 3385 3386Usable 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>>, 3387 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 3388</pre></td></tr> 3389 3390 3391<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> 3392<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 3393 3394Given: 3395 void Func(); 3396 void DeletedFunc() = delete; 3397functionDecl(isDeleted()) 3398 matches the declaration of DeletedFunc, but not Func. 3399</pre></td></tr> 3400 3401 3402<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> 3403<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 3404static member variable template instantiations. 3405 3406Given 3407 template<typename T> void A(T t) { } 3408 template<> void A(int N) { } 3409functionDecl(isExplicitTemplateSpecialization()) 3410 matches the specialization A<int>(). 3411 3412Usable 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>> 3413</pre></td></tr> 3414 3415 3416<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> 3417<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 3418 3419Given: 3420 extern "C" void f() {} 3421 extern "C" { void g() {} } 3422 void h() {} 3423 extern "C" int x = 1; 3424 extern "C" int y = 2; 3425 int z = 3; 3426functionDecl(isExternC()) 3427 matches the declaration of f and g, but not the declaration of h. 3428varDecl(isExternC()) 3429 matches the declaration of x and y, but not the declaration of z. 3430</pre></td></tr> 3431 3432 3433<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> 3434<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 3435the inline keyword. 3436 3437Given 3438 inline void f(); 3439 void g(); 3440 namespace n { 3441 inline namespace m {} 3442 } 3443functionDecl(isInline()) will match ::f(). 3444namespaceDecl(isInline()) will match n::m. 3445</pre></td></tr> 3446 3447 3448<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> 3449<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point 3450into an executable program. 3451</pre></td></tr> 3452 3453 3454<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> 3455<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 3456 3457Given 3458 void nope(); 3459 [[noreturn]] void a(); 3460 __attribute__((noreturn)) void b(); 3461 struct c { [[noreturn]] c(); }; 3462functionDecl(isNoReturn()) 3463 matches all of those except 3464 void nope(); 3465</pre></td></tr> 3466 3467 3468<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> 3469<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 3470 3471Given: 3472 void f(); 3473 void g() noexcept; 3474 void h() throw(); 3475 void i() throw(int); 3476 void j() noexcept(false); 3477functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 3478 match the declarations of g, and h, but not f, i or j. 3479</pre></td></tr> 3480 3481 3482<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> 3483<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage 3484class specifier ("static" keyword) written in the source. 3485 3486Given: 3487 static void f() {} 3488 static int i = 0; 3489 extern int j; 3490 int k; 3491functionDecl(isStaticStorageClass()) 3492 matches the function declaration f. 3493varDecl(isStaticStorageClass()) 3494 matches the variable declaration i. 3495</pre></td></tr> 3496 3497 3498<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> 3499<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 3500member variable template instantiations. 3501 3502Given 3503 template <typename T> class X {}; class A {}; X<A> x; 3504or 3505 template <typename T> class X {}; class A {}; template class X<A>; 3506or 3507 template <typename T> class X {}; class A {}; extern template class X<A>; 3508cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3509 matches the template instantiation of X<A>. 3510 3511But given 3512 template <typename T> class X {}; class A {}; 3513 template <> class X<A> {}; X<A> x; 3514cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3515 does not match, as X<A> is an explicit template specialization. 3516 3517Usable 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>> 3518</pre></td></tr> 3519 3520 3521<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> 3522<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 3523 3524Example matches f, but not g or h. The function i will not match, even when 3525compiled in C mode. 3526 void f(...); 3527 void g(int); 3528 template <typename... Ts> void h(Ts...); 3529 void i(); 3530</pre></td></tr> 3531 3532 3533<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> 3534<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 3535specific parameter count. 3536 3537Given 3538 void f(int i) {} 3539 void g(int i, int j) {} 3540 void h(int i, int j); 3541 void j(int i); 3542 void k(int x, int y, int z, ...); 3543functionDecl(parameterCountIs(2)) 3544 matches g and h 3545functionProtoType(parameterCountIs(2)) 3546 matches g and h 3547functionProtoType(parameterCountIs(3)) 3548 matches k 3549</pre></td></tr> 3550 3551 3552<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> 3553<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 3554 3555Given: 3556 void f(); 3557 void g() noexcept; 3558 void h() noexcept(true); 3559 void i() noexcept(false); 3560 void j() throw(); 3561 void k() throw(int); 3562 void l() throw(...); 3563functionDecl(hasDynamicExceptionSpec()) and 3564 functionProtoType(hasDynamicExceptionSpec()) 3565 match the declarations of j, k, and l, but not f, g, h, or i. 3566</pre></td></tr> 3567 3568 3569<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> 3570<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 3571 3572Given: 3573 void f(); 3574 void g() noexcept; 3575 void h() throw(); 3576 void i() throw(int); 3577 void j() noexcept(false); 3578functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 3579 match the declarations of g, and h, but not f, i or j. 3580</pre></td></tr> 3581 3582 3583<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> 3584<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 3585specific parameter count. 3586 3587Given 3588 void f(int i) {} 3589 void g(int i, int j) {} 3590 void h(int i, int j); 3591 void j(int i); 3592 void k(int x, int y, int z, ...); 3593functionDecl(parameterCountIs(2)) 3594 matches g and h 3595functionProtoType(parameterCountIs(2)) 3596 matches g and h 3597functionProtoType(parameterCountIs(3)) 3598 matches k 3599</pre></td></tr> 3600 3601 3602<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> 3603<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations, 3604 and if constexpr. 3605 3606Given: 3607 constexpr int foo = 42; 3608 constexpr int bar(); 3609 void baz() { if constexpr(1 > 0) {} } 3610varDecl(isConstexpr()) 3611 matches the declaration of foo. 3612functionDecl(isConstexpr()) 3613 matches the declaration of bar. 3614ifStmt(isConstexpr()) 3615 matches the if statement in baz. 3616</pre></td></tr> 3617 3618 3619<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> 3620<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 3621 3622 3623<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> 3624<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 3625 3626Given 3627 f('false, 3.14, 42); 3628characterLiteral(equals(0)) 3629 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3630 match false 3631floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3632 match 3.14 3633integerLiteral(equals(42)) 3634 matches 42 3635 3636Note that you cannot directly match a negative numeric literal because the 3637minus sign is not part of the literal: It is a unary operator whose operand 3638is the positive numeric literal. Instead, you must use a unaryOperator() 3639matcher to match the minus sign: 3640 3641unaryOperator(hasOperatorName("-"), 3642 hasUnaryOperand(integerLiteral(equals(13)))) 3643 3644Usable 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>>, 3645 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>> 3646</pre></td></tr> 3647 3648 3649<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> 3650<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 3651 3652 3653<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> 3654<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 3655 3656 3657<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> 3658<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 3659to '.'. 3660 3661Member calls on the implicit this pointer match as called with '->'. 3662 3663Given 3664 class Y { 3665 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3666 template <class T> void f() { this->f<T>(); f<T>(); } 3667 int a; 3668 static int b; 3669 }; 3670 template <class T> 3671 class Z { 3672 void x() { this->m; } 3673 }; 3674memberExpr(isArrow()) 3675 matches this->x, x, y.x, a, this->b 3676cxxDependentScopeMemberExpr(isArrow()) 3677 matches this->m 3678unresolvedMemberExpr(isArrow()) 3679 matches this->f<T>, f<T> 3680</pre></td></tr> 3681 3682 3683<tr><td>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> 3684<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 3685 3686This matcher is only provided as a performance optimization of hasName. 3687 hasAnyName(a, b, c) 3688 is equivalent to, but faster than 3689 anyOf(hasName(a), hasName(b), hasName(c)) 3690</pre></td></tr> 3691 3692 3693<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> 3694<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 3695 3696Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 3697void f() { 3698 int x; 3699 static int y; 3700} 3701int z; 3702 3703Example matches f() because it has external formal linkage despite being 3704unique to the translation unit as though it has internal likage 3705(matcher = functionDecl(hasExternalFormalLinkage())) 3706 3707namespace { 3708void f() {} 3709} 3710</pre></td></tr> 3711 3712 3713<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>StringRef Name</td></tr> 3714<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 3715 3716Supports specifying enclosing namespaces or classes by prefixing the name 3717with '<enclosing>::'. 3718Does not match typedefs of an underlying type with the given name. 3719 3720Example matches X (Name == "X") 3721 class X; 3722 3723Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 3724 namespace a { namespace b { class X; } } 3725</pre></td></tr> 3726 3727 3728<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> 3729<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 3730a substring matched by the given RegExp. 3731 3732Supports specifying enclosing namespaces or classes by 3733prefixing the name with '<enclosing>::'. Does not match typedefs 3734of an underlying type with the given name. 3735 3736Example matches X (regexp == "::X") 3737 class X; 3738 3739Example matches X (regexp is one of "::X", "^foo::.*X", among others) 3740 namespace foo { namespace bar { class X; } } 3741</pre></td></tr> 3742 3743 3744<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> 3745<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 3746 3747Given 3748 namespace n { 3749 namespace {} // #1 3750 } 3751namespaceDecl(isAnonymous()) will match #1 but not ::n. 3752</pre></td></tr> 3753 3754 3755<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> 3756<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 3757the inline keyword. 3758 3759Given 3760 inline void f(); 3761 void g(); 3762 namespace n { 3763 inline namespace m {} 3764 } 3765functionDecl(isInline()) will match ::f(). 3766namespaceDecl(isInline()) will match n::m. 3767</pre></td></tr> 3768 3769 3770<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> 3771<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified. 3772 3773Given 3774 3775 #pragma omp parallel 3776 #pragma omp parallel default(none) 3777 #pragma omp parallel default(shared) 3778 3779``ompDefaultClause(isNoneKind())`` matches only ``default(none)``. 3780</pre></td></tr> 3781 3782 3783<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> 3784<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified. 3785 3786Given 3787 3788 #pragma omp parallel 3789 #pragma omp parallel default(none) 3790 #pragma omp parallel default(shared) 3791 3792``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``. 3793</pre></td></tr> 3794 3795 3796<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> 3797<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP 3798clause kind. 3799 3800Given 3801 3802 #pragma omp parallel 3803 #pragma omp parallel for 3804 #pragma omp for 3805 3806`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches 3807``omp parallel`` and ``omp parallel for``. 3808 3809If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter 3810should be passed as a quoted string. e.g., 3811``isAllowedToContainClauseKind("OMPC_default").`` 3812</pre></td></tr> 3813 3814 3815<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> 3816<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives, 3817i.e., directives that can't have a structured block. 3818 3819Given 3820 3821 #pragma omp parallel 3822 {} 3823 #pragma omp taskyield 3824 3825``ompExecutableDirective(isStandaloneDirective()))`` matches 3826``omp taskyield``. 3827</pre></td></tr> 3828 3829 3830<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> 3831<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 3832</pre></td></tr> 3833 3834 3835<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> 3836<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 3837</pre></td></tr> 3838 3839 3840<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> 3841<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for 3842isSameOrDerivedFrom(hasName(...)). 3843</pre></td></tr> 3844 3845 3846<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> 3847<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3848a specific number of arguments (including absent default arguments). 3849 3850Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3851 void f(int x, int y); 3852 f(0, 0); 3853</pre></td></tr> 3854 3855 3856<tr><td>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> 3857<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 3858Selector.getAsString() 3859 3860 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 3861 matches both of the expressions below: 3862 [myObj methodA:argA]; 3863 [myObj methodB:argB]; 3864</pre></td></tr> 3865 3866 3867<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> 3868<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 3869 3870objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 3871message expression in 3872 3873 UIWebView *webView = ...; 3874 CGRect bodyFrame = webView.frame; 3875 bodyFrame.size.height = self.bodyContentHeight; 3876 webView.frame = bodyFrame; 3877 // ^---- matches here 3878</pre></td></tr> 3879 3880 3881<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> 3882<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 3883 3884Matches only when the selector of the objCMessageExpr is NULL. This may 3885represent an error condition in the tree! 3886</pre></td></tr> 3887 3888 3889<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> 3890<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 3891 3892 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 3893 matches the outer message expr in the code below, but NOT the message 3894 invocation for self.bodyView. 3895 [self.bodyView loadHTMLString:html baseURL:NULL]; 3896</pre></td></tr> 3897 3898 3899<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> 3900<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 3901 3902 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 3903 matches self.bodyView in the code below, but NOT the outer message 3904 invocation of "loadHTMLString:baseURL:". 3905 [self.bodyView loadHTMLString:html baseURL:NULL]; 3906</pre></td></tr> 3907 3908 3909<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> 3910<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class. 3911 3912Example 3913matcher = objcMessageExpr(isClassMessage()) 3914matches 3915 [NSString stringWithFormat:@"format"]; 3916but not 3917 NSString *x = @"hello"; 3918 [x containsString:@"h"]; 3919</pre></td></tr> 3920 3921 3922<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> 3923<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance. 3924 3925Example 3926matcher = objcMessageExpr(isInstanceMessage()) 3927matches 3928 NSString *x = @"hello"; 3929 [x containsString:@"h"]; 3930but not 3931 [NSString stringWithFormat:@"format"]; 3932</pre></td></tr> 3933 3934 3935<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> 3936<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 3937a substring matched by the given RegExp. 3938 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 3939 invocation for self.bodyView. 3940 [self.bodyView loadHTMLString:html baseURL:NULL]; 3941</pre></td></tr> 3942 3943 3944<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> 3945<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 3946 3947 matcher = objCMessageExpr(numSelectorArgs(0)); 3948 matches self.bodyView in the code below 3949 3950 matcher = objCMessageExpr(numSelectorArgs(2)); 3951 matches the invocation of "loadHTMLString:baseURL:" but not that 3952 of self.bodyView 3953 [self.bodyView loadHTMLString:html baseURL:NULL]; 3954</pre></td></tr> 3955 3956 3957<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> 3958<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method. 3959 3960Example 3961matcher = objcMethodDecl(isClassMethod()) 3962matches 3963@interface I + (void)foo; @end 3964but not 3965@interface I - (void)bar; @end 3966</pre></td></tr> 3967 3968 3969<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> 3970<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 3971 3972Example matches A, va, fa 3973 class A {}; 3974 class B; // Doesn't match, as it has no body. 3975 int va; 3976 extern int vb; // Doesn't match, as it doesn't define the variable. 3977 void fa() {} 3978 void fb(); // Doesn't match, as it has no body. 3979 @interface X 3980 - (void)ma; // Doesn't match, interface is declaration. 3981 @end 3982 @implementation X 3983 - (void)ma {} 3984 @end 3985 3986Usable 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>>, 3987 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 3988</pre></td></tr> 3989 3990 3991<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> 3992<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method. 3993 3994Example 3995matcher = objcMethodDecl(isInstanceMethod()) 3996matches 3997@interface I - (void)bar; @end 3998but not 3999@interface I + (void)foo; @end 4000</pre></td></tr> 4001 4002 4003<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> 4004<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 4005 4006Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 4007void x(int val) {} 4008void y(int val = 0) {} 4009 4010Deprecated. Use hasInitializer() instead to be able to 4011match on the contents of the default argument. For example: 4012 4013void x(int val = 7) {} 4014void y(int val = 42) {} 4015parmVarDecl(hasInitializer(integerLiteral(equals(42)))) 4016 matches the parameter of y 4017 4018A matcher such as 4019 parmVarDecl(hasInitializer(anything())) 4020is equivalent to parmVarDecl(hasDefaultArgument()). 4021</pre></td></tr> 4022 4023 4024<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>></td><td class="name" onclick="toggle('isAtPosition0')"><a name="isAtPosition0Anchor">isAtPosition</a></td><td>unsigned N</td></tr> 4025<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter 4026list. The parameter list could be that of either a block, function, or 4027objc-method. 4028 4029 4030Given 4031 4032void f(int a, int b, int c) { 4033} 4034 4035``parmVarDecl(isAtPosition(0))`` matches ``int a``. 4036 4037``parmVarDecl(isAtPosition(1))`` matches ``int b``. 4038</pre></td></tr> 4039 4040 4041<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> 4042<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 4043 4044Given 4045 class Y { public: void x(); }; 4046 void z() { Y* y; y->x(); } 4047cxxMemberCallExpr(on(hasType(asString("class Y *")))) 4048 matches y->x() 4049</pre></td></tr> 4050 4051 4052<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> 4053<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 4054 4055Matches a node if it equals the node previously bound to ID. 4056 4057Given 4058 class X { int a; int b; }; 4059cxxRecordDecl( 4060 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4061 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4062 matches the class X, as a and b have the same type. 4063 4064Note that when multiple matches are involved via forEach* matchers, 4065equalsBoundNodes acts as a filter. 4066For example: 4067compoundStmt( 4068 forEachDescendant(varDecl().bind("d")), 4069 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4070will trigger a match for each combination of variable declaration 4071and reference to that variable declaration within a compound statement. 4072</pre></td></tr> 4073 4074 4075<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> 4076<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 4077the node, not hidden within a typedef. 4078 4079Given 4080 typedef const int const_int; 4081 const_int i; 4082 int *const j; 4083 int *volatile k; 4084 int m; 4085varDecl(hasType(hasLocalQualifiers())) matches only j and k. 4086i is const-qualified but the qualifier is not local. 4087</pre></td></tr> 4088 4089 4090<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> 4091<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 4092 4093Given 4094 void a(char); 4095 void b(wchar_t); 4096 void c(double); 4097functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 4098matches "a(char)", "b(wchar_t)", but not "c(double)". 4099</pre></td></tr> 4100 4101 4102<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> 4103<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 4104the Objective-C object pointer type, which is different despite being 4105syntactically similar. 4106 4107Given 4108 int *i = nullptr; 4109 4110 @interface Foo 4111 @end 4112 Foo *f; 4113 4114 int j; 4115varDecl(hasType(isAnyPointer())) 4116 matches "int *i" and "Foo *f", but not "int j". 4117</pre></td></tr> 4118 4119 4120<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> 4121<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 4122include "top-level" const. 4123 4124Given 4125 void a(int); 4126 void b(int const); 4127 void c(const int); 4128 void d(const int*); 4129 void e(int const) {}; 4130functionDecl(hasAnyParameter(hasType(isConstQualified()))) 4131 matches "void b(int const)", "void c(const int)" and 4132 "void e(int const) {}". It does not match d as there 4133 is no top-level const on the parameter type "const int *". 4134</pre></td></tr> 4135 4136 4137<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> 4138<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 4139 4140Given 4141 void a(int); 4142 void b(long); 4143 void c(double); 4144functionDecl(hasAnyParameter(hasType(isInteger()))) 4145matches "a(int)", "b(long)", but not "c(double)". 4146</pre></td></tr> 4147 4148 4149<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> 4150<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 4151 4152Given 4153 void a(int); 4154 void b(unsigned long); 4155 void c(double); 4156functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 4157matches "a(int)", but not "b(unsigned long)" and "c(double)". 4158</pre></td></tr> 4159 4160 4161<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> 4162<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 4163 4164Given 4165 void a(int); 4166 void b(unsigned long); 4167 void c(double); 4168functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 4169matches "b(unsigned long)", but not "a(int)" and "c(double)". 4170</pre></td></tr> 4171 4172 4173<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> 4174<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 4175include "top-level" volatile. 4176 4177Given 4178 void a(int); 4179 void b(int volatile); 4180 void c(volatile int); 4181 void d(volatile int*); 4182 void e(int volatile) {}; 4183functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 4184 matches "void b(int volatile)", "void c(volatile int)" and 4185 "void e(int volatile) {}". It does not match d as there 4186 is no top-level volatile on the parameter type "volatile int *". 4187</pre></td></tr> 4188 4189 4190<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> 4191<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 4192 4193Matches a node if it equals the node previously bound to ID. 4194 4195Given 4196 class X { int a; int b; }; 4197cxxRecordDecl( 4198 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4199 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4200 matches the class X, as a and b have the same type. 4201 4202Note that when multiple matches are involved via forEach* matchers, 4203equalsBoundNodes acts as a filter. 4204For example: 4205compoundStmt( 4206 forEachDescendant(varDecl().bind("d")), 4207 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4208will trigger a match for each combination of variable declaration 4209and reference to that variable declaration within a compound statement. 4210</pre></td></tr> 4211 4212 4213<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> 4214<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 4215 4216Stmt has pointer identity in the AST. 4217</pre></td></tr> 4218 4219 4220<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpandedFromMacro0')"><a name="isExpandedFromMacro0Anchor">isExpandedFromMacro</a></td><td>llvm::StringRef MacroName</td></tr> 4221<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro. 4222Does not match if only part of the statement is expanded from that macro or 4223if different parts of the the statement are expanded from different 4224appearances of the macro. 4225 4226FIXME: Change to be a polymorphic matcher that works on any syntactic 4227node. There's nothing `Stmt`-specific about it. 4228</pre></td></tr> 4229 4230 4231<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> 4232<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 4233partially matching a given regex. 4234 4235Example matches Y but not X 4236 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 4237 #include "ASTMatcher.h" 4238 class X {}; 4239ASTMatcher.h: 4240 class Y {}; 4241 4242Usable 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>> 4243</pre></td></tr> 4244 4245 4246<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> 4247<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 4248 4249Example matches X but not Y 4250 (matcher = cxxRecordDecl(isExpansionInMainFile()) 4251 #include <Y.h> 4252 class X {}; 4253Y.h: 4254 class Y {}; 4255 4256Usable 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>> 4257</pre></td></tr> 4258 4259 4260<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> 4261<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 4262 4263Example matches Y but not X 4264 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 4265 #include <SystemHeader.h> 4266 class X {}; 4267SystemHeader.h: 4268 class Y {}; 4269 4270Usable 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>> 4271</pre></td></tr> 4272 4273 4274<tr><td>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> 4275<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 4276 4277Given 4278 int j; 4279 template<typename T> void A(T t) { T i; j += 42;} 4280 A(0); 4281 A(0U); 4282declStmt(isInTemplateInstantiation()) 4283 matches 'int i;' and 'unsigned i'. 4284unless(stmt(isInTemplateInstantiation())) 4285 will NOT match j += 42; as it's shared between the template definition and 4286 instantiation. 4287</pre></td></tr> 4288 4289 4290<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> 4291<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 4292 4293Given 4294 int a[42]; 4295 int b[2 * 21]; 4296 int c[41], d[43]; 4297 char *s = "abcd"; 4298 wchar_t *ws = L"abcd"; 4299 char *w = "a"; 4300constantArrayType(hasSize(42)) 4301 matches "int a[42]" and "int b[2 * 21]" 4302stringLiteral(hasSize(4)) 4303 matches "abcd", L"abcd" 4304</pre></td></tr> 4305 4306 4307<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr> 4308<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class." 4309 4310Example matches C, but not S, U or E. 4311 struct S {}; 4312 class C {}; 4313 union U {}; 4314 enum E {}; 4315</pre></td></tr> 4316 4317 4318<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> 4319<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 4320 4321Example matches A, va, fa 4322 class A {}; 4323 class B; // Doesn't match, as it has no body. 4324 int va; 4325 extern int vb; // Doesn't match, as it doesn't define the variable. 4326 void fa() {} 4327 void fb(); // Doesn't match, as it has no body. 4328 @interface X 4329 - (void)ma; // Doesn't match, interface is declaration. 4330 @end 4331 @implementation X 4332 - (void)ma {} 4333 @end 4334 4335Usable 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>>, 4336 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4337</pre></td></tr> 4338 4339 4340<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isEnum0')"><a name="isEnum0Anchor">isEnum</a></td><td></td></tr> 4341<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum." 4342 4343Example matches E, but not C, S or U. 4344 struct S {}; 4345 class C {}; 4346 union U {}; 4347 enum E {}; 4348</pre></td></tr> 4349 4350 4351<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr> 4352<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct." 4353 4354Example matches S, but not C, U or E. 4355 struct S {}; 4356 class C {}; 4357 union U {}; 4358 enum E {}; 4359</pre></td></tr> 4360 4361 4362<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr> 4363<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union." 4364 4365Example matches U, but not C, S or E. 4366 struct S {}; 4367 class C {}; 4368 union U {}; 4369 enum E {}; 4370</pre></td></tr> 4371 4372 4373<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> 4374<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 4375 4376Note that 'Value' is a string as the template argument's value is 4377an arbitrary precision integer. 'Value' must be euqal to the canonical 4378representation of that integral value in base 10. 4379 4380Given 4381 template<int T> struct C {}; 4382 C<42> c; 4383classTemplateSpecializationDecl( 4384 hasAnyTemplateArgument(equalsIntegralValue("42"))) 4385 matches the implicit instantiation of C in C<42>. 4386</pre></td></tr> 4387 4388 4389<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> 4390<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 4391 4392Given 4393 template<int T> struct C {}; 4394 C<42> c; 4395classTemplateSpecializationDecl( 4396 hasAnyTemplateArgument(isIntegral())) 4397 matches the implicit instantiation of C in C<42> 4398 with isIntegral() matching 42. 4399</pre></td></tr> 4400 4401 4402<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> 4403<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 4404 4405Given 4406 template<typename T> struct C {}; 4407 C<int> c; 4408classTemplateSpecializationDecl(templateArgumentCountIs(1)) 4409 matches C<int>. 4410</pre></td></tr> 4411 4412 4413<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> 4414<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 4415partially matching a given regex. 4416 4417Example matches Y but not X 4418 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 4419 #include "ASTMatcher.h" 4420 class X {}; 4421ASTMatcher.h: 4422 class Y {}; 4423 4424Usable 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>> 4425</pre></td></tr> 4426 4427 4428<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> 4429<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 4430 4431Example matches X but not Y 4432 (matcher = cxxRecordDecl(isExpansionInMainFile()) 4433 #include <Y.h> 4434 class X {}; 4435Y.h: 4436 class Y {}; 4437 4438Usable 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>> 4439</pre></td></tr> 4440 4441 4442<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> 4443<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 4444 4445Example matches Y but not X 4446 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 4447 #include <SystemHeader.h> 4448 class X {}; 4449SystemHeader.h: 4450 class Y {}; 4451 4452Usable 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>> 4453</pre></td></tr> 4454 4455 4456<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> 4457<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 4458 4459Given 4460 struct S { bool func(); }; 4461functionDecl(returns(booleanType())) 4462 matches "bool func();" 4463</pre></td></tr> 4464 4465 4466<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> 4467<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 4468 4469Matches a node if it equals the node previously bound to ID. 4470 4471Given 4472 class X { int a; int b; }; 4473cxxRecordDecl( 4474 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4475 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4476 matches the class X, as a and b have the same type. 4477 4478Note that when multiple matches are involved via forEach* matchers, 4479equalsBoundNodes acts as a filter. 4480For example: 4481compoundStmt( 4482 forEachDescendant(varDecl().bind("d")), 4483 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4484will trigger a match for each combination of variable declaration 4485and reference to that variable declaration within a compound statement. 4486</pre></td></tr> 4487 4488 4489<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> 4490<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 4491 4492Type has pointer identity in the AST. 4493</pre></td></tr> 4494 4495 4496<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> 4497<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 4498 4499Given 4500 int i; 4501 float f; 4502realFloatingPointType() 4503 matches "float f" but not "int i" 4504</pre></td></tr> 4505 4506 4507<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> 4508<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 4509 4510Given 4511 struct S { void func(); }; 4512functionDecl(returns(voidType())) 4513 matches "void func();" 4514</pre></td></tr> 4515 4516 4517<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> 4518<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 4519 4520Given 4521 int x; 4522 int s = sizeof(x) + alignof(x) 4523unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 4524 matches sizeof(x) 4525 4526If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter 4527should be passed as a quoted string. e.g., ofKind("UETT_SizeOf"). 4528</pre></td></tr> 4529 4530 4531<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName1')"><a name="hasAnyOperatorName1Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 4532<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the 4533specified names. 4534 4535 hasAnyOperatorName("+", "-") 4536 Is equivalent to 4537 anyOf(hasOperatorName("+"), hasOperatorName("-")) 4538</pre></td></tr> 4539 4540 4541<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> 4542<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 4543unary). 4544 4545Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 4546 !(a || b) 4547</pre></td></tr> 4548 4549 4550<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> 4551<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed 4552to '.'. 4553 4554Member calls on the implicit this pointer match as called with '->'. 4555 4556Given 4557 class Y { 4558 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 4559 template <class T> void f() { this->f<T>(); f<T>(); } 4560 int a; 4561 static int b; 4562 }; 4563 template <class T> 4564 class Z { 4565 void x() { this->m; } 4566 }; 4567memberExpr(isArrow()) 4568 matches this->x, x, y.x, a, this->b 4569cxxDependentScopeMemberExpr(isArrow()) 4570 matches this->m 4571unresolvedMemberExpr(isArrow()) 4572 matches this->f<T>, f<T> 4573</pre></td></tr> 4574 4575 4576<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> 4577<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 4578 4579Example matches x, but not y, z, or a. 4580(matcher = varDecl(hasAutomaticStorageDuration()) 4581void f() { 4582 int x; 4583 static int y; 4584 thread_local int z; 4585} 4586int a; 4587</pre></td></tr> 4588 4589 4590<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> 4591<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 4592 4593Example matches y and z (matcher = varDecl(hasGlobalStorage()) 4594void f() { 4595 int x; 4596 static int y; 4597} 4598int z; 4599</pre></td></tr> 4600 4601 4602<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> 4603<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 4604non-static local variable. 4605 4606Example matches x (matcher = varDecl(hasLocalStorage()) 4607void f() { 4608 int x; 4609 static int y; 4610} 4611int z; 4612</pre></td></tr> 4613 4614 4615<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> 4616<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 4617It includes the variable declared at namespace scope and those declared 4618with "static" and "extern" storage class specifiers. 4619 4620void f() { 4621 int x; 4622 static int y; 4623 thread_local int z; 4624} 4625int a; 4626static int b; 4627extern int c; 4628varDecl(hasStaticStorageDuration()) 4629 matches the function declaration y, a, b and c. 4630</pre></td></tr> 4631 4632 4633<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> 4634<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 4635 4636Example matches z, but not x, z, or a. 4637(matcher = varDecl(hasThreadStorageDuration()) 4638void f() { 4639 int x; 4640 static int y; 4641 thread_local int z; 4642} 4643int a; 4644</pre></td></tr> 4645 4646 4647<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> 4648<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations, 4649 and if constexpr. 4650 4651Given: 4652 constexpr int foo = 42; 4653 constexpr int bar(); 4654 void baz() { if constexpr(1 > 0) {} } 4655varDecl(isConstexpr()) 4656 matches the declaration of foo. 4657functionDecl(isConstexpr()) 4658 matches the declaration of bar. 4659ifStmt(isConstexpr()) 4660 matches the if statement in baz. 4661</pre></td></tr> 4662 4663 4664<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> 4665<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 4666 4667Example matches A, va, fa 4668 class A {}; 4669 class B; // Doesn't match, as it has no body. 4670 int va; 4671 extern int vb; // Doesn't match, as it doesn't define the variable. 4672 void fa() {} 4673 void fb(); // Doesn't match, as it has no body. 4674 @interface X 4675 - (void)ma; // Doesn't match, interface is declaration. 4676 @end 4677 @implementation X 4678 - (void)ma {} 4679 @end 4680 4681Usable 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>>, 4682 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4683</pre></td></tr> 4684 4685 4686<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> 4687<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 4688a C++ catch block, or an Objective-C statement. 4689 4690Example matches x (matcher = varDecl(isExceptionVariable()) 4691void f(int y) { 4692 try { 4693 } catch (int x) { 4694 } 4695} 4696</pre></td></tr> 4697 4698 4699<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> 4700<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 4701static member variable template instantiations. 4702 4703Given 4704 template<typename T> void A(T t) { } 4705 template<> void A(int N) { } 4706functionDecl(isExplicitTemplateSpecialization()) 4707 matches the specialization A<int>(). 4708 4709Usable 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>> 4710</pre></td></tr> 4711 4712 4713<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> 4714<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 4715 4716Given: 4717 extern "C" void f() {} 4718 extern "C" { void g() {} } 4719 void h() {} 4720 extern "C" int x = 1; 4721 extern "C" int y = 2; 4722 int z = 3; 4723functionDecl(isExternC()) 4724 matches the declaration of f and g, but not the declaration of h. 4725varDecl(isExternC()) 4726 matches the declaration of x and y, but not the declaration of z. 4727</pre></td></tr> 4728 4729 4730<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> 4731<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope. 4732 4733Example matches y (matcher = varDecl(isStaticLocal())) 4734void f() { 4735 int x; 4736 static int y; 4737} 4738static int z; 4739</pre></td></tr> 4740 4741 4742<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> 4743<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage 4744class specifier ("static" keyword) written in the source. 4745 4746Given: 4747 static void f() {} 4748 static int i = 0; 4749 extern int j; 4750 int k; 4751functionDecl(isStaticStorageClass()) 4752 matches the function declaration f. 4753varDecl(isStaticStorageClass()) 4754 matches the variable declaration i. 4755</pre></td></tr> 4756 4757 4758<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> 4759<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 4760member variable template instantiations. 4761 4762Given 4763 template <typename T> class X {}; class A {}; X<A> x; 4764or 4765 template <typename T> class X {}; class A {}; template class X<A>; 4766or 4767 template <typename T> class X {}; class A {}; extern template class X<A>; 4768cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4769 matches the template instantiation of X<A>. 4770 4771But given 4772 template <typename T> class X {}; class A {}; 4773 template <> class X<A> {}; X<A> x; 4774cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4775 does not match, as X<A> is an explicit template specialization. 4776 4777Usable 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>> 4778</pre></td></tr> 4779 4780<!--END_NARROWING_MATCHERS --> 4781</table> 4782 4783<!-- ======================================================================= --> 4784<h2 id="traversal-matchers">AST Traversal Matchers</h2> 4785<!-- ======================================================================= --> 4786 4787<p>Traversal matchers specify the relationship to other nodes that are 4788reachable from the current node.</p> 4789 4790<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 4791forEachDescendant) which work on all nodes and allow users to write more generic 4792match expressions.</p> 4793 4794<table> 4795<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 4796<!-- START_TRAVERSAL_MATCHERS --> 4797 4798<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 4799<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 4800 4801Unlike anyOf, eachOf will generate a match result for each 4802matching submatcher. 4803 4804For example, in: 4805 class A { int a; int b; }; 4806The matcher: 4807 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 4808 has(fieldDecl(hasName("b")).bind("v")))) 4809will generate two results binding "v", the first of which binds 4810the field declaration of a, the second the field declaration of 4811b. 4812 4813Usable as: Any Matcher 4814</pre></td></tr> 4815 4816 4817<tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr> 4818<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 4819 4820Generates results for each match. 4821 4822For example, in: 4823 class A { class B {}; class C {}; }; 4824The matcher: 4825 cxxRecordDecl(hasName("::A"), 4826 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 4827will generate results for A, B and C. 4828 4829Usable as: Any Matcher 4830</pre></td></tr> 4831 4832 4833<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 4834<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 4835provided matcher. 4836 4837Example matches X, A, A::X, B, B::C, B::C::X 4838 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 4839 class X {}; 4840 class A { class X {}; }; // Matches A, because A::X is a class of name 4841 // X inside A. 4842 class B { class C { class X {}; }; }; 4843 4844DescendantT must be an AST base type. 4845 4846As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 4847each result that matches instead of only on the first one. 4848 4849Note: Recursively combined ForEachDescendant can cause many matches: 4850 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 4851 forEachDescendant(cxxRecordDecl()) 4852 ))) 4853will match 10 times (plus injected class name matches) on: 4854 class A { class B { class C { class D { class E {}; }; }; }; }; 4855 4856Usable as: Any Matcher 4857</pre></td></tr> 4858 4859 4860<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 4861<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 4862provided matcher. 4863 4864Example matches X, Y, Y::X, Z::Y, Z::Y::X 4865 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 4866 class X {}; 4867 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X 4868 // inside Y. 4869 class Z { class Y { class X {}; }; }; // Does not match Z. 4870 4871ChildT must be an AST base type. 4872 4873As opposed to 'has', 'forEach' will cause a match for each result that 4874matches instead of only on the first one. 4875 4876Usable as: Any Matcher 4877</pre></td></tr> 4878 4879 4880<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 4881<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 4882matcher. 4883 4884Given 4885void f() { if (true) { int x = 42; } } 4886void g() { for (;;) { int x = 43; } } 4887expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 4888 4889Usable as: Any Matcher 4890</pre></td></tr> 4891 4892 4893<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 4894<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 4895provided matcher. 4896 4897Example matches X, Y, Z 4898 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 4899 class X {}; // Matches X, because X::X is a class of name X inside X. 4900 class Y { class X {}; }; 4901 class Z { class Y { class X {}; }; }; 4902 4903DescendantT must be an AST base type. 4904 4905Usable as: Any Matcher 4906</pre></td></tr> 4907 4908 4909<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 4910<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 4911provided matcher. 4912 4913Example matches X, Y 4914 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 4915 class X {}; // Matches X, because X::X is a class of name X inside X. 4916 class Y { class X {}; }; 4917 class Z { class Y { class X {}; }; }; // Does not match Z. 4918 4919ChildT must be an AST base type. 4920 4921Usable as: Any Matcher 4922Note that has is direct matcher, so it also matches things like implicit 4923casts and paren casts. If you are matching with expr then you should 4924probably consider using ignoringParenImpCasts like: 4925has(ignoringParenImpCasts(expr())). 4926</pre></td></tr> 4927 4928 4929<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 4930<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 4931matcher. 4932 4933Given 4934void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 4935compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 4936 4937Usable as: Any Matcher 4938</pre></td></tr> 4939 4940 4941<tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr> 4942<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher. 4943 4944However, optionally will retain any bindings generated by the submatcher. 4945Useful when additional information which may or may not present about a main 4946matching node is desired. 4947 4948For example, in: 4949 class Foo { 4950 int bar; 4951 } 4952The matcher: 4953 cxxRecordDecl( 4954 optionally(has( 4955 fieldDecl(hasName("bar")).bind("var") 4956 ))).bind("record") 4957will produce a result binding for both "record" and "var". 4958The matcher will produce a "record" binding for even if there is no data 4959member named "bar" in that class. 4960 4961Usable as: Any Matcher 4962</pre></td></tr> 4963 4964 4965<tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr> 4966<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind. 4967 4968Given 4969 void foo() 4970 { 4971 int i = 3.0; 4972 } 4973The matcher 4974 traverse(TK_IgnoreImplicitCastsAndParentheses, 4975 varDecl(hasInitializer(floatLiteral().bind("init"))) 4976 ) 4977matches the variable declaration with "init" bound to the "3.0". 4978</pre></td></tr> 4979 4980 4981<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> 4982<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 4983switch statement or conditional operator. 4984 4985Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4986 if (true) {} 4987</pre></td></tr> 4988 4989 4990<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> 4991<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 4992(binary or ternary). 4993 4994Example matches b 4995 condition ? a : b 4996 condition ?: b 4997</pre></td></tr> 4998 4999 5000<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> 5001<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 5002 5003Example 1 (conditional ternary operator): matches a 5004 condition ? a : b 5005 5006Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 5007 condition ?: b 5008</pre></td></tr> 5009 5010 5011<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5012<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 5013matches the given matcher. 5014 5015The associated declaration is: 5016- for type nodes, the declaration of the underlying type 5017- for CallExpr, the declaration of the callee 5018- for MemberExpr, the declaration of the referenced member 5019- for CXXConstructExpr, the declaration of the constructor 5020- for CXXNewExpr, the declaration of the operator new 5021- for ObjCIvarExpr, the declaration of the ivar 5022 5023For type nodes, hasDeclaration will generally match the declaration of the 5024sugared type. Given 5025 class X {}; 5026 typedef X Y; 5027 Y y; 5028in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5029typedefDecl. A common use case is to match the underlying, desugared type. 5030This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5031 varDecl(hasType(hasUnqualifiedDesugaredType( 5032 recordType(hasDeclaration(decl()))))) 5033In this matcher, the decl will match the CXXRecordDecl of class X. 5034 5035Usable 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>>, 5036 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>>, 5037 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>>, 5038 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>>, 5039 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>>, 5040 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>>, 5041 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5042</pre></td></tr> 5043 5044 5045<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> 5046<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 5047 5048Given 5049 int i[5]; 5050 void f() { i[1] = 42; } 5051arraySubscriptExpression(hasBase(implicitCastExpr( 5052 hasSourceExpression(declRefExpr())))) 5053 matches i[1] with the declRefExpr() matching i 5054</pre></td></tr> 5055 5056 5057<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> 5058<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 5059 5060Given 5061 int i[5]; 5062 void f() { i[1] = 42; } 5063arraySubscriptExpression(hasIndex(integerLiteral())) 5064 matches i[1] with the integerLiteral() matching 1 5065</pre></td></tr> 5066 5067 5068<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> 5069<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 5070 5071Example matches a (matcher = binaryOperator(hasLHS())) 5072 a || b 5073</pre></td></tr> 5074 5075 5076<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> 5077<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 5078 5079Example matches b (matcher = binaryOperator(hasRHS())) 5080 a || b 5081</pre></td></tr> 5082 5083 5084<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> 5085<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 5086type. 5087 5088Given 5089 struct A {}; 5090 A a[7]; 5091 int b[7]; 5092arrayType(hasElementType(builtinType())) 5093 matches "int b[7]" 5094 5095Usable 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>> 5096</pre></td></tr> 5097 5098 5099<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> 5100<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 5101 5102Given 5103 _Atomic(int) i; 5104 _Atomic(float) f; 5105atomicType(hasValueType(isInteger())) 5106 matches "_Atomic(int) i" 5107 5108Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 5109</pre></td></tr> 5110 5111 5112<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> 5113<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 5114 5115Note: There is no TypeLoc for the deduced type and thus no 5116getDeducedLoc() matcher. 5117 5118Given 5119 auto a = 1; 5120 auto b = 2.0; 5121autoType(hasDeducedType(isInteger())) 5122 matches "auto a" 5123 5124Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 5125</pre></td></tr> 5126 5127 5128<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5129<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 5130binary operator matches. 5131</pre></td></tr> 5132 5133 5134<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> 5135<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 5136 5137Example matches a (matcher = binaryOperator(hasLHS())) 5138 a || b 5139</pre></td></tr> 5140 5141 5142<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasOperands0')"><a name="hasOperands0Anchor">hasOperands</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher1, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher2</td></tr> 5143<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator. 5144 5145Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 5146 integerLiteral(equals(2))) 5147 1 + 2 // Match 5148 2 + 1 // Match 5149 1 + 1 // No match 5150 2 + 2 // No match 5151</pre></td></tr> 5152 5153 5154<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> 5155<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 5156 5157Example matches b (matcher = binaryOperator(hasRHS())) 5158 a || b 5159</pre></td></tr> 5160 5161 5162<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> 5163<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 5164block. 5165 5166Does not match the 'this' parameter of a method. 5167 5168Given 5169 class X { void f(int x, int y, int z) {} }; 5170cxxMethodDecl(hasAnyParameter(hasName("y"))) 5171 matches f(int x, int y, int z) {} 5172with hasAnyParameter(...) 5173 matching int y 5174 5175For ObjectiveC, given 5176 @interface I - (void) f:(int) y; @end 5177 5178the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 5179matches the declaration of method f with hasParameter 5180matching y. 5181 5182For blocks, given 5183 b = ^(int y) { printf("%d", y) }; 5184 5185the matcher blockDecl(hasAnyParameter(hasName("y"))) 5186matches the declaration of the block b with hasParameter 5187matching y. 5188</pre></td></tr> 5189 5190 5191<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> 5192<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 5193declaration or a block. 5194 5195Given 5196 class X { void f(int x) {} }; 5197cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 5198 matches f(int x) {} 5199with hasParameter(...) 5200 matching int x 5201 5202For ObjectiveC, given 5203 @interface I - (void) f:(int) y; @end 5204 5205the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 5206matches the declaration of method f with hasParameter 5207matching y. 5208</pre></td></tr> 5209 5210 5211<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> 5212<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 5213pointee matches a given matcher. 5214 5215Given 5216 int *a; 5217 int const *b; 5218 float const *f; 5219pointerType(pointee(isConstQualified(), isInteger())) 5220 matches "int const *b" 5221 5222Usable 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>>, 5223 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>> 5224</pre></td></tr> 5225 5226 5227<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasType7')"><a name="hasType7Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5228<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value 5229declaration's type. 5230 5231In case of a value declaration (for example a variable declaration), 5232this resolves one layer of indirection. For example, in the value 5233declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 5234X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 5235declaration of x. 5236 5237Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5238 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5239 and friend class X (matcher = friendDecl(hasType("X")) 5240 class X {}; 5241 void y(X &x) { x; X z; } 5242 class Y { friend class X; }; 5243 5244Example matches class Derived 5245(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 5246class Base {}; 5247class Derived : Base {}; 5248 5249Usable 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_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>, 5250Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 5251</pre></td></tr> 5252 5253 5254<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> 5255<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 5256 5257Given 5258 void f(int i); 5259 int y; 5260 f(y); 5261callExpr( 5262 forEachArgumentWithParam( 5263 declRefExpr(to(varDecl(hasName("y")))), 5264 parmVarDecl(hasType(isInteger())) 5265)) 5266 matches f(y); 5267with declRefExpr(...) 5268 matching int y 5269and parmVarDecl(...) 5270 matching int i 5271</pre></td></tr> 5272 5273 5274<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> 5275<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 5276expression, or an ObjC-message-send expression. 5277 5278Given 5279 void x(int, int, int) { int y; x(1, y, 42); } 5280callExpr(hasAnyArgument(declRefExpr())) 5281 matches x(1, y, 42) 5282with hasAnyArgument(...) 5283 matching y 5284 5285For ObjectiveC, given 5286 @interface I - (void) f:(int) y; @end 5287 void foo(I *i) { [i f:12]; } 5288objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5289 matches [i f:12] 5290</pre></td></tr> 5291 5292 5293<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> 5294<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 5295call expression. 5296 5297Example matches y in x(y) 5298 (matcher = callExpr(hasArgument(0, declRefExpr()))) 5299 void x(int) { int y; x(y); } 5300</pre></td></tr> 5301 5302 5303<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5304<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 5305matches the given matcher. 5306 5307The associated declaration is: 5308- for type nodes, the declaration of the underlying type 5309- for CallExpr, the declaration of the callee 5310- for MemberExpr, the declaration of the referenced member 5311- for CXXConstructExpr, the declaration of the constructor 5312- for CXXNewExpr, the declaration of the operator new 5313- for ObjCIvarExpr, the declaration of the ivar 5314 5315For type nodes, hasDeclaration will generally match the declaration of the 5316sugared type. Given 5317 class X {}; 5318 typedef X Y; 5319 Y y; 5320in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5321typedefDecl. A common use case is to match the underlying, desugared type. 5322This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5323 varDecl(hasType(hasUnqualifiedDesugaredType( 5324 recordType(hasDeclaration(decl()))))) 5325In this matcher, the decl will match the CXXRecordDecl of class X. 5326 5327Usable 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>>, 5328 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>>, 5329 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>>, 5330 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>>, 5331 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>>, 5332 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>>, 5333 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5334</pre></td></tr> 5335 5336 5337<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> 5338<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 5339 5340Given 5341 class A { A() : i(42), j(42) {} int i; int j; }; 5342cxxConstructorDecl(forEachConstructorInitializer( 5343 forField(decl().bind("x")) 5344)) 5345 will trigger two matches, binding for 'i' and 'j' respectively. 5346</pre></td></tr> 5347 5348 5349<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> 5350<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 5351 5352Given 5353 struct Foo { 5354 Foo() : foo_(1) { } 5355 int foo_; 5356 }; 5357cxxRecordDecl(has(cxxConstructorDecl( 5358 hasAnyConstructorInitializer(anything()) 5359))) 5360 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 5361</pre></td></tr> 5362 5363 5364<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> 5365<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 5366 5367Given 5368 struct Foo { 5369 Foo() : foo_(1) { } 5370 int foo_; 5371 }; 5372cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 5373 forField(hasName("foo_")))))) 5374 matches Foo 5375with forField matching foo_ 5376</pre></td></tr> 5377 5378 5379<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> 5380<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 5381 5382Given 5383 struct Foo { 5384 Foo() : foo_(1) { } 5385 int foo_; 5386 }; 5387cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 5388 withInitializer(integerLiteral(equals(1))))))) 5389 matches Foo 5390with withInitializer matching (1) 5391</pre></td></tr> 5392 5393 5394<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> 5395<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 5396given matcher. Implicit object expressions are included; that is, it matches 5397use of implicit `this`. 5398 5399Given 5400 struct X { 5401 int m; 5402 int f(X x) { x.m; return m; } 5403 }; 5404memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 5405 matches `x.m`, but not `m`; however, 5406memberExpr(hasObjectExpression(hasType(pointsTo( 5407 cxxRecordDecl(hasName("X")))))) 5408 matches `m` (aka. `this->m`), but not `x.m`. 5409</pre></td></tr> 5410 5411 5412<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> 5413<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function 5414definition that has a given body. 5415 5416Given 5417 for (;;) {} 5418hasBody(compoundStmt()) 5419 matches 'for (;;) {}' 5420with compoundStmt() 5421 matching '{}' 5422</pre></td></tr> 5423 5424 5425<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasInitStatement2')"><a name="hasInitStatement2Anchor">hasInitStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 5426<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer. 5427 5428Given: 5429 void foo() { 5430 if (int i = foobar(); i > 0) {} 5431 switch (int i = foobar(); i) {} 5432 for (auto& a = get_range(); auto& x : a) {} 5433 } 5434 void bar() { 5435 if (foobar() > 0) {} 5436 switch (foobar()) {} 5437 for (auto& x : get_range()) {} 5438 } 5439ifStmt(hasInitStatement(anything())) 5440 matches the if statement in foo but not in bar. 5441switchStmt(hasInitStatement(anything())) 5442 matches the switch statement in foo but not in bar. 5443cxxForRangeStmt(hasInitStatement(anything())) 5444 matches the range for statement in foo but not in bar. 5445</pre></td></tr> 5446 5447 5448<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> 5449<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 5450 5451Example: 5452 forStmt(hasLoopVariable(anything())) 5453matches 'int x' in 5454 for (int x : a) { } 5455</pre></td></tr> 5456 5457 5458<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> 5459<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 5460 5461Example: 5462 forStmt(hasRangeInit(anything())) 5463matches 'a' in 5464 for (int x : a) { } 5465</pre></td></tr> 5466 5467 5468<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> 5469<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 5470`on`, matches the argument directly without stripping away anything. 5471 5472Given 5473 class Y { public: void m(); }; 5474 Y g(); 5475 class X : public Y { void g(); }; 5476 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 5477cxxMemberCallExpr(onImplicitObjectArgument(hasType( 5478 cxxRecordDecl(hasName("Y"))))) 5479 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 5480cxxMemberCallExpr(on(callExpr())) 5481 does not match `(g()).m()`, because the parens are not ignored. 5482 5483FIXME: Overload to allow directly matching types? 5484</pre></td></tr> 5485 5486 5487<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> 5488<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 5489stripping off any parentheses or implicit casts. 5490 5491Given 5492 class Y { public: void m(); }; 5493 Y g(); 5494 class X : public Y {}; 5495 void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 5496cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 5497 matches `y.m()` and `(g()).m()`. 5498cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 5499 matches `x.m()`. 5500cxxMemberCallExpr(on(callExpr())) 5501 matches `(g()).m()`. 5502 5503FIXME: Overload to allow directly matching types? 5504</pre></td></tr> 5505 5506 5507<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> 5508<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 5509</pre></td></tr> 5510 5511 5512<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> 5513<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 5514matches the InnerMatcher, or is a pointer to a type that matches the 5515InnerMatcher. 5516 5517Given 5518 class Y { public: void m(); }; 5519 class X : public Y { void g(); }; 5520 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 5521cxxMemberCallExpr(thisPointerType(hasDeclaration( 5522 cxxRecordDecl(hasName("Y"))))) 5523 matches `y.m()`, `p->m()` and `x.m()`. 5524cxxMemberCallExpr(thisPointerType(hasDeclaration( 5525 cxxRecordDecl(hasName("X"))))) 5526 matches `x.g()`. 5527</pre></td></tr> 5528 5529 5530<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> 5531<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 5532produce multiple matches. 5533 5534Given 5535 class A { virtual void f(); }; 5536 class B : public A { void f(); }; 5537 class C : public B { void f(); }; 5538cxxMethodDecl(ofClass(hasName("C")), 5539 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 5540 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 5541 that B::f is not overridden by C::f). 5542 5543The check can produce multiple matches in case of multiple inheritance, e.g. 5544 class A1 { virtual void f(); }; 5545 class A2 { virtual void f(); }; 5546 class C : public A1, public A2 { void f(); }; 5547cxxMethodDecl(ofClass(hasName("C")), 5548 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 5549 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 5550 once with "b" binding "A2::f" and "d" binding "C::f". 5551</pre></td></tr> 5552 5553 5554<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> 5555<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 5556belongs to. 5557 5558FIXME: Generalize this for other kinds of declarations. 5559FIXME: What other kind of declarations would we need to generalize 5560this to? 5561 5562Example matches A() in the last line 5563 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 5564 ofClass(hasName("A")))))) 5565 class A { 5566 public: 5567 A(); 5568 }; 5569 A a = A(); 5570</pre></td></tr> 5571 5572 5573<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasAnyPlacementArg0')"><a name="hasAnyPlacementArg0Anchor">hasAnyPlacementArg</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5574<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments. 5575 5576Given: 5577 MyClass *p1 = new (Storage) MyClass(); 5578cxxNewExpr(hasAnyPlacementArg(anything())) 5579 matches the expression 'new (Storage, 16) MyClass()'. 5580</pre></td></tr> 5581 5582 5583<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> 5584<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 5585 5586Given: 5587 MyClass *p1 = new MyClass[10]; 5588cxxNewExpr(hasArraySize(integerLiteral(equals(10)))) 5589 matches the expression 'new MyClass[10]'. 5590</pre></td></tr> 5591 5592 5593<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5594<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 5595matches the given matcher. 5596 5597The associated declaration is: 5598- for type nodes, the declaration of the underlying type 5599- for CallExpr, the declaration of the callee 5600- for MemberExpr, the declaration of the referenced member 5601- for CXXConstructExpr, the declaration of the constructor 5602- for CXXNewExpr, the declaration of the operator new 5603- for ObjCIvarExpr, the declaration of the ivar 5604 5605For type nodes, hasDeclaration will generally match the declaration of the 5606sugared type. Given 5607 class X {}; 5608 typedef X Y; 5609 Y y; 5610in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5611typedefDecl. A common use case is to match the underlying, desugared type. 5612This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5613 varDecl(hasType(hasUnqualifiedDesugaredType( 5614 recordType(hasDeclaration(decl()))))) 5615In this matcher, the decl will match the CXXRecordDecl of class X. 5616 5617Usable 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>>, 5618 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>>, 5619 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>>, 5620 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>>, 5621 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>>, 5622 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>>, 5623 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5624</pre></td></tr> 5625 5626 5627<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasPlacementArg0')"><a name="hasPlacementArg0Anchor">hasPlacementArg</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5628<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments. 5629 5630Given: 5631 MyClass *p1 = new (Storage, 16) MyClass(); 5632cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16)))) 5633 matches the expression 'new (Storage, 16) MyClass()'. 5634</pre></td></tr> 5635 5636 5637<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasAnyBase0')"><a name="hasAnyBase0Anchor">hasAnyBase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> BaseSpecMatcher</td></tr> 5638<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher. 5639 5640Example: 5641matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))) 5642 class Foo; 5643 class Bar : Foo {}; 5644 class Baz : Bar {}; 5645 class SpecialBase; 5646 class Proxy : SpecialBase {}; // matches Proxy 5647 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived 5648 5649FIXME: Refactor this and isDerivedFrom to reuse implementation. 5650</pre></td></tr> 5651 5652 5653<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> 5654<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 5655 5656Given: 5657 class A { void func(); }; 5658 class B { void member(); }; 5659 5660cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 5661A but not B. 5662</pre></td></tr> 5663 5664 5665<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> 5666<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class 5667matching Base, or Objective-C classes that directly or indirectly 5668subclass a class matching Base. 5669 5670Note that a class is not considered to be derived from itself. 5671 5672Example matches Y, Z, C (Base == hasName("X")) 5673 class X; 5674 class Y : public X {}; // directly derived 5675 class Z : public Y {}; // indirectly derived 5676 typedef X A; 5677 typedef A B; 5678 class C : public B {}; // derived from a typedef of X 5679 5680In the following example, Bar matches isDerivedFrom(hasName("X")): 5681 class Foo; 5682 typedef Foo X; 5683 class Bar : public Foo {}; // derived from a type that X is a typedef of 5684 5685In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 5686 @interface NSObject @end 5687 @interface Bar : NSObject @end 5688 5689Usable 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>> 5690</pre></td></tr> 5691 5692 5693<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> 5694<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class 5695matching Base. 5696 5697Note that a class is not considered to be derived from itself. 5698 5699Example matches Y, C (Base == hasName("X")) 5700 class X; 5701 class Y : public X {}; // directly derived 5702 class Z : public Y {}; // indirectly derived 5703 typedef X A; 5704 typedef A B; 5705 class C : public B {}; // derived from a typedef of X 5706 5707In the following example, Bar matches isDerivedFrom(hasName("X")): 5708 class Foo; 5709 typedef Foo X; 5710 class Bar : public Foo {}; // derived from a type that X is a typedef of 5711</pre></td></tr> 5712 5713 5714<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> 5715<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 5716match Base. 5717</pre></td></tr> 5718 5719 5720<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> 5721<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 5722expression, or an ObjC-message-send expression. 5723 5724Given 5725 void x(int, int, int) { int y; x(1, y, 42); } 5726callExpr(hasAnyArgument(declRefExpr())) 5727 matches x(1, y, 42) 5728with hasAnyArgument(...) 5729 matching y 5730 5731For ObjectiveC, given 5732 @interface I - (void) f:(int) y; @end 5733 void foo(I *i) { [i f:12]; } 5734objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5735 matches [i f:12] 5736</pre></td></tr> 5737 5738 5739<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> 5740<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 5741given matcher. 5742 5743Example matches y.x() (matcher = callExpr(callee( 5744 cxxMethodDecl(hasName("x"))))) 5745 class Y { public: void x(); }; 5746 void z() { Y y; y.x(); } 5747</pre></td></tr> 5748 5749 5750<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> 5751<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 5752 5753Given 5754 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 5755 void f() { f(); } 5756callExpr(callee(expr())) 5757 matches this->x(), x(), y.x(), f() 5758with callee(...) 5759 matching this->x, x, y.x, f respectively 5760 5761Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 5762because this introduces ambiguous overloads with calls to Callee taking a 5763internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 5764implemented in terms of implicit casts. 5765</pre></td></tr> 5766 5767 5768<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> 5769<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 5770 5771Given 5772 void f(int i); 5773 int y; 5774 f(y); 5775callExpr( 5776 forEachArgumentWithParam( 5777 declRefExpr(to(varDecl(hasName("y")))), 5778 parmVarDecl(hasType(isInteger())) 5779)) 5780 matches f(y); 5781with declRefExpr(...) 5782 matching int y 5783and parmVarDecl(...) 5784 matching int i 5785</pre></td></tr> 5786 5787 5788<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> 5789<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 5790expression, or an ObjC-message-send expression. 5791 5792Given 5793 void x(int, int, int) { int y; x(1, y, 42); } 5794callExpr(hasAnyArgument(declRefExpr())) 5795 matches x(1, y, 42) 5796with hasAnyArgument(...) 5797 matching y 5798 5799For ObjectiveC, given 5800 @interface I - (void) f:(int) y; @end 5801 void foo(I *i) { [i f:12]; } 5802objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5803 matches [i f:12] 5804</pre></td></tr> 5805 5806 5807<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> 5808<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 5809call expression. 5810 5811Example matches y in x(y) 5812 (matcher = callExpr(hasArgument(0, declRefExpr()))) 5813 void x(int) { int y; x(y); } 5814</pre></td></tr> 5815 5816 5817<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5818<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 5819matches the given matcher. 5820 5821The associated declaration is: 5822- for type nodes, the declaration of the underlying type 5823- for CallExpr, the declaration of the callee 5824- for MemberExpr, the declaration of the referenced member 5825- for CXXConstructExpr, the declaration of the constructor 5826- for CXXNewExpr, the declaration of the operator new 5827- for ObjCIvarExpr, the declaration of the ivar 5828 5829For type nodes, hasDeclaration will generally match the declaration of the 5830sugared type. Given 5831 class X {}; 5832 typedef X Y; 5833 Y y; 5834in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5835typedefDecl. A common use case is to match the underlying, desugared type. 5836This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5837 varDecl(hasType(hasUnqualifiedDesugaredType( 5838 recordType(hasDeclaration(decl()))))) 5839In this matcher, the decl will match the CXXRecordDecl of class X. 5840 5841Usable 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>>, 5842 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>>, 5843 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>>, 5844 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>>, 5845 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>>, 5846 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>>, 5847 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5848</pre></td></tr> 5849 5850 5851<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> 5852<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 5853extension, matches the constant given in the statement. 5854 5855Given 5856 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 5857caseStmt(hasCaseConstant(integerLiteral())) 5858 matches "case 1:" 5859</pre></td></tr> 5860 5861 5862<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> 5863<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 5864or opaque value's source expression matches the given matcher. 5865 5866Example 1: matches "a string" 5867(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 5868class URL { URL(string); }; 5869URL url = "a string"; 5870 5871Example 2: matches 'b' (matcher = 5872opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 5873int a = b ?: 1; 5874</pre></td></tr> 5875 5876 5877<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> 5878<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 5879functionDecl that have at least one TemplateArgument matching the given 5880InnerMatcher. 5881 5882Given 5883 template<typename T> class A {}; 5884 template<> class A<double> {}; 5885 A<int> a; 5886 5887 template<typename T> f() {}; 5888 void func() { f<int>(); }; 5889 5890classTemplateSpecializationDecl(hasAnyTemplateArgument( 5891 refersToType(asString("int")))) 5892 matches the specialization A<int> 5893 5894functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 5895 matches the specialization f<int> 5896</pre></td></tr> 5897 5898 5899<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> 5900<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 5901 5902Given 5903 template<typename T> class A {}; #1 5904 template<> class A<int> {}; #2 5905classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 5906 matches '#2' with classTemplateDecl() matching the class template 5907 declaration of 'A' at #1. 5908</pre></td></tr> 5909 5910 5911<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> 5912<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 5913functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 5914 5915Given 5916 template<typename T, typename U> class A {}; 5917 A<bool, int> b; 5918 A<int, bool> c; 5919 5920 template<typename T> void f() {} 5921 void func() { f<int>(); }; 5922classTemplateSpecializationDecl(hasTemplateArgument( 5923 1, refersToType(asString("int")))) 5924 matches the specialization A<bool, int> 5925 5926functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 5927 matches the specialization f<int> 5928</pre></td></tr> 5929 5930 5931<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> 5932<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 5933type. 5934 5935Given 5936 struct A {}; 5937 A a[7]; 5938 int b[7]; 5939arrayType(hasElementType(builtinType())) 5940 matches "int b[7]" 5941 5942Usable 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>> 5943</pre></td></tr> 5944 5945 5946<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> 5947<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 5948a given matcher. Also matches StmtExprs that have CompoundStmt as children. 5949 5950Given 5951 { {}; 1+2; } 5952hasAnySubstatement(compoundStmt()) 5953 matches '{ {}; 1+2; }' 5954with compoundStmt() 5955 matching '{}' 5956</pre></td></tr> 5957 5958 5959<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> 5960<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher 5961</pre></td></tr> 5962 5963 5964<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5965<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 5966matches the given matcher. 5967 5968The associated declaration is: 5969- for type nodes, the declaration of the underlying type 5970- for CallExpr, the declaration of the callee 5971- for MemberExpr, the declaration of the referenced member 5972- for CXXConstructExpr, the declaration of the constructor 5973- for CXXNewExpr, the declaration of the operator new 5974- for ObjCIvarExpr, the declaration of the ivar 5975 5976For type nodes, hasDeclaration will generally match the declaration of the 5977sugared type. Given 5978 class X {}; 5979 typedef X Y; 5980 Y y; 5981in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5982typedefDecl. A common use case is to match the underlying, desugared type. 5983This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5984 varDecl(hasType(hasUnqualifiedDesugaredType( 5985 recordType(hasDeclaration(decl()))))) 5986In this matcher, the decl will match the CXXRecordDecl of class X. 5987 5988Usable 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>>, 5989 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>>, 5990 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>>, 5991 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>>, 5992 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>>, 5993 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>>, 5994 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5995</pre></td></tr> 5996 5997 5998<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> 5999<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 6000specific using shadow declaration. 6001 6002Given 6003 namespace a { void f() {} } 6004 using a::f; 6005 void g() { 6006 f(); // Matches this .. 6007 a::f(); // .. but not this. 6008 } 6009declRefExpr(throughUsingDecl(anything())) 6010 matches f() 6011</pre></td></tr> 6012 6013 6014<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> 6015<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 6016specified matcher. 6017 6018Example matches x in if(x) 6019 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 6020 bool x; 6021 if (x) {} 6022</pre></td></tr> 6023 6024 6025<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> 6026<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 6027 6028Note that this does not work for global declarations because the AST 6029breaks up multiple-declaration DeclStmt's into multiple single-declaration 6030DeclStmt's. 6031Example: Given non-global declarations 6032 int a, b = 0; 6033 int c; 6034 int d = 2, e; 6035declStmt(containsDeclaration( 6036 0, varDecl(hasInitializer(anything())))) 6037 matches only 'int d = 2, e;', and 6038declStmt(containsDeclaration(1, varDecl())) 6039 matches 'int a, b = 0' as well as 'int d = 2, e;' 6040 but 'int c;' is not matched. 6041</pre></td></tr> 6042 6043 6044<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> 6045<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 6046 6047Given 6048 int a, b; 6049 int c; 6050declStmt(hasSingleDecl(anything())) 6051 matches 'int c;' but not 'int a, b;'. 6052</pre></td></tr> 6053 6054 6055<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> 6056<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 6057the inner matcher. 6058 6059Given 6060 int x; 6061declaratorDecl(hasTypeLoc(loc(asString("int")))) 6062 matches int x 6063</pre></td></tr> 6064 6065 6066<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> 6067<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 6068Decl, matches InnerMatcher. 6069 6070Given 6071 namespace N { 6072 namespace M { 6073 class D {}; 6074 } 6075 } 6076 6077cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 6078declaration of class D. 6079</pre></td></tr> 6080 6081 6082<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> 6083<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type. 6084 6085Given 6086 decltype(1) a = 1; 6087 decltype(2.0) b = 2.0; 6088decltypeType(hasUnderlyingType(isInteger())) 6089 matches the type of "a" 6090 6091Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>> 6092</pre></td></tr> 6093 6094 6095<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> 6096<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function 6097definition that has a given body. 6098 6099Given 6100 for (;;) {} 6101hasBody(compoundStmt()) 6102 matches 'for (;;) {}' 6103with compoundStmt() 6104 matching '{}' 6105</pre></td></tr> 6106 6107 6108<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> 6109<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 6110switch statement or conditional operator. 6111 6112Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6113 if (true) {} 6114</pre></td></tr> 6115 6116 6117<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> 6118<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 6119matches InnerMatcher if the qualifier exists. 6120 6121Given 6122 namespace N { 6123 namespace M { 6124 class D {}; 6125 } 6126 } 6127 N::M::D d; 6128 6129elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 6130matches the type of the variable declaration of d. 6131</pre></td></tr> 6132 6133 6134<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> 6135<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 6136 6137Given 6138 namespace N { 6139 namespace M { 6140 class D {}; 6141 } 6142 } 6143 N::M::D d; 6144 6145elaboratedType(namesType(recordType( 6146hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 6147declaration of d. 6148</pre></td></tr> 6149 6150 6151<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6152<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 6153matches the given matcher. 6154 6155The associated declaration is: 6156- for type nodes, the declaration of the underlying type 6157- for CallExpr, the declaration of the callee 6158- for MemberExpr, the declaration of the referenced member 6159- for CXXConstructExpr, the declaration of the constructor 6160- for CXXNewExpr, the declaration of the operator new 6161- for ObjCIvarExpr, the declaration of the ivar 6162 6163For type nodes, hasDeclaration will generally match the declaration of the 6164sugared type. Given 6165 class X {}; 6166 typedef X Y; 6167 Y y; 6168in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6169typedefDecl. A common use case is to match the underlying, desugared type. 6170This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6171 varDecl(hasType(hasUnqualifiedDesugaredType( 6172 recordType(hasDeclaration(decl()))))) 6173In this matcher, the decl will match the CXXRecordDecl of class X. 6174 6175Usable 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>>, 6176 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>>, 6177 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>>, 6178 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>>, 6179 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>>, 6180 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>>, 6181 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6182</pre></td></tr> 6183 6184 6185<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> 6186<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 6187 6188(Note: Clang's AST refers to other conversions as "casts" too, and calls 6189actual casts "explicit" casts.) 6190</pre></td></tr> 6191 6192 6193<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> 6194<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value 6195declaration's type. 6196 6197In case of a value declaration (for example a variable declaration), 6198this resolves one layer of indirection. For example, in the value 6199declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6200X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6201declaration of x. 6202 6203Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6204 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6205 and friend class X (matcher = friendDecl(hasType("X")) 6206 class X {}; 6207 void y(X &x) { x; X z; } 6208 class Y { friend class X; }; 6209 6210Example matches class Derived 6211(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6212class Base {}; 6213class Derived : Base {}; 6214 6215Usable 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_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>, 6216Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6217</pre></td></tr> 6218 6219 6220<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> 6221<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 6222matcher. 6223 6224Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6225 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6226 and U (matcher = typedefDecl(hasType(asString("int"))) 6227 and friend class X (matcher = friendDecl(hasType("X")) 6228 class X {}; 6229 void y(X &x) { x; X z; } 6230 typedef int U; 6231 class Y { friend class X; }; 6232</pre></td></tr> 6233 6234 6235<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> 6236<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 6237elidable constructor and other corresponding bookkeeping nodes. 6238 6239In C++17, elidable copy constructors are no longer being generated in the 6240AST as it is not permitted by the standard. They are, however, part of the 6241AST in C++14 and earlier. So, a matcher must abstract over these differences 6242to work in all language modes. This matcher skips elidable constructor-call 6243AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 6244various implicit nodes inside the constructor calls, all of which will not 6245appear in the C++17 AST. 6246 6247Given 6248 6249struct H {}; 6250H G(); 6251void f() { 6252 H D = G(); 6253} 6254 6255``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 6256matches ``H D = G()`` in C++11 through C++17 (and beyond). 6257</pre></td></tr> 6258 6259 6260<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> 6261<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 6262are stripped off. 6263 6264Parentheses and explicit casts are not discarded. 6265Given 6266 int arr[5]; 6267 int a = 0; 6268 char b = 0; 6269 const int c = a; 6270 int *d = arr; 6271 long e = (long) 0l; 6272The matchers 6273 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 6274 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 6275would match the declarations for a, b, c, and d, but not e. 6276While 6277 varDecl(hasInitializer(integerLiteral())) 6278 varDecl(hasInitializer(declRefExpr())) 6279only match the declarations for b, c, and d. 6280</pre></td></tr> 6281 6282 6283<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> 6284<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 6285nodes are stripped off. 6286 6287Parentheses and explicit casts are not discarded. 6288Given 6289 class C {}; 6290 C a = C(); 6291 C b; 6292 C c = b; 6293The matchers 6294 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 6295would match the declarations for a, b, and c. 6296While 6297 varDecl(hasInitializer(cxxConstructExpr())) 6298only match the declarations for b and c. 6299</pre></td></tr> 6300 6301 6302<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> 6303<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 6304casts are stripped off. 6305 6306Implicit and non-C Style casts are also discarded. 6307Given 6308 int a = 0; 6309 char b = (0); 6310 void* c = reinterpret_cast<char*>(0); 6311 char d = char(0); 6312The matcher 6313 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 6314would match the declarations for a, b, c, and d. 6315while 6316 varDecl(hasInitializer(integerLiteral())) 6317only match the declaration for a. 6318</pre></td></tr> 6319 6320 6321<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> 6322<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 6323parentheses are stripped off. 6324 6325Explicit casts are not discarded. 6326Given 6327 int arr[5]; 6328 int a = 0; 6329 char b = (0); 6330 const int c = a; 6331 int *d = (arr); 6332 long e = ((long) 0l); 6333The matchers 6334 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 6335 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 6336would match the declarations for a, b, c, and d, but not e. 6337while 6338 varDecl(hasInitializer(integerLiteral())) 6339 varDecl(hasInitializer(declRefExpr())) 6340would only match the declaration for a. 6341</pre></td></tr> 6342 6343 6344<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> 6345<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 6346 6347Given 6348 const char* str = ("my-string"); 6349The matcher 6350 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 6351would match the implicit cast resulting from the assignment. 6352</pre></td></tr> 6353 6354 6355<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> 6356<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 6357 6358Given 6359 class C { 6360 int a = 2; 6361 int b = 3; 6362 int c; 6363 }; 6364fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 6365 matches 'int a;' but not 'int b;'. 6366fieldDecl(hasInClassInitializer(anything())) 6367 matches 'int a;' and 'int b;' but not 'int c;'. 6368</pre></td></tr> 6369 6370 6371<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> 6372<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function 6373definition that has a given body. 6374 6375Given 6376 for (;;) {} 6377hasBody(compoundStmt()) 6378 matches 'for (;;) {}' 6379with compoundStmt() 6380 matching '{}' 6381</pre></td></tr> 6382 6383 6384<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> 6385<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 6386switch statement or conditional operator. 6387 6388Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6389 if (true) {} 6390</pre></td></tr> 6391 6392 6393<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> 6394<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 6395 6396Example: 6397 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 6398matches '++x' in 6399 for (x; x < N; ++x) { } 6400</pre></td></tr> 6401 6402 6403<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> 6404<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 6405 6406Example: 6407 forStmt(hasLoopInit(declStmt())) 6408matches 'int x = 0' in 6409 for (int x = 0; x < N; ++x) { } 6410</pre></td></tr> 6411 6412 6413<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> 6414<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 6415declaration's type. 6416 6417In case of a value declaration (for example a variable declaration), 6418this resolves one layer of indirection. For example, in the value 6419declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6420X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6421declaration of x. 6422 6423Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6424 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6425 and friend class X (matcher = friendDecl(hasType("X")) 6426 class X {}; 6427 void y(X &x) { x; X z; } 6428 class Y { friend class X; }; 6429 6430Example matches class Derived 6431(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6432class Base {}; 6433class Derived : Base {}; 6434 6435Usable 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_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>, 6436Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6437</pre></td></tr> 6438 6439 6440<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> 6441<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 6442matcher. 6443 6444Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6445 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6446 and U (matcher = typedefDecl(hasType(asString("int"))) 6447 and friend class X (matcher = friendDecl(hasType("X")) 6448 class X {}; 6449 void y(X &x) { x; X z; } 6450 typedef int U; 6451 class Y { friend class X; }; 6452</pre></td></tr> 6453 6454 6455<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> 6456<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 6457block. 6458 6459Does not match the 'this' parameter of a method. 6460 6461Given 6462 class X { void f(int x, int y, int z) {} }; 6463cxxMethodDecl(hasAnyParameter(hasName("y"))) 6464 matches f(int x, int y, int z) {} 6465with hasAnyParameter(...) 6466 matching int y 6467 6468For ObjectiveC, given 6469 @interface I - (void) f:(int) y; @end 6470 6471the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 6472matches the declaration of method f with hasParameter 6473matching y. 6474 6475For blocks, given 6476 b = ^(int y) { printf("%d", y) }; 6477 6478the matcher blockDecl(hasAnyParameter(hasName("y"))) 6479matches the declaration of the block b with hasParameter 6480matching y. 6481</pre></td></tr> 6482 6483 6484<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> 6485<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6486functionDecl that have at least one TemplateArgument matching the given 6487InnerMatcher. 6488 6489Given 6490 template<typename T> class A {}; 6491 template<> class A<double> {}; 6492 A<int> a; 6493 6494 template<typename T> f() {}; 6495 void func() { f<int>(); }; 6496 6497classTemplateSpecializationDecl(hasAnyTemplateArgument( 6498 refersToType(asString("int")))) 6499 matches the specialization A<int> 6500 6501functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 6502 matches the specialization f<int> 6503</pre></td></tr> 6504 6505 6506<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> 6507<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function 6508definition that has a given body. 6509 6510Given 6511 for (;;) {} 6512hasBody(compoundStmt()) 6513 matches 'for (;;) {}' 6514with compoundStmt() 6515 matching '{}' 6516</pre></td></tr> 6517 6518 6519<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> 6520<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 6521declaration. 6522 6523Given 6524 template<bool b> 6525 struct S { 6526 S(int); // #1 6527 explicit S(double); // #2 6528 operator int(); // #3 6529 explicit operator bool(); // #4 6530 explicit(false) S(bool) // # 7 6531 explicit(true) S(char) // # 8 6532 explicit(b) S(S) // # 9 6533 }; 6534 S(int) -> S<true> // #5 6535 explicit S(double) -> S<false> // #6 6536cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 6537cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 6538cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 6539</pre></td></tr> 6540 6541 6542<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> 6543<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 6544declaration or a block. 6545 6546Given 6547 class X { void f(int x) {} }; 6548cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6549 matches f(int x) {} 6550with hasParameter(...) 6551 matching int x 6552 6553For ObjectiveC, given 6554 @interface I - (void) f:(int) y; @end 6555 6556the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6557matches the declaration of method f with hasParameter 6558matching y. 6559</pre></td></tr> 6560 6561 6562<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> 6563<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6564functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 6565 6566Given 6567 template<typename T, typename U> class A {}; 6568 A<bool, int> b; 6569 A<int, bool> c; 6570 6571 template<typename T> void f() {} 6572 void func() { f<int>(); }; 6573classTemplateSpecializationDecl(hasTemplateArgument( 6574 1, refersToType(asString("int")))) 6575 matches the specialization A<bool, int> 6576 6577functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 6578 matches the specialization f<int> 6579</pre></td></tr> 6580 6581 6582<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> 6583<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 6584 6585Given: 6586 class X { int f() { return 1; } }; 6587cxxMethodDecl(returns(asString("int"))) 6588 matches int f() { return 1; } 6589</pre></td></tr> 6590 6591 6592<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> 6593<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 6594switch statement or conditional operator. 6595 6596Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6597 if (true) {} 6598</pre></td></tr> 6599 6600 6601<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> 6602<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 6603 6604Given 6605 if (A* a = GetAPointer()) {} 6606hasConditionVariableStatement(...) 6607 matches 'A* a = GetAPointer()'. 6608</pre></td></tr> 6609 6610 6611<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> 6612<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 6613 6614Examples matches the if statement 6615 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 6616 if (false) false; else true; 6617</pre></td></tr> 6618 6619 6620<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasInitStatement0')"><a name="hasInitStatement0Anchor">hasInitStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 6621<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 6622 6623Given: 6624 void foo() { 6625 if (int i = foobar(); i > 0) {} 6626 switch (int i = foobar(); i) {} 6627 for (auto& a = get_range(); auto& x : a) {} 6628 } 6629 void bar() { 6630 if (foobar() > 0) {} 6631 switch (foobar()) {} 6632 for (auto& x : get_range()) {} 6633 } 6634ifStmt(hasInitStatement(anything())) 6635 matches the if statement in foo but not in bar. 6636switchStmt(hasInitStatement(anything())) 6637 matches the switch statement in foo but not in bar. 6638cxxForRangeStmt(hasInitStatement(anything())) 6639 matches the range for statement in foo but not in bar. 6640</pre></td></tr> 6641 6642 6643<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> 6644<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 6645 6646Examples matches the if statement 6647 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 6648 if (false) true; else false; 6649</pre></td></tr> 6650 6651 6652<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> 6653<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 6654matcher. 6655 6656FIXME: Unit test this matcher 6657</pre></td></tr> 6658 6659 6660<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> 6661<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 6662 6663Example matches y. 6664 (matcher = initListExpr(hasInit(0, expr()))) 6665 int x{y}. 6666</pre></td></tr> 6667 6668 6669<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> 6670<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 6671(if expression have it). 6672</pre></td></tr> 6673 6674 6675<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6676<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 6677matches the given matcher. 6678 6679The associated declaration is: 6680- for type nodes, the declaration of the underlying type 6681- for CallExpr, the declaration of the callee 6682- for MemberExpr, the declaration of the referenced member 6683- for CXXConstructExpr, the declaration of the constructor 6684- for CXXNewExpr, the declaration of the operator new 6685- for ObjCIvarExpr, the declaration of the ivar 6686 6687For type nodes, hasDeclaration will generally match the declaration of the 6688sugared type. Given 6689 class X {}; 6690 typedef X Y; 6691 Y y; 6692in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6693typedefDecl. A common use case is to match the underlying, desugared type. 6694This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6695 varDecl(hasType(hasUnqualifiedDesugaredType( 6696 recordType(hasDeclaration(decl()))))) 6697In this matcher, the decl will match the CXXRecordDecl of class X. 6698 6699Usable 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>>, 6700 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>>, 6701 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>>, 6702 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>>, 6703 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>>, 6704 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>>, 6705 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6706</pre></td></tr> 6707 6708 6709<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6710<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 6711matches the given matcher. 6712 6713The associated declaration is: 6714- for type nodes, the declaration of the underlying type 6715- for CallExpr, the declaration of the callee 6716- for MemberExpr, the declaration of the referenced member 6717- for CXXConstructExpr, the declaration of the constructor 6718- for CXXNewExpr, the declaration of the operator new 6719- for ObjCIvarExpr, the declaration of the ivar 6720 6721For type nodes, hasDeclaration will generally match the declaration of the 6722sugared type. Given 6723 class X {}; 6724 typedef X Y; 6725 Y y; 6726in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6727typedefDecl. A common use case is to match the underlying, desugared type. 6728This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6729 varDecl(hasType(hasUnqualifiedDesugaredType( 6730 recordType(hasDeclaration(decl()))))) 6731In this matcher, the decl will match the CXXRecordDecl of class X. 6732 6733Usable 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>>, 6734 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>>, 6735 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>>, 6736 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>>, 6737 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>>, 6738 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>>, 6739 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6740</pre></td></tr> 6741 6742 6743<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>></td><td class="name" onclick="toggle('hasAnyCapture1')"><a name="hasAnyCapture1Anchor">hasAnyCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>> InnerMatcher</td></tr> 6744<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression. 6745 6746Given 6747 struct foo { 6748 void bar() { 6749 auto f = [this](){}; 6750 } 6751 } 6752lambdaExpr(hasAnyCapture(cxxThisExpr())) 6753 matches [this](){}; 6754</pre></td></tr> 6755 6756 6757<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>></td><td class="name" onclick="toggle('hasAnyCapture0')"><a name="hasAnyCapture0Anchor">hasAnyCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>> InnerMatcher</td></tr> 6758<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression. 6759 6760Given 6761 void foo() { 6762 int x; 6763 auto f = [x](){}; 6764 } 6765lambdaExpr(hasAnyCapture(anything())) 6766 matches [x](){}; 6767</pre></td></tr> 6768 6769 6770<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6771<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 6772matches the given matcher. 6773 6774The associated declaration is: 6775- for type nodes, the declaration of the underlying type 6776- for CallExpr, the declaration of the callee 6777- for MemberExpr, the declaration of the referenced member 6778- for CXXConstructExpr, the declaration of the constructor 6779- for CXXNewExpr, the declaration of the operator new 6780- for ObjCIvarExpr, the declaration of the ivar 6781 6782For type nodes, hasDeclaration will generally match the declaration of the 6783sugared type. Given 6784 class X {}; 6785 typedef X Y; 6786 Y y; 6787in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6788typedefDecl. A common use case is to match the underlying, desugared type. 6789This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6790 varDecl(hasType(hasUnqualifiedDesugaredType( 6791 recordType(hasDeclaration(decl()))))) 6792In this matcher, the decl will match the CXXRecordDecl of class X. 6793 6794Usable 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>>, 6795 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>>, 6796 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>>, 6797 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>>, 6798 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>>, 6799 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>>, 6800 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6801</pre></td></tr> 6802 6803 6804<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> 6805<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 6806given matcher. Implicit object expressions are included; that is, it matches 6807use of implicit `this`. 6808 6809Given 6810 struct X { 6811 int m; 6812 int f(X x) { x.m; return m; } 6813 }; 6814memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6815 matches `x.m`, but not `m`; however, 6816memberExpr(hasObjectExpression(hasType(pointsTo( 6817 cxxRecordDecl(hasName("X")))))) 6818 matches `m` (aka. `this->m`), but not `x.m`. 6819</pre></td></tr> 6820 6821 6822<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> 6823<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 6824given matcher. 6825 6826Given 6827 struct { int first, second; } first, second; 6828 int i(second.first); 6829 int j(first.second); 6830memberExpr(member(hasName("first"))) 6831 matches second.first 6832 but not first.second (because the member name there is "second"). 6833</pre></td></tr> 6834 6835 6836<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> 6837<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 6838pointee matches a given matcher. 6839 6840Given 6841 int *a; 6842 int const *b; 6843 float const *f; 6844pointerType(pointee(isConstQualified(), isInteger())) 6845 matches "int const *b" 6846 6847Usable 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>>, 6848 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>> 6849</pre></td></tr> 6850 6851 6852<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> 6853<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 6854matcher. 6855 6856Given 6857 namespace N { template<class T> void f(T t); } 6858 template <class T> void g() { using N::f; f(T()); } 6859unresolvedLookupExpr(hasAnyDeclaration( 6860 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 6861 matches the use of f in g() . 6862</pre></td></tr> 6863 6864 6865<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> 6866<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 6867 6868Given 6869 struct A { struct B { struct C {}; }; }; 6870 A::B::C c; 6871nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 6872 matches "A::" 6873</pre></td></tr> 6874 6875 6876<tr><td>Matcher<<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> 6877<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 6878NestedNameSpecifier-matcher matches. 6879</pre></td></tr> 6880 6881 6882<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> 6883<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 6884given TypeLoc. 6885 6886Given 6887 struct A { struct B { struct C {}; }; }; 6888 A::B::C c; 6889nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 6890 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 6891 matches "A::" 6892</pre></td></tr> 6893 6894 6895<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> 6896<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 6897 6898Given 6899 struct A { struct B { struct C {}; }; }; 6900 A::B::C c; 6901nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 6902 matches "A::" 6903</pre></td></tr> 6904 6905 6906<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> 6907<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 6908given namespace matcher. 6909 6910Given 6911 namespace ns { struct A {}; } 6912 ns::A a; 6913nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 6914 matches "ns::" 6915</pre></td></tr> 6916 6917 6918<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> 6919<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 6920given QualType matcher without qualifiers. 6921 6922Given 6923 struct A { struct B { struct C {}; }; }; 6924 A::B::C c; 6925nestedNameSpecifier(specifiesType( 6926 hasDeclaration(cxxRecordDecl(hasName("A"))) 6927)) 6928 matches "A::" 6929</pre></td></tr> 6930 6931 6932<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> 6933<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 6934 6935Given 6936 6937 #pragma omp parallel 6938 #pragma omp parallel default(none) 6939 6940``ompExecutableDirective(hasAnyClause(anything()))`` matches 6941``omp parallel default(none)``. 6942</pre></td></tr> 6943 6944 6945<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> 6946<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 6947 6948Prerequisite: the executable directive must not be standalone directive. 6949If it is, it will never match. 6950 6951Given 6952 6953 #pragma omp parallel 6954 ; 6955 #pragma omp parallel 6956 {} 6957 6958``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 6959</pre></td></tr> 6960 6961 6962<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> 6963<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 6964matching Base, or Objective-C classes that directly or indirectly 6965subclass a class matching Base. 6966 6967Note that a class is not considered to be derived from itself. 6968 6969Example matches Y, Z, C (Base == hasName("X")) 6970 class X; 6971 class Y : public X {}; // directly derived 6972 class Z : public Y {}; // indirectly derived 6973 typedef X A; 6974 typedef A B; 6975 class C : public B {}; // derived from a typedef of X 6976 6977In the following example, Bar matches isDerivedFrom(hasName("X")): 6978 class Foo; 6979 typedef Foo X; 6980 class Bar : public Foo {}; // derived from a type that X is a typedef of 6981 6982In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 6983 @interface NSObject @end 6984 @interface Bar : NSObject @end 6985 6986Usable 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>> 6987</pre></td></tr> 6988 6989 6990<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> 6991<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 6992matching Base. 6993 6994Note that a class is not considered to be derived from itself. 6995 6996Example matches Y, C (Base == hasName("X")) 6997 class X; 6998 class Y : public X {}; // directly derived 6999 class Z : public Y {}; // indirectly derived 7000 typedef X A; 7001 typedef A B; 7002 class C : public B {}; // derived from a typedef of X 7003 7004In the following example, Bar matches isDerivedFrom(hasName("X")): 7005 class Foo; 7006 typedef Foo X; 7007 class Bar : public Foo {}; // derived from a type that X is a typedef of 7008</pre></td></tr> 7009 7010 7011<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> 7012<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 7013match Base. 7014</pre></td></tr> 7015 7016 7017<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> 7018<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 7019expression, or an ObjC-message-send expression. 7020 7021Given 7022 void x(int, int, int) { int y; x(1, y, 42); } 7023callExpr(hasAnyArgument(declRefExpr())) 7024 matches x(1, y, 42) 7025with hasAnyArgument(...) 7026 matching y 7027 7028For ObjectiveC, given 7029 @interface I - (void) f:(int) y; @end 7030 void foo(I *i) { [i f:12]; } 7031objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 7032 matches [i f:12] 7033</pre></td></tr> 7034 7035 7036<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> 7037<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 7038call expression. 7039 7040Example matches y in x(y) 7041 (matcher = callExpr(hasArgument(0, declRefExpr()))) 7042 void x(int) { int y; x(y); } 7043</pre></td></tr> 7044 7045 7046<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> 7047<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 7048and the inner matcher matches on that instance. 7049 7050For example the method call in 7051 NSString *x = @"hello"; 7052 [x containsString:@"h"]; 7053is matched by 7054objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 7055</pre></td></tr> 7056 7057 7058<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> 7059<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 7060 7061Example 7062matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 7063matches the [webView ...] message invocation. 7064 NSString *webViewJavaScript = ... 7065 UIWebView *webView = ... 7066 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 7067</pre></td></tr> 7068 7069 7070<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> 7071<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 7072block. 7073 7074Does not match the 'this' parameter of a method. 7075 7076Given 7077 class X { void f(int x, int y, int z) {} }; 7078cxxMethodDecl(hasAnyParameter(hasName("y"))) 7079 matches f(int x, int y, int z) {} 7080with hasAnyParameter(...) 7081 matching int y 7082 7083For ObjectiveC, given 7084 @interface I - (void) f:(int) y; @end 7085 7086the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 7087matches the declaration of method f with hasParameter 7088matching y. 7089 7090For blocks, given 7091 b = ^(int y) { printf("%d", y) }; 7092 7093the matcher blockDecl(hasAnyParameter(hasName("y"))) 7094matches the declaration of the block b with hasParameter 7095matching y. 7096</pre></td></tr> 7097 7098 7099<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> 7100<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 7101declaration or a block. 7102 7103Given 7104 class X { void f(int x) {} }; 7105cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 7106 matches f(int x) {} 7107with hasParameter(...) 7108 matching int x 7109 7110For ObjectiveC, given 7111 @interface I - (void) f:(int) y; @end 7112 7113the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 7114matches the declaration of method f with hasParameter 7115matching y. 7116</pre></td></tr> 7117 7118 7119<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> 7120<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 7121or opaque value's source expression matches the given matcher. 7122 7123Example 1: matches "a string" 7124(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 7125class URL { URL(string); }; 7126URL url = "a string"; 7127 7128Example 2: matches 'b' (matcher = 7129opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 7130int a = b ?: 1; 7131</pre></td></tr> 7132 7133 7134<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> 7135<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 7136overloads matches the given matcher. 7137 7138Given 7139 template <typename T> void foo(T); 7140 template <typename T> void bar(T); 7141 template <typename T> void baz(T t) { 7142 foo(t); 7143 bar(t); 7144 } 7145unresolvedLookupExpr(hasAnyDeclaration( 7146 functionTemplateDecl(hasName("foo")))) 7147 matches foo in foo(t); but not bar in bar(t); 7148</pre></td></tr> 7149 7150 7151<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> 7152<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 7153 7154Given 7155 int (*ptr_to_array)[4]; 7156 int (*ptr_to_func)(int); 7157 7158varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 7159ptr_to_func but not ptr_to_array. 7160 7161Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 7162</pre></td></tr> 7163 7164 7165<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> 7166<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 7167pointee matches a given matcher. 7168 7169Given 7170 int *a; 7171 int const *b; 7172 float const *f; 7173pointerType(pointee(isConstQualified(), isInteger())) 7174 matches "int const *b" 7175 7176Usable 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>>, 7177 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>> 7178</pre></td></tr> 7179 7180 7181<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> 7182<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 7183 7184Given: 7185 typedef int &int_ref; 7186 int a; 7187 int_ref b = a; 7188 7189varDecl(hasType(qualType(referenceType()))))) will not match the 7190declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 7191</pre></td></tr> 7192 7193 7194<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7195<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 7196matches the given matcher. 7197 7198The associated declaration is: 7199- for type nodes, the declaration of the underlying type 7200- for CallExpr, the declaration of the callee 7201- for MemberExpr, the declaration of the referenced member 7202- for CXXConstructExpr, the declaration of the constructor 7203- for CXXNewExpr, the declaration of the operator new 7204- for ObjCIvarExpr, the declaration of the ivar 7205 7206For type nodes, hasDeclaration will generally match the declaration of the 7207sugared type. Given 7208 class X {}; 7209 typedef X Y; 7210 Y y; 7211in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7212typedefDecl. A common use case is to match the underlying, desugared type. 7213This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7214 varDecl(hasType(hasUnqualifiedDesugaredType( 7215 recordType(hasDeclaration(decl()))))) 7216In this matcher, the decl will match the CXXRecordDecl of class X. 7217 7218Usable 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>>, 7219 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>>, 7220 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>>, 7221 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>>, 7222 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>>, 7223 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>>, 7224 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7225</pre></td></tr> 7226 7227 7228<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> 7229<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 7230 7231Given 7232 void (*fp)(void); 7233The matcher 7234 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 7235would match the declaration for fp. 7236</pre></td></tr> 7237 7238 7239<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> 7240<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 7241</pre></td></tr> 7242 7243 7244<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> 7245<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 7246matches the specified matcher. 7247 7248Example matches y->x() 7249 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 7250 cxxRecordDecl(hasName("Y"))))))) 7251 class Y { public: void x(); }; 7252 void z() { Y *y; y->x(); } 7253</pre></td></tr> 7254 7255 7256<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> 7257<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 7258</pre></td></tr> 7259 7260 7261<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> 7262<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 7263type matches the specified matcher. 7264 7265Example matches X &x and const X &y 7266 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 7267 class X { 7268 void a(X b) { 7269 X &x = b; 7270 const X &y = b; 7271 } 7272 }; 7273</pre></td></tr> 7274 7275 7276<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7277<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 7278matches the given matcher. 7279 7280The associated declaration is: 7281- for type nodes, the declaration of the underlying type 7282- for CallExpr, the declaration of the callee 7283- for MemberExpr, the declaration of the referenced member 7284- for CXXConstructExpr, the declaration of the constructor 7285- for CXXNewExpr, the declaration of the operator new 7286- for ObjCIvarExpr, the declaration of the ivar 7287 7288For type nodes, hasDeclaration will generally match the declaration of the 7289sugared type. Given 7290 class X {}; 7291 typedef X Y; 7292 Y y; 7293in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7294typedefDecl. A common use case is to match the underlying, desugared type. 7295This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7296 varDecl(hasType(hasUnqualifiedDesugaredType( 7297 recordType(hasDeclaration(decl()))))) 7298In this matcher, the decl will match the CXXRecordDecl of class X. 7299 7300Usable 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>>, 7301 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>>, 7302 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>>, 7303 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>>, 7304 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>>, 7305 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>>, 7306 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7307</pre></td></tr> 7308 7309 7310<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> 7311<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 7312pointee matches a given matcher. 7313 7314Given 7315 int *a; 7316 int const *b; 7317 float const *f; 7318pointerType(pointee(isConstQualified(), isInteger())) 7319 matches "int const *b" 7320 7321Usable 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>>, 7322 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>> 7323</pre></td></tr> 7324 7325 7326<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> 7327<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 7328 7329Given 7330 return a + b; 7331hasReturnValue(binaryOperator()) 7332 matches 'return a + b' 7333with binaryOperator() 7334 matching 'a + b' 7335</pre></td></tr> 7336 7337 7338<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> 7339<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 7340a given matcher. Also matches StmtExprs that have CompoundStmt as children. 7341 7342Given 7343 { {}; 1+2; } 7344hasAnySubstatement(compoundStmt()) 7345 matches '{ {}; 1+2; }' 7346with compoundStmt() 7347 matching '{}' 7348</pre></td></tr> 7349 7350 7351<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr> 7352<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 7353alignof. 7354</pre></td></tr> 7355 7356 7357<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> 7358<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to 7359 7360Given: 7361F& operator=(const F& o) { 7362 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 7363 return *this; 7364} 7365returnStmt(forFunction(hasName("operator="))) 7366 matches 'return *this' 7367 but does not match 'return v > 0' 7368</pre></td></tr> 7369 7370 7371<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr> 7372<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 7373sizeof. 7374</pre></td></tr> 7375 7376 7377<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> 7378<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 7379type that matches the provided matcher. 7380 7381Given 7382 template <typename T> 7383 double F(T t); 7384 int i; 7385 double j = F(i); 7386 7387substTemplateTypeParmType(hasReplacementType(type())) matches int 7388</pre></td></tr> 7389 7390 7391<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> 7392<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 7393statement. This matcher may produce multiple matches. 7394 7395Given 7396 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 7397switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 7398 matches four times, with "c" binding each of "case 1:", "case 2:", 7399"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 7400"switch (1)", "switch (2)" and "switch (2)". 7401</pre></td></tr> 7402 7403 7404<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> 7405<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 7406switch statement or conditional operator. 7407 7408Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7409 if (true) {} 7410</pre></td></tr> 7411 7412 7413<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>></td><td class="name" onclick="toggle('hasInitStatement1')"><a name="hasInitStatement1Anchor">hasInitStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7414<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 7415 7416Given: 7417 void foo() { 7418 if (int i = foobar(); i > 0) {} 7419 switch (int i = foobar(); i) {} 7420 for (auto& a = get_range(); auto& x : a) {} 7421 } 7422 void bar() { 7423 if (foobar() > 0) {} 7424 switch (foobar()) {} 7425 for (auto& x : get_range()) {} 7426 } 7427ifStmt(hasInitStatement(anything())) 7428 matches the if statement in foo but not in bar. 7429switchStmt(hasInitStatement(anything())) 7430 matches the switch statement in foo but not in bar. 7431cxxForRangeStmt(hasInitStatement(anything())) 7432 matches the range for statement in foo but not in bar. 7433</pre></td></tr> 7434 7435 7436<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7437<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 7438matches the given matcher. 7439 7440The associated declaration is: 7441- for type nodes, the declaration of the underlying type 7442- for CallExpr, the declaration of the callee 7443- for MemberExpr, the declaration of the referenced member 7444- for CXXConstructExpr, the declaration of the constructor 7445- for CXXNewExpr, the declaration of the operator new 7446- for ObjCIvarExpr, the declaration of the ivar 7447 7448For type nodes, hasDeclaration will generally match the declaration of the 7449sugared type. Given 7450 class X {}; 7451 typedef X Y; 7452 Y y; 7453in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7454typedefDecl. A common use case is to match the underlying, desugared type. 7455This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7456 varDecl(hasType(hasUnqualifiedDesugaredType( 7457 recordType(hasDeclaration(decl()))))) 7458In this matcher, the decl will match the CXXRecordDecl of class X. 7459 7460Usable 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>>, 7461 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>>, 7462 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>>, 7463 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>>, 7464 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>>, 7465 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>>, 7466 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7467</pre></td></tr> 7468 7469 7470<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> 7471<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 7472 7473Given 7474 struct B { int next; }; 7475 template<int(B::*next_ptr)> struct A {}; 7476 A<&B::next> a; 7477templateSpecializationType(hasAnyTemplateArgument( 7478 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 7479 matches the specialization A<&B::next> with fieldDecl(...) matching 7480 B::next 7481</pre></td></tr> 7482 7483 7484<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> 7485<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 7486declaration. 7487 7488Given 7489 struct B { int next; }; 7490 template<int(B::*next_ptr)> struct A {}; 7491 A<&B::next> a; 7492classTemplateSpecializationDecl(hasAnyTemplateArgument( 7493 refersToDeclaration(fieldDecl(hasName("next"))))) 7494 matches the specialization A<&B::next> with fieldDecl(...) matching 7495 B::next 7496</pre></td></tr> 7497 7498 7499<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> 7500<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type. 7501 7502Given 7503 template<int T> struct C {}; 7504 C<42> c; 7505classTemplateSpecializationDecl( 7506 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 7507 matches the implicit instantiation of C in C<42>. 7508</pre></td></tr> 7509 7510 7511<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> 7512<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 7513 7514Given 7515 template<template <typename> class S> class X {}; 7516 template<typename T> class Y {}; 7517 X<Y> xi; 7518classTemplateSpecializationDecl(hasAnyTemplateArgument( 7519 refersToTemplate(templateName()))) 7520 matches the specialization X<Y> 7521</pre></td></tr> 7522 7523 7524<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> 7525<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 7526 7527Given 7528 struct X {}; 7529 template<typename T> struct A {}; 7530 A<X> a; 7531classTemplateSpecializationDecl(hasAnyTemplateArgument( 7532 refersToType(class(hasName("X"))))) 7533 matches the specialization A<X> 7534</pre></td></tr> 7535 7536 7537<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> 7538<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7539functionDecl that have at least one TemplateArgument matching the given 7540InnerMatcher. 7541 7542Given 7543 template<typename T> class A {}; 7544 template<> class A<double> {}; 7545 A<int> a; 7546 7547 template<typename T> f() {}; 7548 void func() { f<int>(); }; 7549 7550classTemplateSpecializationDecl(hasAnyTemplateArgument( 7551 refersToType(asString("int")))) 7552 matches the specialization A<int> 7553 7554functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7555 matches the specialization f<int> 7556</pre></td></tr> 7557 7558 7559<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7560<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 7561matches the given matcher. 7562 7563The associated declaration is: 7564- for type nodes, the declaration of the underlying type 7565- for CallExpr, the declaration of the callee 7566- for MemberExpr, the declaration of the referenced member 7567- for CXXConstructExpr, the declaration of the constructor 7568- for CXXNewExpr, the declaration of the operator new 7569- for ObjCIvarExpr, the declaration of the ivar 7570 7571For type nodes, hasDeclaration will generally match the declaration of the 7572sugared type. Given 7573 class X {}; 7574 typedef X Y; 7575 Y y; 7576in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7577typedefDecl. A common use case is to match the underlying, desugared type. 7578This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7579 varDecl(hasType(hasUnqualifiedDesugaredType( 7580 recordType(hasDeclaration(decl()))))) 7581In this matcher, the decl will match the CXXRecordDecl of class X. 7582 7583Usable 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>>, 7584 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>>, 7585 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>>, 7586 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>>, 7587 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>>, 7588 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>>, 7589 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7590</pre></td></tr> 7591 7592 7593<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> 7594<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7595functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7596 7597Given 7598 template<typename T, typename U> class A {}; 7599 A<bool, int> b; 7600 A<int, bool> c; 7601 7602 template<typename T> void f() {} 7603 void func() { f<int>(); }; 7604classTemplateSpecializationDecl(hasTemplateArgument( 7605 1, refersToType(asString("int")))) 7606 matches the specialization A<bool, int> 7607 7608functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7609 matches the specialization f<int> 7610</pre></td></tr> 7611 7612 7613<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7614<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 7615matches the given matcher. 7616 7617The associated declaration is: 7618- for type nodes, the declaration of the underlying type 7619- for CallExpr, the declaration of the callee 7620- for MemberExpr, the declaration of the referenced member 7621- for CXXConstructExpr, the declaration of the constructor 7622- for CXXNewExpr, the declaration of the operator new 7623- for ObjCIvarExpr, the declaration of the ivar 7624 7625For type nodes, hasDeclaration will generally match the declaration of the 7626sugared type. Given 7627 class X {}; 7628 typedef X Y; 7629 Y y; 7630in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7631typedefDecl. A common use case is to match the underlying, desugared type. 7632This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7633 varDecl(hasType(hasUnqualifiedDesugaredType( 7634 recordType(hasDeclaration(decl()))))) 7635In this matcher, the decl will match the CXXRecordDecl of class X. 7636 7637Usable 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>>, 7638 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>>, 7639 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>>, 7640 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>>, 7641 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>>, 7642 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>>, 7643 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7644</pre></td></tr> 7645 7646 7647<tr><td>Matcher<<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> 7648<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 7649QualType-matcher matches. 7650</pre></td></tr> 7651 7652 7653<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> 7654<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 7655matcher. 7656 7657Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7658 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7659 and U (matcher = typedefDecl(hasType(asString("int"))) 7660 and friend class X (matcher = friendDecl(hasType("X")) 7661 class X {}; 7662 void y(X &x) { x; X z; } 7663 typedef int U; 7664 class Y { friend class X; }; 7665</pre></td></tr> 7666 7667 7668<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7669<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 7670matches the given matcher. 7671 7672The associated declaration is: 7673- for type nodes, the declaration of the underlying type 7674- for CallExpr, the declaration of the callee 7675- for MemberExpr, the declaration of the referenced member 7676- for CXXConstructExpr, the declaration of the constructor 7677- for CXXNewExpr, the declaration of the operator new 7678- for ObjCIvarExpr, the declaration of the ivar 7679 7680For type nodes, hasDeclaration will generally match the declaration of the 7681sugared type. Given 7682 class X {}; 7683 typedef X Y; 7684 Y y; 7685in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7686typedefDecl. A common use case is to match the underlying, desugared type. 7687This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7688 varDecl(hasType(hasUnqualifiedDesugaredType( 7689 recordType(hasDeclaration(decl()))))) 7690In this matcher, the decl will match the CXXRecordDecl of class X. 7691 7692Usable 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>>, 7693 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>>, 7694 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>>, 7695 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>>, 7696 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>>, 7697 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>>, 7698 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7699</pre></td></tr> 7700 7701 7702<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> 7703<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 7704type of the matched node. 7705 7706For example, in: 7707 class A {}; 7708 using B = A; 7709The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 7710both B and A. 7711</pre></td></tr> 7712 7713 7714<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> 7715<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 7716 7717Given 7718 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 7719unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 7720 matches sizeof(a) and alignof(c) 7721</pre></td></tr> 7722 7723 7724<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> 7725<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 7726 7727Example matches true (matcher = hasUnaryOperand( 7728 cxxBoolLiteral(equals(true)))) 7729 !true 7730</pre></td></tr> 7731 7732 7733<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> 7734<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 7735given matcher. Implicit object expressions are included; that is, it matches 7736use of implicit `this`. 7737 7738Given 7739 struct X { 7740 int m; 7741 int f(X x) { x.m; return m; } 7742 }; 7743memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 7744 matches `x.m`, but not `m`; however, 7745memberExpr(hasObjectExpression(hasType(pointsTo( 7746 cxxRecordDecl(hasName("X")))))) 7747 matches `m` (aka. `this->m`), but not `x.m`. 7748</pre></td></tr> 7749 7750 7751<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>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7752<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 7753matches the given matcher. 7754 7755The associated declaration is: 7756- for type nodes, the declaration of the underlying type 7757- for CallExpr, the declaration of the callee 7758- for MemberExpr, the declaration of the referenced member 7759- for CXXConstructExpr, the declaration of the constructor 7760- for CXXNewExpr, the declaration of the operator new 7761- for ObjCIvarExpr, the declaration of the ivar 7762 7763For type nodes, hasDeclaration will generally match the declaration of the 7764sugared type. Given 7765 class X {}; 7766 typedef X Y; 7767 Y y; 7768in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7769typedefDecl. A common use case is to match the underlying, desugared type. 7770This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7771 varDecl(hasType(hasUnqualifiedDesugaredType( 7772 recordType(hasDeclaration(decl()))))) 7773In this matcher, the decl will match the CXXRecordDecl of class X. 7774 7775Usable 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>>, 7776 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>>, 7777 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>>, 7778 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>>, 7779 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>>, 7780 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>>, 7781 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7782</pre></td></tr> 7783 7784 7785<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> 7786<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 7787 7788Given 7789 namespace X { void b(); } 7790 using X::b; 7791usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 7792 matches using X::b </pre></td></tr> 7793 7794 7795<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> 7796<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 7797matched by the given matcher. 7798 7799Given 7800 namespace X { int a; void b(); } 7801 using X::a; 7802 using X::b; 7803usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 7804 matches using X::b but not using X::a </pre></td></tr> 7805 7806 7807<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> 7808<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 7809declaration's type. 7810 7811In case of a value declaration (for example a variable declaration), 7812this resolves one layer of indirection. For example, in the value 7813declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7814X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7815declaration of x. 7816 7817Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7818 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7819 and friend class X (matcher = friendDecl(hasType("X")) 7820 class X {}; 7821 void y(X &x) { x; X z; } 7822 class Y { friend class X; }; 7823 7824Example matches class Derived 7825(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7826class Base {}; 7827class Derived : Base {}; 7828 7829Usable 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_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>, 7830Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7831</pre></td></tr> 7832 7833 7834<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> 7835<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 7836matcher. 7837 7838Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7839 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7840 and U (matcher = typedefDecl(hasType(asString("int"))) 7841 and friend class X (matcher = friendDecl(hasType("X")) 7842 class X {}; 7843 void y(X &x) { x; X z; } 7844 typedef int U; 7845 class Y { friend class X; }; 7846</pre></td></tr> 7847 7848 7849<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> 7850<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 7851that matches the given matcher. 7852 7853Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 7854 bool y() { return true; } 7855 bool x = y(); 7856</pre></td></tr> 7857 7858 7859<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> 7860<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 7861expression. 7862 7863Given 7864 void f(int b) { 7865 int a[b]; 7866 } 7867variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 7868 varDecl(hasName("b"))))))) 7869 matches "int a[b]" 7870</pre></td></tr> 7871 7872 7873<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> 7874<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function 7875definition that has a given body. 7876 7877Given 7878 for (;;) {} 7879hasBody(compoundStmt()) 7880 matches 'for (;;) {}' 7881with compoundStmt() 7882 matching '{}' 7883</pre></td></tr> 7884 7885 7886<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> 7887<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 7888switch statement or conditional operator. 7889 7890Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7891 if (true) {} 7892</pre></td></tr> 7893 7894<!--END_TRAVERSAL_MATCHERS --> 7895</table> 7896 7897</div> 7898</body> 7899</html> 7900 7901 7902