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>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</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 3023If the matcher is used in clang-query, RegexFlags parameter 3024should be passed as a quoted string. e.g: "NoFlags". 3025Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3026</pre></td></tr> 3027 3028 3029<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> 3030<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 3031 3032Example matches X but not Y 3033 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3034 #include <Y.h> 3035 class X {}; 3036Y.h: 3037 class Y {}; 3038 3039Usable 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>> 3040</pre></td></tr> 3041 3042 3043<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> 3044<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 3045 3046Example matches Y but not X 3047 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3048 #include <SystemHeader.h> 3049 class X {}; 3050SystemHeader.h: 3051 class Y {}; 3052 3053Usable 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>> 3054</pre></td></tr> 3055 3056 3057<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> 3058<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added 3059by the compiler (eg. implicit default/copy constructors). 3060</pre></td></tr> 3061 3062 3063<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> 3064<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces. 3065 3066Given 3067 class vector {}; 3068 namespace foo { 3069 class vector {}; 3070 namespace std { 3071 class vector {}; 3072 } 3073 } 3074 namespace std { 3075 inline namespace __1 { 3076 class vector {}; // #1 3077 namespace experimental { 3078 class vector {}; 3079 } 3080 } 3081 } 3082cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1. 3083</pre></td></tr> 3084 3085 3086<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> 3087<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3088template instantiations. 3089 3090Given 3091 template<typename T> void A(T t) { T i; } 3092 A(0); 3093 A(0U); 3094functionDecl(isInstantiated()) 3095 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3096</pre></td></tr> 3097 3098 3099<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> 3100<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private 3101inheritance. 3102 3103Examples: 3104 class C { 3105 public: int a; 3106 protected: int b; 3107 private: int c; // fieldDecl(isPrivate()) matches 'c' 3108 }; 3109 3110 struct Base {}; 3111 struct Derived1 : private Base {}; // matches 'Base' 3112 class Derived2 : Base {}; // matches 'Base' 3113</pre></td></tr> 3114 3115 3116<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> 3117<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify 3118protected inheritance. 3119 3120Examples: 3121 class C { 3122 public: int a; 3123 protected: int b; // fieldDecl(isProtected()) matches 'b' 3124 private: int c; 3125 }; 3126 3127 class Base {}; 3128 class Derived : protected Base {}; // matches 'Base' 3129</pre></td></tr> 3130 3131 3132<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> 3133<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public 3134inheritance. 3135 3136Examples: 3137 class C { 3138 public: int a; // fieldDecl(isPublic()) matches 'a' 3139 protected: int b; 3140 private: int c; 3141 }; 3142 3143 class Base {}; 3144 class Derived1 : public Base {}; // matches 'Base' 3145 struct Derived2 : Base {}; // matches 'Base' 3146</pre></td></tr> 3147 3148 3149<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> 3150<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 3151a specific number of designators. 3152 3153Example: Given 3154 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 3155 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 3156designatorCountIs(2) 3157 matches '{ [2].y = 1.0, [0].x = 1.0 }', 3158 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 3159</pre></td></tr> 3160 3161 3162<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> 3163<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration. 3164 3165Example matches Y (matcher = enumDecl(isScoped())) 3166enum X {}; 3167enum class Y {}; 3168</pre></td></tr> 3169 3170 3171<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> 3172<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is 3173neither type- nor value-dependent. 3174 3175In the following example, the expression sizeof(sizeof(T() + T())) 3176is instantiation-dependent (since it involves a template parameter T), 3177but is neither type- nor value-dependent, since the type of the inner 3178sizeof is known (std::size_t) and therefore the size of the outer 3179sizeof is known. 3180 template<typename T> 3181 void f(T x, T y) { sizeof(sizeof(T() + T()); } 3182expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T()) 3183</pre></td></tr> 3184 3185 3186<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> 3187<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type 3188is not yet instantiated. 3189 3190For example, the expressions "x" and "x + y" are type-dependent in 3191the following code, but "y" is not type-dependent: 3192 template<typename T> 3193 void add(T x, int y) { 3194 x + y; 3195 } 3196expr(isTypeDependent()) matches x + y 3197</pre></td></tr> 3198 3199 3200<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> 3201<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a 3202non-type template parameter. 3203 3204For example, the array bound of "Chars" in the following example is 3205value-dependent. 3206 template<int Size> int f() { return Size; } 3207expr(isValueDependent()) matches return Size 3208</pre></td></tr> 3209 3210 3211<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> 3212<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 3213GNU's __null, C++11's nullptr, or C's NULL macro. 3214 3215Given: 3216 void *v1 = NULL; 3217 void *v2 = nullptr; 3218 void *v3 = __null; // GNU extension 3219 char *cp = (char *)0; 3220 int *ip = 0; 3221 int i = 0; 3222expr(nullPointerConstant()) 3223 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 3224 initializer for i. 3225</pre></td></tr> 3226 3227 3228<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> 3229<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 3230bit width. 3231 3232Given 3233 class C { 3234 int a : 2; 3235 int b : 4; 3236 int c : 2; 3237 }; 3238fieldDecl(hasBitWidth(2)) 3239 matches 'int a;' and 'int c;' but not 'int b;'. 3240</pre></td></tr> 3241 3242 3243<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> 3244<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 3245 3246Given 3247 class C { 3248 int a : 2; 3249 int b; 3250 }; 3251fieldDecl(isBitField()) 3252 matches 'int a;' but not 'int b;'. 3253</pre></td></tr> 3254 3255 3256<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> 3257<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 3258 3259Given 3260 f('false, 3.14, 42); 3261characterLiteral(equals(0)) 3262 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3263 match false 3264floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3265 match 3.14 3266integerLiteral(equals(42)) 3267 matches 42 3268 3269Note that you cannot directly match a negative numeric literal because the 3270minus sign is not part of the literal: It is a unary operator whose operand 3271is the positive numeric literal. Instead, you must use a unaryOperator() 3272matcher to match the minus sign: 3273 3274unaryOperator(hasOperatorName("-"), 3275 hasUnaryOperand(integerLiteral(equals(13)))) 3276 3277Usable 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>>, 3278 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>> 3279</pre></td></tr> 3280 3281 3282<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> 3283<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr> 3284 3285 3286<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> 3287<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names. 3288 3289Matches overloaded operator names specified in strings without the 3290"operator" prefix: e.g. "<<". 3291 3292 hasAnyOverloadesOperatorName("+", "-") 3293Is equivalent to 3294 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3295</pre></td></tr> 3296 3297 3298<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> 3299<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 3300 3301Given: 3302 void f(); 3303 void g() noexcept; 3304 void h() noexcept(true); 3305 void i() noexcept(false); 3306 void j() throw(); 3307 void k() throw(int); 3308 void l() throw(...); 3309functionDecl(hasDynamicExceptionSpec()) and 3310 functionProtoType(hasDynamicExceptionSpec()) 3311 match the declarations of j, k, and l, but not f, g, h, or i. 3312</pre></td></tr> 3313 3314 3315<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> 3316<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 3317 3318Matches overloaded operator names specified in strings without the 3319"operator" prefix: e.g. "<<". 3320 3321Given: 3322 class A { int operator*(); }; 3323 const A &operator<<(const A &a, const A &b); 3324 A a; 3325 a << a; // <-- This matches 3326 3327cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3328specified line and 3329cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3330matches the declaration of A. 3331 3332Usable 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>> 3333</pre></td></tr> 3334 3335 3336<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> 3337<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 3338 3339Example matches Y (matcher = functionDecl(hasTrailingReturn())) 3340int X() {} 3341auto Y() -> int {} 3342</pre></td></tr> 3343 3344 3345<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> 3346<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations, 3347 and if constexpr. 3348 3349Given: 3350 constexpr int foo = 42; 3351 constexpr int bar(); 3352 void baz() { if constexpr(1 > 0) {} } 3353varDecl(isConstexpr()) 3354 matches the declaration of foo. 3355functionDecl(isConstexpr()) 3356 matches the declaration of bar. 3357ifStmt(isConstexpr()) 3358 matches the if statement in baz. 3359</pre></td></tr> 3360 3361 3362<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> 3363<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 3364 3365Given: 3366 class A { ~A(); }; 3367 class B { ~B() = default; }; 3368functionDecl(isDefaulted()) 3369 matches the declaration of ~B, but not ~A. 3370</pre></td></tr> 3371 3372 3373<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> 3374<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 3375 3376Example matches A, va, fa 3377 class A {}; 3378 class B; // Doesn't match, as it has no body. 3379 int va; 3380 extern int vb; // Doesn't match, as it doesn't define the variable. 3381 void fa() {} 3382 void fb(); // Doesn't match, as it has no body. 3383 @interface X 3384 - (void)ma; // Doesn't match, interface is declaration. 3385 @end 3386 @implementation X 3387 - (void)ma {} 3388 @end 3389 3390Usable 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>>, 3391 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 3392</pre></td></tr> 3393 3394 3395<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> 3396<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 3397 3398Given: 3399 void Func(); 3400 void DeletedFunc() = delete; 3401functionDecl(isDeleted()) 3402 matches the declaration of DeletedFunc, but not Func. 3403</pre></td></tr> 3404 3405 3406<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> 3407<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 3408static member variable template instantiations. 3409 3410Given 3411 template<typename T> void A(T t) { } 3412 template<> void A(int N) { } 3413functionDecl(isExplicitTemplateSpecialization()) 3414 matches the specialization A<int>(). 3415 3416Usable 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>> 3417</pre></td></tr> 3418 3419 3420<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> 3421<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 3422 3423Given: 3424 extern "C" void f() {} 3425 extern "C" { void g() {} } 3426 void h() {} 3427 extern "C" int x = 1; 3428 extern "C" int y = 2; 3429 int z = 3; 3430functionDecl(isExternC()) 3431 matches the declaration of f and g, but not the declaration of h. 3432varDecl(isExternC()) 3433 matches the declaration of x and y, but not the declaration of z. 3434</pre></td></tr> 3435 3436 3437<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> 3438<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 3439the inline keyword. 3440 3441Given 3442 inline void f(); 3443 void g(); 3444 namespace n { 3445 inline namespace m {} 3446 } 3447functionDecl(isInline()) will match ::f(). 3448namespaceDecl(isInline()) will match n::m. 3449</pre></td></tr> 3450 3451 3452<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> 3453<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point 3454into an executable program. 3455</pre></td></tr> 3456 3457 3458<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> 3459<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 3460 3461Given 3462 void nope(); 3463 [[noreturn]] void a(); 3464 __attribute__((noreturn)) void b(); 3465 struct c { [[noreturn]] c(); }; 3466functionDecl(isNoReturn()) 3467 matches all of those except 3468 void nope(); 3469</pre></td></tr> 3470 3471 3472<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> 3473<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 3474 3475Given: 3476 void f(); 3477 void g() noexcept; 3478 void h() throw(); 3479 void i() throw(int); 3480 void j() noexcept(false); 3481functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 3482 match the declarations of g, and h, but not f, i or j. 3483</pre></td></tr> 3484 3485 3486<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> 3487<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage 3488class specifier ("static" keyword) written in the source. 3489 3490Given: 3491 static void f() {} 3492 static int i = 0; 3493 extern int j; 3494 int k; 3495functionDecl(isStaticStorageClass()) 3496 matches the function declaration f. 3497varDecl(isStaticStorageClass()) 3498 matches the variable declaration i. 3499</pre></td></tr> 3500 3501 3502<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> 3503<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 3504member variable template instantiations. 3505 3506Given 3507 template <typename T> class X {}; class A {}; X<A> x; 3508or 3509 template <typename T> class X {}; class A {}; template class X<A>; 3510or 3511 template <typename T> class X {}; class A {}; extern template class X<A>; 3512cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3513 matches the template instantiation of X<A>. 3514 3515But given 3516 template <typename T> class X {}; class A {}; 3517 template <> class X<A> {}; X<A> x; 3518cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3519 does not match, as X<A> is an explicit template specialization. 3520 3521Usable 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>> 3522</pre></td></tr> 3523 3524 3525<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> 3526<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 3527 3528Example matches f, but not g or h. The function i will not match, even when 3529compiled in C mode. 3530 void f(...); 3531 void g(int); 3532 template <typename... Ts> void h(Ts...); 3533 void i(); 3534</pre></td></tr> 3535 3536 3537<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> 3538<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 3539specific parameter count. 3540 3541Given 3542 void f(int i) {} 3543 void g(int i, int j) {} 3544 void h(int i, int j); 3545 void j(int i); 3546 void k(int x, int y, int z, ...); 3547functionDecl(parameterCountIs(2)) 3548 matches g and h 3549functionProtoType(parameterCountIs(2)) 3550 matches g and h 3551functionProtoType(parameterCountIs(3)) 3552 matches k 3553</pre></td></tr> 3554 3555 3556<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> 3557<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 3558 3559Given: 3560 void f(); 3561 void g() noexcept; 3562 void h() noexcept(true); 3563 void i() noexcept(false); 3564 void j() throw(); 3565 void k() throw(int); 3566 void l() throw(...); 3567functionDecl(hasDynamicExceptionSpec()) and 3568 functionProtoType(hasDynamicExceptionSpec()) 3569 match the declarations of j, k, and l, but not f, g, h, or i. 3570</pre></td></tr> 3571 3572 3573<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> 3574<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 3575 3576Given: 3577 void f(); 3578 void g() noexcept; 3579 void h() throw(); 3580 void i() throw(int); 3581 void j() noexcept(false); 3582functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 3583 match the declarations of g, and h, but not f, i or j. 3584</pre></td></tr> 3585 3586 3587<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> 3588<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 3589specific parameter count. 3590 3591Given 3592 void f(int i) {} 3593 void g(int i, int j) {} 3594 void h(int i, int j); 3595 void j(int i); 3596 void k(int x, int y, int z, ...); 3597functionDecl(parameterCountIs(2)) 3598 matches g and h 3599functionProtoType(parameterCountIs(2)) 3600 matches g and h 3601functionProtoType(parameterCountIs(3)) 3602 matches k 3603</pre></td></tr> 3604 3605 3606<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> 3607<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations, 3608 and if constexpr. 3609 3610Given: 3611 constexpr int foo = 42; 3612 constexpr int bar(); 3613 void baz() { if constexpr(1 > 0) {} } 3614varDecl(isConstexpr()) 3615 matches the declaration of foo. 3616functionDecl(isConstexpr()) 3617 matches the declaration of bar. 3618ifStmt(isConstexpr()) 3619 matches the if statement in baz. 3620</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('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr> 3624<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 3625 3626 3627<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> 3628<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 3629 3630Given 3631 f('false, 3.14, 42); 3632characterLiteral(equals(0)) 3633 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3634 match false 3635floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3636 match 3.14 3637integerLiteral(equals(42)) 3638 matches 42 3639 3640Note that you cannot directly match a negative numeric literal because the 3641minus sign is not part of the literal: It is a unary operator whose operand 3642is the positive numeric literal. Instead, you must use a unaryOperator() 3643matcher to match the minus sign: 3644 3645unaryOperator(hasOperatorName("-"), 3646 hasUnaryOperand(integerLiteral(equals(13)))) 3647 3648Usable 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>>, 3649 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>> 3650</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('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr> 3654<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 3655 3656 3657<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> 3658<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 3659 3660 3661<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> 3662<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 3663to '.'. 3664 3665Member calls on the implicit this pointer match as called with '->'. 3666 3667Given 3668 class Y { 3669 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3670 template <class T> void f() { this->f<T>(); f<T>(); } 3671 int a; 3672 static int b; 3673 }; 3674 template <class T> 3675 class Z { 3676 void x() { this->m; } 3677 }; 3678memberExpr(isArrow()) 3679 matches this->x, x, y.x, a, this->b 3680cxxDependentScopeMemberExpr(isArrow()) 3681 matches this->m 3682unresolvedMemberExpr(isArrow()) 3683 matches this->f<T>, f<T> 3684</pre></td></tr> 3685 3686 3687<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> 3688<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 3689 3690This matcher is only provided as a performance optimization of hasName. 3691 hasAnyName(a, b, c) 3692 is equivalent to, but faster than 3693 anyOf(hasName(a), hasName(b), hasName(c)) 3694</pre></td></tr> 3695 3696 3697<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> 3698<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 3699 3700Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 3701void f() { 3702 int x; 3703 static int y; 3704} 3705int z; 3706 3707Example matches f() because it has external formal linkage despite being 3708unique to the translation unit as though it has internal likage 3709(matcher = functionDecl(hasExternalFormalLinkage())) 3710 3711namespace { 3712void f() {} 3713} 3714</pre></td></tr> 3715 3716 3717<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> 3718<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 3719 3720Supports specifying enclosing namespaces or classes by prefixing the name 3721with '<enclosing>::'. 3722Does not match typedefs of an underlying type with the given name. 3723 3724Example matches X (Name == "X") 3725 class X; 3726 3727Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 3728 namespace a { namespace b { class X; } } 3729</pre></td></tr> 3730 3731 3732<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>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 3733<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 3734a substring matched by the given RegExp. 3735 3736Supports specifying enclosing namespaces or classes by 3737prefixing the name with '<enclosing>::'. Does not match typedefs 3738of an underlying type with the given name. 3739 3740Example matches X (regexp == "::X") 3741 class X; 3742 3743Example matches X (regexp is one of "::X", "^foo::.*X", among others) 3744 namespace foo { namespace bar { class X; } } 3745 3746If the matcher is used in clang-query, RegexFlags parameter 3747should be passed as a quoted string. e.g: "NoFlags". 3748Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3749</pre></td></tr> 3750 3751 3752<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> 3753<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 3754 3755Given 3756 namespace n { 3757 namespace {} // #1 3758 } 3759namespaceDecl(isAnonymous()) will match #1 but not ::n. 3760</pre></td></tr> 3761 3762 3763<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> 3764<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 3765the inline keyword. 3766 3767Given 3768 inline void f(); 3769 void g(); 3770 namespace n { 3771 inline namespace m {} 3772 } 3773functionDecl(isInline()) will match ::f(). 3774namespaceDecl(isInline()) will match n::m. 3775</pre></td></tr> 3776 3777 3778<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> 3779<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified. 3780 3781Given 3782 3783 #pragma omp parallel 3784 #pragma omp parallel default(none) 3785 #pragma omp parallel default(shared) 3786 3787``ompDefaultClause(isNoneKind())`` matches only ``default(none)``. 3788</pre></td></tr> 3789 3790 3791<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> 3792<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified. 3793 3794Given 3795 3796 #pragma omp parallel 3797 #pragma omp parallel default(none) 3798 #pragma omp parallel default(shared) 3799 3800``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``. 3801</pre></td></tr> 3802 3803 3804<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> 3805<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP 3806clause kind. 3807 3808Given 3809 3810 #pragma omp parallel 3811 #pragma omp parallel for 3812 #pragma omp for 3813 3814`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches 3815``omp parallel`` and ``omp parallel for``. 3816 3817If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter 3818should be passed as a quoted string. e.g., 3819``isAllowedToContainClauseKind("OMPC_default").`` 3820</pre></td></tr> 3821 3822 3823<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> 3824<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives, 3825i.e., directives that can't have a structured block. 3826 3827Given 3828 3829 #pragma omp parallel 3830 {} 3831 #pragma omp taskyield 3832 3833``ompExecutableDirective(isStandaloneDirective()))`` matches 3834``omp taskyield``. 3835</pre></td></tr> 3836 3837 3838<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> 3839<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 3840</pre></td></tr> 3841 3842 3843<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> 3844<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 3845</pre></td></tr> 3846 3847 3848<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> 3849<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for 3850isSameOrDerivedFrom(hasName(...)). 3851</pre></td></tr> 3852 3853 3854<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> 3855<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3856a specific number of arguments (including absent default arguments). 3857 3858Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3859 void f(int x, int y); 3860 f(0, 0); 3861</pre></td></tr> 3862 3863 3864<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> 3865<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 3866Selector.getAsString() 3867 3868 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 3869 matches both of the expressions below: 3870 [myObj methodA:argA]; 3871 [myObj methodB:argB]; 3872</pre></td></tr> 3873 3874 3875<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> 3876<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 3877 3878objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 3879message expression in 3880 3881 UIWebView *webView = ...; 3882 CGRect bodyFrame = webView.frame; 3883 bodyFrame.size.height = self.bodyContentHeight; 3884 webView.frame = bodyFrame; 3885 // ^---- matches here 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('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr> 3890<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 3891 3892Matches only when the selector of the objCMessageExpr is NULL. This may 3893represent an error condition in the tree! 3894</pre></td></tr> 3895 3896 3897<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> 3898<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 3899 3900 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 3901 matches the outer message expr in the code below, but NOT the message 3902 invocation for self.bodyView. 3903 [self.bodyView loadHTMLString:html baseURL:NULL]; 3904</pre></td></tr> 3905 3906 3907<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> 3908<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 3909 3910 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 3911 matches self.bodyView in the code below, but NOT the outer message 3912 invocation of "loadHTMLString:baseURL:". 3913 [self.bodyView loadHTMLString:html baseURL:NULL]; 3914</pre></td></tr> 3915 3916 3917<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> 3918<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class. 3919 3920Example 3921matcher = objcMessageExpr(isClassMessage()) 3922matches 3923 [NSString stringWithFormat:@"format"]; 3924but not 3925 NSString *x = @"hello"; 3926 [x containsString:@"h"]; 3927</pre></td></tr> 3928 3929 3930<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> 3931<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance. 3932 3933Example 3934matcher = objcMessageExpr(isInstanceMessage()) 3935matches 3936 NSString *x = @"hello"; 3937 [x containsString:@"h"]; 3938but not 3939 [NSString stringWithFormat:@"format"]; 3940</pre></td></tr> 3941 3942 3943<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>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 3944<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 3945a substring matched by the given RegExp. 3946 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 3947 invocation for self.bodyView. 3948 [self.bodyView loadHTMLString:html baseURL:NULL]; 3949 3950If the matcher is used in clang-query, RegexFlags parameter 3951should be passed as a quoted string. e.g: "NoFlags". 3952Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3953</pre></td></tr> 3954 3955 3956<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> 3957<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 3958 3959 matcher = objCMessageExpr(numSelectorArgs(0)); 3960 matches self.bodyView in the code below 3961 3962 matcher = objCMessageExpr(numSelectorArgs(2)); 3963 matches the invocation of "loadHTMLString:baseURL:" but not that 3964 of self.bodyView 3965 [self.bodyView loadHTMLString:html baseURL:NULL]; 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('isClassMethod0')"><a name="isClassMethod0Anchor">isClassMethod</a></td><td></td></tr> 3970<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method. 3971 3972Example 3973matcher = objcMethodDecl(isClassMethod()) 3974matches 3975@interface I + (void)foo; @end 3976but not 3977@interface I - (void)bar; @end 3978</pre></td></tr> 3979 3980 3981<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> 3982<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 3983 3984Example matches A, va, fa 3985 class A {}; 3986 class B; // Doesn't match, as it has no body. 3987 int va; 3988 extern int vb; // Doesn't match, as it doesn't define the variable. 3989 void fa() {} 3990 void fb(); // Doesn't match, as it has no body. 3991 @interface X 3992 - (void)ma; // Doesn't match, interface is declaration. 3993 @end 3994 @implementation X 3995 - (void)ma {} 3996 @end 3997 3998Usable 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>>, 3999 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4000</pre></td></tr> 4001 4002 4003<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> 4004<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method. 4005 4006Example 4007matcher = objcMethodDecl(isInstanceMethod()) 4008matches 4009@interface I - (void)bar; @end 4010but not 4011@interface I + (void)foo; @end 4012</pre></td></tr> 4013 4014 4015<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> 4016<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 4017 4018Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 4019void x(int val) {} 4020void y(int val = 0) {} 4021 4022Deprecated. Use hasInitializer() instead to be able to 4023match on the contents of the default argument. For example: 4024 4025void x(int val = 7) {} 4026void y(int val = 42) {} 4027parmVarDecl(hasInitializer(integerLiteral(equals(42)))) 4028 matches the parameter of y 4029 4030A matcher such as 4031 parmVarDecl(hasInitializer(anything())) 4032is equivalent to parmVarDecl(hasDefaultArgument()). 4033</pre></td></tr> 4034 4035 4036<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> 4037<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter 4038list. The parameter list could be that of either a block, function, or 4039objc-method. 4040 4041 4042Given 4043 4044void f(int a, int b, int c) { 4045} 4046 4047``parmVarDecl(isAtPosition(0))`` matches ``int a``. 4048 4049``parmVarDecl(isAtPosition(1))`` matches ``int b``. 4050</pre></td></tr> 4051 4052 4053<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> 4054<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 4055 4056Given 4057 class Y { public: void x(); }; 4058 void z() { Y* y; y->x(); } 4059cxxMemberCallExpr(on(hasType(asString("class Y *")))) 4060 matches y->x() 4061</pre></td></tr> 4062 4063 4064<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> 4065<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 4066 4067Matches a node if it equals the node previously bound to ID. 4068 4069Given 4070 class X { int a; int b; }; 4071cxxRecordDecl( 4072 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4073 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4074 matches the class X, as a and b have the same type. 4075 4076Note that when multiple matches are involved via forEach* matchers, 4077equalsBoundNodes acts as a filter. 4078For example: 4079compoundStmt( 4080 forEachDescendant(varDecl().bind("d")), 4081 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4082will trigger a match for each combination of variable declaration 4083and reference to that variable declaration within a compound statement. 4084</pre></td></tr> 4085 4086 4087<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> 4088<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 4089the node, not hidden within a typedef. 4090 4091Given 4092 typedef const int const_int; 4093 const_int i; 4094 int *const j; 4095 int *volatile k; 4096 int m; 4097varDecl(hasType(hasLocalQualifiers())) matches only j and k. 4098i is const-qualified but the qualifier is not local. 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('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr> 4103<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 4104 4105Given 4106 void a(char); 4107 void b(wchar_t); 4108 void c(double); 4109functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 4110matches "a(char)", "b(wchar_t)", but not "c(double)". 4111</pre></td></tr> 4112 4113 4114<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> 4115<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 4116the Objective-C object pointer type, which is different despite being 4117syntactically similar. 4118 4119Given 4120 int *i = nullptr; 4121 4122 @interface Foo 4123 @end 4124 Foo *f; 4125 4126 int j; 4127varDecl(hasType(isAnyPointer())) 4128 matches "int *i" and "Foo *f", but not "int j". 4129</pre></td></tr> 4130 4131 4132<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> 4133<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 4134include "top-level" const. 4135 4136Given 4137 void a(int); 4138 void b(int const); 4139 void c(const int); 4140 void d(const int*); 4141 void e(int const) {}; 4142functionDecl(hasAnyParameter(hasType(isConstQualified()))) 4143 matches "void b(int const)", "void c(const int)" and 4144 "void e(int const) {}". It does not match d as there 4145 is no top-level const on the parameter type "const int *". 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('isInteger0')"><a name="isInteger0Anchor">isInteger</a></td><td></td></tr> 4150<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 4151 4152Given 4153 void a(int); 4154 void b(long); 4155 void c(double); 4156functionDecl(hasAnyParameter(hasType(isInteger()))) 4157matches "a(int)", "b(long)", but not "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('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr> 4162<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 4163 4164Given 4165 void a(int); 4166 void b(unsigned long); 4167 void c(double); 4168functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 4169matches "a(int)", but not "b(unsigned long)" 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('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr> 4174<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 4175 4176Given 4177 void a(int); 4178 void b(unsigned long); 4179 void c(double); 4180functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 4181matches "b(unsigned long)", but not "a(int)" and "c(double)". 4182</pre></td></tr> 4183 4184 4185<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> 4186<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 4187include "top-level" volatile. 4188 4189Given 4190 void a(int); 4191 void b(int volatile); 4192 void c(volatile int); 4193 void d(volatile int*); 4194 void e(int volatile) {}; 4195functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 4196 matches "void b(int volatile)", "void c(volatile int)" and 4197 "void e(int volatile) {}". It does not match d as there 4198 is no top-level volatile on the parameter type "volatile int *". 4199</pre></td></tr> 4200 4201 4202<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> 4203<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 4204 4205Matches a node if it equals the node previously bound to ID. 4206 4207Given 4208 class X { int a; int b; }; 4209cxxRecordDecl( 4210 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4211 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4212 matches the class X, as a and b have the same type. 4213 4214Note that when multiple matches are involved via forEach* matchers, 4215equalsBoundNodes acts as a filter. 4216For example: 4217compoundStmt( 4218 forEachDescendant(varDecl().bind("d")), 4219 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4220will trigger a match for each combination of variable declaration 4221and reference to that variable declaration within a compound statement. 4222</pre></td></tr> 4223 4224 4225<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> 4226<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 4227 4228Stmt has pointer identity in the AST. 4229</pre></td></tr> 4230 4231 4232<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> 4233<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro. 4234Does not match if only part of the statement is expanded from that macro or 4235if different parts of the the statement are expanded from different 4236appearances of the macro. 4237 4238FIXME: Change to be a polymorphic matcher that works on any syntactic 4239node. There's nothing `Stmt`-specific about it. 4240</pre></td></tr> 4241 4242 4243<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>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 4244<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 4245partially matching a given regex. 4246 4247Example matches Y but not X 4248 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 4249 #include "ASTMatcher.h" 4250 class X {}; 4251ASTMatcher.h: 4252 class Y {}; 4253 4254Usable 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>> 4255 4256If the matcher is used in clang-query, RegexFlags parameter 4257should be passed as a quoted string. e.g: "NoFlags". 4258Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4259</pre></td></tr> 4260 4261 4262<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> 4263<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 4264 4265Example matches X but not Y 4266 (matcher = cxxRecordDecl(isExpansionInMainFile()) 4267 #include <Y.h> 4268 class X {}; 4269Y.h: 4270 class Y {}; 4271 4272Usable 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>> 4273</pre></td></tr> 4274 4275 4276<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> 4277<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 4278 4279Example matches Y but not X 4280 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 4281 #include <SystemHeader.h> 4282 class X {}; 4283SystemHeader.h: 4284 class Y {}; 4285 4286Usable 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>> 4287</pre></td></tr> 4288 4289 4290<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> 4291<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 4292 4293Given 4294 int j; 4295 template<typename T> void A(T t) { T i; j += 42;} 4296 A(0); 4297 A(0U); 4298declStmt(isInTemplateInstantiation()) 4299 matches 'int i;' and 'unsigned i'. 4300unless(stmt(isInTemplateInstantiation())) 4301 will NOT match j += 42; as it's shared between the template definition and 4302 instantiation. 4303</pre></td></tr> 4304 4305 4306<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> 4307<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 4308 4309Given 4310 int a[42]; 4311 int b[2 * 21]; 4312 int c[41], d[43]; 4313 char *s = "abcd"; 4314 wchar_t *ws = L"abcd"; 4315 char *w = "a"; 4316constantArrayType(hasSize(42)) 4317 matches "int a[42]" and "int b[2 * 21]" 4318stringLiteral(hasSize(4)) 4319 matches "abcd", L"abcd" 4320</pre></td></tr> 4321 4322 4323<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> 4324<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class." 4325 4326Example matches C, but not S, U or E. 4327 struct S {}; 4328 class C {}; 4329 union U {}; 4330 enum E {}; 4331</pre></td></tr> 4332 4333 4334<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> 4335<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 4336 4337Example matches A, va, fa 4338 class A {}; 4339 class B; // Doesn't match, as it has no body. 4340 int va; 4341 extern int vb; // Doesn't match, as it doesn't define the variable. 4342 void fa() {} 4343 void fb(); // Doesn't match, as it has no body. 4344 @interface X 4345 - (void)ma; // Doesn't match, interface is declaration. 4346 @end 4347 @implementation X 4348 - (void)ma {} 4349 @end 4350 4351Usable 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>>, 4352 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4353</pre></td></tr> 4354 4355 4356<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> 4357<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum." 4358 4359Example matches E, but not C, S or U. 4360 struct S {}; 4361 class C {}; 4362 union U {}; 4363 enum E {}; 4364</pre></td></tr> 4365 4366 4367<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> 4368<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct." 4369 4370Example matches S, but not C, U or E. 4371 struct S {}; 4372 class C {}; 4373 union U {}; 4374 enum E {}; 4375</pre></td></tr> 4376 4377 4378<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> 4379<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union." 4380 4381Example matches U, but not C, S or E. 4382 struct S {}; 4383 class C {}; 4384 union U {}; 4385 enum E {}; 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('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr> 4390<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 4391 4392Note that 'Value' is a string as the template argument's value is 4393an arbitrary precision integer. 'Value' must be euqal to the canonical 4394representation of that integral value in base 10. 4395 4396Given 4397 template<int T> struct C {}; 4398 C<42> c; 4399classTemplateSpecializationDecl( 4400 hasAnyTemplateArgument(equalsIntegralValue("42"))) 4401 matches the implicit instantiation of C in C<42>. 4402</pre></td></tr> 4403 4404 4405<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> 4406<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 4407 4408Given 4409 template<int T> struct C {}; 4410 C<42> c; 4411classTemplateSpecializationDecl( 4412 hasAnyTemplateArgument(isIntegral())) 4413 matches the implicit instantiation of C in C<42> 4414 with isIntegral() matching 42. 4415</pre></td></tr> 4416 4417 4418<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> 4419<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 4420 4421Given 4422 template<typename T> struct C {}; 4423 C<int> c; 4424classTemplateSpecializationDecl(templateArgumentCountIs(1)) 4425 matches C<int>. 4426</pre></td></tr> 4427 4428 4429<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>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 4430<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 4431partially matching a given regex. 4432 4433Example matches Y but not X 4434 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 4435 #include "ASTMatcher.h" 4436 class X {}; 4437ASTMatcher.h: 4438 class Y {}; 4439 4440Usable 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>> 4441 4442If the matcher is used in clang-query, RegexFlags parameter 4443should be passed as a quoted string. e.g: "NoFlags". 4444Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4445</pre></td></tr> 4446 4447 4448<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> 4449<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 4450 4451Example matches X but not Y 4452 (matcher = cxxRecordDecl(isExpansionInMainFile()) 4453 #include <Y.h> 4454 class X {}; 4455Y.h: 4456 class Y {}; 4457 4458Usable 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>> 4459</pre></td></tr> 4460 4461 4462<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> 4463<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 4464 4465Example matches Y but not X 4466 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 4467 #include <SystemHeader.h> 4468 class X {}; 4469SystemHeader.h: 4470 class Y {}; 4471 4472Usable 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>> 4473</pre></td></tr> 4474 4475 4476<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> 4477<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 4478 4479Given 4480 struct S { bool func(); }; 4481functionDecl(returns(booleanType())) 4482 matches "bool func();" 4483</pre></td></tr> 4484 4485 4486<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> 4487<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 4488 4489Matches a node if it equals the node previously bound to ID. 4490 4491Given 4492 class X { int a; int b; }; 4493cxxRecordDecl( 4494 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4495 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4496 matches the class X, as a and b have the same type. 4497 4498Note that when multiple matches are involved via forEach* matchers, 4499equalsBoundNodes acts as a filter. 4500For example: 4501compoundStmt( 4502 forEachDescendant(varDecl().bind("d")), 4503 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4504will trigger a match for each combination of variable declaration 4505and reference to that variable declaration within a compound statement. 4506</pre></td></tr> 4507 4508 4509<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> 4510<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 4511 4512Type has pointer identity in the AST. 4513</pre></td></tr> 4514 4515 4516<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> 4517<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 4518 4519Given 4520 int i; 4521 float f; 4522realFloatingPointType() 4523 matches "float f" but not "int i" 4524</pre></td></tr> 4525 4526 4527<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> 4528<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 4529 4530Given 4531 struct S { void func(); }; 4532functionDecl(returns(voidType())) 4533 matches "void func();" 4534</pre></td></tr> 4535 4536 4537<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> 4538<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 4539 4540Given 4541 int x; 4542 int s = sizeof(x) + alignof(x) 4543unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 4544 matches sizeof(x) 4545 4546If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter 4547should be passed as a quoted string. e.g., ofKind("UETT_SizeOf"). 4548</pre></td></tr> 4549 4550 4551<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> 4552<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the 4553specified names. 4554 4555 hasAnyOperatorName("+", "-") 4556 Is equivalent to 4557 anyOf(hasOperatorName("+"), hasOperatorName("-")) 4558</pre></td></tr> 4559 4560 4561<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> 4562<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 4563unary). 4564 4565Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 4566 !(a || b) 4567</pre></td></tr> 4568 4569 4570<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> 4571<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed 4572to '.'. 4573 4574Member calls on the implicit this pointer match as called with '->'. 4575 4576Given 4577 class Y { 4578 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 4579 template <class T> void f() { this->f<T>(); f<T>(); } 4580 int a; 4581 static int b; 4582 }; 4583 template <class T> 4584 class Z { 4585 void x() { this->m; } 4586 }; 4587memberExpr(isArrow()) 4588 matches this->x, x, y.x, a, this->b 4589cxxDependentScopeMemberExpr(isArrow()) 4590 matches this->m 4591unresolvedMemberExpr(isArrow()) 4592 matches this->f<T>, f<T> 4593</pre></td></tr> 4594 4595 4596<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> 4597<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 4598 4599Example matches x, but not y, z, or a. 4600(matcher = varDecl(hasAutomaticStorageDuration()) 4601void f() { 4602 int x; 4603 static int y; 4604 thread_local int z; 4605} 4606int a; 4607</pre></td></tr> 4608 4609 4610<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> 4611<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 4612 4613Example matches y and z (matcher = varDecl(hasGlobalStorage()) 4614void f() { 4615 int x; 4616 static int y; 4617} 4618int z; 4619</pre></td></tr> 4620 4621 4622<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> 4623<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 4624non-static local variable. 4625 4626Example matches x (matcher = varDecl(hasLocalStorage()) 4627void f() { 4628 int x; 4629 static int y; 4630} 4631int z; 4632</pre></td></tr> 4633 4634 4635<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> 4636<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 4637It includes the variable declared at namespace scope and those declared 4638with "static" and "extern" storage class specifiers. 4639 4640void f() { 4641 int x; 4642 static int y; 4643 thread_local int z; 4644} 4645int a; 4646static int b; 4647extern int c; 4648varDecl(hasStaticStorageDuration()) 4649 matches the function declaration y, a, b and c. 4650</pre></td></tr> 4651 4652 4653<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> 4654<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 4655 4656Example matches z, but not x, z, or a. 4657(matcher = varDecl(hasThreadStorageDuration()) 4658void f() { 4659 int x; 4660 static int y; 4661 thread_local int z; 4662} 4663int a; 4664</pre></td></tr> 4665 4666 4667<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> 4668<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations, 4669 and if constexpr. 4670 4671Given: 4672 constexpr int foo = 42; 4673 constexpr int bar(); 4674 void baz() { if constexpr(1 > 0) {} } 4675varDecl(isConstexpr()) 4676 matches the declaration of foo. 4677functionDecl(isConstexpr()) 4678 matches the declaration of bar. 4679ifStmt(isConstexpr()) 4680 matches the if statement in baz. 4681</pre></td></tr> 4682 4683 4684<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> 4685<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 4686 4687Example matches A, va, fa 4688 class A {}; 4689 class B; // Doesn't match, as it has no body. 4690 int va; 4691 extern int vb; // Doesn't match, as it doesn't define the variable. 4692 void fa() {} 4693 void fb(); // Doesn't match, as it has no body. 4694 @interface X 4695 - (void)ma; // Doesn't match, interface is declaration. 4696 @end 4697 @implementation X 4698 - (void)ma {} 4699 @end 4700 4701Usable 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>>, 4702 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4703</pre></td></tr> 4704 4705 4706<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> 4707<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 4708a C++ catch block, or an Objective-C statement. 4709 4710Example matches x (matcher = varDecl(isExceptionVariable()) 4711void f(int y) { 4712 try { 4713 } catch (int x) { 4714 } 4715} 4716</pre></td></tr> 4717 4718 4719<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> 4720<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 4721static member variable template instantiations. 4722 4723Given 4724 template<typename T> void A(T t) { } 4725 template<> void A(int N) { } 4726functionDecl(isExplicitTemplateSpecialization()) 4727 matches the specialization A<int>(). 4728 4729Usable 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>> 4730</pre></td></tr> 4731 4732 4733<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> 4734<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 4735 4736Given: 4737 extern "C" void f() {} 4738 extern "C" { void g() {} } 4739 void h() {} 4740 extern "C" int x = 1; 4741 extern "C" int y = 2; 4742 int z = 3; 4743functionDecl(isExternC()) 4744 matches the declaration of f and g, but not the declaration of h. 4745varDecl(isExternC()) 4746 matches the declaration of x and y, but not the declaration of z. 4747</pre></td></tr> 4748 4749 4750<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> 4751<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope. 4752 4753Example matches y (matcher = varDecl(isStaticLocal())) 4754void f() { 4755 int x; 4756 static int y; 4757} 4758static int z; 4759</pre></td></tr> 4760 4761 4762<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> 4763<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage 4764class specifier ("static" keyword) written in the source. 4765 4766Given: 4767 static void f() {} 4768 static int i = 0; 4769 extern int j; 4770 int k; 4771functionDecl(isStaticStorageClass()) 4772 matches the function declaration f. 4773varDecl(isStaticStorageClass()) 4774 matches the variable declaration i. 4775</pre></td></tr> 4776 4777 4778<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> 4779<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 4780member variable template instantiations. 4781 4782Given 4783 template <typename T> class X {}; class A {}; X<A> x; 4784or 4785 template <typename T> class X {}; class A {}; template class X<A>; 4786or 4787 template <typename T> class X {}; class A {}; extern template class X<A>; 4788cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4789 matches the template instantiation of X<A>. 4790 4791But given 4792 template <typename T> class X {}; class A {}; 4793 template <> class X<A> {}; X<A> x; 4794cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4795 does not match, as X<A> is an explicit template specialization. 4796 4797Usable 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>> 4798</pre></td></tr> 4799 4800<!--END_NARROWING_MATCHERS --> 4801</table> 4802 4803<!-- ======================================================================= --> 4804<h2 id="traversal-matchers">AST Traversal Matchers</h2> 4805<!-- ======================================================================= --> 4806 4807<p>Traversal matchers specify the relationship to other nodes that are 4808reachable from the current node.</p> 4809 4810<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 4811forEachDescendant) which work on all nodes and allow users to write more generic 4812match expressions.</p> 4813 4814<table> 4815<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 4816<!-- START_TRAVERSAL_MATCHERS --> 4817 4818<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 4819<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 4820 4821Unlike anyOf, eachOf will generate a match result for each 4822matching submatcher. 4823 4824For example, in: 4825 class A { int a; int b; }; 4826The matcher: 4827 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 4828 has(fieldDecl(hasName("b")).bind("v")))) 4829will generate two results binding "v", the first of which binds 4830the field declaration of a, the second the field declaration of 4831b. 4832 4833Usable as: Any Matcher 4834</pre></td></tr> 4835 4836 4837<tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr> 4838<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 4839 4840Generates results for each match. 4841 4842For example, in: 4843 class A { class B {}; class C {}; }; 4844The matcher: 4845 cxxRecordDecl(hasName("::A"), 4846 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 4847will generate results for A, B and C. 4848 4849Usable as: Any Matcher 4850</pre></td></tr> 4851 4852 4853<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 4854<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 4855provided matcher. 4856 4857Example matches X, A, A::X, B, B::C, B::C::X 4858 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 4859 class X {}; 4860 class A { class X {}; }; // Matches A, because A::X is a class of name 4861 // X inside A. 4862 class B { class C { class X {}; }; }; 4863 4864DescendantT must be an AST base type. 4865 4866As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 4867each result that matches instead of only on the first one. 4868 4869Note: Recursively combined ForEachDescendant can cause many matches: 4870 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 4871 forEachDescendant(cxxRecordDecl()) 4872 ))) 4873will match 10 times (plus injected class name matches) on: 4874 class A { class B { class C { class D { class E {}; }; }; }; }; 4875 4876Usable as: Any Matcher 4877</pre></td></tr> 4878 4879 4880<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 4881<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 4882provided matcher. 4883 4884Example matches X, Y, Y::X, Z::Y, Z::Y::X 4885 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 4886 class X {}; 4887 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X 4888 // inside Y. 4889 class Z { class Y { class X {}; }; }; // Does not match Z. 4890 4891ChildT must be an AST base type. 4892 4893As opposed to 'has', 'forEach' will cause a match for each result that 4894matches instead of only on the first one. 4895 4896Usable as: Any Matcher 4897</pre></td></tr> 4898 4899 4900<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 4901<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 4902matcher. 4903 4904Given 4905void f() { if (true) { int x = 42; } } 4906void g() { for (;;) { int x = 43; } } 4907expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 4908 4909Usable as: Any Matcher 4910</pre></td></tr> 4911 4912 4913<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 4914<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 4915provided matcher. 4916 4917Example matches X, Y, Z 4918 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 4919 class X {}; // Matches X, because X::X is a class of name X inside X. 4920 class Y { class X {}; }; 4921 class Z { class Y { class X {}; }; }; 4922 4923DescendantT must be an AST base type. 4924 4925Usable as: Any Matcher 4926</pre></td></tr> 4927 4928 4929<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 4930<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 4931provided matcher. 4932 4933Example matches X, Y 4934 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 4935 class X {}; // Matches X, because X::X is a class of name X inside X. 4936 class Y { class X {}; }; 4937 class Z { class Y { class X {}; }; }; // Does not match Z. 4938 4939ChildT must be an AST base type. 4940 4941Usable as: Any Matcher 4942Note that has is direct matcher, so it also matches things like implicit 4943casts and paren casts. If you are matching with expr then you should 4944probably consider using ignoringParenImpCasts like: 4945has(ignoringParenImpCasts(expr())). 4946</pre></td></tr> 4947 4948 4949<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 4950<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 4951matcher. 4952 4953Given 4954void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 4955compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 4956 4957Usable as: Any Matcher 4958</pre></td></tr> 4959 4960 4961<tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr> 4962<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher. 4963 4964However, optionally will retain any bindings generated by the submatcher. 4965Useful when additional information which may or may not present about a main 4966matching node is desired. 4967 4968For example, in: 4969 class Foo { 4970 int bar; 4971 } 4972The matcher: 4973 cxxRecordDecl( 4974 optionally(has( 4975 fieldDecl(hasName("bar")).bind("var") 4976 ))).bind("record") 4977will produce a result binding for both "record" and "var". 4978The matcher will produce a "record" binding for even if there is no data 4979member named "bar" in that class. 4980 4981Usable as: Any Matcher 4982</pre></td></tr> 4983 4984 4985<tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr> 4986<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind. 4987 4988Given 4989 void foo() 4990 { 4991 int i = 3.0; 4992 } 4993The matcher 4994 traverse(TK_IgnoreImplicitCastsAndParentheses, 4995 varDecl(hasInitializer(floatLiteral().bind("init"))) 4996 ) 4997matches the variable declaration with "init" bound to the "3.0". 4998</pre></td></tr> 4999 5000 5001<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> 5002<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 5003switch statement or conditional operator. 5004 5005Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5006 if (true) {} 5007</pre></td></tr> 5008 5009 5010<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> 5011<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 5012(binary or ternary). 5013 5014Example matches b 5015 condition ? a : b 5016 condition ?: b 5017</pre></td></tr> 5018 5019 5020<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> 5021<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 5022 5023Example 1 (conditional ternary operator): matches a 5024 condition ? a : b 5025 5026Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 5027 condition ?: b 5028</pre></td></tr> 5029 5030 5031<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> 5032<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 5033matches the given matcher. 5034 5035The associated declaration is: 5036- for type nodes, the declaration of the underlying type 5037- for CallExpr, the declaration of the callee 5038- for MemberExpr, the declaration of the referenced member 5039- for CXXConstructExpr, the declaration of the constructor 5040- for CXXNewExpr, the declaration of the operator new 5041- for ObjCIvarExpr, the declaration of the ivar 5042 5043For type nodes, hasDeclaration will generally match the declaration of the 5044sugared type. Given 5045 class X {}; 5046 typedef X Y; 5047 Y y; 5048in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5049typedefDecl. A common use case is to match the underlying, desugared type. 5050This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5051 varDecl(hasType(hasUnqualifiedDesugaredType( 5052 recordType(hasDeclaration(decl()))))) 5053In this matcher, the decl will match the CXXRecordDecl of class X. 5054 5055Usable 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>>, 5056 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>>, 5057 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>>, 5058 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>>, 5059 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>>, 5060 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>>, 5061 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5062</pre></td></tr> 5063 5064 5065<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> 5066<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 5067 5068Given 5069 int i[5]; 5070 void f() { i[1] = 42; } 5071arraySubscriptExpression(hasBase(implicitCastExpr( 5072 hasSourceExpression(declRefExpr())))) 5073 matches i[1] with the declRefExpr() matching i 5074</pre></td></tr> 5075 5076 5077<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> 5078<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 5079 5080Given 5081 int i[5]; 5082 void f() { i[1] = 42; } 5083arraySubscriptExpression(hasIndex(integerLiteral())) 5084 matches i[1] with the integerLiteral() matching 1 5085</pre></td></tr> 5086 5087 5088<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> 5089<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 5090 5091Example matches a (matcher = binaryOperator(hasLHS())) 5092 a || b 5093</pre></td></tr> 5094 5095 5096<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> 5097<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 5098 5099Example matches b (matcher = binaryOperator(hasRHS())) 5100 a || b 5101</pre></td></tr> 5102 5103 5104<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> 5105<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 5106type. 5107 5108Given 5109 struct A {}; 5110 A a[7]; 5111 int b[7]; 5112arrayType(hasElementType(builtinType())) 5113 matches "int b[7]" 5114 5115Usable 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>> 5116</pre></td></tr> 5117 5118 5119<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> 5120<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 5121 5122Given 5123 _Atomic(int) i; 5124 _Atomic(float) f; 5125atomicType(hasValueType(isInteger())) 5126 matches "_Atomic(int) i" 5127 5128Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 5129</pre></td></tr> 5130 5131 5132<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> 5133<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 5134 5135Note: There is no TypeLoc for the deduced type and thus no 5136getDeducedLoc() matcher. 5137 5138Given 5139 auto a = 1; 5140 auto b = 2.0; 5141autoType(hasDeducedType(isInteger())) 5142 matches "auto a" 5143 5144Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 5145</pre></td></tr> 5146 5147 5148<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> 5149<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 5150binary operator matches. 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('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> 5155<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 5156 5157Example matches a (matcher = binaryOperator(hasLHS())) 5158 a || b 5159</pre></td></tr> 5160 5161 5162<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> 5163<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator. 5164 5165Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 5166 integerLiteral(equals(2))) 5167 1 + 2 // Match 5168 2 + 1 // Match 5169 1 + 1 // No match 5170 2 + 2 // No match 5171</pre></td></tr> 5172 5173 5174<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> 5175<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 5176 5177Example matches b (matcher = binaryOperator(hasRHS())) 5178 a || b 5179</pre></td></tr> 5180 5181 5182<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> 5183<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 5184block. 5185 5186Does not match the 'this' parameter of a method. 5187 5188Given 5189 class X { void f(int x, int y, int z) {} }; 5190cxxMethodDecl(hasAnyParameter(hasName("y"))) 5191 matches f(int x, int y, int z) {} 5192with hasAnyParameter(...) 5193 matching int y 5194 5195For ObjectiveC, given 5196 @interface I - (void) f:(int) y; @end 5197 5198the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 5199matches the declaration of method f with hasParameter 5200matching y. 5201 5202For blocks, given 5203 b = ^(int y) { printf("%d", y) }; 5204 5205the matcher blockDecl(hasAnyParameter(hasName("y"))) 5206matches the declaration of the block b with hasParameter 5207matching y. 5208</pre></td></tr> 5209 5210 5211<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> 5212<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 5213declaration or a block. 5214 5215Given 5216 class X { void f(int x) {} }; 5217cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 5218 matches f(int x) {} 5219with hasParameter(...) 5220 matching int x 5221 5222For ObjectiveC, given 5223 @interface I - (void) f:(int) y; @end 5224 5225the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 5226matches the declaration of method f with hasParameter 5227matching y. 5228</pre></td></tr> 5229 5230 5231<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> 5232<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 5233pointee matches a given matcher. 5234 5235Given 5236 int *a; 5237 int const *b; 5238 float const *f; 5239pointerType(pointee(isConstQualified(), isInteger())) 5240 matches "int const *b" 5241 5242Usable 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>>, 5243 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>> 5244</pre></td></tr> 5245 5246 5247<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> 5248<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value 5249declaration's type. 5250 5251In case of a value declaration (for example a variable declaration), 5252this resolves one layer of indirection. For example, in the value 5253declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 5254X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 5255declaration of x. 5256 5257Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5258 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5259 and friend class X (matcher = friendDecl(hasType("X")) 5260 class X {}; 5261 void y(X &x) { x; X z; } 5262 class Y { friend class X; }; 5263 5264Example matches class Derived 5265(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 5266class Base {}; 5267class Derived : Base {}; 5268 5269Usable 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>>, 5270Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 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('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> 5275<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 5276 5277Given 5278 void f(int i); 5279 int y; 5280 f(y); 5281callExpr( 5282 forEachArgumentWithParam( 5283 declRefExpr(to(varDecl(hasName("y")))), 5284 parmVarDecl(hasType(isInteger())) 5285)) 5286 matches f(y); 5287with declRefExpr(...) 5288 matching int y 5289and parmVarDecl(...) 5290 matching int i 5291</pre></td></tr> 5292 5293 5294<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> 5295<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 5296expression, or an ObjC-message-send expression. 5297 5298Given 5299 void x(int, int, int) { int y; x(1, y, 42); } 5300callExpr(hasAnyArgument(declRefExpr())) 5301 matches x(1, y, 42) 5302with hasAnyArgument(...) 5303 matching y 5304 5305For ObjectiveC, given 5306 @interface I - (void) f:(int) y; @end 5307 void foo(I *i) { [i f:12]; } 5308objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5309 matches [i f:12] 5310</pre></td></tr> 5311 5312 5313<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> 5314<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 5315call expression. 5316 5317Example matches y in x(y) 5318 (matcher = callExpr(hasArgument(0, declRefExpr()))) 5319 void x(int) { int y; x(y); } 5320</pre></td></tr> 5321 5322 5323<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> 5324<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 5325matches the given matcher. 5326 5327The associated declaration is: 5328- for type nodes, the declaration of the underlying type 5329- for CallExpr, the declaration of the callee 5330- for MemberExpr, the declaration of the referenced member 5331- for CXXConstructExpr, the declaration of the constructor 5332- for CXXNewExpr, the declaration of the operator new 5333- for ObjCIvarExpr, the declaration of the ivar 5334 5335For type nodes, hasDeclaration will generally match the declaration of the 5336sugared type. Given 5337 class X {}; 5338 typedef X Y; 5339 Y y; 5340in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5341typedefDecl. A common use case is to match the underlying, desugared type. 5342This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5343 varDecl(hasType(hasUnqualifiedDesugaredType( 5344 recordType(hasDeclaration(decl()))))) 5345In this matcher, the decl will match the CXXRecordDecl of class X. 5346 5347Usable 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>>, 5348 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>>, 5349 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>>, 5350 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>>, 5351 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>>, 5352 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>>, 5353 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5354</pre></td></tr> 5355 5356 5357<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> 5358<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 5359 5360Given 5361 class A { A() : i(42), j(42) {} int i; int j; }; 5362cxxConstructorDecl(forEachConstructorInitializer( 5363 forField(decl().bind("x")) 5364)) 5365 will trigger two matches, binding for 'i' and 'j' respectively. 5366</pre></td></tr> 5367 5368 5369<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> 5370<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 5371 5372Given 5373 struct Foo { 5374 Foo() : foo_(1) { } 5375 int foo_; 5376 }; 5377cxxRecordDecl(has(cxxConstructorDecl( 5378 hasAnyConstructorInitializer(anything()) 5379))) 5380 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 5381</pre></td></tr> 5382 5383 5384<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> 5385<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 5386 5387Given 5388 struct Foo { 5389 Foo() : foo_(1) { } 5390 int foo_; 5391 }; 5392cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 5393 forField(hasName("foo_")))))) 5394 matches Foo 5395with forField matching foo_ 5396</pre></td></tr> 5397 5398 5399<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> 5400<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 5401 5402Given 5403 struct Foo { 5404 Foo() : foo_(1) { } 5405 int foo_; 5406 }; 5407cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 5408 withInitializer(integerLiteral(equals(1))))))) 5409 matches Foo 5410with withInitializer matching (1) 5411</pre></td></tr> 5412 5413 5414<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> 5415<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 5416given matcher. Implicit object expressions are included; that is, it matches 5417use of implicit `this`. 5418 5419Given 5420 struct X { 5421 int m; 5422 int f(X x) { x.m; return m; } 5423 }; 5424memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 5425 matches `x.m`, but not `m`; however, 5426memberExpr(hasObjectExpression(hasType(pointsTo( 5427 cxxRecordDecl(hasName("X")))))) 5428 matches `m` (aka. `this->m`), but not `x.m`. 5429</pre></td></tr> 5430 5431 5432<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> 5433<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function 5434definition that has a given body. 5435 5436Given 5437 for (;;) {} 5438hasBody(compoundStmt()) 5439 matches 'for (;;) {}' 5440with compoundStmt() 5441 matching '{}' 5442</pre></td></tr> 5443 5444 5445<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> 5446<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer. 5447 5448Given: 5449 void foo() { 5450 if (int i = foobar(); i > 0) {} 5451 switch (int i = foobar(); i) {} 5452 for (auto& a = get_range(); auto& x : a) {} 5453 } 5454 void bar() { 5455 if (foobar() > 0) {} 5456 switch (foobar()) {} 5457 for (auto& x : get_range()) {} 5458 } 5459ifStmt(hasInitStatement(anything())) 5460 matches the if statement in foo but not in bar. 5461switchStmt(hasInitStatement(anything())) 5462 matches the switch statement in foo but not in bar. 5463cxxForRangeStmt(hasInitStatement(anything())) 5464 matches the range for statement in foo but not in bar. 5465</pre></td></tr> 5466 5467 5468<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> 5469<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 5470 5471Example: 5472 forStmt(hasLoopVariable(anything())) 5473matches 'int x' in 5474 for (int x : a) { } 5475</pre></td></tr> 5476 5477 5478<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> 5479<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 5480 5481Example: 5482 forStmt(hasRangeInit(anything())) 5483matches 'a' in 5484 for (int x : a) { } 5485</pre></td></tr> 5486 5487 5488<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> 5489<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 5490`on`, matches the argument directly without stripping away anything. 5491 5492Given 5493 class Y { public: void m(); }; 5494 Y g(); 5495 class X : public Y { void g(); }; 5496 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 5497cxxMemberCallExpr(onImplicitObjectArgument(hasType( 5498 cxxRecordDecl(hasName("Y"))))) 5499 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 5500cxxMemberCallExpr(on(callExpr())) 5501 does not match `(g()).m()`, because the parens are not ignored. 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('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> 5508<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 5509stripping off any parentheses or implicit casts. 5510 5511Given 5512 class Y { public: void m(); }; 5513 Y g(); 5514 class X : public Y {}; 5515 void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 5516cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 5517 matches `y.m()` and `(g()).m()`. 5518cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 5519 matches `x.m()`. 5520cxxMemberCallExpr(on(callExpr())) 5521 matches `(g()).m()`. 5522 5523FIXME: Overload to allow directly matching types? 5524</pre></td></tr> 5525 5526 5527<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> 5528<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 5529</pre></td></tr> 5530 5531 5532<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> 5533<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 5534matches the InnerMatcher, or is a pointer to a type that matches the 5535InnerMatcher. 5536 5537Given 5538 class Y { public: void m(); }; 5539 class X : public Y { void g(); }; 5540 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 5541cxxMemberCallExpr(thisPointerType(hasDeclaration( 5542 cxxRecordDecl(hasName("Y"))))) 5543 matches `y.m()`, `p->m()` and `x.m()`. 5544cxxMemberCallExpr(thisPointerType(hasDeclaration( 5545 cxxRecordDecl(hasName("X"))))) 5546 matches `x.g()`. 5547</pre></td></tr> 5548 5549 5550<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> 5551<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 5552produce multiple matches. 5553 5554Given 5555 class A { virtual void f(); }; 5556 class B : public A { void f(); }; 5557 class C : public B { void f(); }; 5558cxxMethodDecl(ofClass(hasName("C")), 5559 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 5560 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 5561 that B::f is not overridden by C::f). 5562 5563The check can produce multiple matches in case of multiple inheritance, e.g. 5564 class A1 { virtual void f(); }; 5565 class A2 { virtual void f(); }; 5566 class C : public A1, public A2 { void f(); }; 5567cxxMethodDecl(ofClass(hasName("C")), 5568 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 5569 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 5570 once with "b" binding "A2::f" and "d" binding "C::f". 5571</pre></td></tr> 5572 5573 5574<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> 5575<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 5576belongs to. 5577 5578FIXME: Generalize this for other kinds of declarations. 5579FIXME: What other kind of declarations would we need to generalize 5580this to? 5581 5582Example matches A() in the last line 5583 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 5584 ofClass(hasName("A")))))) 5585 class A { 5586 public: 5587 A(); 5588 }; 5589 A a = A(); 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('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> 5594<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments. 5595 5596Given: 5597 MyClass *p1 = new (Storage) MyClass(); 5598cxxNewExpr(hasAnyPlacementArg(anything())) 5599 matches the expression 'new (Storage, 16) MyClass()'. 5600</pre></td></tr> 5601 5602 5603<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> 5604<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 5605 5606Given: 5607 MyClass *p1 = new MyClass[10]; 5608cxxNewExpr(hasArraySize(integerLiteral(equals(10)))) 5609 matches the expression 'new MyClass[10]'. 5610</pre></td></tr> 5611 5612 5613<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> 5614<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 5615matches the given matcher. 5616 5617The associated declaration is: 5618- for type nodes, the declaration of the underlying type 5619- for CallExpr, the declaration of the callee 5620- for MemberExpr, the declaration of the referenced member 5621- for CXXConstructExpr, the declaration of the constructor 5622- for CXXNewExpr, the declaration of the operator new 5623- for ObjCIvarExpr, the declaration of the ivar 5624 5625For type nodes, hasDeclaration will generally match the declaration of the 5626sugared type. Given 5627 class X {}; 5628 typedef X Y; 5629 Y y; 5630in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5631typedefDecl. A common use case is to match the underlying, desugared type. 5632This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5633 varDecl(hasType(hasUnqualifiedDesugaredType( 5634 recordType(hasDeclaration(decl()))))) 5635In this matcher, the decl will match the CXXRecordDecl of class X. 5636 5637Usable 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>>, 5638 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>>, 5639 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>>, 5640 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>>, 5641 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>>, 5642 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>>, 5643 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5644</pre></td></tr> 5645 5646 5647<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> 5648<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments. 5649 5650Given: 5651 MyClass *p1 = new (Storage, 16) MyClass(); 5652cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16)))) 5653 matches the expression 'new (Storage, 16) MyClass()'. 5654</pre></td></tr> 5655 5656 5657<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> 5658<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher. 5659 5660Example: 5661matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 5662 class Foo; 5663 class Bar : Foo {}; 5664 class Baz : Bar {}; 5665 class SpecialBase; 5666 class Proxy : SpecialBase {}; // matches Proxy 5667 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived 5668 5669FIXME: Refactor this and isDerivedFrom to reuse implementation. 5670</pre></td></tr> 5671 5672 5673<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasDirectBase0')"><a name="hasDirectBase0Anchor">hasDirectBase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> BaseSpecMatcher</td></tr> 5674<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher. 5675 5676Example: 5677matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 5678 class Foo; 5679 class Bar : Foo {}; 5680 class Baz : Bar {}; 5681 class SpecialBase; 5682 class Proxy : SpecialBase {}; // matches Proxy 5683 class IndirectlyDerived : Proxy {}; // doesn't match 5684</pre></td></tr> 5685 5686 5687<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> 5688<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 5689 5690Given: 5691 class A { void func(); }; 5692 class B { void member(); }; 5693 5694cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 5695A but not B. 5696</pre></td></tr> 5697 5698 5699<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> 5700<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class 5701matching Base, or Objective-C classes that directly or indirectly 5702subclass a class matching Base. 5703 5704Note that a class is not considered to be derived from itself. 5705 5706Example matches Y, Z, C (Base == hasName("X")) 5707 class X; 5708 class Y : public X {}; // directly derived 5709 class Z : public Y {}; // indirectly derived 5710 typedef X A; 5711 typedef A B; 5712 class C : public B {}; // derived from a typedef of X 5713 5714In the following example, Bar matches isDerivedFrom(hasName("X")): 5715 class Foo; 5716 typedef Foo X; 5717 class Bar : public Foo {}; // derived from a type that X is a typedef of 5718 5719In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 5720 @interface NSObject @end 5721 @interface Bar : NSObject @end 5722 5723Usable 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>> 5724</pre></td></tr> 5725 5726 5727<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> 5728<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class 5729matching Base. 5730 5731Note that a class is not considered to be derived from itself. 5732 5733Example matches Y, C (Base == hasName("X")) 5734 class X; 5735 class Y : public X {}; // directly derived 5736 class Z : public Y {}; // indirectly derived 5737 typedef X A; 5738 typedef A B; 5739 class C : public B {}; // derived from a typedef of X 5740 5741In the following example, Bar matches isDerivedFrom(hasName("X")): 5742 class Foo; 5743 typedef Foo X; 5744 class Bar : public Foo {}; // derived from a type that X is a typedef of 5745</pre></td></tr> 5746 5747 5748<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> 5749<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 5750match Base. 5751</pre></td></tr> 5752 5753 5754<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> 5755<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 5756expression, or an ObjC-message-send expression. 5757 5758Given 5759 void x(int, int, int) { int y; x(1, y, 42); } 5760callExpr(hasAnyArgument(declRefExpr())) 5761 matches x(1, y, 42) 5762with hasAnyArgument(...) 5763 matching y 5764 5765For ObjectiveC, given 5766 @interface I - (void) f:(int) y; @end 5767 void foo(I *i) { [i f:12]; } 5768objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5769 matches [i f:12] 5770</pre></td></tr> 5771 5772 5773<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> 5774<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 5775given matcher. 5776 5777Example matches y.x() (matcher = callExpr(callee( 5778 cxxMethodDecl(hasName("x"))))) 5779 class Y { public: void x(); }; 5780 void z() { Y y; y.x(); } 5781</pre></td></tr> 5782 5783 5784<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> 5785<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 5786 5787Given 5788 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 5789 void f() { f(); } 5790callExpr(callee(expr())) 5791 matches this->x(), x(), y.x(), f() 5792with callee(...) 5793 matching this->x, x, y.x, f respectively 5794 5795Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 5796because this introduces ambiguous overloads with calls to Callee taking a 5797internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 5798implemented in terms of implicit casts. 5799</pre></td></tr> 5800 5801 5802<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> 5803<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 5804 5805Given 5806 void f(int i); 5807 int y; 5808 f(y); 5809callExpr( 5810 forEachArgumentWithParam( 5811 declRefExpr(to(varDecl(hasName("y")))), 5812 parmVarDecl(hasType(isInteger())) 5813)) 5814 matches f(y); 5815with declRefExpr(...) 5816 matching int y 5817and parmVarDecl(...) 5818 matching int i 5819</pre></td></tr> 5820 5821 5822<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> 5823<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 5824expression, or an ObjC-message-send expression. 5825 5826Given 5827 void x(int, int, int) { int y; x(1, y, 42); } 5828callExpr(hasAnyArgument(declRefExpr())) 5829 matches x(1, y, 42) 5830with hasAnyArgument(...) 5831 matching y 5832 5833For ObjectiveC, given 5834 @interface I - (void) f:(int) y; @end 5835 void foo(I *i) { [i f:12]; } 5836objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5837 matches [i f:12] 5838</pre></td></tr> 5839 5840 5841<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> 5842<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 5843call expression. 5844 5845Example matches y in x(y) 5846 (matcher = callExpr(hasArgument(0, declRefExpr()))) 5847 void x(int) { int y; x(y); } 5848</pre></td></tr> 5849 5850 5851<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> 5852<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 5853matches the given matcher. 5854 5855The associated declaration is: 5856- for type nodes, the declaration of the underlying type 5857- for CallExpr, the declaration of the callee 5858- for MemberExpr, the declaration of the referenced member 5859- for CXXConstructExpr, the declaration of the constructor 5860- for CXXNewExpr, the declaration of the operator new 5861- for ObjCIvarExpr, the declaration of the ivar 5862 5863For type nodes, hasDeclaration will generally match the declaration of the 5864sugared type. Given 5865 class X {}; 5866 typedef X Y; 5867 Y y; 5868in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5869typedefDecl. A common use case is to match the underlying, desugared type. 5870This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5871 varDecl(hasType(hasUnqualifiedDesugaredType( 5872 recordType(hasDeclaration(decl()))))) 5873In this matcher, the decl will match the CXXRecordDecl of class X. 5874 5875Usable 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>>, 5876 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>>, 5877 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>>, 5878 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>>, 5879 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>>, 5880 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>>, 5881 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5882</pre></td></tr> 5883 5884 5885<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> 5886<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 5887extension, matches the constant given in the statement. 5888 5889Given 5890 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 5891caseStmt(hasCaseConstant(integerLiteral())) 5892 matches "case 1:" 5893</pre></td></tr> 5894 5895 5896<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> 5897<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 5898or opaque value's source expression matches the given matcher. 5899 5900Example 1: matches "a string" 5901(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 5902class URL { URL(string); }; 5903URL url = "a string"; 5904 5905Example 2: matches 'b' (matcher = 5906opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 5907int a = b ?: 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('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> 5912<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 5913functionDecl that have at least one TemplateArgument matching the given 5914InnerMatcher. 5915 5916Given 5917 template<typename T> class A {}; 5918 template<> class A<double> {}; 5919 A<int> a; 5920 5921 template<typename T> f() {}; 5922 void func() { f<int>(); }; 5923 5924classTemplateSpecializationDecl(hasAnyTemplateArgument( 5925 refersToType(asString("int")))) 5926 matches the specialization A<int> 5927 5928functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 5929 matches the specialization f<int> 5930</pre></td></tr> 5931 5932 5933<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> 5934<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 5935 5936Given 5937 template<typename T> class A {}; #1 5938 template<> class A<int> {}; #2 5939classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 5940 matches '#2' with classTemplateDecl() matching the class template 5941 declaration of 'A' at #1. 5942</pre></td></tr> 5943 5944 5945<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> 5946<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 5947functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 5948 5949Given 5950 template<typename T, typename U> class A {}; 5951 A<bool, int> b; 5952 A<int, bool> c; 5953 5954 template<typename T> void f() {} 5955 void func() { f<int>(); }; 5956classTemplateSpecializationDecl(hasTemplateArgument( 5957 1, refersToType(asString("int")))) 5958 matches the specialization A<bool, int> 5959 5960functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 5961 matches the specialization f<int> 5962</pre></td></tr> 5963 5964 5965<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> 5966<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 5967type. 5968 5969Given 5970 struct A {}; 5971 A a[7]; 5972 int b[7]; 5973arrayType(hasElementType(builtinType())) 5974 matches "int b[7]" 5975 5976Usable 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>> 5977</pre></td></tr> 5978 5979 5980<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> 5981<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 5982a given matcher. Also matches StmtExprs that have CompoundStmt as children. 5983 5984Given 5985 { {}; 1+2; } 5986hasAnySubstatement(compoundStmt()) 5987 matches '{ {}; 1+2; }' 5988with compoundStmt() 5989 matching '{}' 5990</pre></td></tr> 5991 5992 5993<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> 5994<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher 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('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> 5999<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 6000matches the given matcher. 6001 6002The associated declaration is: 6003- for type nodes, the declaration of the underlying type 6004- for CallExpr, the declaration of the callee 6005- for MemberExpr, the declaration of the referenced member 6006- for CXXConstructExpr, the declaration of the constructor 6007- for CXXNewExpr, the declaration of the operator new 6008- for ObjCIvarExpr, the declaration of the ivar 6009 6010For type nodes, hasDeclaration will generally match the declaration of the 6011sugared type. Given 6012 class X {}; 6013 typedef X Y; 6014 Y y; 6015in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6016typedefDecl. A common use case is to match the underlying, desugared type. 6017This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6018 varDecl(hasType(hasUnqualifiedDesugaredType( 6019 recordType(hasDeclaration(decl()))))) 6020In this matcher, the decl will match the CXXRecordDecl of class X. 6021 6022Usable 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>>, 6023 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>>, 6024 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>>, 6025 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>>, 6026 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>>, 6027 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>>, 6028 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6029</pre></td></tr> 6030 6031 6032<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> 6033<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 6034specific using shadow declaration. 6035 6036Given 6037 namespace a { void f() {} } 6038 using a::f; 6039 void g() { 6040 f(); // Matches this .. 6041 a::f(); // .. but not this. 6042 } 6043declRefExpr(throughUsingDecl(anything())) 6044 matches f() 6045</pre></td></tr> 6046 6047 6048<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> 6049<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 6050specified matcher. 6051 6052Example matches x in if(x) 6053 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 6054 bool x; 6055 if (x) {} 6056</pre></td></tr> 6057 6058 6059<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> 6060<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 6061 6062Note that this does not work for global declarations because the AST 6063breaks up multiple-declaration DeclStmt's into multiple single-declaration 6064DeclStmt's. 6065Example: Given non-global declarations 6066 int a, b = 0; 6067 int c; 6068 int d = 2, e; 6069declStmt(containsDeclaration( 6070 0, varDecl(hasInitializer(anything())))) 6071 matches only 'int d = 2, e;', and 6072declStmt(containsDeclaration(1, varDecl())) 6073 matches 'int a, b = 0' as well as 'int d = 2, e;' 6074 but 'int c;' is not matched. 6075</pre></td></tr> 6076 6077 6078<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> 6079<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 6080 6081Given 6082 int a, b; 6083 int c; 6084declStmt(hasSingleDecl(anything())) 6085 matches 'int c;' but not 'int a, b;'. 6086</pre></td></tr> 6087 6088 6089<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> 6090<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 6091the inner matcher. 6092 6093Given 6094 int x; 6095declaratorDecl(hasTypeLoc(loc(asString("int")))) 6096 matches int x 6097</pre></td></tr> 6098 6099 6100<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> 6101<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 6102Decl, matches InnerMatcher. 6103 6104Given 6105 namespace N { 6106 namespace M { 6107 class D {}; 6108 } 6109 } 6110 6111cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 6112declaration of class D. 6113</pre></td></tr> 6114 6115 6116<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> 6117<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type. 6118 6119Given 6120 decltype(1) a = 1; 6121 decltype(2.0) b = 2.0; 6122decltypeType(hasUnderlyingType(isInteger())) 6123 matches the type of "a" 6124 6125Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>> 6126</pre></td></tr> 6127 6128 6129<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> 6130<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function 6131definition that has a given body. 6132 6133Given 6134 for (;;) {} 6135hasBody(compoundStmt()) 6136 matches 'for (;;) {}' 6137with compoundStmt() 6138 matching '{}' 6139</pre></td></tr> 6140 6141 6142<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> 6143<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 6144switch statement or conditional operator. 6145 6146Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6147 if (true) {} 6148</pre></td></tr> 6149 6150 6151<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> 6152<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 6153matches InnerMatcher if the qualifier exists. 6154 6155Given 6156 namespace N { 6157 namespace M { 6158 class D {}; 6159 } 6160 } 6161 N::M::D d; 6162 6163elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 6164matches the type of the variable declaration of d. 6165</pre></td></tr> 6166 6167 6168<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> 6169<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 6170 6171Given 6172 namespace N { 6173 namespace M { 6174 class D {}; 6175 } 6176 } 6177 N::M::D d; 6178 6179elaboratedType(namesType(recordType( 6180hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 6181declaration of d. 6182</pre></td></tr> 6183 6184 6185<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> 6186<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 6187matches the given matcher. 6188 6189The associated declaration is: 6190- for type nodes, the declaration of the underlying type 6191- for CallExpr, the declaration of the callee 6192- for MemberExpr, the declaration of the referenced member 6193- for CXXConstructExpr, the declaration of the constructor 6194- for CXXNewExpr, the declaration of the operator new 6195- for ObjCIvarExpr, the declaration of the ivar 6196 6197For type nodes, hasDeclaration will generally match the declaration of the 6198sugared type. Given 6199 class X {}; 6200 typedef X Y; 6201 Y y; 6202in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6203typedefDecl. A common use case is to match the underlying, desugared type. 6204This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6205 varDecl(hasType(hasUnqualifiedDesugaredType( 6206 recordType(hasDeclaration(decl()))))) 6207In this matcher, the decl will match the CXXRecordDecl of class X. 6208 6209Usable 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>>, 6210 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>>, 6211 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>>, 6212 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>>, 6213 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>>, 6214 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>>, 6215 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6216</pre></td></tr> 6217 6218 6219<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> 6220<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 6221 6222(Note: Clang's AST refers to other conversions as "casts" too, and calls 6223actual casts "explicit" casts.) 6224</pre></td></tr> 6225 6226 6227<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> 6228<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value 6229declaration's type. 6230 6231In case of a value declaration (for example a variable declaration), 6232this resolves one layer of indirection. For example, in the value 6233declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6234X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6235declaration of x. 6236 6237Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6238 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6239 and friend class X (matcher = friendDecl(hasType("X")) 6240 class X {}; 6241 void y(X &x) { x; X z; } 6242 class Y { friend class X; }; 6243 6244Example matches class Derived 6245(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6246class Base {}; 6247class Derived : Base {}; 6248 6249Usable 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>>, 6250Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6251</pre></td></tr> 6252 6253 6254<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> 6255<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 6256matcher. 6257 6258Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6259 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6260 and U (matcher = typedefDecl(hasType(asString("int"))) 6261 and friend class X (matcher = friendDecl(hasType("X")) 6262 class X {}; 6263 void y(X &x) { x; X z; } 6264 typedef int U; 6265 class Y { friend class X; }; 6266</pre></td></tr> 6267 6268 6269<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> 6270<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 6271elidable constructor and other corresponding bookkeeping nodes. 6272 6273In C++17, elidable copy constructors are no longer being generated in the 6274AST as it is not permitted by the standard. They are, however, part of the 6275AST in C++14 and earlier. So, a matcher must abstract over these differences 6276to work in all language modes. This matcher skips elidable constructor-call 6277AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 6278various implicit nodes inside the constructor calls, all of which will not 6279appear in the C++17 AST. 6280 6281Given 6282 6283struct H {}; 6284H G(); 6285void f() { 6286 H D = G(); 6287} 6288 6289``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 6290matches ``H D = G()`` in C++11 through C++17 (and beyond). 6291</pre></td></tr> 6292 6293 6294<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> 6295<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 6296are stripped off. 6297 6298Parentheses and explicit casts are not discarded. 6299Given 6300 int arr[5]; 6301 int a = 0; 6302 char b = 0; 6303 const int c = a; 6304 int *d = arr; 6305 long e = (long) 0l; 6306The matchers 6307 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 6308 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 6309would match the declarations for a, b, c, and d, but not e. 6310While 6311 varDecl(hasInitializer(integerLiteral())) 6312 varDecl(hasInitializer(declRefExpr())) 6313only match the declarations for b, c, and d. 6314</pre></td></tr> 6315 6316 6317<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> 6318<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 6319nodes are stripped off. 6320 6321Parentheses and explicit casts are not discarded. 6322Given 6323 class C {}; 6324 C a = C(); 6325 C b; 6326 C c = b; 6327The matchers 6328 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 6329would match the declarations for a, b, and c. 6330While 6331 varDecl(hasInitializer(cxxConstructExpr())) 6332only match the declarations for b and c. 6333</pre></td></tr> 6334 6335 6336<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> 6337<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 6338casts are stripped off. 6339 6340Implicit and non-C Style casts are also discarded. 6341Given 6342 int a = 0; 6343 char b = (0); 6344 void* c = reinterpret_cast<char*>(0); 6345 char d = char(0); 6346The matcher 6347 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 6348would match the declarations for a, b, c, and d. 6349while 6350 varDecl(hasInitializer(integerLiteral())) 6351only match the declaration for a. 6352</pre></td></tr> 6353 6354 6355<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> 6356<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 6357parentheses are stripped off. 6358 6359Explicit casts are not discarded. 6360Given 6361 int arr[5]; 6362 int a = 0; 6363 char b = (0); 6364 const int c = a; 6365 int *d = (arr); 6366 long e = ((long) 0l); 6367The matchers 6368 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 6369 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 6370would match the declarations for a, b, c, and d, but not e. 6371while 6372 varDecl(hasInitializer(integerLiteral())) 6373 varDecl(hasInitializer(declRefExpr())) 6374would only match the declaration for a. 6375</pre></td></tr> 6376 6377 6378<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> 6379<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 6380 6381Given 6382 const char* str = ("my-string"); 6383The matcher 6384 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 6385would match the implicit cast resulting from the assignment. 6386</pre></td></tr> 6387 6388 6389<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> 6390<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 6391 6392Given 6393 class C { 6394 int a = 2; 6395 int b = 3; 6396 int c; 6397 }; 6398fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 6399 matches 'int a;' but not 'int b;'. 6400fieldDecl(hasInClassInitializer(anything())) 6401 matches 'int a;' and 'int b;' but not 'int c;'. 6402</pre></td></tr> 6403 6404 6405<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> 6406<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function 6407definition that has a given body. 6408 6409Given 6410 for (;;) {} 6411hasBody(compoundStmt()) 6412 matches 'for (;;) {}' 6413with compoundStmt() 6414 matching '{}' 6415</pre></td></tr> 6416 6417 6418<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> 6419<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 6420switch statement or conditional operator. 6421 6422Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6423 if (true) {} 6424</pre></td></tr> 6425 6426 6427<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> 6428<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 6429 6430Example: 6431 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 6432matches '++x' in 6433 for (x; x < N; ++x) { } 6434</pre></td></tr> 6435 6436 6437<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> 6438<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 6439 6440Example: 6441 forStmt(hasLoopInit(declStmt())) 6442matches 'int x = 0' in 6443 for (int x = 0; x < N; ++x) { } 6444</pre></td></tr> 6445 6446 6447<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> 6448<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 6449declaration's type. 6450 6451In case of a value declaration (for example a variable declaration), 6452this resolves one layer of indirection. For example, in the value 6453declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6454X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6455declaration of x. 6456 6457Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6458 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6459 and friend class X (matcher = friendDecl(hasType("X")) 6460 class X {}; 6461 void y(X &x) { x; X z; } 6462 class Y { friend class X; }; 6463 6464Example matches class Derived 6465(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6466class Base {}; 6467class Derived : Base {}; 6468 6469Usable 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>>, 6470Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6471</pre></td></tr> 6472 6473 6474<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> 6475<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 6476matcher. 6477 6478Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6479 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6480 and U (matcher = typedefDecl(hasType(asString("int"))) 6481 and friend class X (matcher = friendDecl(hasType("X")) 6482 class X {}; 6483 void y(X &x) { x; X z; } 6484 typedef int U; 6485 class Y { friend class X; }; 6486</pre></td></tr> 6487 6488 6489<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> 6490<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 6491block. 6492 6493Does not match the 'this' parameter of a method. 6494 6495Given 6496 class X { void f(int x, int y, int z) {} }; 6497cxxMethodDecl(hasAnyParameter(hasName("y"))) 6498 matches f(int x, int y, int z) {} 6499with hasAnyParameter(...) 6500 matching int y 6501 6502For ObjectiveC, given 6503 @interface I - (void) f:(int) y; @end 6504 6505the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 6506matches the declaration of method f with hasParameter 6507matching y. 6508 6509For blocks, given 6510 b = ^(int y) { printf("%d", y) }; 6511 6512the matcher blockDecl(hasAnyParameter(hasName("y"))) 6513matches the declaration of the block b with hasParameter 6514matching y. 6515</pre></td></tr> 6516 6517 6518<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> 6519<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6520functionDecl that have at least one TemplateArgument matching the given 6521InnerMatcher. 6522 6523Given 6524 template<typename T> class A {}; 6525 template<> class A<double> {}; 6526 A<int> a; 6527 6528 template<typename T> f() {}; 6529 void func() { f<int>(); }; 6530 6531classTemplateSpecializationDecl(hasAnyTemplateArgument( 6532 refersToType(asString("int")))) 6533 matches the specialization A<int> 6534 6535functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 6536 matches the specialization f<int> 6537</pre></td></tr> 6538 6539 6540<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> 6541<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function 6542definition that has a given body. 6543 6544Given 6545 for (;;) {} 6546hasBody(compoundStmt()) 6547 matches 'for (;;) {}' 6548with compoundStmt() 6549 matching '{}' 6550</pre></td></tr> 6551 6552 6553<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> 6554<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 6555declaration. 6556 6557Given 6558 template<bool b> 6559 struct S { 6560 S(int); // #1 6561 explicit S(double); // #2 6562 operator int(); // #3 6563 explicit operator bool(); // #4 6564 explicit(false) S(bool) // # 7 6565 explicit(true) S(char) // # 8 6566 explicit(b) S(S) // # 9 6567 }; 6568 S(int) -> S<true> // #5 6569 explicit S(double) -> S<false> // #6 6570cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 6571cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 6572cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 6573</pre></td></tr> 6574 6575 6576<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> 6577<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 6578declaration or a block. 6579 6580Given 6581 class X { void f(int x) {} }; 6582cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6583 matches f(int x) {} 6584with hasParameter(...) 6585 matching int x 6586 6587For ObjectiveC, given 6588 @interface I - (void) f:(int) y; @end 6589 6590the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6591matches the declaration of method f with hasParameter 6592matching y. 6593</pre></td></tr> 6594 6595 6596<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> 6597<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6598functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 6599 6600Given 6601 template<typename T, typename U> class A {}; 6602 A<bool, int> b; 6603 A<int, bool> c; 6604 6605 template<typename T> void f() {} 6606 void func() { f<int>(); }; 6607classTemplateSpecializationDecl(hasTemplateArgument( 6608 1, refersToType(asString("int")))) 6609 matches the specialization A<bool, int> 6610 6611functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 6612 matches the specialization f<int> 6613</pre></td></tr> 6614 6615 6616<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> 6617<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 6618 6619Given: 6620 class X { int f() { return 1; } }; 6621cxxMethodDecl(returns(asString("int"))) 6622 matches int f() { return 1; } 6623</pre></td></tr> 6624 6625 6626<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> 6627<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 6628switch statement or conditional operator. 6629 6630Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6631 if (true) {} 6632</pre></td></tr> 6633 6634 6635<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> 6636<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 6637 6638Given 6639 if (A* a = GetAPointer()) {} 6640hasConditionVariableStatement(...) 6641 matches 'A* a = GetAPointer()'. 6642</pre></td></tr> 6643 6644 6645<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> 6646<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 6647 6648Examples matches the if statement 6649 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 6650 if (false) false; else true; 6651</pre></td></tr> 6652 6653 6654<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> 6655<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 6656 6657Given: 6658 void foo() { 6659 if (int i = foobar(); i > 0) {} 6660 switch (int i = foobar(); i) {} 6661 for (auto& a = get_range(); auto& x : a) {} 6662 } 6663 void bar() { 6664 if (foobar() > 0) {} 6665 switch (foobar()) {} 6666 for (auto& x : get_range()) {} 6667 } 6668ifStmt(hasInitStatement(anything())) 6669 matches the if statement in foo but not in bar. 6670switchStmt(hasInitStatement(anything())) 6671 matches the switch statement in foo but not in bar. 6672cxxForRangeStmt(hasInitStatement(anything())) 6673 matches the range for statement in foo but not in bar. 6674</pre></td></tr> 6675 6676 6677<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> 6678<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 6679 6680Examples matches the if statement 6681 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 6682 if (false) true; else false; 6683</pre></td></tr> 6684 6685 6686<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> 6687<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 6688matcher. 6689 6690FIXME: Unit test this matcher 6691</pre></td></tr> 6692 6693 6694<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> 6695<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 6696 6697Example matches y. 6698 (matcher = initListExpr(hasInit(0, expr()))) 6699 int x{y}. 6700</pre></td></tr> 6701 6702 6703<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> 6704<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 6705(if expression have it). 6706</pre></td></tr> 6707 6708 6709<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> 6710<tr><td colspan="4" class="doc" id="hasDeclaration9"><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_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> 6744<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 6745matches the given matcher. 6746 6747The associated declaration is: 6748- for type nodes, the declaration of the underlying type 6749- for CallExpr, the declaration of the callee 6750- for MemberExpr, the declaration of the referenced member 6751- for CXXConstructExpr, the declaration of the constructor 6752- for CXXNewExpr, the declaration of the operator new 6753- for ObjCIvarExpr, the declaration of the ivar 6754 6755For type nodes, hasDeclaration will generally match the declaration of the 6756sugared type. Given 6757 class X {}; 6758 typedef X Y; 6759 Y y; 6760in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6761typedefDecl. A common use case is to match the underlying, desugared type. 6762This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6763 varDecl(hasType(hasUnqualifiedDesugaredType( 6764 recordType(hasDeclaration(decl()))))) 6765In this matcher, the decl will match the CXXRecordDecl of class X. 6766 6767Usable 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>>, 6768 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>>, 6769 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>>, 6770 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>>, 6771 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>>, 6772 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>>, 6773 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6774</pre></td></tr> 6775 6776 6777<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> 6778<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression. 6779 6780Given 6781 struct foo { 6782 void bar() { 6783 auto f = [this](){}; 6784 } 6785 } 6786lambdaExpr(hasAnyCapture(cxxThisExpr())) 6787 matches [this](){}; 6788</pre></td></tr> 6789 6790 6791<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> 6792<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression. 6793 6794Given 6795 void foo() { 6796 int x; 6797 auto f = [x](){}; 6798 } 6799lambdaExpr(hasAnyCapture(anything())) 6800 matches [x](){}; 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('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> 6805<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 6806matches the given matcher. 6807 6808The associated declaration is: 6809- for type nodes, the declaration of the underlying type 6810- for CallExpr, the declaration of the callee 6811- for MemberExpr, the declaration of the referenced member 6812- for CXXConstructExpr, the declaration of the constructor 6813- for CXXNewExpr, the declaration of the operator new 6814- for ObjCIvarExpr, the declaration of the ivar 6815 6816For type nodes, hasDeclaration will generally match the declaration of the 6817sugared type. Given 6818 class X {}; 6819 typedef X Y; 6820 Y y; 6821in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6822typedefDecl. A common use case is to match the underlying, desugared type. 6823This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6824 varDecl(hasType(hasUnqualifiedDesugaredType( 6825 recordType(hasDeclaration(decl()))))) 6826In this matcher, the decl will match the CXXRecordDecl of class X. 6827 6828Usable 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>>, 6829 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>>, 6830 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>>, 6831 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>>, 6832 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>>, 6833 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>>, 6834 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6835</pre></td></tr> 6836 6837 6838<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> 6839<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 6840given matcher. Implicit object expressions are included; that is, it matches 6841use of implicit `this`. 6842 6843Given 6844 struct X { 6845 int m; 6846 int f(X x) { x.m; return m; } 6847 }; 6848memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6849 matches `x.m`, but not `m`; however, 6850memberExpr(hasObjectExpression(hasType(pointsTo( 6851 cxxRecordDecl(hasName("X")))))) 6852 matches `m` (aka. `this->m`), but not `x.m`. 6853</pre></td></tr> 6854 6855 6856<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> 6857<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 6858given matcher. 6859 6860Given 6861 struct { int first, second; } first, second; 6862 int i(second.first); 6863 int j(first.second); 6864memberExpr(member(hasName("first"))) 6865 matches second.first 6866 but not first.second (because the member name there is "second"). 6867</pre></td></tr> 6868 6869 6870<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> 6871<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 6872pointee matches a given matcher. 6873 6874Given 6875 int *a; 6876 int const *b; 6877 float const *f; 6878pointerType(pointee(isConstQualified(), isInteger())) 6879 matches "int const *b" 6880 6881Usable 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>>, 6882 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>> 6883</pre></td></tr> 6884 6885 6886<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> 6887<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 6888matcher. 6889 6890Given 6891 namespace N { template<class T> void f(T t); } 6892 template <class T> void g() { using N::f; f(T()); } 6893unresolvedLookupExpr(hasAnyDeclaration( 6894 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 6895 matches the use of f in g() . 6896</pre></td></tr> 6897 6898 6899<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> 6900<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 6901 6902Given 6903 struct A { struct B { struct C {}; }; }; 6904 A::B::C c; 6905nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 6906 matches "A::" 6907</pre></td></tr> 6908 6909 6910<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> 6911<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 6912NestedNameSpecifier-matcher matches. 6913</pre></td></tr> 6914 6915 6916<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> 6917<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 6918given TypeLoc. 6919 6920Given 6921 struct A { struct B { struct C {}; }; }; 6922 A::B::C c; 6923nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 6924 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 6925 matches "A::" 6926</pre></td></tr> 6927 6928 6929<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> 6930<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 6931 6932Given 6933 struct A { struct B { struct C {}; }; }; 6934 A::B::C c; 6935nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 6936 matches "A::" 6937</pre></td></tr> 6938 6939 6940<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> 6941<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 6942given namespace matcher. 6943 6944Given 6945 namespace ns { struct A {}; } 6946 ns::A a; 6947nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 6948 matches "ns::" 6949</pre></td></tr> 6950 6951 6952<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> 6953<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 6954given QualType matcher without qualifiers. 6955 6956Given 6957 struct A { struct B { struct C {}; }; }; 6958 A::B::C c; 6959nestedNameSpecifier(specifiesType( 6960 hasDeclaration(cxxRecordDecl(hasName("A"))) 6961)) 6962 matches "A::" 6963</pre></td></tr> 6964 6965 6966<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> 6967<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 6968 6969Given 6970 6971 #pragma omp parallel 6972 #pragma omp parallel default(none) 6973 6974``ompExecutableDirective(hasAnyClause(anything()))`` matches 6975``omp parallel default(none)``. 6976</pre></td></tr> 6977 6978 6979<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> 6980<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 6981 6982Prerequisite: the executable directive must not be standalone directive. 6983If it is, it will never match. 6984 6985Given 6986 6987 #pragma omp parallel 6988 ; 6989 #pragma omp parallel 6990 {} 6991 6992``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 6993</pre></td></tr> 6994 6995 6996<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> 6997<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 6998matching Base, or Objective-C classes that directly or indirectly 6999subclass a class matching Base. 7000 7001Note that a class is not considered to be derived from itself. 7002 7003Example matches Y, Z, C (Base == hasName("X")) 7004 class X; 7005 class Y : public X {}; // directly derived 7006 class Z : public Y {}; // indirectly derived 7007 typedef X A; 7008 typedef A B; 7009 class C : public B {}; // derived from a typedef of X 7010 7011In the following example, Bar matches isDerivedFrom(hasName("X")): 7012 class Foo; 7013 typedef Foo X; 7014 class Bar : public Foo {}; // derived from a type that X is a typedef of 7015 7016In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 7017 @interface NSObject @end 7018 @interface Bar : NSObject @end 7019 7020Usable 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>> 7021</pre></td></tr> 7022 7023 7024<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> 7025<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 7026matching Base. 7027 7028Note that a class is not considered to be derived from itself. 7029 7030Example matches Y, C (Base == hasName("X")) 7031 class X; 7032 class Y : public X {}; // directly derived 7033 class Z : public Y {}; // indirectly derived 7034 typedef X A; 7035 typedef A B; 7036 class C : public B {}; // derived from a typedef of X 7037 7038In the following example, Bar matches isDerivedFrom(hasName("X")): 7039 class Foo; 7040 typedef Foo X; 7041 class Bar : public Foo {}; // derived from a type that X is a typedef of 7042</pre></td></tr> 7043 7044 7045<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> 7046<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 7047match Base. 7048</pre></td></tr> 7049 7050 7051<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> 7052<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 7053expression, or an ObjC-message-send expression. 7054 7055Given 7056 void x(int, int, int) { int y; x(1, y, 42); } 7057callExpr(hasAnyArgument(declRefExpr())) 7058 matches x(1, y, 42) 7059with hasAnyArgument(...) 7060 matching y 7061 7062For ObjectiveC, given 7063 @interface I - (void) f:(int) y; @end 7064 void foo(I *i) { [i f:12]; } 7065objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 7066 matches [i f:12] 7067</pre></td></tr> 7068 7069 7070<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> 7071<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 7072call expression. 7073 7074Example matches y in x(y) 7075 (matcher = callExpr(hasArgument(0, declRefExpr()))) 7076 void x(int) { int y; x(y); } 7077</pre></td></tr> 7078 7079 7080<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> 7081<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 7082and the inner matcher matches on that instance. 7083 7084For example the method call in 7085 NSString *x = @"hello"; 7086 [x containsString:@"h"]; 7087is matched by 7088objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 7089</pre></td></tr> 7090 7091 7092<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> 7093<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 7094 7095Example 7096matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 7097matches the [webView ...] message invocation. 7098 NSString *webViewJavaScript = ... 7099 UIWebView *webView = ... 7100 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 7101</pre></td></tr> 7102 7103 7104<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> 7105<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 7106block. 7107 7108Does not match the 'this' parameter of a method. 7109 7110Given 7111 class X { void f(int x, int y, int z) {} }; 7112cxxMethodDecl(hasAnyParameter(hasName("y"))) 7113 matches f(int x, int y, int z) {} 7114with hasAnyParameter(...) 7115 matching int y 7116 7117For ObjectiveC, given 7118 @interface I - (void) f:(int) y; @end 7119 7120the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 7121matches the declaration of method f with hasParameter 7122matching y. 7123 7124For blocks, given 7125 b = ^(int y) { printf("%d", y) }; 7126 7127the matcher blockDecl(hasAnyParameter(hasName("y"))) 7128matches the declaration of the block b with hasParameter 7129matching y. 7130</pre></td></tr> 7131 7132 7133<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> 7134<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 7135declaration or a block. 7136 7137Given 7138 class X { void f(int x) {} }; 7139cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 7140 matches f(int x) {} 7141with hasParameter(...) 7142 matching int x 7143 7144For ObjectiveC, given 7145 @interface I - (void) f:(int) y; @end 7146 7147the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 7148matches the declaration of method f with hasParameter 7149matching y. 7150</pre></td></tr> 7151 7152 7153<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> 7154<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 7155or opaque value's source expression matches the given matcher. 7156 7157Example 1: matches "a string" 7158(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 7159class URL { URL(string); }; 7160URL url = "a string"; 7161 7162Example 2: matches 'b' (matcher = 7163opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 7164int a = b ?: 1; 7165</pre></td></tr> 7166 7167 7168<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> 7169<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 7170overloads matches the given matcher. 7171 7172Given 7173 template <typename T> void foo(T); 7174 template <typename T> void bar(T); 7175 template <typename T> void baz(T t) { 7176 foo(t); 7177 bar(t); 7178 } 7179unresolvedLookupExpr(hasAnyDeclaration( 7180 functionTemplateDecl(hasName("foo")))) 7181 matches foo in foo(t); but not bar in bar(t); 7182</pre></td></tr> 7183 7184 7185<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> 7186<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 7187 7188Given 7189 int (*ptr_to_array)[4]; 7190 int (*ptr_to_func)(int); 7191 7192varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 7193ptr_to_func but not ptr_to_array. 7194 7195Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 7196</pre></td></tr> 7197 7198 7199<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> 7200<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 7201pointee matches a given matcher. 7202 7203Given 7204 int *a; 7205 int const *b; 7206 float const *f; 7207pointerType(pointee(isConstQualified(), isInteger())) 7208 matches "int const *b" 7209 7210Usable 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>>, 7211 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>> 7212</pre></td></tr> 7213 7214 7215<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> 7216<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 7217 7218Given: 7219 typedef int &int_ref; 7220 int a; 7221 int_ref b = a; 7222 7223varDecl(hasType(qualType(referenceType()))))) will not match the 7224declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 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('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> 7229<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 7230matches the given matcher. 7231 7232The associated declaration is: 7233- for type nodes, the declaration of the underlying type 7234- for CallExpr, the declaration of the callee 7235- for MemberExpr, the declaration of the referenced member 7236- for CXXConstructExpr, the declaration of the constructor 7237- for CXXNewExpr, the declaration of the operator new 7238- for ObjCIvarExpr, the declaration of the ivar 7239 7240For type nodes, hasDeclaration will generally match the declaration of the 7241sugared type. Given 7242 class X {}; 7243 typedef X Y; 7244 Y y; 7245in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7246typedefDecl. A common use case is to match the underlying, desugared type. 7247This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7248 varDecl(hasType(hasUnqualifiedDesugaredType( 7249 recordType(hasDeclaration(decl()))))) 7250In this matcher, the decl will match the CXXRecordDecl of class X. 7251 7252Usable 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>>, 7253 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>>, 7254 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>>, 7255 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>>, 7256 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>>, 7257 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>>, 7258 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7259</pre></td></tr> 7260 7261 7262<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> 7263<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 7264 7265Given 7266 void (*fp)(void); 7267The matcher 7268 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 7269would match the declaration for fp. 7270</pre></td></tr> 7271 7272 7273<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> 7274<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 7275</pre></td></tr> 7276 7277 7278<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> 7279<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 7280matches the specified matcher. 7281 7282Example matches y->x() 7283 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 7284 cxxRecordDecl(hasName("Y"))))))) 7285 class Y { public: void x(); }; 7286 void z() { Y *y; y->x(); } 7287</pre></td></tr> 7288 7289 7290<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> 7291<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 7292</pre></td></tr> 7293 7294 7295<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> 7296<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 7297type matches the specified matcher. 7298 7299Example matches X &x and const X &y 7300 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 7301 class X { 7302 void a(X b) { 7303 X &x = b; 7304 const X &y = b; 7305 } 7306 }; 7307</pre></td></tr> 7308 7309 7310<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> 7311<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 7312matches the given matcher. 7313 7314The associated declaration is: 7315- for type nodes, the declaration of the underlying type 7316- for CallExpr, the declaration of the callee 7317- for MemberExpr, the declaration of the referenced member 7318- for CXXConstructExpr, the declaration of the constructor 7319- for CXXNewExpr, the declaration of the operator new 7320- for ObjCIvarExpr, the declaration of the ivar 7321 7322For type nodes, hasDeclaration will generally match the declaration of the 7323sugared type. Given 7324 class X {}; 7325 typedef X Y; 7326 Y y; 7327in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7328typedefDecl. A common use case is to match the underlying, desugared type. 7329This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7330 varDecl(hasType(hasUnqualifiedDesugaredType( 7331 recordType(hasDeclaration(decl()))))) 7332In this matcher, the decl will match the CXXRecordDecl of class X. 7333 7334Usable 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>>, 7335 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>>, 7336 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>>, 7337 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>>, 7338 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>>, 7339 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>>, 7340 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7341</pre></td></tr> 7342 7343 7344<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> 7345<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 7346pointee matches a given matcher. 7347 7348Given 7349 int *a; 7350 int const *b; 7351 float const *f; 7352pointerType(pointee(isConstQualified(), isInteger())) 7353 matches "int const *b" 7354 7355Usable 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>>, 7356 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>> 7357</pre></td></tr> 7358 7359 7360<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> 7361<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 7362 7363Given 7364 return a + b; 7365hasReturnValue(binaryOperator()) 7366 matches 'return a + b' 7367with binaryOperator() 7368 matching 'a + b' 7369</pre></td></tr> 7370 7371 7372<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> 7373<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 7374a given matcher. Also matches StmtExprs that have CompoundStmt as children. 7375 7376Given 7377 { {}; 1+2; } 7378hasAnySubstatement(compoundStmt()) 7379 matches '{ {}; 1+2; }' 7380with compoundStmt() 7381 matching '{}' 7382</pre></td></tr> 7383 7384 7385<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> 7386<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 7387alignof. 7388</pre></td></tr> 7389 7390 7391<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> 7392<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to 7393 7394Given: 7395F& operator=(const F& o) { 7396 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 7397 return *this; 7398} 7399returnStmt(forFunction(hasName("operator="))) 7400 matches 'return *this' 7401 but does not match 'return v > 0' 7402</pre></td></tr> 7403 7404 7405<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> 7406<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 7407sizeof. 7408</pre></td></tr> 7409 7410 7411<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> 7412<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 7413type that matches the provided matcher. 7414 7415Given 7416 template <typename T> 7417 double F(T t); 7418 int i; 7419 double j = F(i); 7420 7421substTemplateTypeParmType(hasReplacementType(type())) matches int 7422</pre></td></tr> 7423 7424 7425<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> 7426<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 7427statement. This matcher may produce multiple matches. 7428 7429Given 7430 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 7431switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 7432 matches four times, with "c" binding each of "case 1:", "case 2:", 7433"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 7434"switch (1)", "switch (2)" and "switch (2)". 7435</pre></td></tr> 7436 7437 7438<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> 7439<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 7440switch statement or conditional operator. 7441 7442Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7443 if (true) {} 7444</pre></td></tr> 7445 7446 7447<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> 7448<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 7449 7450Given: 7451 void foo() { 7452 if (int i = foobar(); i > 0) {} 7453 switch (int i = foobar(); i) {} 7454 for (auto& a = get_range(); auto& x : a) {} 7455 } 7456 void bar() { 7457 if (foobar() > 0) {} 7458 switch (foobar()) {} 7459 for (auto& x : get_range()) {} 7460 } 7461ifStmt(hasInitStatement(anything())) 7462 matches the if statement in foo but not in bar. 7463switchStmt(hasInitStatement(anything())) 7464 matches the switch statement in foo but not in bar. 7465cxxForRangeStmt(hasInitStatement(anything())) 7466 matches the range for statement in foo but not in bar. 7467</pre></td></tr> 7468 7469 7470<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> 7471<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 7472matches the given matcher. 7473 7474The associated declaration is: 7475- for type nodes, the declaration of the underlying type 7476- for CallExpr, the declaration of the callee 7477- for MemberExpr, the declaration of the referenced member 7478- for CXXConstructExpr, the declaration of the constructor 7479- for CXXNewExpr, the declaration of the operator new 7480- for ObjCIvarExpr, the declaration of the ivar 7481 7482For type nodes, hasDeclaration will generally match the declaration of the 7483sugared type. Given 7484 class X {}; 7485 typedef X Y; 7486 Y y; 7487in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7488typedefDecl. A common use case is to match the underlying, desugared type. 7489This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7490 varDecl(hasType(hasUnqualifiedDesugaredType( 7491 recordType(hasDeclaration(decl()))))) 7492In this matcher, the decl will match the CXXRecordDecl of class X. 7493 7494Usable 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>>, 7495 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>>, 7496 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>>, 7497 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>>, 7498 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>>, 7499 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>>, 7500 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7501</pre></td></tr> 7502 7503 7504<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> 7505<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 7506 7507Given 7508 struct B { int next; }; 7509 template<int(B::*next_ptr)> struct A {}; 7510 A<&B::next> a; 7511templateSpecializationType(hasAnyTemplateArgument( 7512 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 7513 matches the specialization A<&B::next> with fieldDecl(...) matching 7514 B::next 7515</pre></td></tr> 7516 7517 7518<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> 7519<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 7520declaration. 7521 7522Given 7523 struct B { int next; }; 7524 template<int(B::*next_ptr)> struct A {}; 7525 A<&B::next> a; 7526classTemplateSpecializationDecl(hasAnyTemplateArgument( 7527 refersToDeclaration(fieldDecl(hasName("next"))))) 7528 matches the specialization A<&B::next> with fieldDecl(...) matching 7529 B::next 7530</pre></td></tr> 7531 7532 7533<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> 7534<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type. 7535 7536Given 7537 template<int T> struct C {}; 7538 C<42> c; 7539classTemplateSpecializationDecl( 7540 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 7541 matches the implicit instantiation of C in C<42>. 7542</pre></td></tr> 7543 7544 7545<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> 7546<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 7547 7548Given 7549 template<template <typename> class S> class X {}; 7550 template<typename T> class Y {}; 7551 X<Y> xi; 7552classTemplateSpecializationDecl(hasAnyTemplateArgument( 7553 refersToTemplate(templateName()))) 7554 matches the specialization X<Y> 7555</pre></td></tr> 7556 7557 7558<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> 7559<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 7560 7561Given 7562 struct X {}; 7563 template<typename T> struct A {}; 7564 A<X> a; 7565classTemplateSpecializationDecl(hasAnyTemplateArgument( 7566 refersToType(class(hasName("X"))))) 7567 matches the specialization A<X> 7568</pre></td></tr> 7569 7570 7571<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> 7572<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7573functionDecl that have at least one TemplateArgument matching the given 7574InnerMatcher. 7575 7576Given 7577 template<typename T> class A {}; 7578 template<> class A<double> {}; 7579 A<int> a; 7580 7581 template<typename T> f() {}; 7582 void func() { f<int>(); }; 7583 7584classTemplateSpecializationDecl(hasAnyTemplateArgument( 7585 refersToType(asString("int")))) 7586 matches the specialization A<int> 7587 7588functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7589 matches the specialization f<int> 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('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> 7594<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 7595matches the given matcher. 7596 7597The associated declaration is: 7598- for type nodes, the declaration of the underlying type 7599- for CallExpr, the declaration of the callee 7600- for MemberExpr, the declaration of the referenced member 7601- for CXXConstructExpr, the declaration of the constructor 7602- for CXXNewExpr, the declaration of the operator new 7603- for ObjCIvarExpr, the declaration of the ivar 7604 7605For type nodes, hasDeclaration will generally match the declaration of the 7606sugared type. Given 7607 class X {}; 7608 typedef X Y; 7609 Y y; 7610in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7611typedefDecl. A common use case is to match the underlying, desugared type. 7612This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7613 varDecl(hasType(hasUnqualifiedDesugaredType( 7614 recordType(hasDeclaration(decl()))))) 7615In this matcher, the decl will match the CXXRecordDecl of class X. 7616 7617Usable 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>>, 7618 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>>, 7619 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>>, 7620 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>>, 7621 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>>, 7622 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>>, 7623 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7624</pre></td></tr> 7625 7626 7627<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> 7628<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7629functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7630 7631Given 7632 template<typename T, typename U> class A {}; 7633 A<bool, int> b; 7634 A<int, bool> c; 7635 7636 template<typename T> void f() {} 7637 void func() { f<int>(); }; 7638classTemplateSpecializationDecl(hasTemplateArgument( 7639 1, refersToType(asString("int")))) 7640 matches the specialization A<bool, int> 7641 7642functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7643 matches the specialization f<int> 7644</pre></td></tr> 7645 7646 7647<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> 7648<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 7649matches the given matcher. 7650 7651The associated declaration is: 7652- for type nodes, the declaration of the underlying type 7653- for CallExpr, the declaration of the callee 7654- for MemberExpr, the declaration of the referenced member 7655- for CXXConstructExpr, the declaration of the constructor 7656- for CXXNewExpr, the declaration of the operator new 7657- for ObjCIvarExpr, the declaration of the ivar 7658 7659For type nodes, hasDeclaration will generally match the declaration of the 7660sugared type. Given 7661 class X {}; 7662 typedef X Y; 7663 Y y; 7664in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7665typedefDecl. A common use case is to match the underlying, desugared type. 7666This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7667 varDecl(hasType(hasUnqualifiedDesugaredType( 7668 recordType(hasDeclaration(decl()))))) 7669In this matcher, the decl will match the CXXRecordDecl of class X. 7670 7671Usable 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>>, 7672 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>>, 7673 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>>, 7674 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>>, 7675 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>>, 7676 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>>, 7677 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7678</pre></td></tr> 7679 7680 7681<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> 7682<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 7683QualType-matcher matches. 7684</pre></td></tr> 7685 7686 7687<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> 7688<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 7689matcher. 7690 7691Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7692 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7693 and U (matcher = typedefDecl(hasType(asString("int"))) 7694 and friend class X (matcher = friendDecl(hasType("X")) 7695 class X {}; 7696 void y(X &x) { x; X z; } 7697 typedef int U; 7698 class Y { friend class X; }; 7699</pre></td></tr> 7700 7701 7702<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> 7703<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 7704matches the given matcher. 7705 7706The associated declaration is: 7707- for type nodes, the declaration of the underlying type 7708- for CallExpr, the declaration of the callee 7709- for MemberExpr, the declaration of the referenced member 7710- for CXXConstructExpr, the declaration of the constructor 7711- for CXXNewExpr, the declaration of the operator new 7712- for ObjCIvarExpr, the declaration of the ivar 7713 7714For type nodes, hasDeclaration will generally match the declaration of the 7715sugared type. Given 7716 class X {}; 7717 typedef X Y; 7718 Y y; 7719in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7720typedefDecl. A common use case is to match the underlying, desugared type. 7721This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7722 varDecl(hasType(hasUnqualifiedDesugaredType( 7723 recordType(hasDeclaration(decl()))))) 7724In this matcher, the decl will match the CXXRecordDecl of class X. 7725 7726Usable 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>>, 7727 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>>, 7728 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>>, 7729 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>>, 7730 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>>, 7731 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>>, 7732 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7733</pre></td></tr> 7734 7735 7736<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> 7737<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 7738type of the matched node. 7739 7740For example, in: 7741 class A {}; 7742 using B = A; 7743The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 7744both B and A. 7745</pre></td></tr> 7746 7747 7748<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> 7749<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 7750 7751Given 7752 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 7753unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 7754 matches sizeof(a) and alignof(c) 7755</pre></td></tr> 7756 7757 7758<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> 7759<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 7760 7761Example matches true (matcher = hasUnaryOperand( 7762 cxxBoolLiteral(equals(true)))) 7763 !true 7764</pre></td></tr> 7765 7766 7767<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> 7768<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 7769given matcher. Implicit object expressions are included; that is, it matches 7770use of implicit `this`. 7771 7772Given 7773 struct X { 7774 int m; 7775 int f(X x) { x.m; return m; } 7776 }; 7777memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 7778 matches `x.m`, but not `m`; however, 7779memberExpr(hasObjectExpression(hasType(pointsTo( 7780 cxxRecordDecl(hasName("X")))))) 7781 matches `m` (aka. `this->m`), but not `x.m`. 7782</pre></td></tr> 7783 7784 7785<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> 7786<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 7787matches the given matcher. 7788 7789The associated declaration is: 7790- for type nodes, the declaration of the underlying type 7791- for CallExpr, the declaration of the callee 7792- for MemberExpr, the declaration of the referenced member 7793- for CXXConstructExpr, the declaration of the constructor 7794- for CXXNewExpr, the declaration of the operator new 7795- for ObjCIvarExpr, the declaration of the ivar 7796 7797For type nodes, hasDeclaration will generally match the declaration of the 7798sugared type. Given 7799 class X {}; 7800 typedef X Y; 7801 Y y; 7802in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7803typedefDecl. A common use case is to match the underlying, desugared type. 7804This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7805 varDecl(hasType(hasUnqualifiedDesugaredType( 7806 recordType(hasDeclaration(decl()))))) 7807In this matcher, the decl will match the CXXRecordDecl of class X. 7808 7809Usable 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>>, 7810 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>>, 7811 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>>, 7812 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>>, 7813 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>>, 7814 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>>, 7815 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7816</pre></td></tr> 7817 7818 7819<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> 7820<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 7821 7822Given 7823 namespace X { void b(); } 7824 using X::b; 7825usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 7826 matches using X::b </pre></td></tr> 7827 7828 7829<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> 7830<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 7831matched by the given matcher. 7832 7833Given 7834 namespace X { int a; void b(); } 7835 using X::a; 7836 using X::b; 7837usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 7838 matches using X::b but not using X::a </pre></td></tr> 7839 7840 7841<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> 7842<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 7843declaration's type. 7844 7845In case of a value declaration (for example a variable declaration), 7846this resolves one layer of indirection. For example, in the value 7847declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7848X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7849declaration of x. 7850 7851Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7852 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7853 and friend class X (matcher = friendDecl(hasType("X")) 7854 class X {}; 7855 void y(X &x) { x; X z; } 7856 class Y { friend class X; }; 7857 7858Example matches class Derived 7859(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7860class Base {}; 7861class Derived : Base {}; 7862 7863Usable 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>>, 7864Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7865</pre></td></tr> 7866 7867 7868<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> 7869<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 7870matcher. 7871 7872Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7873 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7874 and U (matcher = typedefDecl(hasType(asString("int"))) 7875 and friend class X (matcher = friendDecl(hasType("X")) 7876 class X {}; 7877 void y(X &x) { x; X z; } 7878 typedef int U; 7879 class Y { friend class X; }; 7880</pre></td></tr> 7881 7882 7883<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> 7884<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 7885that matches the given matcher. 7886 7887Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 7888 bool y() { return true; } 7889 bool x = y(); 7890</pre></td></tr> 7891 7892 7893<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> 7894<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 7895expression. 7896 7897Given 7898 void f(int b) { 7899 int a[b]; 7900 } 7901variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 7902 varDecl(hasName("b"))))))) 7903 matches "int a[b]" 7904</pre></td></tr> 7905 7906 7907<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> 7908<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function 7909definition that has a given body. 7910 7911Given 7912 for (;;) {} 7913hasBody(compoundStmt()) 7914 matches 'for (;;) {}' 7915with compoundStmt() 7916 matching '{}' 7917</pre></td></tr> 7918 7919 7920<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> 7921<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 7922switch statement or conditional operator. 7923 7924Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7925 if (true) {} 7926</pre></td></tr> 7927 7928<!--END_TRAVERSAL_MATCHERS --> 7929</table> 7930 7931</div> 7932</body> 7933</html> 7934 7935 7936