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