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