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