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<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 4693<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatchers. 4694 4695However, optionally will generate a result binding for each matching 4696submatcher. 4697 4698Useful when additional information which may or may not present about a 4699main matching node is desired. 4700 4701For example, in: 4702 class Foo { 4703 int bar; 4704 } 4705The matcher: 4706 cxxRecordDecl( 4707 optionally(has( 4708 fieldDecl(hasName("bar")).bind("var") 4709 ))).bind("record") 4710will produce a result binding for both "record" and "var". 4711The matcher will produce a "record" binding for even if there is no data 4712member named "bar" in that class. 4713 4714Usable as: Any Matcher 4715</pre></td></tr> 4716 4717 4718<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> 4719<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 4720switch statement or conditional operator. 4721 4722Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4723 if (true) {} 4724</pre></td></tr> 4725 4726 4727<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> 4728<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 4729(binary or ternary). 4730 4731Example matches b 4732 condition ? a : b 4733 condition ?: b 4734</pre></td></tr> 4735 4736 4737<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> 4738<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 4739 4740Example 1 (conditional ternary operator): matches a 4741 condition ? a : b 4742 4743Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 4744 condition ?: b 4745</pre></td></tr> 4746 4747 4748<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> 4749<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 4750matches the given matcher. 4751 4752The associated declaration is: 4753- for type nodes, the declaration of the underlying type 4754- for CallExpr, the declaration of the callee 4755- for MemberExpr, the declaration of the referenced member 4756- for CXXConstructExpr, the declaration of the constructor 4757- for CXXNewExpr, the declaration of the operator new 4758- for ObjCIvarExpr, the declaration of the ivar 4759 4760For type nodes, hasDeclaration will generally match the declaration of the 4761sugared type. Given 4762 class X {}; 4763 typedef X Y; 4764 Y y; 4765in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 4766typedefDecl. A common use case is to match the underlying, desugared type. 4767This can be achieved by using the hasUnqualifiedDesugaredType matcher: 4768 varDecl(hasType(hasUnqualifiedDesugaredType( 4769 recordType(hasDeclaration(decl()))))) 4770In this matcher, the decl will match the CXXRecordDecl of class X. 4771 4772Usable 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>>, 4773 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>>, 4774 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>>, 4775 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>>, 4776 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>>, 4777 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>>, 4778 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4779</pre></td></tr> 4780 4781 4782<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> 4783<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 4784 4785Given 4786 int i[5]; 4787 void f() { i[1] = 42; } 4788arraySubscriptExpression(hasBase(implicitCastExpr( 4789 hasSourceExpression(declRefExpr())))) 4790 matches i[1] with the declRefExpr() matching i 4791</pre></td></tr> 4792 4793 4794<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> 4795<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 4796 4797Given 4798 int i[5]; 4799 void f() { i[1] = 42; } 4800arraySubscriptExpression(hasIndex(integerLiteral())) 4801 matches i[1] with the integerLiteral() matching 1 4802</pre></td></tr> 4803 4804 4805<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> 4806<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 4807 4808Example matches a (matcher = binaryOperator(hasLHS())) 4809 a || b 4810</pre></td></tr> 4811 4812 4813<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> 4814<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 4815 4816Example matches b (matcher = binaryOperator(hasRHS())) 4817 a || b 4818</pre></td></tr> 4819 4820 4821<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> 4822<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 4823type. 4824 4825Given 4826 struct A {}; 4827 A a[7]; 4828 int b[7]; 4829arrayType(hasElementType(builtinType())) 4830 matches "int b[7]" 4831 4832Usable 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>> 4833</pre></td></tr> 4834 4835 4836<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> 4837<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 4838 4839Given 4840 _Atomic(int) i; 4841 _Atomic(float) f; 4842atomicType(hasValueType(isInteger())) 4843 matches "_Atomic(int) i" 4844 4845Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 4846</pre></td></tr> 4847 4848 4849<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> 4850<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 4851 4852Note: There is no TypeLoc for the deduced type and thus no 4853getDeducedLoc() matcher. 4854 4855Given 4856 auto a = 1; 4857 auto b = 2.0; 4858autoType(hasDeducedType(isInteger())) 4859 matches "auto a" 4860 4861Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 4862</pre></td></tr> 4863 4864 4865<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> 4866<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 4867binary operator matches. 4868</pre></td></tr> 4869 4870 4871<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> 4872<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 4873 4874Example matches a (matcher = binaryOperator(hasLHS())) 4875 a || b 4876</pre></td></tr> 4877 4878 4879<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> 4880<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 4881 4882Example matches b (matcher = binaryOperator(hasRHS())) 4883 a || b 4884</pre></td></tr> 4885 4886 4887<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> 4888<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 4889block. 4890 4891Does not match the 'this' parameter of a method. 4892 4893Given 4894 class X { void f(int x, int y, int z) {} }; 4895cxxMethodDecl(hasAnyParameter(hasName("y"))) 4896 matches f(int x, int y, int z) {} 4897with hasAnyParameter(...) 4898 matching int y 4899 4900For ObjectiveC, given 4901 @interface I - (void) f:(int) y; @end 4902 4903the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 4904matches the declaration of method f with hasParameter 4905matching y. 4906 4907For blocks, given 4908 b = ^(int y) { printf("%d", y) }; 4909 4910the matcher blockDecl(hasAnyParameter(hasName("y"))) 4911matches the declaration of the block b with hasParameter 4912matching y. 4913</pre></td></tr> 4914 4915 4916<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> 4917<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 4918declaration or a block. 4919 4920Given 4921 class X { void f(int x) {} }; 4922cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 4923 matches f(int x) {} 4924with hasParameter(...) 4925 matching int x 4926 4927For ObjectiveC, given 4928 @interface I - (void) f:(int) y; @end 4929 4930the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 4931matches the declaration of method f with hasParameter 4932matching y. 4933</pre></td></tr> 4934 4935 4936<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> 4937<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 4938pointee matches a given matcher. 4939 4940Given 4941 int *a; 4942 int const *b; 4943 float const *f; 4944pointerType(pointee(isConstQualified(), isInteger())) 4945 matches "int const *b" 4946 4947Usable 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>>, 4948 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>> 4949</pre></td></tr> 4950 4951 4952<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> 4953<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 4954 4955Given 4956 void f(int i); 4957 int y; 4958 f(y); 4959callExpr( 4960 forEachArgumentWithParam( 4961 declRefExpr(to(varDecl(hasName("y")))), 4962 parmVarDecl(hasType(isInteger())) 4963)) 4964 matches f(y); 4965with declRefExpr(...) 4966 matching int y 4967and parmVarDecl(...) 4968 matching int i 4969</pre></td></tr> 4970 4971 4972<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> 4973<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 4974expression, or an ObjC-message-send expression. 4975 4976Given 4977 void x(int, int, int) { int y; x(1, y, 42); } 4978callExpr(hasAnyArgument(declRefExpr())) 4979 matches x(1, y, 42) 4980with hasAnyArgument(...) 4981 matching y 4982 4983For ObjectiveC, given 4984 @interface I - (void) f:(int) y; @end 4985 void foo(I *i) { [i f:12]; } 4986objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 4987 matches [i f:12] 4988</pre></td></tr> 4989 4990 4991<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> 4992<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 4993call expression. 4994 4995Example matches y in x(y) 4996 (matcher = callExpr(hasArgument(0, declRefExpr()))) 4997 void x(int) { int y; x(y); } 4998</pre></td></tr> 4999 5000 5001<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> 5002<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 5003matches the given matcher. 5004 5005The associated declaration is: 5006- for type nodes, the declaration of the underlying type 5007- for CallExpr, the declaration of the callee 5008- for MemberExpr, the declaration of the referenced member 5009- for CXXConstructExpr, the declaration of the constructor 5010- for CXXNewExpr, the declaration of the operator new 5011- for ObjCIvarExpr, the declaration of the ivar 5012 5013For type nodes, hasDeclaration will generally match the declaration of the 5014sugared type. Given 5015 class X {}; 5016 typedef X Y; 5017 Y y; 5018in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5019typedefDecl. A common use case is to match the underlying, desugared type. 5020This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5021 varDecl(hasType(hasUnqualifiedDesugaredType( 5022 recordType(hasDeclaration(decl()))))) 5023In this matcher, the decl will match the CXXRecordDecl of class X. 5024 5025Usable 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>>, 5026 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>>, 5027 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>>, 5028 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>>, 5029 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>>, 5030 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>>, 5031 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5032</pre></td></tr> 5033 5034 5035<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> 5036<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 5037 5038Given 5039 class A { A() : i(42), j(42) {} int i; int j; }; 5040cxxConstructorDecl(forEachConstructorInitializer( 5041 forField(decl().bind("x")) 5042)) 5043 will trigger two matches, binding for 'i' and 'j' respectively. 5044</pre></td></tr> 5045 5046 5047<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> 5048<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 5049 5050Given 5051 struct Foo { 5052 Foo() : foo_(1) { } 5053 int foo_; 5054 }; 5055cxxRecordDecl(has(cxxConstructorDecl( 5056 hasAnyConstructorInitializer(anything()) 5057))) 5058 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 5059</pre></td></tr> 5060 5061 5062<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> 5063<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 5064 5065Given 5066 struct Foo { 5067 Foo() : foo_(1) { } 5068 int foo_; 5069 }; 5070cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 5071 forField(hasName("foo_")))))) 5072 matches Foo 5073with forField matching foo_ 5074</pre></td></tr> 5075 5076 5077<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> 5078<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 5079 5080Given 5081 struct Foo { 5082 Foo() : foo_(1) { } 5083 int foo_; 5084 }; 5085cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 5086 withInitializer(integerLiteral(equals(1))))))) 5087 matches Foo 5088with withInitializer matching (1) 5089</pre></td></tr> 5090 5091 5092<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> 5093<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 5094given matcher. Implicit object expressions are included; that is, it matches 5095use of implicit `this`. 5096 5097Given 5098 struct X { 5099 int m; 5100 int f(X x) { x.m; return m; } 5101 }; 5102memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 5103 matches `x.m`, but not `m`; however, 5104memberExpr(hasObjectExpression(hasType(pointsTo( 5105 cxxRecordDecl(hasName("X")))))) 5106 matches `m` (aka. `this->m`), but not `x.m`. 5107</pre></td></tr> 5108 5109 5110<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> 5111<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function 5112definition that has a given body. 5113 5114Given 5115 for (;;) {} 5116hasBody(compoundStmt()) 5117 matches 'for (;;) {}' 5118with compoundStmt() 5119 matching '{}' 5120</pre></td></tr> 5121 5122 5123<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> 5124<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer. 5125 5126Given: 5127 void foo() { 5128 if (int i = foobar(); i > 0) {} 5129 switch (int i = foobar(); i) {} 5130 for (auto& a = get_range(); auto& x : a) {} 5131 } 5132 void bar() { 5133 if (foobar() > 0) {} 5134 switch (foobar()) {} 5135 for (auto& x : get_range()) {} 5136 } 5137ifStmt(hasInitStatement(anything())) 5138 matches the if statement in foo but not in bar. 5139switchStmt(hasInitStatement(anything())) 5140 matches the switch statement in foo but not in bar. 5141cxxForRangeStmt(hasInitStatement(anything())) 5142 matches the range for statement in foo but not in bar. 5143</pre></td></tr> 5144 5145 5146<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> 5147<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 5148 5149Example: 5150 forStmt(hasLoopVariable(anything())) 5151matches 'int x' in 5152 for (int x : a) { } 5153</pre></td></tr> 5154 5155 5156<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> 5157<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 5158 5159Example: 5160 forStmt(hasRangeInit(anything())) 5161matches 'a' in 5162 for (int x : a) { } 5163</pre></td></tr> 5164 5165 5166<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> 5167<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 5168`on`, matches the argument directly without stripping away anything. 5169 5170Given 5171 class Y { public: void m(); }; 5172 Y g(); 5173 class X : public Y { void g(); }; 5174 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 5175cxxMemberCallExpr(onImplicitObjectArgument(hasType( 5176 cxxRecordDecl(hasName("Y"))))) 5177 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 5178cxxMemberCallExpr(on(callExpr())) 5179 does not match `(g()).m()`, because the parens are not ignored. 5180 5181FIXME: Overload to allow directly matching types? 5182</pre></td></tr> 5183 5184 5185<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> 5186<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 5187stripping off any parentheses or implicit casts. 5188 5189Given 5190 class Y { public: void m(); }; 5191 Y g(); 5192 class X : public Y {}; 5193 void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 5194cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 5195 matches `y.m()` and `(g()).m()`. 5196cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 5197 matches `x.m()`. 5198cxxMemberCallExpr(on(callExpr())) 5199 matches `(g()).m()`. 5200 5201FIXME: Overload to allow directly matching types? 5202</pre></td></tr> 5203 5204 5205<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> 5206<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 5207</pre></td></tr> 5208 5209 5210<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> 5211<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 5212matches the InnerMatcher, or is a pointer to a type that matches the 5213InnerMatcher. 5214 5215Given 5216 class Y { public: void m(); }; 5217 class X : public Y { void g(); }; 5218 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 5219cxxMemberCallExpr(thisPointerType(hasDeclaration( 5220 cxxRecordDecl(hasName("Y"))))) 5221 matches `y.m()`, `p->m()` and `x.m()`. 5222cxxMemberCallExpr(thisPointerType(hasDeclaration( 5223 cxxRecordDecl(hasName("X"))))) 5224 matches `x.g()`. 5225</pre></td></tr> 5226 5227 5228<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> 5229<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 5230produce multiple matches. 5231 5232Given 5233 class A { virtual void f(); }; 5234 class B : public A { void f(); }; 5235 class C : public B { void f(); }; 5236cxxMethodDecl(ofClass(hasName("C")), 5237 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 5238 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 5239 that B::f is not overridden by C::f). 5240 5241The check can produce multiple matches in case of multiple inheritance, e.g. 5242 class A1 { virtual void f(); }; 5243 class A2 { virtual void f(); }; 5244 class C : public A1, public A2 { void f(); }; 5245cxxMethodDecl(ofClass(hasName("C")), 5246 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 5247 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 5248 once with "b" binding "A2::f" and "d" binding "C::f". 5249</pre></td></tr> 5250 5251 5252<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> 5253<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 5254belongs to. 5255 5256FIXME: Generalize this for other kinds of declarations. 5257FIXME: What other kind of declarations would we need to generalize 5258this to? 5259 5260Example matches A() in the last line 5261 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 5262 ofClass(hasName("A")))))) 5263 class A { 5264 public: 5265 A(); 5266 }; 5267 A a = A(); 5268</pre></td></tr> 5269 5270 5271<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> 5272<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 5273 5274Given: 5275 MyClass *p1 = new MyClass[10]; 5276cxxNewExpr(hasArraySize(integerLiteral(equals(10)))) 5277 matches the expression 'new MyClass[10]'. 5278</pre></td></tr> 5279 5280 5281<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> 5282<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 5283matches the given matcher. 5284 5285The associated declaration is: 5286- for type nodes, the declaration of the underlying type 5287- for CallExpr, the declaration of the callee 5288- for MemberExpr, the declaration of the referenced member 5289- for CXXConstructExpr, the declaration of the constructor 5290- for CXXNewExpr, the declaration of the operator new 5291- for ObjCIvarExpr, the declaration of the ivar 5292 5293For type nodes, hasDeclaration will generally match the declaration of the 5294sugared type. Given 5295 class X {}; 5296 typedef X Y; 5297 Y y; 5298in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5299typedefDecl. A common use case is to match the underlying, desugared type. 5300This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5301 varDecl(hasType(hasUnqualifiedDesugaredType( 5302 recordType(hasDeclaration(decl()))))) 5303In this matcher, the decl will match the CXXRecordDecl of class X. 5304 5305Usable 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>>, 5306 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>>, 5307 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>>, 5308 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>>, 5309 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>>, 5310 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>>, 5311 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5312</pre></td></tr> 5313 5314 5315<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> 5316<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 5317 5318Given: 5319 class A { void func(); }; 5320 class B { void member(); }; 5321 5322cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 5323A but not B. 5324</pre></td></tr> 5325 5326 5327<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> 5328<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class 5329matching Base, or Objective-C classes that directly or indirectly 5330subclass a class matching Base. 5331 5332Note that a class is not considered to be derived from itself. 5333 5334Example matches Y, Z, C (Base == hasName("X")) 5335 class X; 5336 class Y : public X {}; // directly derived 5337 class Z : public Y {}; // indirectly derived 5338 typedef X A; 5339 typedef A B; 5340 class C : public B {}; // derived from a typedef of X 5341 5342In the following example, Bar matches isDerivedFrom(hasName("X")): 5343 class Foo; 5344 typedef Foo X; 5345 class Bar : public Foo {}; // derived from a type that X is a typedef of 5346 5347In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 5348 @interface NSObject @end 5349 @interface Bar : NSObject @end 5350 5351Usable 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>> 5352</pre></td></tr> 5353 5354 5355<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> 5356<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class 5357matching Base. 5358 5359Note that a class is not considered to be derived from itself. 5360 5361Example matches Y, C (Base == hasName("X")) 5362 class X; 5363 class Y : public X {}; // directly derived 5364 class Z : public Y {}; // indirectly derived 5365 typedef X A; 5366 typedef A B; 5367 class C : public B {}; // derived from a typedef of X 5368 5369In the following example, Bar matches isDerivedFrom(hasName("X")): 5370 class Foo; 5371 typedef Foo X; 5372 class Bar : public Foo {}; // derived from a type that X is a typedef of 5373</pre></td></tr> 5374 5375 5376<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> 5377<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 5378match Base. 5379</pre></td></tr> 5380 5381 5382<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> 5383<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 5384expression, or an ObjC-message-send expression. 5385 5386Given 5387 void x(int, int, int) { int y; x(1, y, 42); } 5388callExpr(hasAnyArgument(declRefExpr())) 5389 matches x(1, y, 42) 5390with hasAnyArgument(...) 5391 matching y 5392 5393For ObjectiveC, given 5394 @interface I - (void) f:(int) y; @end 5395 void foo(I *i) { [i f:12]; } 5396objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5397 matches [i f:12] 5398</pre></td></tr> 5399 5400 5401<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> 5402<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 5403given matcher. 5404 5405Example matches y.x() (matcher = callExpr(callee( 5406 cxxMethodDecl(hasName("x"))))) 5407 class Y { public: void x(); }; 5408 void z() { Y y; y.x(); } 5409</pre></td></tr> 5410 5411 5412<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> 5413<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 5414 5415Given 5416 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 5417 void f() { f(); } 5418callExpr(callee(expr())) 5419 matches this->x(), x(), y.x(), f() 5420with callee(...) 5421 matching this->x, x, y.x, f respectively 5422 5423Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 5424because this introduces ambiguous overloads with calls to Callee taking a 5425internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 5426implemented in terms of implicit casts. 5427</pre></td></tr> 5428 5429 5430<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> 5431<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 5432 5433Given 5434 void f(int i); 5435 int y; 5436 f(y); 5437callExpr( 5438 forEachArgumentWithParam( 5439 declRefExpr(to(varDecl(hasName("y")))), 5440 parmVarDecl(hasType(isInteger())) 5441)) 5442 matches f(y); 5443with declRefExpr(...) 5444 matching int y 5445and parmVarDecl(...) 5446 matching int i 5447</pre></td></tr> 5448 5449 5450<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> 5451<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 5452expression, or an ObjC-message-send expression. 5453 5454Given 5455 void x(int, int, int) { int y; x(1, y, 42); } 5456callExpr(hasAnyArgument(declRefExpr())) 5457 matches x(1, y, 42) 5458with hasAnyArgument(...) 5459 matching y 5460 5461For ObjectiveC, given 5462 @interface I - (void) f:(int) y; @end 5463 void foo(I *i) { [i f:12]; } 5464objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5465 matches [i f:12] 5466</pre></td></tr> 5467 5468 5469<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> 5470<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 5471call expression. 5472 5473Example matches y in x(y) 5474 (matcher = callExpr(hasArgument(0, declRefExpr()))) 5475 void x(int) { int y; x(y); } 5476</pre></td></tr> 5477 5478 5479<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> 5480<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 5481matches the given matcher. 5482 5483The associated declaration is: 5484- for type nodes, the declaration of the underlying type 5485- for CallExpr, the declaration of the callee 5486- for MemberExpr, the declaration of the referenced member 5487- for CXXConstructExpr, the declaration of the constructor 5488- for CXXNewExpr, the declaration of the operator new 5489- for ObjCIvarExpr, the declaration of the ivar 5490 5491For type nodes, hasDeclaration will generally match the declaration of the 5492sugared type. Given 5493 class X {}; 5494 typedef X Y; 5495 Y y; 5496in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5497typedefDecl. A common use case is to match the underlying, desugared type. 5498This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5499 varDecl(hasType(hasUnqualifiedDesugaredType( 5500 recordType(hasDeclaration(decl()))))) 5501In this matcher, the decl will match the CXXRecordDecl of class X. 5502 5503Usable 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>>, 5504 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>>, 5505 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>>, 5506 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>>, 5507 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>>, 5508 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>>, 5509 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5510</pre></td></tr> 5511 5512 5513<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> 5514<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 5515extension, matches the constant given in the statement. 5516 5517Given 5518 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 5519caseStmt(hasCaseConstant(integerLiteral())) 5520 matches "case 1:" 5521</pre></td></tr> 5522 5523 5524<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> 5525<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 5526or opaque value's source expression matches the given matcher. 5527 5528Example 1: matches "a string" 5529(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 5530class URL { URL(string); }; 5531URL url = "a string"; 5532 5533Example 2: matches 'b' (matcher = 5534opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 5535int a = b ?: 1; 5536</pre></td></tr> 5537 5538 5539<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> 5540<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 5541functionDecl that have at least one TemplateArgument matching the given 5542InnerMatcher. 5543 5544Given 5545 template<typename T> class A {}; 5546 template<> class A<double> {}; 5547 A<int> a; 5548 5549 template<typename T> f() {}; 5550 void func() { f<int>(); }; 5551 5552classTemplateSpecializationDecl(hasAnyTemplateArgument( 5553 refersToType(asString("int")))) 5554 matches the specialization A<int> 5555 5556functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 5557 matches the specialization f<int> 5558</pre></td></tr> 5559 5560 5561<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> 5562<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 5563 5564Given 5565 template<typename T> class A {}; #1 5566 template<> class A<int> {}; #2 5567classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 5568 matches '#2' with classTemplateDecl() matching the class template 5569 declaration of 'A' at #1. 5570</pre></td></tr> 5571 5572 5573<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> 5574<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 5575functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 5576 5577Given 5578 template<typename T, typename U> class A {}; 5579 A<bool, int> b; 5580 A<int, bool> c; 5581 5582 template<typename T> void f() {} 5583 void func() { f<int>(); }; 5584classTemplateSpecializationDecl(hasTemplateArgument( 5585 1, refersToType(asString("int")))) 5586 matches the specialization A<bool, int> 5587 5588functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 5589 matches the specialization f<int> 5590</pre></td></tr> 5591 5592 5593<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> 5594<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 5595type. 5596 5597Given 5598 struct A {}; 5599 A a[7]; 5600 int b[7]; 5601arrayType(hasElementType(builtinType())) 5602 matches "int b[7]" 5603 5604Usable 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>> 5605</pre></td></tr> 5606 5607 5608<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> 5609<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 5610a given matcher. Also matches StmtExprs that have CompoundStmt as children. 5611 5612Given 5613 { {}; 1+2; } 5614hasAnySubstatement(compoundStmt()) 5615 matches '{ {}; 1+2; }' 5616with compoundStmt() 5617 matching '{}' 5618</pre></td></tr> 5619 5620 5621<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> 5622<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher 5623</pre></td></tr> 5624 5625 5626<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> 5627<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 5628matches the given matcher. 5629 5630The associated declaration is: 5631- for type nodes, the declaration of the underlying type 5632- for CallExpr, the declaration of the callee 5633- for MemberExpr, the declaration of the referenced member 5634- for CXXConstructExpr, the declaration of the constructor 5635- for CXXNewExpr, the declaration of the operator new 5636- for ObjCIvarExpr, the declaration of the ivar 5637 5638For type nodes, hasDeclaration will generally match the declaration of the 5639sugared type. Given 5640 class X {}; 5641 typedef X Y; 5642 Y y; 5643in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5644typedefDecl. A common use case is to match the underlying, desugared type. 5645This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5646 varDecl(hasType(hasUnqualifiedDesugaredType( 5647 recordType(hasDeclaration(decl()))))) 5648In this matcher, the decl will match the CXXRecordDecl of class X. 5649 5650Usable 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>>, 5651 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>>, 5652 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>>, 5653 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>>, 5654 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>>, 5655 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>>, 5656 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5657</pre></td></tr> 5658 5659 5660<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> 5661<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 5662specific using shadow declaration. 5663 5664Given 5665 namespace a { void f() {} } 5666 using a::f; 5667 void g() { 5668 f(); // Matches this .. 5669 a::f(); // .. but not this. 5670 } 5671declRefExpr(throughUsingDecl(anything())) 5672 matches f() 5673</pre></td></tr> 5674 5675 5676<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> 5677<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 5678specified matcher. 5679 5680Example matches x in if(x) 5681 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 5682 bool x; 5683 if (x) {} 5684</pre></td></tr> 5685 5686 5687<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> 5688<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 5689 5690Note that this does not work for global declarations because the AST 5691breaks up multiple-declaration DeclStmt's into multiple single-declaration 5692DeclStmt's. 5693Example: Given non-global declarations 5694 int a, b = 0; 5695 int c; 5696 int d = 2, e; 5697declStmt(containsDeclaration( 5698 0, varDecl(hasInitializer(anything())))) 5699 matches only 'int d = 2, e;', and 5700declStmt(containsDeclaration(1, varDecl())) 5701 matches 'int a, b = 0' as well as 'int d = 2, e;' 5702 but 'int c;' is not matched. 5703</pre></td></tr> 5704 5705 5706<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> 5707<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 5708 5709Given 5710 int a, b; 5711 int c; 5712declStmt(hasSingleDecl(anything())) 5713 matches 'int c;' but not 'int a, b;'. 5714</pre></td></tr> 5715 5716 5717<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> 5718<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 5719the inner matcher. 5720 5721Given 5722 int x; 5723declaratorDecl(hasTypeLoc(loc(asString("int")))) 5724 matches int x 5725</pre></td></tr> 5726 5727 5728<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> 5729<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 5730Decl, matches InnerMatcher. 5731 5732Given 5733 namespace N { 5734 namespace M { 5735 class D {}; 5736 } 5737 } 5738 5739cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 5740declaration of class D. 5741</pre></td></tr> 5742 5743 5744<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> 5745<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type. 5746 5747Given 5748 decltype(1) a = 1; 5749 decltype(2.0) b = 2.0; 5750decltypeType(hasUnderlyingType(isInteger())) 5751 matches the type of "a" 5752 5753Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>> 5754</pre></td></tr> 5755 5756 5757<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> 5758<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function 5759definition that has a given body. 5760 5761Given 5762 for (;;) {} 5763hasBody(compoundStmt()) 5764 matches 'for (;;) {}' 5765with compoundStmt() 5766 matching '{}' 5767</pre></td></tr> 5768 5769 5770<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> 5771<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 5772switch statement or conditional operator. 5773 5774Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5775 if (true) {} 5776</pre></td></tr> 5777 5778 5779<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> 5780<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 5781matches InnerMatcher if the qualifier exists. 5782 5783Given 5784 namespace N { 5785 namespace M { 5786 class D {}; 5787 } 5788 } 5789 N::M::D d; 5790 5791elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 5792matches the type of the variable declaration of d. 5793</pre></td></tr> 5794 5795 5796<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> 5797<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 5798 5799Given 5800 namespace N { 5801 namespace M { 5802 class D {}; 5803 } 5804 } 5805 N::M::D d; 5806 5807elaboratedType(namesType(recordType( 5808hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 5809declaration of d. 5810</pre></td></tr> 5811 5812 5813<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> 5814<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 5815matches the given matcher. 5816 5817The associated declaration is: 5818- for type nodes, the declaration of the underlying type 5819- for CallExpr, the declaration of the callee 5820- for MemberExpr, the declaration of the referenced member 5821- for CXXConstructExpr, the declaration of the constructor 5822- for CXXNewExpr, the declaration of the operator new 5823- for ObjCIvarExpr, the declaration of the ivar 5824 5825For type nodes, hasDeclaration will generally match the declaration of the 5826sugared type. Given 5827 class X {}; 5828 typedef X Y; 5829 Y y; 5830in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5831typedefDecl. A common use case is to match the underlying, desugared type. 5832This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5833 varDecl(hasType(hasUnqualifiedDesugaredType( 5834 recordType(hasDeclaration(decl()))))) 5835In this matcher, the decl will match the CXXRecordDecl of class X. 5836 5837Usable 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>>, 5838 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>>, 5839 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>>, 5840 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>>, 5841 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>>, 5842 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>>, 5843 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5844</pre></td></tr> 5845 5846 5847<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> 5848<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 5849 5850(Note: Clang's AST refers to other conversions as "casts" too, and calls 5851actual casts "explicit" casts.) 5852</pre></td></tr> 5853 5854 5855<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> 5856<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value 5857declaration's type. 5858 5859In case of a value declaration (for example a variable declaration), 5860this resolves one layer of indirection. For example, in the value 5861declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 5862X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 5863declaration of x. 5864 5865Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5866 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5867 and friend class X (matcher = friendDecl(hasType("X")) 5868 class X {}; 5869 void y(X &x) { x; X z; } 5870 class Y { friend class X; }; 5871 5872Usable 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>> 5873</pre></td></tr> 5874 5875 5876<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> 5877<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 5878matcher. 5879 5880Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5881 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5882 and U (matcher = typedefDecl(hasType(asString("int"))) 5883 and friend class X (matcher = friendDecl(hasType("X")) 5884 class X {}; 5885 void y(X &x) { x; X z; } 5886 typedef int U; 5887 class Y { friend class X; }; 5888</pre></td></tr> 5889 5890 5891<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> 5892<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 5893elidable constructor and other corresponding bookkeeping nodes. 5894 5895In C++17, elidable copy constructors are no longer being generated in the 5896AST as it is not permitted by the standard. They are, however, part of the 5897AST in C++14 and earlier. So, a matcher must abstract over these differences 5898to work in all language modes. This matcher skips elidable constructor-call 5899AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 5900various implicit nodes inside the constructor calls, all of which will not 5901appear in the C++17 AST. 5902 5903Given 5904 5905struct H {}; 5906H G(); 5907void f() { 5908 H D = G(); 5909} 5910 5911``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 5912matches ``H D = G()`` in C++11 through C++17 (and beyond). 5913</pre></td></tr> 5914 5915 5916<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> 5917<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 5918are stripped off. 5919 5920Parentheses and explicit casts are not discarded. 5921Given 5922 int arr[5]; 5923 int a = 0; 5924 char b = 0; 5925 const int c = a; 5926 int *d = arr; 5927 long e = (long) 0l; 5928The matchers 5929 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 5930 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 5931would match the declarations for a, b, c, and d, but not e. 5932While 5933 varDecl(hasInitializer(integerLiteral())) 5934 varDecl(hasInitializer(declRefExpr())) 5935only match the declarations for b, c, and d. 5936</pre></td></tr> 5937 5938 5939<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> 5940<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 5941nodes are stripped off. 5942 5943Parentheses and explicit casts are not discarded. 5944Given 5945 class C {}; 5946 C a = C(); 5947 C b; 5948 C c = b; 5949The matchers 5950 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 5951would match the declarations for a, b, and c. 5952While 5953 varDecl(hasInitializer(cxxConstructExpr())) 5954only match the declarations for b and c. 5955</pre></td></tr> 5956 5957 5958<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> 5959<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 5960casts are stripped off. 5961 5962Implicit and non-C Style casts are also discarded. 5963Given 5964 int a = 0; 5965 char b = (0); 5966 void* c = reinterpret_cast<char*>(0); 5967 char d = char(0); 5968The matcher 5969 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 5970would match the declarations for a, b, c, and d. 5971while 5972 varDecl(hasInitializer(integerLiteral())) 5973only match the declaration for a. 5974</pre></td></tr> 5975 5976 5977<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> 5978<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 5979parentheses are stripped off. 5980 5981Explicit casts are not discarded. 5982Given 5983 int arr[5]; 5984 int a = 0; 5985 char b = (0); 5986 const int c = a; 5987 int *d = (arr); 5988 long e = ((long) 0l); 5989The matchers 5990 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 5991 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 5992would match the declarations for a, b, c, and d, but not e. 5993while 5994 varDecl(hasInitializer(integerLiteral())) 5995 varDecl(hasInitializer(declRefExpr())) 5996would only match the declaration for a. 5997</pre></td></tr> 5998 5999 6000<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> 6001<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 6002 6003Given 6004 const char* str = ("my-string"); 6005The matcher 6006 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 6007would match the implicit cast resulting from the assignment. 6008</pre></td></tr> 6009 6010 6011<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> 6012<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 6013 6014Given 6015 class C { 6016 int a = 2; 6017 int b = 3; 6018 int c; 6019 }; 6020fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 6021 matches 'int a;' but not 'int b;'. 6022fieldDecl(hasInClassInitializer(anything())) 6023 matches 'int a;' and 'int b;' but not 'int c;'. 6024</pre></td></tr> 6025 6026 6027<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> 6028<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function 6029definition that has a given body. 6030 6031Given 6032 for (;;) {} 6033hasBody(compoundStmt()) 6034 matches 'for (;;) {}' 6035with compoundStmt() 6036 matching '{}' 6037</pre></td></tr> 6038 6039 6040<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> 6041<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 6042switch statement or conditional operator. 6043 6044Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6045 if (true) {} 6046</pre></td></tr> 6047 6048 6049<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> 6050<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 6051 6052Example: 6053 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 6054matches '++x' in 6055 for (x; x < N; ++x) { } 6056</pre></td></tr> 6057 6058 6059<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> 6060<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 6061 6062Example: 6063 forStmt(hasLoopInit(declStmt())) 6064matches 'int x = 0' in 6065 for (int x = 0; x < N; ++x) { } 6066</pre></td></tr> 6067 6068 6069<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> 6070<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 6071declaration's type. 6072 6073In case of a value declaration (for example a variable declaration), 6074this resolves one layer of indirection. For example, in the value 6075declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6076X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6077declaration of x. 6078 6079Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6080 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6081 and friend class X (matcher = friendDecl(hasType("X")) 6082 class X {}; 6083 void y(X &x) { x; X z; } 6084 class Y { friend class X; }; 6085 6086Usable 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>> 6087</pre></td></tr> 6088 6089 6090<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> 6091<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 6092matcher. 6093 6094Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6095 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6096 and U (matcher = typedefDecl(hasType(asString("int"))) 6097 and friend class X (matcher = friendDecl(hasType("X")) 6098 class X {}; 6099 void y(X &x) { x; X z; } 6100 typedef int U; 6101 class Y { friend class X; }; 6102</pre></td></tr> 6103 6104 6105<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> 6106<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 6107block. 6108 6109Does not match the 'this' parameter of a method. 6110 6111Given 6112 class X { void f(int x, int y, int z) {} }; 6113cxxMethodDecl(hasAnyParameter(hasName("y"))) 6114 matches f(int x, int y, int z) {} 6115with hasAnyParameter(...) 6116 matching int y 6117 6118For ObjectiveC, given 6119 @interface I - (void) f:(int) y; @end 6120 6121the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 6122matches the declaration of method f with hasParameter 6123matching y. 6124 6125For blocks, given 6126 b = ^(int y) { printf("%d", y) }; 6127 6128the matcher blockDecl(hasAnyParameter(hasName("y"))) 6129matches the declaration of the block b with hasParameter 6130matching y. 6131</pre></td></tr> 6132 6133 6134<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> 6135<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6136functionDecl that have at least one TemplateArgument matching the given 6137InnerMatcher. 6138 6139Given 6140 template<typename T> class A {}; 6141 template<> class A<double> {}; 6142 A<int> a; 6143 6144 template<typename T> f() {}; 6145 void func() { f<int>(); }; 6146 6147classTemplateSpecializationDecl(hasAnyTemplateArgument( 6148 refersToType(asString("int")))) 6149 matches the specialization A<int> 6150 6151functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 6152 matches the specialization f<int> 6153</pre></td></tr> 6154 6155 6156<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> 6157<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function 6158definition that has a given body. 6159 6160Given 6161 for (;;) {} 6162hasBody(compoundStmt()) 6163 matches 'for (;;) {}' 6164with compoundStmt() 6165 matching '{}' 6166</pre></td></tr> 6167 6168 6169<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> 6170<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 6171declaration. 6172 6173Given 6174 template<bool b> 6175 struct S { 6176 S(int); // #1 6177 explicit S(double); // #2 6178 operator int(); // #3 6179 explicit operator bool(); // #4 6180 explicit(false) S(bool) // # 7 6181 explicit(true) S(char) // # 8 6182 explicit(b) S(S) // # 9 6183 }; 6184 S(int) -> S<true> // #5 6185 explicit S(double) -> S<false> // #6 6186cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 6187cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 6188cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 6189</pre></td></tr> 6190 6191 6192<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> 6193<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 6194declaration or a block. 6195 6196Given 6197 class X { void f(int x) {} }; 6198cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6199 matches f(int x) {} 6200with hasParameter(...) 6201 matching int x 6202 6203For ObjectiveC, given 6204 @interface I - (void) f:(int) y; @end 6205 6206the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6207matches the declaration of method f with hasParameter 6208matching y. 6209</pre></td></tr> 6210 6211 6212<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> 6213<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6214functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 6215 6216Given 6217 template<typename T, typename U> class A {}; 6218 A<bool, int> b; 6219 A<int, bool> c; 6220 6221 template<typename T> void f() {} 6222 void func() { f<int>(); }; 6223classTemplateSpecializationDecl(hasTemplateArgument( 6224 1, refersToType(asString("int")))) 6225 matches the specialization A<bool, int> 6226 6227functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 6228 matches the specialization f<int> 6229</pre></td></tr> 6230 6231 6232<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> 6233<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 6234 6235Given: 6236 class X { int f() { return 1; } }; 6237cxxMethodDecl(returns(asString("int"))) 6238 matches int f() { return 1; } 6239</pre></td></tr> 6240 6241 6242<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> 6243<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 6244switch statement or conditional operator. 6245 6246Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6247 if (true) {} 6248</pre></td></tr> 6249 6250 6251<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> 6252<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 6253 6254Given 6255 if (A* a = GetAPointer()) {} 6256hasConditionVariableStatement(...) 6257 matches 'A* a = GetAPointer()'. 6258</pre></td></tr> 6259 6260 6261<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> 6262<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 6263 6264Examples matches the if statement 6265 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 6266 if (false) false; else true; 6267</pre></td></tr> 6268 6269 6270<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> 6271<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 6272 6273Given: 6274 void foo() { 6275 if (int i = foobar(); i > 0) {} 6276 switch (int i = foobar(); i) {} 6277 for (auto& a = get_range(); auto& x : a) {} 6278 } 6279 void bar() { 6280 if (foobar() > 0) {} 6281 switch (foobar()) {} 6282 for (auto& x : get_range()) {} 6283 } 6284ifStmt(hasInitStatement(anything())) 6285 matches the if statement in foo but not in bar. 6286switchStmt(hasInitStatement(anything())) 6287 matches the switch statement in foo but not in bar. 6288cxxForRangeStmt(hasInitStatement(anything())) 6289 matches the range for statement in foo but not in bar. 6290</pre></td></tr> 6291 6292 6293<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> 6294<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 6295 6296Examples matches the if statement 6297 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 6298 if (false) true; else false; 6299</pre></td></tr> 6300 6301 6302<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> 6303<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 6304matcher. 6305 6306FIXME: Unit test this matcher 6307</pre></td></tr> 6308 6309 6310<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> 6311<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 6312 6313Example matches y. 6314 (matcher = initListExpr(hasInit(0, expr()))) 6315 int x{y}. 6316</pre></td></tr> 6317 6318 6319<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> 6320<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 6321(if expression have it). 6322</pre></td></tr> 6323 6324 6325<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> 6326<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 6327matches the given matcher. 6328 6329The associated declaration is: 6330- for type nodes, the declaration of the underlying type 6331- for CallExpr, the declaration of the callee 6332- for MemberExpr, the declaration of the referenced member 6333- for CXXConstructExpr, the declaration of the constructor 6334- for CXXNewExpr, the declaration of the operator new 6335- for ObjCIvarExpr, the declaration of the ivar 6336 6337For type nodes, hasDeclaration will generally match the declaration of the 6338sugared type. Given 6339 class X {}; 6340 typedef X Y; 6341 Y y; 6342in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6343typedefDecl. A common use case is to match the underlying, desugared type. 6344This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6345 varDecl(hasType(hasUnqualifiedDesugaredType( 6346 recordType(hasDeclaration(decl()))))) 6347In this matcher, the decl will match the CXXRecordDecl of class X. 6348 6349Usable 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>>, 6350 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>>, 6351 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>>, 6352 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>>, 6353 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>>, 6354 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>>, 6355 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6356</pre></td></tr> 6357 6358 6359<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> 6360<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 6361matches the given matcher. 6362 6363The associated declaration is: 6364- for type nodes, the declaration of the underlying type 6365- for CallExpr, the declaration of the callee 6366- for MemberExpr, the declaration of the referenced member 6367- for CXXConstructExpr, the declaration of the constructor 6368- for CXXNewExpr, the declaration of the operator new 6369- for ObjCIvarExpr, the declaration of the ivar 6370 6371For type nodes, hasDeclaration will generally match the declaration of the 6372sugared type. Given 6373 class X {}; 6374 typedef X Y; 6375 Y y; 6376in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6377typedefDecl. A common use case is to match the underlying, desugared type. 6378This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6379 varDecl(hasType(hasUnqualifiedDesugaredType( 6380 recordType(hasDeclaration(decl()))))) 6381In this matcher, the decl will match the CXXRecordDecl of class X. 6382 6383Usable 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>>, 6384 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>>, 6385 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>>, 6386 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>>, 6387 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>>, 6388 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>>, 6389 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6390</pre></td></tr> 6391 6392 6393<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>></td><td class="name" onclick="toggle('hasAnyCapture1')"><a name="hasAnyCapture1Anchor">hasAnyCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>> InnerMatcher</td></tr> 6394<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression. 6395 6396Given 6397 struct foo { 6398 void bar() { 6399 auto f = [this](){}; 6400 } 6401 } 6402lambdaExpr(hasAnyCapture(cxxThisExpr())) 6403 matches [this](){}; 6404</pre></td></tr> 6405 6406 6407<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>></td><td class="name" onclick="toggle('hasAnyCapture0')"><a name="hasAnyCapture0Anchor">hasAnyCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>> InnerMatcher</td></tr> 6408<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression. 6409 6410Given 6411 void foo() { 6412 int x; 6413 auto f = [x](){}; 6414 } 6415lambdaExpr(hasAnyCapture(anything())) 6416 matches [x](){}; 6417</pre></td></tr> 6418 6419 6420<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> 6421<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 6422matches the given matcher. 6423 6424The associated declaration is: 6425- for type nodes, the declaration of the underlying type 6426- for CallExpr, the declaration of the callee 6427- for MemberExpr, the declaration of the referenced member 6428- for CXXConstructExpr, the declaration of the constructor 6429- for CXXNewExpr, the declaration of the operator new 6430- for ObjCIvarExpr, the declaration of the ivar 6431 6432For type nodes, hasDeclaration will generally match the declaration of the 6433sugared type. Given 6434 class X {}; 6435 typedef X Y; 6436 Y y; 6437in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6438typedefDecl. A common use case is to match the underlying, desugared type. 6439This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6440 varDecl(hasType(hasUnqualifiedDesugaredType( 6441 recordType(hasDeclaration(decl()))))) 6442In this matcher, the decl will match the CXXRecordDecl of class X. 6443 6444Usable 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>>, 6445 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>>, 6446 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>>, 6447 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>>, 6448 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>>, 6449 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>>, 6450 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6451</pre></td></tr> 6452 6453 6454<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> 6455<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 6456given matcher. Implicit object expressions are included; that is, it matches 6457use of implicit `this`. 6458 6459Given 6460 struct X { 6461 int m; 6462 int f(X x) { x.m; return m; } 6463 }; 6464memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6465 matches `x.m`, but not `m`; however, 6466memberExpr(hasObjectExpression(hasType(pointsTo( 6467 cxxRecordDecl(hasName("X")))))) 6468 matches `m` (aka. `this->m`), but not `x.m`. 6469</pre></td></tr> 6470 6471 6472<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> 6473<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 6474given matcher. 6475 6476Given 6477 struct { int first, second; } first, second; 6478 int i(second.first); 6479 int j(first.second); 6480memberExpr(member(hasName("first"))) 6481 matches second.first 6482 but not first.second (because the member name there is "second"). 6483</pre></td></tr> 6484 6485 6486<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> 6487<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 6488pointee matches a given matcher. 6489 6490Given 6491 int *a; 6492 int const *b; 6493 float const *f; 6494pointerType(pointee(isConstQualified(), isInteger())) 6495 matches "int const *b" 6496 6497Usable 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>>, 6498 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>> 6499</pre></td></tr> 6500 6501 6502<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> 6503<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 6504matcher. 6505 6506Given 6507 namespace N { template<class T> void f(T t); } 6508 template <class T> void g() { using N::f; f(T()); } 6509unresolvedLookupExpr(hasAnyDeclaration( 6510 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 6511 matches the use of f in g() . 6512</pre></td></tr> 6513 6514 6515<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> 6516<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 6517 6518Given 6519 struct A { struct B { struct C {}; }; }; 6520 A::B::C c; 6521nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 6522 matches "A::" 6523</pre></td></tr> 6524 6525 6526<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> 6527<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 6528given TypeLoc. 6529 6530Given 6531 struct A { struct B { struct C {}; }; }; 6532 A::B::C c; 6533nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 6534 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 6535 matches "A::" 6536</pre></td></tr> 6537 6538 6539<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> 6540<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 6541 6542Given 6543 struct A { struct B { struct C {}; }; }; 6544 A::B::C c; 6545nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 6546 matches "A::" 6547</pre></td></tr> 6548 6549 6550<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> 6551<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 6552given namespace matcher. 6553 6554Given 6555 namespace ns { struct A {}; } 6556 ns::A a; 6557nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 6558 matches "ns::" 6559</pre></td></tr> 6560 6561 6562<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> 6563<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 6564given QualType matcher without qualifiers. 6565 6566Given 6567 struct A { struct B { struct C {}; }; }; 6568 A::B::C c; 6569nestedNameSpecifier(specifiesType( 6570 hasDeclaration(cxxRecordDecl(hasName("A"))) 6571)) 6572 matches "A::" 6573</pre></td></tr> 6574 6575 6576<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> 6577<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 6578 6579Given 6580 6581 #pragma omp parallel 6582 #pragma omp parallel default(none) 6583 6584``ompExecutableDirective(hasAnyClause(anything()))`` matches 6585``omp parallel default(none)``. 6586</pre></td></tr> 6587 6588 6589<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> 6590<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 6591 6592Prerequisite: the executable directive must not be standalone directive. 6593If it is, it will never match. 6594 6595Given 6596 6597 #pragma omp parallel 6598 ; 6599 #pragma omp parallel 6600 {} 6601 6602``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 6603</pre></td></tr> 6604 6605 6606<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> 6607<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 6608matching Base, or Objective-C classes that directly or indirectly 6609subclass a class matching Base. 6610 6611Note that a class is not considered to be derived from itself. 6612 6613Example matches Y, Z, C (Base == hasName("X")) 6614 class X; 6615 class Y : public X {}; // directly derived 6616 class Z : public Y {}; // indirectly derived 6617 typedef X A; 6618 typedef A B; 6619 class C : public B {}; // derived from a typedef of X 6620 6621In the following example, Bar matches isDerivedFrom(hasName("X")): 6622 class Foo; 6623 typedef Foo X; 6624 class Bar : public Foo {}; // derived from a type that X is a typedef of 6625 6626In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 6627 @interface NSObject @end 6628 @interface Bar : NSObject @end 6629 6630Usable 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>> 6631</pre></td></tr> 6632 6633 6634<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> 6635<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 6636matching Base. 6637 6638Note that a class is not considered to be derived from itself. 6639 6640Example matches Y, C (Base == hasName("X")) 6641 class X; 6642 class Y : public X {}; // directly derived 6643 class Z : public Y {}; // indirectly derived 6644 typedef X A; 6645 typedef A B; 6646 class C : public B {}; // derived from a typedef of X 6647 6648In the following example, Bar matches isDerivedFrom(hasName("X")): 6649 class Foo; 6650 typedef Foo X; 6651 class Bar : public Foo {}; // derived from a type that X is a typedef of 6652</pre></td></tr> 6653 6654 6655<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> 6656<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 6657match Base. 6658</pre></td></tr> 6659 6660 6661<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> 6662<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 6663expression, or an ObjC-message-send expression. 6664 6665Given 6666 void x(int, int, int) { int y; x(1, y, 42); } 6667callExpr(hasAnyArgument(declRefExpr())) 6668 matches x(1, y, 42) 6669with hasAnyArgument(...) 6670 matching y 6671 6672For ObjectiveC, given 6673 @interface I - (void) f:(int) y; @end 6674 void foo(I *i) { [i f:12]; } 6675objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6676 matches [i f:12] 6677</pre></td></tr> 6678 6679 6680<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> 6681<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 6682call expression. 6683 6684Example matches y in x(y) 6685 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6686 void x(int) { int y; x(y); } 6687</pre></td></tr> 6688 6689 6690<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> 6691<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 6692and the inner matcher matches on that instance. 6693 6694For example the method call in 6695 NSString *x = @"hello"; 6696 [x containsString:@"h"]; 6697is matched by 6698objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 6699</pre></td></tr> 6700 6701 6702<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> 6703<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 6704 6705Example 6706matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 6707matches the [webView ...] message invocation. 6708 NSString *webViewJavaScript = ... 6709 UIWebView *webView = ... 6710 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 6711</pre></td></tr> 6712 6713 6714<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> 6715<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 6716block. 6717 6718Does not match the 'this' parameter of a method. 6719 6720Given 6721 class X { void f(int x, int y, int z) {} }; 6722cxxMethodDecl(hasAnyParameter(hasName("y"))) 6723 matches f(int x, int y, int z) {} 6724with hasAnyParameter(...) 6725 matching int y 6726 6727For ObjectiveC, given 6728 @interface I - (void) f:(int) y; @end 6729 6730the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 6731matches the declaration of method f with hasParameter 6732matching y. 6733 6734For blocks, given 6735 b = ^(int y) { printf("%d", y) }; 6736 6737the matcher blockDecl(hasAnyParameter(hasName("y"))) 6738matches the declaration of the block b with hasParameter 6739matching y. 6740</pre></td></tr> 6741 6742 6743<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> 6744<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 6745declaration or a block. 6746 6747Given 6748 class X { void f(int x) {} }; 6749cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6750 matches f(int x) {} 6751with hasParameter(...) 6752 matching int x 6753 6754For ObjectiveC, given 6755 @interface I - (void) f:(int) y; @end 6756 6757the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6758matches the declaration of method f with hasParameter 6759matching y. 6760</pre></td></tr> 6761 6762 6763<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> 6764<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 6765or opaque value's source expression matches the given matcher. 6766 6767Example 1: matches "a string" 6768(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 6769class URL { URL(string); }; 6770URL url = "a string"; 6771 6772Example 2: matches 'b' (matcher = 6773opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 6774int a = b ?: 1; 6775</pre></td></tr> 6776 6777 6778<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> 6779<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 6780overloads matches the given matcher. 6781 6782Given 6783 template <typename T> void foo(T); 6784 template <typename T> void bar(T); 6785 template <typename T> void baz(T t) { 6786 foo(t); 6787 bar(t); 6788 } 6789unresolvedLookupExpr(hasAnyDeclaration( 6790 functionTemplateDecl(hasName("foo")))) 6791 matches foo in foo(t); but not bar in bar(t); 6792</pre></td></tr> 6793 6794 6795<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> 6796<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 6797 6798Given 6799 int (*ptr_to_array)[4]; 6800 int (*ptr_to_func)(int); 6801 6802varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 6803ptr_to_func but not ptr_to_array. 6804 6805Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 6806</pre></td></tr> 6807 6808 6809<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> 6810<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 6811pointee matches a given matcher. 6812 6813Given 6814 int *a; 6815 int const *b; 6816 float const *f; 6817pointerType(pointee(isConstQualified(), isInteger())) 6818 matches "int const *b" 6819 6820Usable 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>>, 6821 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>> 6822</pre></td></tr> 6823 6824 6825<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> 6826<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 6827 6828Given: 6829 typedef int &int_ref; 6830 int a; 6831 int_ref b = a; 6832 6833varDecl(hasType(qualType(referenceType()))))) will not match the 6834declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 6835</pre></td></tr> 6836 6837 6838<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> 6839<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 6840matches the given matcher. 6841 6842The associated declaration is: 6843- for type nodes, the declaration of the underlying type 6844- for CallExpr, the declaration of the callee 6845- for MemberExpr, the declaration of the referenced member 6846- for CXXConstructExpr, the declaration of the constructor 6847- for CXXNewExpr, the declaration of the operator new 6848- for ObjCIvarExpr, the declaration of the ivar 6849 6850For type nodes, hasDeclaration will generally match the declaration of the 6851sugared type. Given 6852 class X {}; 6853 typedef X Y; 6854 Y y; 6855in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6856typedefDecl. A common use case is to match the underlying, desugared type. 6857This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6858 varDecl(hasType(hasUnqualifiedDesugaredType( 6859 recordType(hasDeclaration(decl()))))) 6860In this matcher, the decl will match the CXXRecordDecl of class X. 6861 6862Usable 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>>, 6863 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>>, 6864 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>>, 6865 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>>, 6866 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>>, 6867 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>>, 6868 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6869</pre></td></tr> 6870 6871 6872<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> 6873<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 6874 6875Given 6876 void (*fp)(void); 6877The matcher 6878 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 6879would match the declaration for fp. 6880</pre></td></tr> 6881 6882 6883<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> 6884<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 6885</pre></td></tr> 6886 6887 6888<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> 6889<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 6890matches the specified matcher. 6891 6892Example matches y->x() 6893 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 6894 cxxRecordDecl(hasName("Y"))))))) 6895 class Y { public: void x(); }; 6896 void z() { Y *y; y->x(); } 6897</pre></td></tr> 6898 6899 6900<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> 6901<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 6902</pre></td></tr> 6903 6904 6905<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> 6906<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 6907type matches the specified matcher. 6908 6909Example matches X &x and const X &y 6910 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 6911 class X { 6912 void a(X b) { 6913 X &x = b; 6914 const X &y = b; 6915 } 6916 }; 6917</pre></td></tr> 6918 6919 6920<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> 6921<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 6922matches the given matcher. 6923 6924The associated declaration is: 6925- for type nodes, the declaration of the underlying type 6926- for CallExpr, the declaration of the callee 6927- for MemberExpr, the declaration of the referenced member 6928- for CXXConstructExpr, the declaration of the constructor 6929- for CXXNewExpr, the declaration of the operator new 6930- for ObjCIvarExpr, the declaration of the ivar 6931 6932For type nodes, hasDeclaration will generally match the declaration of the 6933sugared type. Given 6934 class X {}; 6935 typedef X Y; 6936 Y y; 6937in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6938typedefDecl. A common use case is to match the underlying, desugared type. 6939This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6940 varDecl(hasType(hasUnqualifiedDesugaredType( 6941 recordType(hasDeclaration(decl()))))) 6942In this matcher, the decl will match the CXXRecordDecl of class X. 6943 6944Usable 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>>, 6945 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>>, 6946 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>>, 6947 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>>, 6948 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>>, 6949 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>>, 6950 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6951</pre></td></tr> 6952 6953 6954<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> 6955<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 6956pointee matches a given matcher. 6957 6958Given 6959 int *a; 6960 int const *b; 6961 float const *f; 6962pointerType(pointee(isConstQualified(), isInteger())) 6963 matches "int const *b" 6964 6965Usable 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>>, 6966 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>> 6967</pre></td></tr> 6968 6969 6970<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> 6971<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 6972 6973Given 6974 return a + b; 6975hasReturnValue(binaryOperator()) 6976 matches 'return a + b' 6977with binaryOperator() 6978 matching 'a + b' 6979</pre></td></tr> 6980 6981 6982<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> 6983<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 6984a given matcher. Also matches StmtExprs that have CompoundStmt as children. 6985 6986Given 6987 { {}; 1+2; } 6988hasAnySubstatement(compoundStmt()) 6989 matches '{ {}; 1+2; }' 6990with compoundStmt() 6991 matching '{}' 6992</pre></td></tr> 6993 6994 6995<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> 6996<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 6997alignof. 6998</pre></td></tr> 6999 7000 7001<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> 7002<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to 7003 7004Given: 7005F& operator=(const F& o) { 7006 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 7007 return *this; 7008} 7009returnStmt(forFunction(hasName("operator="))) 7010 matches 'return *this' 7011 but does not match 'return v > 0' 7012</pre></td></tr> 7013 7014 7015<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> 7016<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 7017sizeof. 7018</pre></td></tr> 7019 7020 7021<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> 7022<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 7023type that matches the provided matcher. 7024 7025Given 7026 template <typename T> 7027 double F(T t); 7028 int i; 7029 double j = F(i); 7030 7031substTemplateTypeParmType(hasReplacementType(type())) matches int 7032</pre></td></tr> 7033 7034 7035<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> 7036<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 7037statement. This matcher may produce multiple matches. 7038 7039Given 7040 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 7041switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 7042 matches four times, with "c" binding each of "case 1:", "case 2:", 7043"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 7044"switch (1)", "switch (2)" and "switch (2)". 7045</pre></td></tr> 7046 7047 7048<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> 7049<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 7050switch statement or conditional operator. 7051 7052Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7053 if (true) {} 7054</pre></td></tr> 7055 7056 7057<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> 7058<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 7059 7060Given: 7061 void foo() { 7062 if (int i = foobar(); i > 0) {} 7063 switch (int i = foobar(); i) {} 7064 for (auto& a = get_range(); auto& x : a) {} 7065 } 7066 void bar() { 7067 if (foobar() > 0) {} 7068 switch (foobar()) {} 7069 for (auto& x : get_range()) {} 7070 } 7071ifStmt(hasInitStatement(anything())) 7072 matches the if statement in foo but not in bar. 7073switchStmt(hasInitStatement(anything())) 7074 matches the switch statement in foo but not in bar. 7075cxxForRangeStmt(hasInitStatement(anything())) 7076 matches the range for statement in foo but not in bar. 7077</pre></td></tr> 7078 7079 7080<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> 7081<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 7082matches the given matcher. 7083 7084The associated declaration is: 7085- for type nodes, the declaration of the underlying type 7086- for CallExpr, the declaration of the callee 7087- for MemberExpr, the declaration of the referenced member 7088- for CXXConstructExpr, the declaration of the constructor 7089- for CXXNewExpr, the declaration of the operator new 7090- for ObjCIvarExpr, the declaration of the ivar 7091 7092For type nodes, hasDeclaration will generally match the declaration of the 7093sugared type. Given 7094 class X {}; 7095 typedef X Y; 7096 Y y; 7097in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7098typedefDecl. A common use case is to match the underlying, desugared type. 7099This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7100 varDecl(hasType(hasUnqualifiedDesugaredType( 7101 recordType(hasDeclaration(decl()))))) 7102In this matcher, the decl will match the CXXRecordDecl of class X. 7103 7104Usable 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>>, 7105 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>>, 7106 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>>, 7107 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>>, 7108 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>>, 7109 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>>, 7110 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7111</pre></td></tr> 7112 7113 7114<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> 7115<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 7116 7117Given 7118 struct B { int next; }; 7119 template<int(B::*next_ptr)> struct A {}; 7120 A<&B::next> a; 7121templateSpecializationType(hasAnyTemplateArgument( 7122 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 7123 matches the specialization A<&B::next> with fieldDecl(...) matching 7124 B::next 7125</pre></td></tr> 7126 7127 7128<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> 7129<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 7130declaration. 7131 7132Given 7133 struct B { int next; }; 7134 template<int(B::*next_ptr)> struct A {}; 7135 A<&B::next> a; 7136classTemplateSpecializationDecl(hasAnyTemplateArgument( 7137 refersToDeclaration(fieldDecl(hasName("next"))))) 7138 matches the specialization A<&B::next> with fieldDecl(...) matching 7139 B::next 7140</pre></td></tr> 7141 7142 7143<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> 7144<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type. 7145 7146Given 7147 template<int T> struct C {}; 7148 C<42> c; 7149classTemplateSpecializationDecl( 7150 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 7151 matches the implicit instantiation of C in C<42>. 7152</pre></td></tr> 7153 7154 7155<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> 7156<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 7157 7158Given 7159 template<template <typename> class S> class X {}; 7160 template<typename T> class Y {}; 7161 X<Y> xi; 7162classTemplateSpecializationDecl(hasAnyTemplateArgument( 7163 refersToTemplate(templateName()))) 7164 matches the specialization X<Y> 7165</pre></td></tr> 7166 7167 7168<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> 7169<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 7170 7171Given 7172 struct X {}; 7173 template<typename T> struct A {}; 7174 A<X> a; 7175classTemplateSpecializationDecl(hasAnyTemplateArgument( 7176 refersToType(class(hasName("X"))))) 7177 matches the specialization A<X> 7178</pre></td></tr> 7179 7180 7181<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> 7182<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7183functionDecl that have at least one TemplateArgument matching the given 7184InnerMatcher. 7185 7186Given 7187 template<typename T> class A {}; 7188 template<> class A<double> {}; 7189 A<int> a; 7190 7191 template<typename T> f() {}; 7192 void func() { f<int>(); }; 7193 7194classTemplateSpecializationDecl(hasAnyTemplateArgument( 7195 refersToType(asString("int")))) 7196 matches the specialization A<int> 7197 7198functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7199 matches the specialization f<int> 7200</pre></td></tr> 7201 7202 7203<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> 7204<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 7205matches the given matcher. 7206 7207The associated declaration is: 7208- for type nodes, the declaration of the underlying type 7209- for CallExpr, the declaration of the callee 7210- for MemberExpr, the declaration of the referenced member 7211- for CXXConstructExpr, the declaration of the constructor 7212- for CXXNewExpr, the declaration of the operator new 7213- for ObjCIvarExpr, the declaration of the ivar 7214 7215For type nodes, hasDeclaration will generally match the declaration of the 7216sugared type. Given 7217 class X {}; 7218 typedef X Y; 7219 Y y; 7220in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7221typedefDecl. A common use case is to match the underlying, desugared type. 7222This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7223 varDecl(hasType(hasUnqualifiedDesugaredType( 7224 recordType(hasDeclaration(decl()))))) 7225In this matcher, the decl will match the CXXRecordDecl of class X. 7226 7227Usable 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>>, 7228 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>>, 7229 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>>, 7230 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>>, 7231 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>>, 7232 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>>, 7233 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7234</pre></td></tr> 7235 7236 7237<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> 7238<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7239functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7240 7241Given 7242 template<typename T, typename U> class A {}; 7243 A<bool, int> b; 7244 A<int, bool> c; 7245 7246 template<typename T> void f() {} 7247 void func() { f<int>(); }; 7248classTemplateSpecializationDecl(hasTemplateArgument( 7249 1, refersToType(asString("int")))) 7250 matches the specialization A<bool, int> 7251 7252functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7253 matches the specialization f<int> 7254</pre></td></tr> 7255 7256 7257<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> 7258<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 7259matches the given matcher. 7260 7261The associated declaration is: 7262- for type nodes, the declaration of the underlying type 7263- for CallExpr, the declaration of the callee 7264- for MemberExpr, the declaration of the referenced member 7265- for CXXConstructExpr, the declaration of the constructor 7266- for CXXNewExpr, the declaration of the operator new 7267- for ObjCIvarExpr, the declaration of the ivar 7268 7269For type nodes, hasDeclaration will generally match the declaration of the 7270sugared type. Given 7271 class X {}; 7272 typedef X Y; 7273 Y y; 7274in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7275typedefDecl. A common use case is to match the underlying, desugared type. 7276This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7277 varDecl(hasType(hasUnqualifiedDesugaredType( 7278 recordType(hasDeclaration(decl()))))) 7279In this matcher, the decl will match the CXXRecordDecl of class X. 7280 7281Usable 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>>, 7282 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>>, 7283 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>>, 7284 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>>, 7285 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>>, 7286 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>>, 7287 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7288</pre></td></tr> 7289 7290 7291<tr><td>Matcher<T></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>const Matcher<T> Matcher</td></tr> 7292<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 7293 7294Generates results for each match. 7295 7296For example, in: 7297 class A { class B {}; class C {}; }; 7298The matcher: 7299 cxxRecordDecl(hasName("::A"), 7300 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 7301will generate results for A, B and C. 7302 7303Usable as: Any Matcher 7304</pre></td></tr> 7305 7306 7307<tr><td>Matcher<T></td><td class="name" onclick="toggle('traverse1')"><a name="traverse1Anchor">traverse</a></td><td>ast_type_traits::TraversalKind TK, const BindableMatcher<T> InnerMatcher</td></tr> 7308<tr><td colspan="4" class="doc" id="traverse1"><pre></pre></td></tr> 7309 7310 7311<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> 7312<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind. 7313 7314Given 7315 void foo() 7316 { 7317 int i = 3.0; 7318 } 7319The matcher 7320 traverse(ast_type_traits::TK_IgnoreImplicitCastsAndParentheses, 7321 varDecl(hasInitializer(floatLiteral().bind("init"))) 7322 ) 7323matches the variable declaration with "init" bound to the "3.0". 7324</pre></td></tr> 7325 7326 7327<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> 7328<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 7329matcher. 7330 7331Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7332 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7333 and U (matcher = typedefDecl(hasType(asString("int"))) 7334 and friend class X (matcher = friendDecl(hasType("X")) 7335 class X {}; 7336 void y(X &x) { x; X z; } 7337 typedef int U; 7338 class Y { friend class X; }; 7339</pre></td></tr> 7340 7341 7342<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> 7343<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 7344matches the given matcher. 7345 7346The associated declaration is: 7347- for type nodes, the declaration of the underlying type 7348- for CallExpr, the declaration of the callee 7349- for MemberExpr, the declaration of the referenced member 7350- for CXXConstructExpr, the declaration of the constructor 7351- for CXXNewExpr, the declaration of the operator new 7352- for ObjCIvarExpr, the declaration of the ivar 7353 7354For type nodes, hasDeclaration will generally match the declaration of the 7355sugared type. Given 7356 class X {}; 7357 typedef X Y; 7358 Y y; 7359in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7360typedefDecl. A common use case is to match the underlying, desugared type. 7361This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7362 varDecl(hasType(hasUnqualifiedDesugaredType( 7363 recordType(hasDeclaration(decl()))))) 7364In this matcher, the decl will match the CXXRecordDecl of class X. 7365 7366Usable 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>>, 7367 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>>, 7368 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>>, 7369 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>>, 7370 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>>, 7371 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>>, 7372 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7373</pre></td></tr> 7374 7375 7376<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> 7377<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 7378type of the matched node. 7379 7380For example, in: 7381 class A {}; 7382 using B = A; 7383The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 7384both B and A. 7385</pre></td></tr> 7386 7387 7388<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> 7389<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 7390 7391Given 7392 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 7393unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 7394 matches sizeof(a) and alignof(c) 7395</pre></td></tr> 7396 7397 7398<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> 7399<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 7400 7401Example matches true (matcher = hasUnaryOperand( 7402 cxxBoolLiteral(equals(true)))) 7403 !true 7404</pre></td></tr> 7405 7406 7407<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> 7408<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 7409given matcher. Implicit object expressions are included; that is, it matches 7410use of implicit `this`. 7411 7412Given 7413 struct X { 7414 int m; 7415 int f(X x) { x.m; return m; } 7416 }; 7417memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 7418 matches `x.m`, but not `m`; however, 7419memberExpr(hasObjectExpression(hasType(pointsTo( 7420 cxxRecordDecl(hasName("X")))))) 7421 matches `m` (aka. `this->m`), but not `x.m`. 7422</pre></td></tr> 7423 7424 7425<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> 7426<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 7427matches the given matcher. 7428 7429The associated declaration is: 7430- for type nodes, the declaration of the underlying type 7431- for CallExpr, the declaration of the callee 7432- for MemberExpr, the declaration of the referenced member 7433- for CXXConstructExpr, the declaration of the constructor 7434- for CXXNewExpr, the declaration of the operator new 7435- for ObjCIvarExpr, the declaration of the ivar 7436 7437For type nodes, hasDeclaration will generally match the declaration of the 7438sugared type. Given 7439 class X {}; 7440 typedef X Y; 7441 Y y; 7442in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7443typedefDecl. A common use case is to match the underlying, desugared type. 7444This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7445 varDecl(hasType(hasUnqualifiedDesugaredType( 7446 recordType(hasDeclaration(decl()))))) 7447In this matcher, the decl will match the CXXRecordDecl of class X. 7448 7449Usable 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>>, 7450 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>>, 7451 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>>, 7452 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>>, 7453 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>>, 7454 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>>, 7455 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7456</pre></td></tr> 7457 7458 7459<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> 7460<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 7461 7462Given 7463 namespace X { void b(); } 7464 using X::b; 7465usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 7466 matches using X::b </pre></td></tr> 7467 7468 7469<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> 7470<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 7471matched by the given matcher. 7472 7473Given 7474 namespace X { int a; void b(); } 7475 using X::a; 7476 using X::b; 7477usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 7478 matches using X::b but not using X::a </pre></td></tr> 7479 7480 7481<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> 7482<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 7483declaration's type. 7484 7485In case of a value declaration (for example a variable declaration), 7486this resolves one layer of indirection. For example, in the value 7487declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7488X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7489declaration of x. 7490 7491Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7492 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7493 and friend class X (matcher = friendDecl(hasType("X")) 7494 class X {}; 7495 void y(X &x) { x; X z; } 7496 class Y { friend class X; }; 7497 7498Usable 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>> 7499</pre></td></tr> 7500 7501 7502<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> 7503<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 7504matcher. 7505 7506Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7507 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7508 and U (matcher = typedefDecl(hasType(asString("int"))) 7509 and friend class X (matcher = friendDecl(hasType("X")) 7510 class X {}; 7511 void y(X &x) { x; X z; } 7512 typedef int U; 7513 class Y { friend class X; }; 7514</pre></td></tr> 7515 7516 7517<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> 7518<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 7519that matches the given matcher. 7520 7521Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 7522 bool y() { return true; } 7523 bool x = y(); 7524</pre></td></tr> 7525 7526 7527<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> 7528<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 7529expression. 7530 7531Given 7532 void f(int b) { 7533 int a[b]; 7534 } 7535variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 7536 varDecl(hasName("b"))))))) 7537 matches "int a[b]" 7538</pre></td></tr> 7539 7540 7541<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> 7542<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function 7543definition that has a given body. 7544 7545Given 7546 for (;;) {} 7547hasBody(compoundStmt()) 7548 matches 'for (;;) {}' 7549with compoundStmt() 7550 matching '{}' 7551</pre></td></tr> 7552 7553 7554<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> 7555<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 7556switch statement or conditional operator. 7557 7558Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7559 if (true) {} 7560</pre></td></tr> 7561 7562 7563<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> 7564<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 7565NestedNameSpecifier-matcher matches. 7566</pre></td></tr> 7567 7568 7569<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> 7570<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 7571QualType-matcher matches. 7572</pre></td></tr> 7573 7574<!--END_TRAVERSAL_MATCHERS --> 7575</table> 7576 7577</div> 7578</body> 7579</html> 7580 7581 7582