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