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