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('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr> 2580<tr><td colspan="4" class="doc" id="isDerivedFrom1"><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('isDirectlyDerivedFrom1')"><a name="isDirectlyDerivedFrom1Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr> 2585<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><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('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr> 2632<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><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_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr> 3013<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 3014bit width. 3015 3016Given 3017 class C { 3018 int a : 2; 3019 int b : 4; 3020 int c : 2; 3021 }; 3022fieldDecl(hasBitWidth(2)) 3023 matches 'int a;' and 'int c;' but not 'int b;'. 3024</pre></td></tr> 3025 3026 3027<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> 3028<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 3029 3030Given 3031 class C { 3032 int a : 2; 3033 int b; 3034 }; 3035fieldDecl(isBitField()) 3036 matches 'int a;' but not 'int b;'. 3037</pre></td></tr> 3038 3039 3040<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> 3041<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 3042 3043Given 3044 f('false, 3.14, 42); 3045characterLiteral(equals(0)) 3046 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3047 match false 3048floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3049 match 3.14 3050integerLiteral(equals(42)) 3051 matches 42 3052 3053Note that you cannot directly match a negative numeric literal because the 3054minus sign is not part of the literal: It is a unary operator whose operand 3055is the positive numeric literal. Instead, you must use a unaryOperator() 3056matcher to match the minus sign: 3057 3058unaryOperator(hasOperatorName("-"), 3059 hasUnaryOperand(integerLiteral(equals(13)))) 3060 3061Usable 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>>, 3062 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>> 3063</pre></td></tr> 3064 3065 3066<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> 3067<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr> 3068 3069 3070<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> 3071<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 3072 3073Given: 3074 void f(); 3075 void g() noexcept; 3076 void h() noexcept(true); 3077 void i() noexcept(false); 3078 void j() throw(); 3079 void k() throw(int); 3080 void l() throw(...); 3081functionDecl(hasDynamicExceptionSpec()) and 3082 functionProtoType(hasDynamicExceptionSpec()) 3083 match the declarations of j, k, and l, but not f, g, h, or i. 3084</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('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr> 3088<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 3089 3090Matches overloaded operator names specified in strings without the 3091"operator" prefix: e.g. "<<". 3092 3093Given: 3094 class A { int operator*(); }; 3095 const A &operator<<(const A &a, const A &b); 3096 A a; 3097 a << a; // <-- This matches 3098 3099cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3100specified line and 3101cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3102matches the declaration of A. 3103 3104Usable 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>> 3105</pre></td></tr> 3106 3107 3108<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> 3109<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 3110 3111Example matches Y (matcher = functionDecl(hasTrailingReturn())) 3112int X() {} 3113auto Y() -> int {} 3114</pre></td></tr> 3115 3116 3117<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> 3118<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations, 3119 and if constexpr. 3120 3121Given: 3122 constexpr int foo = 42; 3123 constexpr int bar(); 3124 void baz() { if constexpr(1 > 0) {} } 3125varDecl(isConstexpr()) 3126 matches the declaration of foo. 3127functionDecl(isConstexpr()) 3128 matches the declaration of bar. 3129ifStmt(isConstexpr()) 3130 matches the if statement in baz. 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('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr> 3135<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 3136 3137Given: 3138 class A { ~A(); }; 3139 class B { ~B() = default; }; 3140functionDecl(isDefaulted()) 3141 matches the declaration of ~B, but not ~A. 3142</pre></td></tr> 3143 3144 3145<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> 3146<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 3147 3148Example matches A, va, fa 3149 class A {}; 3150 class B; // Doesn't match, as it has no body. 3151 int va; 3152 extern int vb; // Doesn't match, as it doesn't define the variable. 3153 void fa() {} 3154 void fb(); // Doesn't match, as it has no body. 3155 @interface X 3156 - (void)ma; // Doesn't match, interface is declaration. 3157 @end 3158 @implementation X 3159 - (void)ma {} 3160 @end 3161 3162Usable 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>>, 3163 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 3164</pre></td></tr> 3165 3166 3167<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> 3168<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 3169 3170Given: 3171 void Func(); 3172 void DeletedFunc() = delete; 3173functionDecl(isDeleted()) 3174 matches the declaration of DeletedFunc, but not Func. 3175</pre></td></tr> 3176 3177 3178<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> 3179<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 3180static member variable template instantiations. 3181 3182Given 3183 template<typename T> void A(T t) { } 3184 template<> void A(int N) { } 3185functionDecl(isExplicitTemplateSpecialization()) 3186 matches the specialization A<int>(). 3187 3188Usable 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>> 3189</pre></td></tr> 3190 3191 3192<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> 3193<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 3194 3195Given: 3196 extern "C" void f() {} 3197 extern "C" { void g() {} } 3198 void h() {} 3199 extern "C" int x = 1; 3200 extern "C" int y = 2; 3201 int z = 3; 3202functionDecl(isExternC()) 3203 matches the declaration of f and g, but not the declaration of h. 3204varDecl(isExternC()) 3205 matches the declaration of x and y, but not the declaration of z. 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('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr> 3210<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 3211the inline keyword. 3212 3213Given 3214 inline void f(); 3215 void g(); 3216 namespace n { 3217 inline namespace m {} 3218 } 3219functionDecl(isInline()) will match ::f(). 3220namespaceDecl(isInline()) will match n::m. 3221</pre></td></tr> 3222 3223 3224<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> 3225<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point 3226into an executable program. 3227</pre></td></tr> 3228 3229 3230<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> 3231<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 3232 3233Given 3234 void nope(); 3235 [[noreturn]] void a(); 3236 __attribute__((noreturn)) void b(); 3237 struct c { [[noreturn]] c(); }; 3238functionDecl(isNoReturn()) 3239 matches all of those except 3240 void nope(); 3241</pre></td></tr> 3242 3243 3244<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> 3245<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 3246 3247Given: 3248 void f(); 3249 void g() noexcept; 3250 void h() throw(); 3251 void i() throw(int); 3252 void j() noexcept(false); 3253functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 3254 match the declarations of g, and h, but not f, i or j. 3255</pre></td></tr> 3256 3257 3258<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> 3259<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage 3260class specifier ("static" keyword) written in the source. 3261 3262Given: 3263 static void f() {} 3264 static int i = 0; 3265 extern int j; 3266 int k; 3267functionDecl(isStaticStorageClass()) 3268 matches the function declaration f. 3269varDecl(isStaticStorageClass()) 3270 matches the variable declaration i. 3271</pre></td></tr> 3272 3273 3274<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> 3275<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 3276member variable template instantiations. 3277 3278Given 3279 template <typename T> class X {}; class A {}; X<A> x; 3280or 3281 template <typename T> class X {}; class A {}; template class X<A>; 3282or 3283 template <typename T> class X {}; class A {}; extern template class X<A>; 3284cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3285 matches the template instantiation of X<A>. 3286 3287But given 3288 template <typename T> class X {}; class A {}; 3289 template <> class X<A> {}; X<A> x; 3290cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3291 does not match, as X<A> is an explicit template specialization. 3292 3293Usable 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>> 3294</pre></td></tr> 3295 3296 3297<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> 3298<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 3299 3300Example matches f, but not g or h. The function i will not match, even when 3301compiled in C mode. 3302 void f(...); 3303 void g(int); 3304 template <typename... Ts> void h(Ts...); 3305 void i(); 3306</pre></td></tr> 3307 3308 3309<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> 3310<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 3311specific parameter count. 3312 3313Given 3314 void f(int i) {} 3315 void g(int i, int j) {} 3316 void h(int i, int j); 3317 void j(int i); 3318 void k(int x, int y, int z, ...); 3319functionDecl(parameterCountIs(2)) 3320 matches g and h 3321functionProtoType(parameterCountIs(2)) 3322 matches g and h 3323functionProtoType(parameterCountIs(3)) 3324 matches k 3325</pre></td></tr> 3326 3327 3328<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> 3329<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 3330 3331Given: 3332 void f(); 3333 void g() noexcept; 3334 void h() noexcept(true); 3335 void i() noexcept(false); 3336 void j() throw(); 3337 void k() throw(int); 3338 void l() throw(...); 3339functionDecl(hasDynamicExceptionSpec()) and 3340 functionProtoType(hasDynamicExceptionSpec()) 3341 match the declarations of j, k, and l, but not f, g, h, or i. 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('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr> 3346<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 3347 3348Given: 3349 void f(); 3350 void g() noexcept; 3351 void h() throw(); 3352 void i() throw(int); 3353 void j() noexcept(false); 3354functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 3355 match the declarations of g, and h, but not f, i or j. 3356</pre></td></tr> 3357 3358 3359<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> 3360<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 3361specific parameter count. 3362 3363Given 3364 void f(int i) {} 3365 void g(int i, int j) {} 3366 void h(int i, int j); 3367 void j(int i); 3368 void k(int x, int y, int z, ...); 3369functionDecl(parameterCountIs(2)) 3370 matches g and h 3371functionProtoType(parameterCountIs(2)) 3372 matches g and h 3373functionProtoType(parameterCountIs(3)) 3374 matches k 3375</pre></td></tr> 3376 3377 3378<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> 3379<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations, 3380 and if constexpr. 3381 3382Given: 3383 constexpr int foo = 42; 3384 constexpr int bar(); 3385 void baz() { if constexpr(1 > 0) {} } 3386varDecl(isConstexpr()) 3387 matches the declaration of foo. 3388functionDecl(isConstexpr()) 3389 matches the declaration of bar. 3390ifStmt(isConstexpr()) 3391 matches the if statement in baz. 3392</pre></td></tr> 3393 3394 3395<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> 3396<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 3397 3398 3399<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> 3400<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 3401 3402Given 3403 f('false, 3.14, 42); 3404characterLiteral(equals(0)) 3405 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3406 match false 3407floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3408 match 3.14 3409integerLiteral(equals(42)) 3410 matches 42 3411 3412Note that you cannot directly match a negative numeric literal because the 3413minus sign is not part of the literal: It is a unary operator whose operand 3414is the positive numeric literal. Instead, you must use a unaryOperator() 3415matcher to match the minus sign: 3416 3417unaryOperator(hasOperatorName("-"), 3418 hasUnaryOperand(integerLiteral(equals(13)))) 3419 3420Usable 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>>, 3421 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>> 3422</pre></td></tr> 3423 3424 3425<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> 3426<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 3427 3428 3429<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> 3430<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 3431 3432 3433<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> 3434<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 3435to '.'. 3436 3437Member calls on the implicit this pointer match as called with '->'. 3438 3439Given 3440 class Y { 3441 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3442 template <class T> void f() { this->f<T>(); f<T>(); } 3443 int a; 3444 static int b; 3445 }; 3446 template <class T> 3447 class Z { 3448 void x() { this->m; } 3449 }; 3450memberExpr(isArrow()) 3451 matches this->x, x, y.x, a, this->b 3452cxxDependentScopeMemberExpr(isArrow()) 3453 matches this->m 3454unresolvedMemberExpr(isArrow()) 3455 matches this->f<T>, f<T> 3456</pre></td></tr> 3457 3458 3459<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> 3460<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 3461 3462Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 3463void f() { 3464 int x; 3465 static int y; 3466} 3467int z; 3468 3469Example matches f() because it has external formal linkage despite being 3470unique to the translation unit as though it has internal likage 3471(matcher = functionDecl(hasExternalFormalLinkage())) 3472 3473namespace { 3474void f() {} 3475} 3476</pre></td></tr> 3477 3478 3479<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> 3480<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 3481 3482Supports specifying enclosing namespaces or classes by prefixing the name 3483with '<enclosing>::'. 3484Does not match typedefs of an underlying type with the given name. 3485 3486Example matches X (Name == "X") 3487 class X; 3488 3489Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 3490 namespace a { namespace b { class X; } } 3491</pre></td></tr> 3492 3493 3494<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> 3495<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 3496a substring matched by the given RegExp. 3497 3498Supports specifying enclosing namespaces or classes by 3499prefixing the name with '<enclosing>::'. Does not match typedefs 3500of an underlying type with the given name. 3501 3502Example matches X (regexp == "::X") 3503 class X; 3504 3505Example matches X (regexp is one of "::X", "^foo::.*X", among others) 3506 namespace foo { namespace bar { class X; } } 3507</pre></td></tr> 3508 3509 3510<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> 3511<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 3512 3513Given 3514 namespace n { 3515 namespace {} // #1 3516 } 3517namespaceDecl(isAnonymous()) will match #1 but not ::n. 3518</pre></td></tr> 3519 3520 3521<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> 3522<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 3523the inline keyword. 3524 3525Given 3526 inline void f(); 3527 void g(); 3528 namespace n { 3529 inline namespace m {} 3530 } 3531functionDecl(isInline()) will match ::f(). 3532namespaceDecl(isInline()) will match n::m. 3533</pre></td></tr> 3534 3535 3536<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> 3537<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified. 3538 3539Given 3540 3541 #pragma omp parallel 3542 #pragma omp parallel default(none) 3543 #pragma omp parallel default(shared) 3544 3545``ompDefaultClause(isNoneKind())`` matches only ``default(none)``. 3546</pre></td></tr> 3547 3548 3549<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> 3550<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified. 3551 3552Given 3553 3554 #pragma omp parallel 3555 #pragma omp parallel default(none) 3556 #pragma omp parallel default(shared) 3557 3558``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``. 3559</pre></td></tr> 3560 3561 3562<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> 3563<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP 3564clause kind. 3565 3566Given 3567 3568 #pragma omp parallel 3569 #pragma omp parallel for 3570 #pragma omp for 3571 3572`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches 3573``omp parallel`` and ``omp parallel for``. 3574 3575If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter 3576should be passed as a quoted string. e.g., 3577``isAllowedToContainClauseKind("OMPC_default").`` 3578</pre></td></tr> 3579 3580 3581<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> 3582<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives, 3583i.e., directives that can't have a structured block. 3584 3585Given 3586 3587 #pragma omp parallel 3588 {} 3589 #pragma omp taskyield 3590 3591``ompExecutableDirective(isStandaloneDirective()))`` matches 3592``omp taskyield``. 3593</pre></td></tr> 3594 3595 3596<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> 3597<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3598a specific number of arguments (including absent default arguments). 3599 3600Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3601 void f(int x, int y); 3602 f(0, 0); 3603</pre></td></tr> 3604 3605 3606<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> 3607<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 3608 3609objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 3610message expression in 3611 3612 UIWebView *webView = ...; 3613 CGRect bodyFrame = webView.frame; 3614 bodyFrame.size.height = self.bodyContentHeight; 3615 webView.frame = bodyFrame; 3616 // ^---- matches here 3617</pre></td></tr> 3618 3619 3620<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> 3621<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 3622 3623Matches only when the selector of the objCMessageExpr is NULL. This may 3624represent an error condition in the tree! 3625</pre></td></tr> 3626 3627 3628<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> 3629<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 3630 3631 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 3632 matches the outer message expr in the code below, but NOT the message 3633 invocation for self.bodyView. 3634 [self.bodyView loadHTMLString:html baseURL:NULL]; 3635</pre></td></tr> 3636 3637 3638<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> 3639<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 3640 3641 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 3642 matches self.bodyView in the code below, but NOT the outer message 3643 invocation of "loadHTMLString:baseURL:". 3644 [self.bodyView loadHTMLString:html baseURL:NULL]; 3645</pre></td></tr> 3646 3647 3648<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> 3649<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class. 3650 3651Example 3652matcher = objcMessageExpr(isClassMessage()) 3653matches 3654 [NSString stringWithFormat:@"format"]; 3655but not 3656 NSString *x = @"hello"; 3657 [x containsString:@"h"]; 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('isInstanceMessage0')"><a name="isInstanceMessage0Anchor">isInstanceMessage</a></td><td></td></tr> 3662<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance. 3663 3664Example 3665matcher = objcMessageExpr(isInstanceMessage()) 3666matches 3667 NSString *x = @"hello"; 3668 [x containsString:@"h"]; 3669but not 3670 [NSString stringWithFormat:@"format"]; 3671</pre></td></tr> 3672 3673 3674<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> 3675<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 3676a substring matched by the given RegExp. 3677 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 3678 invocation for self.bodyView. 3679 [self.bodyView loadHTMLString:html baseURL:NULL]; 3680</pre></td></tr> 3681 3682 3683<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> 3684<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 3685 3686 matcher = objCMessageExpr(numSelectorArgs(0)); 3687 matches self.bodyView in the code below 3688 3689 matcher = objCMessageExpr(numSelectorArgs(2)); 3690 matches the invocation of "loadHTMLString:baseURL:" but not that 3691 of self.bodyView 3692 [self.bodyView loadHTMLString:html baseURL:NULL]; 3693</pre></td></tr> 3694 3695 3696<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> 3697<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method. 3698 3699Example 3700matcher = objcMethodDecl(isClassMethod()) 3701matches 3702@interface I + (void)foo; @end 3703but not 3704@interface I - (void)bar; @end 3705</pre></td></tr> 3706 3707 3708<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> 3709<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 3710 3711Example matches A, va, fa 3712 class A {}; 3713 class B; // Doesn't match, as it has no body. 3714 int va; 3715 extern int vb; // Doesn't match, as it doesn't define the variable. 3716 void fa() {} 3717 void fb(); // Doesn't match, as it has no body. 3718 @interface X 3719 - (void)ma; // Doesn't match, interface is declaration. 3720 @end 3721 @implementation X 3722 - (void)ma {} 3723 @end 3724 3725Usable 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>>, 3726 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 3727</pre></td></tr> 3728 3729 3730<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> 3731<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method. 3732 3733Example 3734matcher = objcMethodDecl(isInstanceMethod()) 3735matches 3736@interface I - (void)bar; @end 3737but not 3738@interface I + (void)foo; @end 3739</pre></td></tr> 3740 3741 3742<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> 3743<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 3744 3745Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 3746void x(int val) {} 3747void y(int val = 0) {} 3748</pre></td></tr> 3749 3750 3751<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> 3752<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 3753 3754Given 3755 class Y { public: void x(); }; 3756 void z() { Y* y; y->x(); } 3757cxxMemberCallExpr(on(hasType(asString("class Y *")))) 3758 matches y->x() 3759</pre></td></tr> 3760 3761 3762<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> 3763<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 3764 3765Matches a node if it equals the node previously bound to ID. 3766 3767Given 3768 class X { int a; int b; }; 3769cxxRecordDecl( 3770 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3771 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3772 matches the class X, as a and b have the same type. 3773 3774Note that when multiple matches are involved via forEach* matchers, 3775equalsBoundNodes acts as a filter. 3776For example: 3777compoundStmt( 3778 forEachDescendant(varDecl().bind("d")), 3779 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3780will trigger a match for each combination of variable declaration 3781and reference to that variable declaration within a compound statement. 3782</pre></td></tr> 3783 3784 3785<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> 3786<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 3787the node, not hidden within a typedef. 3788 3789Given 3790 typedef const int const_int; 3791 const_int i; 3792 int *const j; 3793 int *volatile k; 3794 int m; 3795varDecl(hasType(hasLocalQualifiers())) matches only j and k. 3796i is const-qualified but the qualifier is not local. 3797</pre></td></tr> 3798 3799 3800<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> 3801<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 3802 3803Given 3804 void a(char); 3805 void b(wchar_t); 3806 void c(double); 3807functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 3808matches "a(char)", "b(wchar_t)", but not "c(double)". 3809</pre></td></tr> 3810 3811 3812<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> 3813<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 3814the Objective-C object pointer type, which is different despite being 3815syntactically similar. 3816 3817Given 3818 int *i = nullptr; 3819 3820 @interface Foo 3821 @end 3822 Foo *f; 3823 3824 int j; 3825varDecl(hasType(isAnyPointer())) 3826 matches "int *i" and "Foo *f", but not "int j". 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('isConstQualified0')"><a name="isConstQualified0Anchor">isConstQualified</a></td><td></td></tr> 3831<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 3832include "top-level" const. 3833 3834Given 3835 void a(int); 3836 void b(int const); 3837 void c(const int); 3838 void d(const int*); 3839 void e(int const) {}; 3840functionDecl(hasAnyParameter(hasType(isConstQualified()))) 3841 matches "void b(int const)", "void c(const int)" and 3842 "void e(int const) {}". It does not match d as there 3843 is no top-level const on the parameter type "const int *". 3844</pre></td></tr> 3845 3846 3847<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> 3848<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 3849 3850Given 3851 void a(int); 3852 void b(long); 3853 void c(double); 3854functionDecl(hasAnyParameter(hasType(isInteger()))) 3855matches "a(int)", "b(long)", but not "c(double)". 3856</pre></td></tr> 3857 3858 3859<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> 3860<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 3861 3862Given 3863 void a(int); 3864 void b(unsigned long); 3865 void c(double); 3866functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 3867matches "a(int)", but not "b(unsigned long)" and "c(double)". 3868</pre></td></tr> 3869 3870 3871<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> 3872<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 3873 3874Given 3875 void a(int); 3876 void b(unsigned long); 3877 void c(double); 3878functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 3879matches "b(unsigned long)", but not "a(int)" and "c(double)". 3880</pre></td></tr> 3881 3882 3883<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> 3884<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 3885include "top-level" volatile. 3886 3887Given 3888 void a(int); 3889 void b(int volatile); 3890 void c(volatile int); 3891 void d(volatile int*); 3892 void e(int volatile) {}; 3893functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 3894 matches "void b(int volatile)", "void c(volatile int)" and 3895 "void e(int volatile) {}". It does not match d as there 3896 is no top-level volatile on the parameter type "volatile int *". 3897</pre></td></tr> 3898 3899 3900<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> 3901<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class." 3902 3903Example matches C, but not S or U. 3904 struct S {}; 3905 class C {}; 3906 union U {}; 3907</pre></td></tr> 3908 3909 3910<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> 3911<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct." 3912 3913Example matches S, but not C or U. 3914 struct S {}; 3915 class C {}; 3916 union U {}; 3917</pre></td></tr> 3918 3919 3920<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> 3921<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union." 3922 3923Example matches U, but not C or S. 3924 struct S {}; 3925 class C {}; 3926 union U {}; 3927</pre></td></tr> 3928 3929 3930<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> 3931<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 3932 3933Matches a node if it equals the node previously bound to ID. 3934 3935Given 3936 class X { int a; int b; }; 3937cxxRecordDecl( 3938 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3939 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3940 matches the class X, as a and b have the same type. 3941 3942Note that when multiple matches are involved via forEach* matchers, 3943equalsBoundNodes acts as a filter. 3944For example: 3945compoundStmt( 3946 forEachDescendant(varDecl().bind("d")), 3947 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3948will trigger a match for each combination of variable declaration 3949and reference to that variable declaration within a compound statement. 3950</pre></td></tr> 3951 3952 3953<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> 3954<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 3955 3956Stmt has pointer identity in the AST. 3957</pre></td></tr> 3958 3959 3960<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> 3961<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 3962partially matching a given regex. 3963 3964Example matches Y but not X 3965 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3966 #include "ASTMatcher.h" 3967 class X {}; 3968ASTMatcher.h: 3969 class Y {}; 3970 3971Usable 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>> 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('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr> 3976<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 3977 3978Example matches X but not Y 3979 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3980 #include <Y.h> 3981 class X {}; 3982Y.h: 3983 class Y {}; 3984 3985Usable 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>> 3986</pre></td></tr> 3987 3988 3989<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> 3990<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 3991 3992Example matches Y but not X 3993 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3994 #include <SystemHeader.h> 3995 class X {}; 3996SystemHeader.h: 3997 class Y {}; 3998 3999Usable 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>> 4000</pre></td></tr> 4001 4002 4003<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> 4004<tr><td colspan="4" class="doc" id="isOMPStructuredBlock0"><pre>Matches the Stmt AST node that is marked as being the structured-block 4005of an OpenMP executable directive. 4006 4007Given 4008 4009 #pragma omp parallel 4010 {} 4011 4012``stmt(isOMPStructuredBlock()))`` matches ``{}``. 4013</pre></td></tr> 4014 4015 4016<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> 4017<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 4018 4019Given 4020 int a[42]; 4021 int b[2 * 21]; 4022 int c[41], d[43]; 4023 char *s = "abcd"; 4024 wchar_t *ws = L"abcd"; 4025 char *w = "a"; 4026constantArrayType(hasSize(42)) 4027 matches "int a[42]" and "int b[2 * 21]" 4028stringLiteral(hasSize(4)) 4029 matches "abcd", L"abcd" 4030</pre></td></tr> 4031 4032 4033<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> 4034<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 4035 4036Example matches A, va, fa 4037 class A {}; 4038 class B; // Doesn't match, as it has no body. 4039 int va; 4040 extern int vb; // Doesn't match, as it doesn't define the variable. 4041 void fa() {} 4042 void fb(); // Doesn't match, as it has no body. 4043 @interface X 4044 - (void)ma; // Doesn't match, interface is declaration. 4045 @end 4046 @implementation X 4047 - (void)ma {} 4048 @end 4049 4050Usable 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>>, 4051 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4052</pre></td></tr> 4053 4054 4055<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> 4056<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 4057 4058Note that 'Value' is a string as the template argument's value is 4059an arbitrary precision integer. 'Value' must be euqal to the canonical 4060representation of that integral value in base 10. 4061 4062Given 4063 template<int T> struct C {}; 4064 C<42> c; 4065classTemplateSpecializationDecl( 4066 hasAnyTemplateArgument(equalsIntegralValue("42"))) 4067 matches the implicit instantiation of C in C<42>. 4068</pre></td></tr> 4069 4070 4071<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> 4072<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 4073 4074Given 4075 template<int T> struct C {}; 4076 C<42> c; 4077classTemplateSpecializationDecl( 4078 hasAnyTemplateArgument(isIntegral())) 4079 matches the implicit instantiation of C in C<42> 4080 with isIntegral() matching 42. 4081</pre></td></tr> 4082 4083 4084<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> 4085<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 4086 4087Given 4088 template<typename T> struct C {}; 4089 C<int> c; 4090classTemplateSpecializationDecl(templateArgumentCountIs(1)) 4091 matches C<int>. 4092</pre></td></tr> 4093 4094 4095<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> 4096<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 4097partially matching a given regex. 4098 4099Example matches Y but not X 4100 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 4101 #include "ASTMatcher.h" 4102 class X {}; 4103ASTMatcher.h: 4104 class Y {}; 4105 4106Usable 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>> 4107</pre></td></tr> 4108 4109 4110<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> 4111<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 4112 4113Example matches X but not Y 4114 (matcher = cxxRecordDecl(isExpansionInMainFile()) 4115 #include <Y.h> 4116 class X {}; 4117Y.h: 4118 class Y {}; 4119 4120Usable 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>> 4121</pre></td></tr> 4122 4123 4124<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> 4125<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 4126 4127Example matches Y but not X 4128 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 4129 #include <SystemHeader.h> 4130 class X {}; 4131SystemHeader.h: 4132 class Y {}; 4133 4134Usable 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>> 4135</pre></td></tr> 4136 4137 4138<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> 4139<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 4140 4141Given 4142 struct S { bool func(); }; 4143functionDecl(returns(booleanType())) 4144 matches "bool func();" 4145</pre></td></tr> 4146 4147 4148<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> 4149<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 4150 4151Matches a node if it equals the node previously bound to ID. 4152 4153Given 4154 class X { int a; int b; }; 4155cxxRecordDecl( 4156 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4157 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4158 matches the class X, as a and b have the same type. 4159 4160Note that when multiple matches are involved via forEach* matchers, 4161equalsBoundNodes acts as a filter. 4162For example: 4163compoundStmt( 4164 forEachDescendant(varDecl().bind("d")), 4165 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4166will trigger a match for each combination of variable declaration 4167and reference to that variable declaration within a compound statement. 4168</pre></td></tr> 4169 4170 4171<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> 4172<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 4173 4174Type has pointer identity in the AST. 4175</pre></td></tr> 4176 4177 4178<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> 4179<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 4180 4181Given 4182 int i; 4183 float f; 4184realFloatingPointType() 4185 matches "float f" but not "int i" 4186</pre></td></tr> 4187 4188 4189<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> 4190<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 4191 4192Given 4193 struct S { void func(); }; 4194functionDecl(returns(voidType())) 4195 matches "void func();" 4196</pre></td></tr> 4197 4198 4199<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> 4200<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 4201 4202Given 4203 int x; 4204 int s = sizeof(x) + alignof(x) 4205unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 4206 matches sizeof(x) 4207 4208If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter 4209should be passed as a quoted string. e.g., ofKind("UETT_SizeOf"). 4210</pre></td></tr> 4211 4212 4213<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> 4214<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 4215unary). 4216 4217Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 4218 !(a || b) 4219</pre></td></tr> 4220 4221 4222<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> 4223<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed 4224to '.'. 4225 4226Member calls on the implicit this pointer match as called with '->'. 4227 4228Given 4229 class Y { 4230 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 4231 template <class T> void f() { this->f<T>(); f<T>(); } 4232 int a; 4233 static int b; 4234 }; 4235 template <class T> 4236 class Z { 4237 void x() { this->m; } 4238 }; 4239memberExpr(isArrow()) 4240 matches this->x, x, y.x, a, this->b 4241cxxDependentScopeMemberExpr(isArrow()) 4242 matches this->m 4243unresolvedMemberExpr(isArrow()) 4244 matches this->f<T>, f<T> 4245</pre></td></tr> 4246 4247 4248<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> 4249<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 4250 4251Example matches x, but not y, z, or a. 4252(matcher = varDecl(hasAutomaticStorageDuration()) 4253void f() { 4254 int x; 4255 static int y; 4256 thread_local int z; 4257} 4258int a; 4259</pre></td></tr> 4260 4261 4262<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> 4263<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 4264 4265Example matches y and z (matcher = varDecl(hasGlobalStorage()) 4266void f() { 4267 int x; 4268 static int y; 4269} 4270int z; 4271</pre></td></tr> 4272 4273 4274<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> 4275<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 4276non-static local variable. 4277 4278Example matches x (matcher = varDecl(hasLocalStorage()) 4279void f() { 4280 int x; 4281 static int y; 4282} 4283int z; 4284</pre></td></tr> 4285 4286 4287<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> 4288<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 4289It includes the variable declared at namespace scope and those declared 4290with "static" and "extern" storage class specifiers. 4291 4292void f() { 4293 int x; 4294 static int y; 4295 thread_local int z; 4296} 4297int a; 4298static int b; 4299extern int c; 4300varDecl(hasStaticStorageDuration()) 4301 matches the function declaration y, a, b and c. 4302</pre></td></tr> 4303 4304 4305<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> 4306<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 4307 4308Example matches z, but not x, z, or a. 4309(matcher = varDecl(hasThreadStorageDuration()) 4310void f() { 4311 int x; 4312 static int y; 4313 thread_local int z; 4314} 4315int a; 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('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr> 4320<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations, 4321 and if constexpr. 4322 4323Given: 4324 constexpr int foo = 42; 4325 constexpr int bar(); 4326 void baz() { if constexpr(1 > 0) {} } 4327varDecl(isConstexpr()) 4328 matches the declaration of foo. 4329functionDecl(isConstexpr()) 4330 matches the declaration of bar. 4331ifStmt(isConstexpr()) 4332 matches the if statement in baz. 4333</pre></td></tr> 4334 4335 4336<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> 4337<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 4338 4339Example matches A, va, fa 4340 class A {}; 4341 class B; // Doesn't match, as it has no body. 4342 int va; 4343 extern int vb; // Doesn't match, as it doesn't define the variable. 4344 void fa() {} 4345 void fb(); // Doesn't match, as it has no body. 4346 @interface X 4347 - (void)ma; // Doesn't match, interface is declaration. 4348 @end 4349 @implementation X 4350 - (void)ma {} 4351 @end 4352 4353Usable 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>>, 4354 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4355</pre></td></tr> 4356 4357 4358<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> 4359<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 4360a C++ catch block, or an Objective-C statement. 4361 4362Example matches x (matcher = varDecl(isExceptionVariable()) 4363void f(int y) { 4364 try { 4365 } catch (int x) { 4366 } 4367} 4368</pre></td></tr> 4369 4370 4371<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> 4372<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 4373static member variable template instantiations. 4374 4375Given 4376 template<typename T> void A(T t) { } 4377 template<> void A(int N) { } 4378functionDecl(isExplicitTemplateSpecialization()) 4379 matches the specialization A<int>(). 4380 4381Usable 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>> 4382</pre></td></tr> 4383 4384 4385<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> 4386<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 4387 4388Given: 4389 extern "C" void f() {} 4390 extern "C" { void g() {} } 4391 void h() {} 4392 extern "C" int x = 1; 4393 extern "C" int y = 2; 4394 int z = 3; 4395functionDecl(isExternC()) 4396 matches the declaration of f and g, but not the declaration of h. 4397varDecl(isExternC()) 4398 matches the declaration of x and y, but not the declaration of z. 4399</pre></td></tr> 4400 4401 4402<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> 4403<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope. 4404 4405Example matches y (matcher = varDecl(isStaticLocal())) 4406void f() { 4407 int x; 4408 static int y; 4409} 4410static int z; 4411</pre></td></tr> 4412 4413 4414<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> 4415<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage 4416class specifier ("static" keyword) written in the source. 4417 4418Given: 4419 static void f() {} 4420 static int i = 0; 4421 extern int j; 4422 int k; 4423functionDecl(isStaticStorageClass()) 4424 matches the function declaration f. 4425varDecl(isStaticStorageClass()) 4426 matches the variable declaration i. 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('isTemplateInstantiation1')"><a name="isTemplateInstantiation1Anchor">isTemplateInstantiation</a></td><td></td></tr> 4431<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 4432member variable template instantiations. 4433 4434Given 4435 template <typename T> class X {}; class A {}; X<A> x; 4436or 4437 template <typename T> class X {}; class A {}; template class X<A>; 4438or 4439 template <typename T> class X {}; class A {}; extern template class X<A>; 4440cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4441 matches the template instantiation of X<A>. 4442 4443But given 4444 template <typename T> class X {}; class A {}; 4445 template <> class X<A> {}; X<A> x; 4446cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4447 does not match, as X<A> is an explicit template specialization. 4448 4449Usable 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>> 4450</pre></td></tr> 4451 4452 4453<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> 4454<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 4455template instantiations. 4456 4457Given 4458 template<typename T> void A(T t) { T i; } 4459 A(0); 4460 A(0U); 4461functionDecl(isInstantiated()) 4462 matches 'A(int) {...};' and 'A(unsigned) {...}'. 4463</pre></td></tr> 4464 4465 4466<tr><td>Matcher<internal::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> 4467<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 4468GNU's __null, C++11's nullptr, or C's NULL macro. 4469 4470Given: 4471 void *v1 = NULL; 4472 void *v2 = nullptr; 4473 void *v3 = __null; // GNU extension 4474 char *cp = (char *)0; 4475 int *ip = 0; 4476 int i = 0; 4477expr(nullPointerConstant()) 4478 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 4479 initializer for i. 4480</pre></td></tr> 4481 4482 4483<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> 4484<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 4485 4486This matcher is only provided as a performance optimization of hasName. 4487 hasAnyName(a, b, c) 4488 is equivalent to, but faster than 4489 anyOf(hasName(a), hasName(b), hasName(c)) 4490</pre></td></tr> 4491 4492 4493<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> 4494<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 4495Selector.getAsString() 4496 4497 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 4498 matches both of the expressions below: 4499 [myObj methodA:argA]; 4500 [myObj methodB:argB]; 4501</pre></td></tr> 4502 4503 4504<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> 4505<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 4506 4507Given 4508 int j; 4509 template<typename T> void A(T t) { T i; j += 42;} 4510 A(0); 4511 A(0U); 4512declStmt(isInTemplateInstantiation()) 4513 matches 'int i;' and 'unsigned i'. 4514unless(stmt(isInTemplateInstantiation())) 4515 will NOT match j += 42; as it's shared between the template definition and 4516 instantiation. 4517</pre></td></tr> 4518 4519<!--END_NARROWING_MATCHERS --> 4520</table> 4521 4522<!-- ======================================================================= --> 4523<h2 id="traversal-matchers">AST Traversal Matchers</h2> 4524<!-- ======================================================================= --> 4525 4526<p>Traversal matchers specify the relationship to other nodes that are 4527reachable from the current node.</p> 4528 4529<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 4530forEachDescendant) which work on all nodes and allow users to write more generic 4531match expressions.</p> 4532 4533<table> 4534<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 4535<!-- START_TRAVERSAL_MATCHERS --> 4536 4537<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 4538<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 4539 4540Unlike anyOf, eachOf will generate a match result for each 4541matching submatcher. 4542 4543For example, in: 4544 class A { int a; int b; }; 4545The matcher: 4546 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 4547 has(fieldDecl(hasName("b")).bind("v")))) 4548will generate two results binding "v", the first of which binds 4549the field declaration of a, the second the field declaration of 4550b. 4551 4552Usable as: Any Matcher 4553</pre></td></tr> 4554 4555 4556<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 4557<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 4558provided matcher. 4559 4560Example matches X, A, A::X, B, B::C, B::C::X 4561 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 4562 class X {}; 4563 class A { class X {}; }; // Matches A, because A::X is a class of name 4564 // X inside A. 4565 class B { class C { class X {}; }; }; 4566 4567DescendantT must be an AST base type. 4568 4569As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 4570each result that matches instead of only on the first one. 4571 4572Note: Recursively combined ForEachDescendant can cause many matches: 4573 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 4574 forEachDescendant(cxxRecordDecl()) 4575 ))) 4576will match 10 times (plus injected class name matches) on: 4577 class A { class B { class C { class D { class E {}; }; }; }; }; 4578 4579Usable as: Any Matcher 4580</pre></td></tr> 4581 4582 4583<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 4584<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 4585provided matcher. 4586 4587Example matches X, Y, Y::X, Z::Y, Z::Y::X 4588 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 4589 class X {}; 4590 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X 4591 // inside Y. 4592 class Z { class Y { class X {}; }; }; // Does not match Z. 4593 4594ChildT must be an AST base type. 4595 4596As opposed to 'has', 'forEach' will cause a match for each result that 4597matches instead of only on the first one. 4598 4599Usable as: Any Matcher 4600</pre></td></tr> 4601 4602 4603<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 4604<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 4605matcher. 4606 4607Given 4608void f() { if (true) { int x = 42; } } 4609void g() { for (;;) { int x = 43; } } 4610expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 4611 4612Usable as: Any Matcher 4613</pre></td></tr> 4614 4615 4616<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 4617<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 4618provided matcher. 4619 4620Example matches X, Y, Z 4621 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 4622 class X {}; // Matches X, because X::X is a class of name X inside X. 4623 class Y { class X {}; }; 4624 class Z { class Y { class X {}; }; }; 4625 4626DescendantT must be an AST base type. 4627 4628Usable as: Any Matcher 4629</pre></td></tr> 4630 4631 4632<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 4633<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 4634provided matcher. 4635 4636Example matches X, Y 4637 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 4638 class X {}; // Matches X, because X::X is a class of name X inside X. 4639 class Y { class X {}; }; 4640 class Z { class Y { class X {}; }; }; // Does not match Z. 4641 4642ChildT must be an AST base type. 4643 4644Usable as: Any Matcher 4645Note that has is direct matcher, so it also matches things like implicit 4646casts and paren casts. If you are matching with expr then you should 4647probably consider using ignoringParenImpCasts like: 4648has(ignoringParenImpCasts(expr())). 4649</pre></td></tr> 4650 4651 4652<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 4653<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 4654matcher. 4655 4656Given 4657void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 4658compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 4659 4660Usable as: Any Matcher 4661</pre></td></tr> 4662 4663 4664<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> 4665<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 4666switch statement or conditional operator. 4667 4668Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4669 if (true) {} 4670</pre></td></tr> 4671 4672 4673<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> 4674<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 4675(binary or ternary). 4676 4677Example matches b 4678 condition ? a : b 4679 condition ?: b 4680</pre></td></tr> 4681 4682 4683<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> 4684<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 4685 4686Example 1 (conditional ternary operator): matches a 4687 condition ? a : b 4688 4689Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 4690 condition ?: b 4691</pre></td></tr> 4692 4693 4694<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> 4695<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 4696matches the given matcher. 4697 4698The associated declaration is: 4699- for type nodes, the declaration of the underlying type 4700- for CallExpr, the declaration of the callee 4701- for MemberExpr, the declaration of the referenced member 4702- for CXXConstructExpr, the declaration of the constructor 4703- for CXXNewExpr, the declaration of the operator new 4704- for ObjCIvarExpr, the declaration of the ivar 4705 4706For type nodes, hasDeclaration will generally match the declaration of the 4707sugared type. Given 4708 class X {}; 4709 typedef X Y; 4710 Y y; 4711in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 4712typedefDecl. A common use case is to match the underlying, desugared type. 4713This can be achieved by using the hasUnqualifiedDesugaredType matcher: 4714 varDecl(hasType(hasUnqualifiedDesugaredType( 4715 recordType(hasDeclaration(decl()))))) 4716In this matcher, the decl will match the CXXRecordDecl of class X. 4717 4718Usable 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>>, 4719 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>>, 4720 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>>, 4721 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>>, 4722 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>>, 4723 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>>, 4724 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4725</pre></td></tr> 4726 4727 4728<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> 4729<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 4730 4731Given 4732 int i[5]; 4733 void f() { i[1] = 42; } 4734arraySubscriptExpression(hasBase(implicitCastExpr( 4735 hasSourceExpression(declRefExpr())))) 4736 matches i[1] with the declRefExpr() matching i 4737</pre></td></tr> 4738 4739 4740<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> 4741<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 4742 4743Given 4744 int i[5]; 4745 void f() { i[1] = 42; } 4746arraySubscriptExpression(hasIndex(integerLiteral())) 4747 matches i[1] with the integerLiteral() matching 1 4748</pre></td></tr> 4749 4750 4751<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> 4752<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 4753 4754Example matches a (matcher = binaryOperator(hasLHS())) 4755 a || b 4756</pre></td></tr> 4757 4758 4759<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> 4760<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 4761 4762Example matches b (matcher = binaryOperator(hasRHS())) 4763 a || b 4764</pre></td></tr> 4765 4766 4767<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> 4768<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 4769type. 4770 4771Given 4772 struct A {}; 4773 A a[7]; 4774 int b[7]; 4775arrayType(hasElementType(builtinType())) 4776 matches "int b[7]" 4777 4778Usable 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>> 4779</pre></td></tr> 4780 4781 4782<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> 4783<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 4784 4785Given 4786 _Atomic(int) i; 4787 _Atomic(float) f; 4788atomicType(hasValueType(isInteger())) 4789 matches "_Atomic(int) i" 4790 4791Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 4792</pre></td></tr> 4793 4794 4795<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> 4796<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 4797 4798Note: There is no TypeLoc for the deduced type and thus no 4799getDeducedLoc() matcher. 4800 4801Given 4802 auto a = 1; 4803 auto b = 2.0; 4804autoType(hasDeducedType(isInteger())) 4805 matches "auto a" 4806 4807Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 4808</pre></td></tr> 4809 4810 4811<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> 4812<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 4813binary operator matches. 4814</pre></td></tr> 4815 4816 4817<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> 4818<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 4819 4820Example matches a (matcher = binaryOperator(hasLHS())) 4821 a || b 4822</pre></td></tr> 4823 4824 4825<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> 4826<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 4827 4828Example matches b (matcher = binaryOperator(hasRHS())) 4829 a || b 4830</pre></td></tr> 4831 4832 4833<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> 4834<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 4835block. 4836 4837Does not match the 'this' parameter of a method. 4838 4839Given 4840 class X { void f(int x, int y, int z) {} }; 4841cxxMethodDecl(hasAnyParameter(hasName("y"))) 4842 matches f(int x, int y, int z) {} 4843with hasAnyParameter(...) 4844 matching int y 4845 4846For ObjectiveC, given 4847 @interface I - (void) f:(int) y; @end 4848 4849the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 4850matches the declaration of method f with hasParameter 4851matching y. 4852 4853For blocks, given 4854 b = ^(int y) { printf("%d", y) }; 4855 4856the matcher blockDecl(hasAnyParameter(hasName("y"))) 4857matches the declaration of the block b with hasParameter 4858matching y. 4859</pre></td></tr> 4860 4861 4862<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> 4863<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 4864declaration or a block. 4865 4866Given 4867 class X { void f(int x) {} }; 4868cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 4869 matches f(int x) {} 4870with hasParameter(...) 4871 matching int x 4872 4873For ObjectiveC, given 4874 @interface I - (void) f:(int) y; @end 4875 4876the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 4877matches the declaration of method f with hasParameter 4878matching y. 4879</pre></td></tr> 4880 4881 4882<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> 4883<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 4884pointee matches a given matcher. 4885 4886Given 4887 int *a; 4888 int const *b; 4889 float const *f; 4890pointerType(pointee(isConstQualified(), isInteger())) 4891 matches "int const *b" 4892 4893Usable 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>>, 4894 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>> 4895</pre></td></tr> 4896 4897 4898<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> 4899<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 4900 4901Given 4902 void f(int i); 4903 int y; 4904 f(y); 4905callExpr( 4906 forEachArgumentWithParam( 4907 declRefExpr(to(varDecl(hasName("y")))), 4908 parmVarDecl(hasType(isInteger())) 4909)) 4910 matches f(y); 4911with declRefExpr(...) 4912 matching int y 4913and parmVarDecl(...) 4914 matching int i 4915</pre></td></tr> 4916 4917 4918<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> 4919<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 4920expression, or an ObjC-message-send expression. 4921 4922Given 4923 void x(int, int, int) { int y; x(1, y, 42); } 4924callExpr(hasAnyArgument(declRefExpr())) 4925 matches x(1, y, 42) 4926with hasAnyArgument(...) 4927 matching y 4928 4929For ObjectiveC, given 4930 @interface I - (void) f:(int) y; @end 4931 void foo(I *i) { [i f:12]; } 4932objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 4933 matches [i f:12] 4934</pre></td></tr> 4935 4936 4937<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> 4938<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 4939call expression. 4940 4941Example matches y in x(y) 4942 (matcher = callExpr(hasArgument(0, declRefExpr()))) 4943 void x(int) { int y; x(y); } 4944</pre></td></tr> 4945 4946 4947<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> 4948<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 4949matches the given matcher. 4950 4951The associated declaration is: 4952- for type nodes, the declaration of the underlying type 4953- for CallExpr, the declaration of the callee 4954- for MemberExpr, the declaration of the referenced member 4955- for CXXConstructExpr, the declaration of the constructor 4956- for CXXNewExpr, the declaration of the operator new 4957- for ObjCIvarExpr, the declaration of the ivar 4958 4959For type nodes, hasDeclaration will generally match the declaration of the 4960sugared type. Given 4961 class X {}; 4962 typedef X Y; 4963 Y y; 4964in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 4965typedefDecl. A common use case is to match the underlying, desugared type. 4966This can be achieved by using the hasUnqualifiedDesugaredType matcher: 4967 varDecl(hasType(hasUnqualifiedDesugaredType( 4968 recordType(hasDeclaration(decl()))))) 4969In this matcher, the decl will match the CXXRecordDecl of class X. 4970 4971Usable 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>>, 4972 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>>, 4973 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>>, 4974 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>>, 4975 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>>, 4976 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>>, 4977 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4978</pre></td></tr> 4979 4980 4981<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> 4982<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 4983 4984Given 4985 class A { A() : i(42), j(42) {} int i; int j; }; 4986cxxConstructorDecl(forEachConstructorInitializer( 4987 forField(decl().bind("x")) 4988)) 4989 will trigger two matches, binding for 'i' and 'j' respectively. 4990</pre></td></tr> 4991 4992 4993<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> 4994<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 4995 4996Given 4997 struct Foo { 4998 Foo() : foo_(1) { } 4999 int foo_; 5000 }; 5001cxxRecordDecl(has(cxxConstructorDecl( 5002 hasAnyConstructorInitializer(anything()) 5003))) 5004 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 5005</pre></td></tr> 5006 5007 5008<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> 5009<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 5010 5011Given 5012 struct Foo { 5013 Foo() : foo_(1) { } 5014 int foo_; 5015 }; 5016cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 5017 forField(hasName("foo_")))))) 5018 matches Foo 5019with forField matching foo_ 5020</pre></td></tr> 5021 5022 5023<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> 5024<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 5025 5026Given 5027 struct Foo { 5028 Foo() : foo_(1) { } 5029 int foo_; 5030 }; 5031cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 5032 withInitializer(integerLiteral(equals(1))))))) 5033 matches Foo 5034with withInitializer matching (1) 5035</pre></td></tr> 5036 5037 5038<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> 5039<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 5040given matcher. Implicit object expressions are included; that is, it matches 5041use of implicit `this`. 5042 5043Given 5044 struct X { 5045 int m; 5046 int f(X x) { x.m; return m; } 5047 }; 5048memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 5049 matches `x.m`, but not `m`; however, 5050memberExpr(hasObjectExpression(hasType(pointsTo( 5051 cxxRecordDecl(hasName("X")))))) 5052 matches `m` (aka. `this->m`), but not `x.m`. 5053</pre></td></tr> 5054 5055 5056<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> 5057<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function 5058definition that has a given body. 5059 5060Given 5061 for (;;) {} 5062hasBody(compoundStmt()) 5063 matches 'for (;;) {}' 5064with compoundStmt() 5065 matching '{}' 5066</pre></td></tr> 5067 5068 5069<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> 5070<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 5071 5072Example: 5073 forStmt(hasLoopVariable(anything())) 5074matches 'int x' in 5075 for (int x : a) { } 5076</pre></td></tr> 5077 5078 5079<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> 5080<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 5081 5082Example: 5083 forStmt(hasRangeInit(anything())) 5084matches 'a' in 5085 for (int x : a) { } 5086</pre></td></tr> 5087 5088 5089<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> 5090<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 5091`on`, matches the argument directly without stripping away anything. 5092 5093Given 5094 class Y { public: void m(); }; 5095 Y g(); 5096 class X : public Y { void g(); }; 5097 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 5098cxxMemberCallExpr(onImplicitObjectArgument(hasType( 5099 cxxRecordDecl(hasName("Y"))))) 5100 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 5101cxxMemberCallExpr(on(callExpr())) 5102 does not match `(g()).m()`, because the parens are not ignored. 5103 5104FIXME: Overload to allow directly matching types? 5105</pre></td></tr> 5106 5107 5108<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> 5109<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 5110stripping off any parentheses or implicit casts. 5111 5112Given 5113 class Y { public: void m(); }; 5114 Y g(); 5115 class X : public Y {}; 5116 void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 5117cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 5118 matches `y.m()` and `(g()).m()`. 5119cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 5120 matches `x.m()`. 5121cxxMemberCallExpr(on(callExpr())) 5122 matches `(g()).m()`. 5123 5124FIXME: Overload to allow directly matching types? 5125</pre></td></tr> 5126 5127 5128<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> 5129<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 5130</pre></td></tr> 5131 5132 5133<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> 5134<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 5135matches the InnerMatcher, or is a pointer to a type that matches the 5136InnerMatcher. 5137 5138Given 5139 class Y { public: void m(); }; 5140 class X : public Y { void g(); }; 5141 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 5142cxxMemberCallExpr(thisPointerType(hasDeclaration( 5143 cxxRecordDecl(hasName("Y"))))) 5144 matches `y.m()`, `p->m()` and `x.m()`. 5145cxxMemberCallExpr(thisPointerType(hasDeclaration( 5146 cxxRecordDecl(hasName("X"))))) 5147 matches `x.g()`. 5148</pre></td></tr> 5149 5150 5151<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> 5152<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 5153produce multiple matches. 5154 5155Given 5156 class A { virtual void f(); }; 5157 class B : public A { void f(); }; 5158 class C : public B { void f(); }; 5159cxxMethodDecl(ofClass(hasName("C")), 5160 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 5161 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 5162 that B::f is not overridden by C::f). 5163 5164The check can produce multiple matches in case of multiple inheritance, e.g. 5165 class A1 { virtual void f(); }; 5166 class A2 { virtual void f(); }; 5167 class C : public A1, public A2 { void f(); }; 5168cxxMethodDecl(ofClass(hasName("C")), 5169 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 5170 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 5171 once with "b" binding "A2::f" and "d" binding "C::f". 5172</pre></td></tr> 5173 5174 5175<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> 5176<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 5177belongs to. 5178 5179FIXME: Generalize this for other kinds of declarations. 5180FIXME: What other kind of declarations would we need to generalize 5181this to? 5182 5183Example matches A() in the last line 5184 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 5185 ofClass(hasName("A")))))) 5186 class A { 5187 public: 5188 A(); 5189 }; 5190 A a = A(); 5191</pre></td></tr> 5192 5193 5194<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> 5195<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 5196 5197Given: 5198 MyClass *p1 = new MyClass[10]; 5199cxxNewExpr(hasArraySize(intgerLiteral(equals(10)))) 5200 matches the expression 'new MyClass[10]'. 5201</pre></td></tr> 5202 5203 5204<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> 5205<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 5206matches the given matcher. 5207 5208The associated declaration is: 5209- for type nodes, the declaration of the underlying type 5210- for CallExpr, the declaration of the callee 5211- for MemberExpr, the declaration of the referenced member 5212- for CXXConstructExpr, the declaration of the constructor 5213- for CXXNewExpr, the declaration of the operator new 5214- for ObjCIvarExpr, the declaration of the ivar 5215 5216For type nodes, hasDeclaration will generally match the declaration of the 5217sugared type. Given 5218 class X {}; 5219 typedef X Y; 5220 Y y; 5221in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5222typedefDecl. A common use case is to match the underlying, desugared type. 5223This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5224 varDecl(hasType(hasUnqualifiedDesugaredType( 5225 recordType(hasDeclaration(decl()))))) 5226In this matcher, the decl will match the CXXRecordDecl of class X. 5227 5228Usable 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>>, 5229 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>>, 5230 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>>, 5231 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>>, 5232 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>>, 5233 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>>, 5234 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5235</pre></td></tr> 5236 5237 5238<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> 5239<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 5240 5241Given: 5242 class A { void func(); }; 5243 class B { void member(); }; 5244 5245cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 5246A but not B. 5247</pre></td></tr> 5248 5249 5250<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> 5251<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from 5252a class matching Base. 5253 5254Note that a class is not considered to be derived from itself. 5255 5256Example matches Y, Z, C (Base == hasName("X")) 5257 class X; 5258 class Y : public X {}; // directly derived 5259 class Z : public Y {}; // indirectly derived 5260 typedef X A; 5261 typedef A B; 5262 class C : public B {}; // derived from a typedef of X 5263 5264In the following example, Bar matches isDerivedFrom(hasName("X")): 5265 class Foo; 5266 typedef Foo X; 5267 class Bar : public Foo {}; // derived from a type that X is a typedef of 5268</pre></td></tr> 5269 5270 5271<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> 5272<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ classes that are directly derived from a class matching Base. 5273 5274Note that a class is not considered to be derived from itself. 5275 5276Example matches Y, C (Base == hasName("X")) 5277 class X; 5278 class Y : public X {}; // directly derived 5279 class Z : public Y {}; // indirectly derived 5280 typedef X A; 5281 typedef A B; 5282 class C : public B {}; // derived from a typedef of X 5283 5284In the following example, Bar matches isDerivedFrom(hasName("X")): 5285 class Foo; 5286 typedef Foo X; 5287 class Bar : public Foo {}; // derived from a type that X is a typedef of 5288</pre></td></tr> 5289 5290 5291<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> 5292<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 5293match Base. 5294</pre></td></tr> 5295 5296 5297<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> 5298<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 5299expression, or an ObjC-message-send expression. 5300 5301Given 5302 void x(int, int, int) { int y; x(1, y, 42); } 5303callExpr(hasAnyArgument(declRefExpr())) 5304 matches x(1, y, 42) 5305with hasAnyArgument(...) 5306 matching y 5307 5308For ObjectiveC, given 5309 @interface I - (void) f:(int) y; @end 5310 void foo(I *i) { [i f:12]; } 5311objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5312 matches [i f:12] 5313</pre></td></tr> 5314 5315 5316<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> 5317<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 5318given matcher. 5319 5320Example matches y.x() (matcher = callExpr(callee( 5321 cxxMethodDecl(hasName("x"))))) 5322 class Y { public: void x(); }; 5323 void z() { Y y; y.x(); } 5324</pre></td></tr> 5325 5326 5327<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> 5328<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 5329 5330Given 5331 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 5332 void f() { f(); } 5333callExpr(callee(expr())) 5334 matches this->x(), x(), y.x(), f() 5335with callee(...) 5336 matching this->x, x, y.x, f respectively 5337 5338Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 5339because this introduces ambiguous overloads with calls to Callee taking a 5340internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 5341implemented in terms of implicit casts. 5342</pre></td></tr> 5343 5344 5345<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> 5346<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 5347 5348Given 5349 void f(int i); 5350 int y; 5351 f(y); 5352callExpr( 5353 forEachArgumentWithParam( 5354 declRefExpr(to(varDecl(hasName("y")))), 5355 parmVarDecl(hasType(isInteger())) 5356)) 5357 matches f(y); 5358with declRefExpr(...) 5359 matching int y 5360and parmVarDecl(...) 5361 matching int i 5362</pre></td></tr> 5363 5364 5365<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> 5366<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 5367expression, or an ObjC-message-send expression. 5368 5369Given 5370 void x(int, int, int) { int y; x(1, y, 42); } 5371callExpr(hasAnyArgument(declRefExpr())) 5372 matches x(1, y, 42) 5373with hasAnyArgument(...) 5374 matching y 5375 5376For ObjectiveC, given 5377 @interface I - (void) f:(int) y; @end 5378 void foo(I *i) { [i f:12]; } 5379objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5380 matches [i f:12] 5381</pre></td></tr> 5382 5383 5384<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> 5385<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 5386call expression. 5387 5388Example matches y in x(y) 5389 (matcher = callExpr(hasArgument(0, declRefExpr()))) 5390 void x(int) { int y; x(y); } 5391</pre></td></tr> 5392 5393 5394<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> 5395<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 5396matches the given matcher. 5397 5398The associated declaration is: 5399- for type nodes, the declaration of the underlying type 5400- for CallExpr, the declaration of the callee 5401- for MemberExpr, the declaration of the referenced member 5402- for CXXConstructExpr, the declaration of the constructor 5403- for CXXNewExpr, the declaration of the operator new 5404- for ObjCIvarExpr, the declaration of the ivar 5405 5406For type nodes, hasDeclaration will generally match the declaration of the 5407sugared type. Given 5408 class X {}; 5409 typedef X Y; 5410 Y y; 5411in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5412typedefDecl. A common use case is to match the underlying, desugared type. 5413This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5414 varDecl(hasType(hasUnqualifiedDesugaredType( 5415 recordType(hasDeclaration(decl()))))) 5416In this matcher, the decl will match the CXXRecordDecl of class X. 5417 5418Usable 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>>, 5419 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>>, 5420 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>>, 5421 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>>, 5422 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>>, 5423 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>>, 5424 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5425</pre></td></tr> 5426 5427 5428<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> 5429<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 5430extension, matches the constant given in the statement. 5431 5432Given 5433 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 5434caseStmt(hasCaseConstant(integerLiteral())) 5435 matches "case 1:" 5436</pre></td></tr> 5437 5438 5439<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> 5440<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 5441or opaque value's source expression matches the given matcher. 5442 5443Example 1: matches "a string" 5444(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 5445class URL { URL(string); }; 5446URL url = "a string"; 5447 5448Example 2: matches 'b' (matcher = 5449opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 5450int a = b ?: 1; 5451</pre></td></tr> 5452 5453 5454<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> 5455<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 5456functionDecl that have at least one TemplateArgument matching the given 5457InnerMatcher. 5458 5459Given 5460 template<typename T> class A {}; 5461 template<> class A<double> {}; 5462 A<int> a; 5463 5464 template<typename T> f() {}; 5465 void func() { f<int>(); }; 5466 5467classTemplateSpecializationDecl(hasAnyTemplateArgument( 5468 refersToType(asString("int")))) 5469 matches the specialization A<int> 5470 5471functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 5472 matches the specialization f<int> 5473</pre></td></tr> 5474 5475 5476<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> 5477<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 5478 5479Given 5480 template<typename T> class A {}; #1 5481 template<> class A<int> {}; #2 5482classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 5483 matches '#2' with classTemplateDecl() matching the class template 5484 declaration of 'A' at #1. 5485</pre></td></tr> 5486 5487 5488<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> 5489<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 5490functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 5491 5492Given 5493 template<typename T, typename U> class A {}; 5494 A<bool, int> b; 5495 A<int, bool> c; 5496 5497 template<typename T> void f() {} 5498 void func() { f<int>(); }; 5499classTemplateSpecializationDecl(hasTemplateArgument( 5500 1, refersToType(asString("int")))) 5501 matches the specialization A<bool, int> 5502 5503functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 5504 matches the specialization f<int> 5505</pre></td></tr> 5506 5507 5508<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> 5509<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 5510type. 5511 5512Given 5513 struct A {}; 5514 A a[7]; 5515 int b[7]; 5516arrayType(hasElementType(builtinType())) 5517 matches "int b[7]" 5518 5519Usable 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>> 5520</pre></td></tr> 5521 5522 5523<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> 5524<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 5525a given matcher. Also matches StmtExprs that have CompoundStmt as children. 5526 5527Given 5528 { {}; 1+2; } 5529hasAnySubstatement(compoundStmt()) 5530 matches '{ {}; 1+2; }' 5531with compoundStmt() 5532 matching '{}' 5533</pre></td></tr> 5534 5535 5536<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> 5537<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher 5538</pre></td></tr> 5539 5540 5541<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> 5542<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 5543matches the given matcher. 5544 5545The associated declaration is: 5546- for type nodes, the declaration of the underlying type 5547- for CallExpr, the declaration of the callee 5548- for MemberExpr, the declaration of the referenced member 5549- for CXXConstructExpr, the declaration of the constructor 5550- for CXXNewExpr, the declaration of the operator new 5551- for ObjCIvarExpr, the declaration of the ivar 5552 5553For type nodes, hasDeclaration will generally match the declaration of the 5554sugared type. Given 5555 class X {}; 5556 typedef X Y; 5557 Y y; 5558in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5559typedefDecl. A common use case is to match the underlying, desugared type. 5560This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5561 varDecl(hasType(hasUnqualifiedDesugaredType( 5562 recordType(hasDeclaration(decl()))))) 5563In this matcher, the decl will match the CXXRecordDecl of class X. 5564 5565Usable 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>>, 5566 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>>, 5567 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>>, 5568 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>>, 5569 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>>, 5570 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>>, 5571 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5572</pre></td></tr> 5573 5574 5575<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> 5576<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 5577specific using shadow declaration. 5578 5579Given 5580 namespace a { void f() {} } 5581 using a::f; 5582 void g() { 5583 f(); // Matches this .. 5584 a::f(); // .. but not this. 5585 } 5586declRefExpr(throughUsingDecl(anything())) 5587 matches f() 5588</pre></td></tr> 5589 5590 5591<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> 5592<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 5593specified matcher. 5594 5595Example matches x in if(x) 5596 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 5597 bool x; 5598 if (x) {} 5599</pre></td></tr> 5600 5601 5602<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> 5603<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 5604 5605Note that this does not work for global declarations because the AST 5606breaks up multiple-declaration DeclStmt's into multiple single-declaration 5607DeclStmt's. 5608Example: Given non-global declarations 5609 int a, b = 0; 5610 int c; 5611 int d = 2, e; 5612declStmt(containsDeclaration( 5613 0, varDecl(hasInitializer(anything())))) 5614 matches only 'int d = 2, e;', and 5615declStmt(containsDeclaration(1, varDecl())) 5616 matches 'int a, b = 0' as well as 'int d = 2, e;' 5617 but 'int c;' is not matched. 5618</pre></td></tr> 5619 5620 5621<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> 5622<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 5623 5624Given 5625 int a, b; 5626 int c; 5627declStmt(hasSingleDecl(anything())) 5628 matches 'int c;' but not 'int a, b;'. 5629</pre></td></tr> 5630 5631 5632<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> 5633<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 5634the inner matcher. 5635 5636Given 5637 int x; 5638declaratorDecl(hasTypeLoc(loc(asString("int")))) 5639 matches int x 5640</pre></td></tr> 5641 5642 5643<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> 5644<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 5645Decl, matches InnerMatcher. 5646 5647Given 5648 namespace N { 5649 namespace M { 5650 class D {}; 5651 } 5652 } 5653 5654cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 5655declaration of class D. 5656</pre></td></tr> 5657 5658 5659<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> 5660<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type. 5661 5662Given 5663 decltype(1) a = 1; 5664 decltype(2.0) b = 2.0; 5665decltypeType(hasUnderlyingType(isInteger())) 5666 matches the type of "a" 5667 5668Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>> 5669</pre></td></tr> 5670 5671 5672<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> 5673<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function 5674definition that has a given body. 5675 5676Given 5677 for (;;) {} 5678hasBody(compoundStmt()) 5679 matches 'for (;;) {}' 5680with compoundStmt() 5681 matching '{}' 5682</pre></td></tr> 5683 5684 5685<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> 5686<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 5687switch statement or conditional operator. 5688 5689Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5690 if (true) {} 5691</pre></td></tr> 5692 5693 5694<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> 5695<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 5696matches InnerMatcher if the qualifier exists. 5697 5698Given 5699 namespace N { 5700 namespace M { 5701 class D {}; 5702 } 5703 } 5704 N::M::D d; 5705 5706elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 5707matches the type of the variable declaration of d. 5708</pre></td></tr> 5709 5710 5711<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> 5712<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 5713 5714Given 5715 namespace N { 5716 namespace M { 5717 class D {}; 5718 } 5719 } 5720 N::M::D d; 5721 5722elaboratedType(namesType(recordType( 5723hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 5724declaration of d. 5725</pre></td></tr> 5726 5727 5728<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> 5729<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 5730matches the given matcher. 5731 5732The associated declaration is: 5733- for type nodes, the declaration of the underlying type 5734- for CallExpr, the declaration of the callee 5735- for MemberExpr, the declaration of the referenced member 5736- for CXXConstructExpr, the declaration of the constructor 5737- for CXXNewExpr, the declaration of the operator new 5738- for ObjCIvarExpr, the declaration of the ivar 5739 5740For type nodes, hasDeclaration will generally match the declaration of the 5741sugared type. Given 5742 class X {}; 5743 typedef X Y; 5744 Y y; 5745in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5746typedefDecl. A common use case is to match the underlying, desugared type. 5747This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5748 varDecl(hasType(hasUnqualifiedDesugaredType( 5749 recordType(hasDeclaration(decl()))))) 5750In this matcher, the decl will match the CXXRecordDecl of class X. 5751 5752Usable 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>>, 5753 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>>, 5754 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>>, 5755 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>>, 5756 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>>, 5757 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>>, 5758 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5759</pre></td></tr> 5760 5761 5762<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> 5763<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 5764 5765(Note: Clang's AST refers to other conversions as "casts" too, and calls 5766actual casts "explicit" casts.) 5767</pre></td></tr> 5768 5769 5770<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> 5771<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value 5772declaration's type. 5773 5774In case of a value declaration (for example a variable declaration), 5775this resolves one layer of indirection. For example, in the value 5776declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 5777X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 5778declaration of x. 5779 5780Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5781 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5782 and friend class X (matcher = friendDecl(hasType("X")) 5783 class X {}; 5784 void y(X &x) { x; X z; } 5785 class Y { friend class X; }; 5786 5787Usable 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>> 5788</pre></td></tr> 5789 5790 5791<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> 5792<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 5793matcher. 5794 5795Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5796 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5797 and U (matcher = typedefDecl(hasType(asString("int"))) 5798 and friend class X (matcher = friendDecl(hasType("X")) 5799 class X {}; 5800 void y(X &x) { x; X z; } 5801 typedef int U; 5802 class Y { friend class X; }; 5803</pre></td></tr> 5804 5805 5806<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> 5807<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 5808elidable constructor. 5809 5810In C++17 copy elidable constructors are no longer being 5811generated in the AST as it is not permitted by the standard. They are 5812however part of the AST in C++14 and earlier. Therefore, to write a matcher 5813that works in all language modes, the matcher has to skip elidable 5814constructor AST nodes if they appear in the AST. This matcher can be used to 5815skip those elidable constructors. 5816 5817Given 5818 5819struct H {}; 5820H G(); 5821void f() { 5822 H D = G(); 5823} 5824 5825``varDecl(hasInitializer(any( 5826 ignoringElidableConstructorCall(callExpr()), 5827 exprWithCleanups(ignoringElidableConstructorCall(callExpr()))))`` 5828matches ``H D = G()`` 5829</pre></td></tr> 5830 5831 5832<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> 5833<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 5834are stripped off. 5835 5836Parentheses and explicit casts are not discarded. 5837Given 5838 int arr[5]; 5839 int a = 0; 5840 char b = 0; 5841 const int c = a; 5842 int *d = arr; 5843 long e = (long) 0l; 5844The matchers 5845 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 5846 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 5847would match the declarations for a, b, c, and d, but not e. 5848While 5849 varDecl(hasInitializer(integerLiteral())) 5850 varDecl(hasInitializer(declRefExpr())) 5851only match the declarations for b, c, and d. 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('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> 5856<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 5857nodes are stripped off. 5858 5859Parentheses and explicit casts are not discarded. 5860Given 5861 class C {}; 5862 C a = C(); 5863 C b; 5864 C c = b; 5865The matchers 5866 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 5867would match the declarations for a, b, and c. 5868While 5869 varDecl(hasInitializer(cxxConstructExpr())) 5870only match the declarations for b and c. 5871</pre></td></tr> 5872 5873 5874<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> 5875<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 5876casts are stripped off. 5877 5878Implicit and non-C Style casts are also discarded. 5879Given 5880 int a = 0; 5881 char b = (0); 5882 void* c = reinterpret_cast<char*>(0); 5883 char d = char(0); 5884The matcher 5885 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 5886would match the declarations for a, b, c, and d. 5887while 5888 varDecl(hasInitializer(integerLiteral())) 5889only match the declaration for a. 5890</pre></td></tr> 5891 5892 5893<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> 5894<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 5895parentheses are stripped off. 5896 5897Explicit casts are not discarded. 5898Given 5899 int arr[5]; 5900 int a = 0; 5901 char b = (0); 5902 const int c = a; 5903 int *d = (arr); 5904 long e = ((long) 0l); 5905The matchers 5906 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 5907 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 5908would match the declarations for a, b, c, and d, but not e. 5909while 5910 varDecl(hasInitializer(integerLiteral())) 5911 varDecl(hasInitializer(declRefExpr())) 5912would only match the declaration for a. 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('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> 5917<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 5918 5919Given 5920 const char* str = ("my-string"); 5921The matcher 5922 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 5923would match the implicit cast resulting from the assignment. 5924</pre></td></tr> 5925 5926 5927<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> 5928<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 5929 5930Given 5931 class C { 5932 int a = 2; 5933 int b = 3; 5934 int c; 5935 }; 5936fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 5937 matches 'int a;' but not 'int b;'. 5938fieldDecl(hasInClassInitializer(anything())) 5939 matches 'int a;' and 'int b;' but not 'int c;'. 5940</pre></td></tr> 5941 5942 5943<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> 5944<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function 5945definition that has a given body. 5946 5947Given 5948 for (;;) {} 5949hasBody(compoundStmt()) 5950 matches 'for (;;) {}' 5951with compoundStmt() 5952 matching '{}' 5953</pre></td></tr> 5954 5955 5956<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> 5957<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 5958switch statement or conditional operator. 5959 5960Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5961 if (true) {} 5962</pre></td></tr> 5963 5964 5965<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> 5966<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 5967 5968Example: 5969 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 5970matches '++x' in 5971 for (x; x < N; ++x) { } 5972</pre></td></tr> 5973 5974 5975<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> 5976<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 5977 5978Example: 5979 forStmt(hasLoopInit(declStmt())) 5980matches 'int x = 0' in 5981 for (int x = 0; x < N; ++x) { } 5982</pre></td></tr> 5983 5984 5985<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> 5986<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 5987declaration's type. 5988 5989In case of a value declaration (for example a variable declaration), 5990this resolves one layer of indirection. For example, in the value 5991declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 5992X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 5993declaration of x. 5994 5995Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5996 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5997 and friend class X (matcher = friendDecl(hasType("X")) 5998 class X {}; 5999 void y(X &x) { x; X z; } 6000 class Y { friend class X; }; 6001 6002Usable 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>> 6003</pre></td></tr> 6004 6005 6006<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> 6007<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 6008matcher. 6009 6010Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6011 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6012 and U (matcher = typedefDecl(hasType(asString("int"))) 6013 and friend class X (matcher = friendDecl(hasType("X")) 6014 class X {}; 6015 void y(X &x) { x; X z; } 6016 typedef int U; 6017 class Y { friend class X; }; 6018</pre></td></tr> 6019 6020 6021<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> 6022<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 6023block. 6024 6025Does not match the 'this' parameter of a method. 6026 6027Given 6028 class X { void f(int x, int y, int z) {} }; 6029cxxMethodDecl(hasAnyParameter(hasName("y"))) 6030 matches f(int x, int y, int z) {} 6031with hasAnyParameter(...) 6032 matching int y 6033 6034For ObjectiveC, given 6035 @interface I - (void) f:(int) y; @end 6036 6037the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 6038matches the declaration of method f with hasParameter 6039matching y. 6040 6041For blocks, given 6042 b = ^(int y) { printf("%d", y) }; 6043 6044the matcher blockDecl(hasAnyParameter(hasName("y"))) 6045matches the declaration of the block b with hasParameter 6046matching y. 6047</pre></td></tr> 6048 6049 6050<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> 6051<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6052functionDecl that have at least one TemplateArgument matching the given 6053InnerMatcher. 6054 6055Given 6056 template<typename T> class A {}; 6057 template<> class A<double> {}; 6058 A<int> a; 6059 6060 template<typename T> f() {}; 6061 void func() { f<int>(); }; 6062 6063classTemplateSpecializationDecl(hasAnyTemplateArgument( 6064 refersToType(asString("int")))) 6065 matches the specialization A<int> 6066 6067functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 6068 matches the specialization f<int> 6069</pre></td></tr> 6070 6071 6072<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> 6073<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function 6074definition that has a given body. 6075 6076Given 6077 for (;;) {} 6078hasBody(compoundStmt()) 6079 matches 'for (;;) {}' 6080with compoundStmt() 6081 matching '{}' 6082</pre></td></tr> 6083 6084 6085<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> 6086<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 6087declaration. 6088 6089Given 6090 template<bool b> 6091 struct S { 6092 S(int); // #1 6093 explicit S(double); // #2 6094 operator int(); // #3 6095 explicit operator bool(); // #4 6096 explicit(false) S(bool) // # 7 6097 explicit(true) S(char) // # 8 6098 explicit(b) S(S) // # 9 6099 }; 6100 S(int) -> S<true> // #5 6101 explicit S(double) -> S<false> // #6 6102cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 6103cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 6104cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 6105</pre></td></tr> 6106 6107 6108<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('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> 6109<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 6110declaration or a block. 6111 6112Given 6113 class X { void f(int x) {} }; 6114cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6115 matches f(int x) {} 6116with hasParameter(...) 6117 matching int x 6118 6119For ObjectiveC, given 6120 @interface I - (void) f:(int) y; @end 6121 6122the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6123matches the declaration of method f with hasParameter 6124matching y. 6125</pre></td></tr> 6126 6127 6128<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> 6129<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6130functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 6131 6132Given 6133 template<typename T, typename U> class A {}; 6134 A<bool, int> b; 6135 A<int, bool> c; 6136 6137 template<typename T> void f() {} 6138 void func() { f<int>(); }; 6139classTemplateSpecializationDecl(hasTemplateArgument( 6140 1, refersToType(asString("int")))) 6141 matches the specialization A<bool, int> 6142 6143functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 6144 matches the specialization f<int> 6145</pre></td></tr> 6146 6147 6148<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> 6149<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 6150 6151Given: 6152 class X { int f() { return 1; } }; 6153cxxMethodDecl(returns(asString("int"))) 6154 matches int f() { return 1; } 6155</pre></td></tr> 6156 6157 6158<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> 6159<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 6160switch statement or conditional operator. 6161 6162Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6163 if (true) {} 6164</pre></td></tr> 6165 6166 6167<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> 6168<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 6169 6170Given 6171 if (A* a = GetAPointer()) {} 6172hasConditionVariableStatement(...) 6173 matches 'A* a = GetAPointer()'. 6174</pre></td></tr> 6175 6176 6177<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> 6178<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 6179 6180Examples matches the if statement 6181 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 6182 if (false) false; else true; 6183</pre></td></tr> 6184 6185 6186<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> 6187<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 6188 6189Examples matches the if statement 6190 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 6191 if (false) true; else false; 6192</pre></td></tr> 6193 6194 6195<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> 6196<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 6197matcher. 6198 6199FIXME: Unit test this matcher 6200</pre></td></tr> 6201 6202 6203<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> 6204<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 6205 6206Example matches y. 6207 (matcher = initListExpr(hasInit(0, expr()))) 6208 int x{y}. 6209</pre></td></tr> 6210 6211 6212<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> 6213<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 6214(if expression have it). 6215</pre></td></tr> 6216 6217 6218<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> 6219<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 6220matches the given matcher. 6221 6222The associated declaration is: 6223- for type nodes, the declaration of the underlying type 6224- for CallExpr, the declaration of the callee 6225- for MemberExpr, the declaration of the referenced member 6226- for CXXConstructExpr, the declaration of the constructor 6227- for CXXNewExpr, the declaration of the operator new 6228- for ObjCIvarExpr, the declaration of the ivar 6229 6230For type nodes, hasDeclaration will generally match the declaration of the 6231sugared type. Given 6232 class X {}; 6233 typedef X Y; 6234 Y y; 6235in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6236typedefDecl. A common use case is to match the underlying, desugared type. 6237This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6238 varDecl(hasType(hasUnqualifiedDesugaredType( 6239 recordType(hasDeclaration(decl()))))) 6240In this matcher, the decl will match the CXXRecordDecl of class X. 6241 6242Usable 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>>, 6243 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>>, 6244 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>>, 6245 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>>, 6246 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>>, 6247 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>>, 6248 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6249</pre></td></tr> 6250 6251 6252<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> 6253<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 6254matches the given matcher. 6255 6256The associated declaration is: 6257- for type nodes, the declaration of the underlying type 6258- for CallExpr, the declaration of the callee 6259- for MemberExpr, the declaration of the referenced member 6260- for CXXConstructExpr, the declaration of the constructor 6261- for CXXNewExpr, the declaration of the operator new 6262- for ObjCIvarExpr, the declaration of the ivar 6263 6264For type nodes, hasDeclaration will generally match the declaration of the 6265sugared type. Given 6266 class X {}; 6267 typedef X Y; 6268 Y y; 6269in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6270typedefDecl. A common use case is to match the underlying, desugared type. 6271This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6272 varDecl(hasType(hasUnqualifiedDesugaredType( 6273 recordType(hasDeclaration(decl()))))) 6274In this matcher, the decl will match the CXXRecordDecl of class X. 6275 6276Usable 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>>, 6277 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>>, 6278 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>>, 6279 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>>, 6280 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>>, 6281 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>>, 6282 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6283</pre></td></tr> 6284 6285 6286<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> 6287<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 6288matches the given matcher. 6289 6290The associated declaration is: 6291- for type nodes, the declaration of the underlying type 6292- for CallExpr, the declaration of the callee 6293- for MemberExpr, the declaration of the referenced member 6294- for CXXConstructExpr, the declaration of the constructor 6295- for CXXNewExpr, the declaration of the operator new 6296- for ObjCIvarExpr, the declaration of the ivar 6297 6298For type nodes, hasDeclaration will generally match the declaration of the 6299sugared type. Given 6300 class X {}; 6301 typedef X Y; 6302 Y y; 6303in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6304typedefDecl. A common use case is to match the underlying, desugared type. 6305This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6306 varDecl(hasType(hasUnqualifiedDesugaredType( 6307 recordType(hasDeclaration(decl()))))) 6308In this matcher, the decl will match the CXXRecordDecl of class X. 6309 6310Usable 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>>, 6311 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>>, 6312 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>>, 6313 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>>, 6314 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>>, 6315 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>>, 6316 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6317</pre></td></tr> 6318 6319 6320<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> 6321<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 6322given matcher. Implicit object expressions are included; that is, it matches 6323use of implicit `this`. 6324 6325Given 6326 struct X { 6327 int m; 6328 int f(X x) { x.m; return m; } 6329 }; 6330memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6331 matches `x.m`, but not `m`; however, 6332memberExpr(hasObjectExpression(hasType(pointsTo( 6333 cxxRecordDecl(hasName("X")))))) 6334 matches `m` (aka. `this->m`), but not `x.m`. 6335</pre></td></tr> 6336 6337 6338<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> 6339<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 6340given matcher. 6341 6342Given 6343 struct { int first, second; } first, second; 6344 int i(second.first); 6345 int j(first.second); 6346memberExpr(member(hasName("first"))) 6347 matches second.first 6348 but not first.second (because the member name there is "second"). 6349</pre></td></tr> 6350 6351 6352<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> 6353<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 6354pointee matches a given matcher. 6355 6356Given 6357 int *a; 6358 int const *b; 6359 float const *f; 6360pointerType(pointee(isConstQualified(), isInteger())) 6361 matches "int const *b" 6362 6363Usable 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>>, 6364 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>> 6365</pre></td></tr> 6366 6367 6368<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> 6369<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 6370matcher. 6371 6372Given 6373 namespace N { template<class T> void f(T t); } 6374 template <class T> void g() { using N::f; f(T()); } 6375unresolvedLookupExpr(hasAnyDeclaration( 6376 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 6377 matches the use of f in g() . 6378</pre></td></tr> 6379 6380 6381<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> 6382<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 6383 6384Given 6385 struct A { struct B { struct C {}; }; }; 6386 A::B::C c; 6387nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 6388 matches "A::" 6389</pre></td></tr> 6390 6391 6392<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> 6393<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 6394given TypeLoc. 6395 6396Given 6397 struct A { struct B { struct C {}; }; }; 6398 A::B::C c; 6399nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 6400 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 6401 matches "A::" 6402</pre></td></tr> 6403 6404 6405<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> 6406<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 6407 6408Given 6409 struct A { struct B { struct C {}; }; }; 6410 A::B::C c; 6411nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 6412 matches "A::" 6413</pre></td></tr> 6414 6415 6416<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> 6417<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 6418given namespace matcher. 6419 6420Given 6421 namespace ns { struct A {}; } 6422 ns::A a; 6423nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 6424 matches "ns::" 6425</pre></td></tr> 6426 6427 6428<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> 6429<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 6430given QualType matcher without qualifiers. 6431 6432Given 6433 struct A { struct B { struct C {}; }; }; 6434 A::B::C c; 6435nestedNameSpecifier(specifiesType( 6436 hasDeclaration(cxxRecordDecl(hasName("A"))) 6437)) 6438 matches "A::" 6439</pre></td></tr> 6440 6441 6442<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> 6443<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 6444 6445Given 6446 6447 #pragma omp parallel 6448 #pragma omp parallel default(none) 6449 6450``ompExecutableDirective(hasAnyClause(anything()))`` matches 6451``omp parallel default(none)``. 6452</pre></td></tr> 6453 6454 6455<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> 6456<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 6457 6458Prerequisite: the executable directive must not be standalone directive. 6459If it is, it will never match. 6460 6461Given 6462 6463 #pragma omp parallel 6464 ; 6465 #pragma omp parallel 6466 {} 6467 6468``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 6469</pre></td></tr> 6470 6471 6472<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> 6473<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 6474expression, or an ObjC-message-send expression. 6475 6476Given 6477 void x(int, int, int) { int y; x(1, y, 42); } 6478callExpr(hasAnyArgument(declRefExpr())) 6479 matches x(1, y, 42) 6480with hasAnyArgument(...) 6481 matching y 6482 6483For ObjectiveC, given 6484 @interface I - (void) f:(int) y; @end 6485 void foo(I *i) { [i f:12]; } 6486objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6487 matches [i f:12] 6488</pre></td></tr> 6489 6490 6491<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> 6492<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 6493call expression. 6494 6495Example matches y in x(y) 6496 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6497 void x(int) { int y; x(y); } 6498</pre></td></tr> 6499 6500 6501<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> 6502<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 6503and the inner matcher matches on that instance. 6504 6505For example the method call in 6506 NSString *x = @"hello"; 6507 [x containsString:@"h"]; 6508is matched by 6509objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 6510</pre></td></tr> 6511 6512 6513<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> 6514<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 6515 6516Example 6517matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 6518matches the [webView ...] message invocation. 6519 NSString *webViewJavaScript = ... 6520 UIWebView *webView = ... 6521 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 6522</pre></td></tr> 6523 6524 6525<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> 6526<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 6527block. 6528 6529Does not match the 'this' parameter of a method. 6530 6531Given 6532 class X { void f(int x, int y, int z) {} }; 6533cxxMethodDecl(hasAnyParameter(hasName("y"))) 6534 matches f(int x, int y, int z) {} 6535with hasAnyParameter(...) 6536 matching int y 6537 6538For ObjectiveC, given 6539 @interface I - (void) f:(int) y; @end 6540 6541the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 6542matches the declaration of method f with hasParameter 6543matching y. 6544 6545For blocks, given 6546 b = ^(int y) { printf("%d", y) }; 6547 6548the matcher blockDecl(hasAnyParameter(hasName("y"))) 6549matches the declaration of the block b with hasParameter 6550matching y. 6551</pre></td></tr> 6552 6553 6554<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> 6555<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 6556declaration or a block. 6557 6558Given 6559 class X { void f(int x) {} }; 6560cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6561 matches f(int x) {} 6562with hasParameter(...) 6563 matching int x 6564 6565For ObjectiveC, given 6566 @interface I - (void) f:(int) y; @end 6567 6568the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6569matches the declaration of method f with hasParameter 6570matching y. 6571</pre></td></tr> 6572 6573 6574<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> 6575<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 6576or opaque value's source expression matches the given matcher. 6577 6578Example 1: matches "a string" 6579(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 6580class URL { URL(string); }; 6581URL url = "a string"; 6582 6583Example 2: matches 'b' (matcher = 6584opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 6585int a = b ?: 1; 6586</pre></td></tr> 6587 6588 6589<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> 6590<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 6591overloads matches the given matcher. 6592 6593Given 6594 template <typename T> void foo(T); 6595 template <typename T> void bar(T); 6596 template <typename T> void baz(T t) { 6597 foo(t); 6598 bar(t); 6599 } 6600unresolvedLookupExpr(hasAnyDeclaration( 6601 functionTemplateDecl(hasName("foo")))) 6602 matches foo in foo(t); but not bar in bar(t); 6603</pre></td></tr> 6604 6605 6606<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> 6607<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 6608 6609Given 6610 int (*ptr_to_array)[4]; 6611 int (*ptr_to_func)(int); 6612 6613varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 6614ptr_to_func but not ptr_to_array. 6615 6616Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 6617</pre></td></tr> 6618 6619 6620<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> 6621<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 6622pointee matches a given matcher. 6623 6624Given 6625 int *a; 6626 int const *b; 6627 float const *f; 6628pointerType(pointee(isConstQualified(), isInteger())) 6629 matches "int const *b" 6630 6631Usable 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>>, 6632 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>> 6633</pre></td></tr> 6634 6635 6636<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> 6637<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 6638 6639Given: 6640 typedef int &int_ref; 6641 int a; 6642 int_ref b = a; 6643 6644varDecl(hasType(qualType(referenceType()))))) will not match the 6645declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 6646</pre></td></tr> 6647 6648 6649<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> 6650<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 6651matches the given matcher. 6652 6653The associated declaration is: 6654- for type nodes, the declaration of the underlying type 6655- for CallExpr, the declaration of the callee 6656- for MemberExpr, the declaration of the referenced member 6657- for CXXConstructExpr, the declaration of the constructor 6658- for CXXNewExpr, the declaration of the operator new 6659- for ObjCIvarExpr, the declaration of the ivar 6660 6661For type nodes, hasDeclaration will generally match the declaration of the 6662sugared type. Given 6663 class X {}; 6664 typedef X Y; 6665 Y y; 6666in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6667typedefDecl. A common use case is to match the underlying, desugared type. 6668This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6669 varDecl(hasType(hasUnqualifiedDesugaredType( 6670 recordType(hasDeclaration(decl()))))) 6671In this matcher, the decl will match the CXXRecordDecl of class X. 6672 6673Usable 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>>, 6674 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>>, 6675 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>>, 6676 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>>, 6677 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>>, 6678 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>>, 6679 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6680</pre></td></tr> 6681 6682 6683<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> 6684<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 6685 6686Given 6687 void (*fp)(void); 6688The matcher 6689 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 6690would match the declaration for fp. 6691</pre></td></tr> 6692 6693 6694<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> 6695<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 6696</pre></td></tr> 6697 6698 6699<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> 6700<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 6701matches the specified matcher. 6702 6703Example matches y->x() 6704 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 6705 cxxRecordDecl(hasName("Y"))))))) 6706 class Y { public: void x(); }; 6707 void z() { Y *y; y->x(); } 6708</pre></td></tr> 6709 6710 6711<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> 6712<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 6713</pre></td></tr> 6714 6715 6716<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> 6717<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 6718type matches the specified matcher. 6719 6720Example matches X &x and const X &y 6721 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 6722 class X { 6723 void a(X b) { 6724 X &x = b; 6725 const X &y = b; 6726 } 6727 }; 6728</pre></td></tr> 6729 6730 6731<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> 6732<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 6733matches the given matcher. 6734 6735The associated declaration is: 6736- for type nodes, the declaration of the underlying type 6737- for CallExpr, the declaration of the callee 6738- for MemberExpr, the declaration of the referenced member 6739- for CXXConstructExpr, the declaration of the constructor 6740- for CXXNewExpr, the declaration of the operator new 6741- for ObjCIvarExpr, the declaration of the ivar 6742 6743For type nodes, hasDeclaration will generally match the declaration of the 6744sugared type. Given 6745 class X {}; 6746 typedef X Y; 6747 Y y; 6748in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6749typedefDecl. A common use case is to match the underlying, desugared type. 6750This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6751 varDecl(hasType(hasUnqualifiedDesugaredType( 6752 recordType(hasDeclaration(decl()))))) 6753In this matcher, the decl will match the CXXRecordDecl of class X. 6754 6755Usable 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>>, 6756 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>>, 6757 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>>, 6758 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>>, 6759 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>>, 6760 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>>, 6761 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6762</pre></td></tr> 6763 6764 6765<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> 6766<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 6767pointee matches a given matcher. 6768 6769Given 6770 int *a; 6771 int const *b; 6772 float const *f; 6773pointerType(pointee(isConstQualified(), isInteger())) 6774 matches "int const *b" 6775 6776Usable 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>>, 6777 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>> 6778</pre></td></tr> 6779 6780 6781<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> 6782<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 6783 6784Given 6785 return a + b; 6786hasReturnValue(binaryOperator()) 6787 matches 'return a + b' 6788with binaryOperator() 6789 matching 'a + b' 6790</pre></td></tr> 6791 6792 6793<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> 6794<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 6795a given matcher. Also matches StmtExprs that have CompoundStmt as children. 6796 6797Given 6798 { {}; 1+2; } 6799hasAnySubstatement(compoundStmt()) 6800 matches '{ {}; 1+2; }' 6801with compoundStmt() 6802 matching '{}' 6803</pre></td></tr> 6804 6805 6806<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> 6807<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 6808alignof. 6809</pre></td></tr> 6810 6811 6812<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> 6813<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to 6814 6815Given: 6816F& operator=(const F& o) { 6817 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 6818 return *this; 6819} 6820returnStmt(forFunction(hasName("operator="))) 6821 matches 'return *this' 6822 but does match 'return > 0' 6823</pre></td></tr> 6824 6825 6826<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> 6827<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 6828sizeof. 6829</pre></td></tr> 6830 6831 6832<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> 6833<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 6834type that matches the provided matcher. 6835 6836Given 6837 template <typename T> 6838 double F(T t); 6839 int i; 6840 double j = F(i); 6841 6842substTemplateTypeParmType(hasReplacementType(type())) matches int 6843</pre></td></tr> 6844 6845 6846<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> 6847<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 6848statement. This matcher may produce multiple matches. 6849 6850Given 6851 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 6852switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 6853 matches four times, with "c" binding each of "case 1:", "case 2:", 6854"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 6855"switch (1)", "switch (2)" and "switch (2)". 6856</pre></td></tr> 6857 6858 6859<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> 6860<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 6861switch statement or conditional operator. 6862 6863Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6864 if (true) {} 6865</pre></td></tr> 6866 6867 6868<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> 6869<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 6870matches the given matcher. 6871 6872The associated declaration is: 6873- for type nodes, the declaration of the underlying type 6874- for CallExpr, the declaration of the callee 6875- for MemberExpr, the declaration of the referenced member 6876- for CXXConstructExpr, the declaration of the constructor 6877- for CXXNewExpr, the declaration of the operator new 6878- for ObjCIvarExpr, the declaration of the ivar 6879 6880For type nodes, hasDeclaration will generally match the declaration of the 6881sugared type. Given 6882 class X {}; 6883 typedef X Y; 6884 Y y; 6885in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6886typedefDecl. A common use case is to match the underlying, desugared type. 6887This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6888 varDecl(hasType(hasUnqualifiedDesugaredType( 6889 recordType(hasDeclaration(decl()))))) 6890In this matcher, the decl will match the CXXRecordDecl of class X. 6891 6892Usable 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>>, 6893 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>>, 6894 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>>, 6895 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>>, 6896 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>>, 6897 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>>, 6898 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6899</pre></td></tr> 6900 6901 6902<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> 6903<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 6904 6905Given 6906 struct B { int next; }; 6907 template<int(B::*next_ptr)> struct A {}; 6908 A<&B::next> a; 6909templateSpecializationType(hasAnyTemplateArgument( 6910 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 6911 matches the specialization A<&B::next> with fieldDecl(...) matching 6912 B::next 6913</pre></td></tr> 6914 6915 6916<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> 6917<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 6918declaration. 6919 6920Given 6921 struct B { int next; }; 6922 template<int(B::*next_ptr)> struct A {}; 6923 A<&B::next> a; 6924classTemplateSpecializationDecl(hasAnyTemplateArgument( 6925 refersToDeclaration(fieldDecl(hasName("next"))))) 6926 matches the specialization A<&B::next> with fieldDecl(...) matching 6927 B::next 6928</pre></td></tr> 6929 6930 6931<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> 6932<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type. 6933 6934Given 6935 template<int T> struct C {}; 6936 C<42> c; 6937classTemplateSpecializationDecl( 6938 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 6939 matches the implicit instantiation of C in C<42>. 6940</pre></td></tr> 6941 6942 6943<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> 6944<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 6945 6946Given 6947 template<template <typename> class S> class X {}; 6948 template<typename T> class Y {}; 6949 X<Y> xi; 6950classTemplateSpecializationDecl(hasAnyTemplateArgument( 6951 refersToTemplate(templateName()))) 6952 matches the specialization X<Y> 6953</pre></td></tr> 6954 6955 6956<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> 6957<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 6958 6959Given 6960 struct X {}; 6961 template<typename T> struct A {}; 6962 A<X> a; 6963classTemplateSpecializationDecl(hasAnyTemplateArgument( 6964 refersToType(class(hasName("X"))))) 6965 matches the specialization A<X> 6966</pre></td></tr> 6967 6968 6969<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> 6970<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6971functionDecl that have at least one TemplateArgument matching the given 6972InnerMatcher. 6973 6974Given 6975 template<typename T> class A {}; 6976 template<> class A<double> {}; 6977 A<int> a; 6978 6979 template<typename T> f() {}; 6980 void func() { f<int>(); }; 6981 6982classTemplateSpecializationDecl(hasAnyTemplateArgument( 6983 refersToType(asString("int")))) 6984 matches the specialization A<int> 6985 6986functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 6987 matches the specialization f<int> 6988</pre></td></tr> 6989 6990 6991<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> 6992<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 6993matches the given matcher. 6994 6995The associated declaration is: 6996- for type nodes, the declaration of the underlying type 6997- for CallExpr, the declaration of the callee 6998- for MemberExpr, the declaration of the referenced member 6999- for CXXConstructExpr, the declaration of the constructor 7000- for CXXNewExpr, the declaration of the operator new 7001- for ObjCIvarExpr, the declaration of the ivar 7002 7003For type nodes, hasDeclaration will generally match the declaration of the 7004sugared type. Given 7005 class X {}; 7006 typedef X Y; 7007 Y y; 7008in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7009typedefDecl. A common use case is to match the underlying, desugared type. 7010This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7011 varDecl(hasType(hasUnqualifiedDesugaredType( 7012 recordType(hasDeclaration(decl()))))) 7013In this matcher, the decl will match the CXXRecordDecl of class X. 7014 7015Usable 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>>, 7016 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>>, 7017 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>>, 7018 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>>, 7019 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>>, 7020 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>>, 7021 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7022</pre></td></tr> 7023 7024 7025<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> 7026<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7027functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7028 7029Given 7030 template<typename T, typename U> class A {}; 7031 A<bool, int> b; 7032 A<int, bool> c; 7033 7034 template<typename T> void f() {} 7035 void func() { f<int>(); }; 7036classTemplateSpecializationDecl(hasTemplateArgument( 7037 1, refersToType(asString("int")))) 7038 matches the specialization A<bool, int> 7039 7040functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7041 matches the specialization f<int> 7042</pre></td></tr> 7043 7044 7045<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> 7046<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 7047matches the given matcher. 7048 7049The associated declaration is: 7050- for type nodes, the declaration of the underlying type 7051- for CallExpr, the declaration of the callee 7052- for MemberExpr, the declaration of the referenced member 7053- for CXXConstructExpr, the declaration of the constructor 7054- for CXXNewExpr, the declaration of the operator new 7055- for ObjCIvarExpr, the declaration of the ivar 7056 7057For type nodes, hasDeclaration will generally match the declaration of the 7058sugared type. Given 7059 class X {}; 7060 typedef X Y; 7061 Y y; 7062in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7063typedefDecl. A common use case is to match the underlying, desugared type. 7064This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7065 varDecl(hasType(hasUnqualifiedDesugaredType( 7066 recordType(hasDeclaration(decl()))))) 7067In this matcher, the decl will match the CXXRecordDecl of class X. 7068 7069Usable 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>>, 7070 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>>, 7071 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>>, 7072 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>>, 7073 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>>, 7074 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>>, 7075 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7076</pre></td></tr> 7077 7078 7079<tr><td>Matcher<T></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>const Matcher<T> Matcher</td></tr> 7080<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 7081 7082Generates results for each match. 7083 7084For example, in: 7085 class A { class B {}; class C {}; }; 7086The matcher: 7087 cxxRecordDecl(hasName("::A"), 7088 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 7089will generate results for A, B and C. 7090 7091Usable as: Any Matcher 7092</pre></td></tr> 7093 7094 7095<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> 7096<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 7097matcher. 7098 7099Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7100 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7101 and U (matcher = typedefDecl(hasType(asString("int"))) 7102 and friend class X (matcher = friendDecl(hasType("X")) 7103 class X {}; 7104 void y(X &x) { x; X z; } 7105 typedef int U; 7106 class Y { friend class X; }; 7107</pre></td></tr> 7108 7109 7110<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> 7111<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 7112matches the given matcher. 7113 7114The associated declaration is: 7115- for type nodes, the declaration of the underlying type 7116- for CallExpr, the declaration of the callee 7117- for MemberExpr, the declaration of the referenced member 7118- for CXXConstructExpr, the declaration of the constructor 7119- for CXXNewExpr, the declaration of the operator new 7120- for ObjCIvarExpr, the declaration of the ivar 7121 7122For type nodes, hasDeclaration will generally match the declaration of the 7123sugared type. Given 7124 class X {}; 7125 typedef X Y; 7126 Y y; 7127in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7128typedefDecl. A common use case is to match the underlying, desugared type. 7129This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7130 varDecl(hasType(hasUnqualifiedDesugaredType( 7131 recordType(hasDeclaration(decl()))))) 7132In this matcher, the decl will match the CXXRecordDecl of class X. 7133 7134Usable 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>>, 7135 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>>, 7136 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>>, 7137 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>>, 7138 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>>, 7139 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>>, 7140 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7141</pre></td></tr> 7142 7143 7144<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> 7145<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 7146type of the matched node. 7147 7148For example, in: 7149 class A {}; 7150 using B = A; 7151The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 7152both B and A. 7153</pre></td></tr> 7154 7155 7156<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> 7157<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 7158 7159Given 7160 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 7161unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 7162 matches sizeof(a) and alignof(c) 7163</pre></td></tr> 7164 7165 7166<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> 7167<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 7168 7169Example matches true (matcher = hasUnaryOperand( 7170 cxxBoolLiteral(equals(true)))) 7171 !true 7172</pre></td></tr> 7173 7174 7175<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> 7176<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 7177given matcher. Implicit object expressions are included; that is, it matches 7178use of implicit `this`. 7179 7180Given 7181 struct X { 7182 int m; 7183 int f(X x) { x.m; return m; } 7184 }; 7185memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 7186 matches `x.m`, but not `m`; however, 7187memberExpr(hasObjectExpression(hasType(pointsTo( 7188 cxxRecordDecl(hasName("X")))))) 7189 matches `m` (aka. `this->m`), but not `x.m`. 7190</pre></td></tr> 7191 7192 7193<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> 7194<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 7195matches the given matcher. 7196 7197The associated declaration is: 7198- for type nodes, the declaration of the underlying type 7199- for CallExpr, the declaration of the callee 7200- for MemberExpr, the declaration of the referenced member 7201- for CXXConstructExpr, the declaration of the constructor 7202- for CXXNewExpr, the declaration of the operator new 7203- for ObjCIvarExpr, the declaration of the ivar 7204 7205For type nodes, hasDeclaration will generally match the declaration of the 7206sugared type. Given 7207 class X {}; 7208 typedef X Y; 7209 Y y; 7210in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7211typedefDecl. A common use case is to match the underlying, desugared type. 7212This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7213 varDecl(hasType(hasUnqualifiedDesugaredType( 7214 recordType(hasDeclaration(decl()))))) 7215In this matcher, the decl will match the CXXRecordDecl of class X. 7216 7217Usable 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>>, 7218 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>>, 7219 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>>, 7220 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>>, 7221 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>>, 7222 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>>, 7223 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7224</pre></td></tr> 7225 7226 7227<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> 7228<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 7229 7230Given 7231 namespace X { void b(); } 7232 using X::b; 7233usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 7234 matches using X::b </pre></td></tr> 7235 7236 7237<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> 7238<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 7239matched by the given matcher. 7240 7241Given 7242 namespace X { int a; void b(); } 7243 using X::a; 7244 using X::b; 7245usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 7246 matches using X::b but not using X::a </pre></td></tr> 7247 7248 7249<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> 7250<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 7251declaration's type. 7252 7253In case of a value declaration (for example a variable declaration), 7254this resolves one layer of indirection. For example, in the value 7255declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7256X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7257declaration of x. 7258 7259Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7260 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7261 and friend class X (matcher = friendDecl(hasType("X")) 7262 class X {}; 7263 void y(X &x) { x; X z; } 7264 class Y { friend class X; }; 7265 7266Usable 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>> 7267</pre></td></tr> 7268 7269 7270<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> 7271<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 7272matcher. 7273 7274Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7275 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7276 and U (matcher = typedefDecl(hasType(asString("int"))) 7277 and friend class X (matcher = friendDecl(hasType("X")) 7278 class X {}; 7279 void y(X &x) { x; X z; } 7280 typedef int U; 7281 class Y { friend class X; }; 7282</pre></td></tr> 7283 7284 7285<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_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> 7286<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 7287that matches the given matcher. 7288 7289Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 7290 bool y() { return true; } 7291 bool x = y(); 7292</pre></td></tr> 7293 7294 7295<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> 7296<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 7297expression. 7298 7299Given 7300 void f(int b) { 7301 int a[b]; 7302 } 7303variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 7304 varDecl(hasName("b"))))))) 7305 matches "int a[b]" 7306</pre></td></tr> 7307 7308 7309<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> 7310<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function 7311definition that has a given body. 7312 7313Given 7314 for (;;) {} 7315hasBody(compoundStmt()) 7316 matches 'for (;;) {}' 7317with compoundStmt() 7318 matching '{}' 7319</pre></td></tr> 7320 7321 7322<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> 7323<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 7324switch statement or conditional operator. 7325 7326Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7327 if (true) {} 7328</pre></td></tr> 7329 7330 7331<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> 7332<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 7333NestedNameSpecifier-matcher matches. 7334</pre></td></tr> 7335 7336 7337<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> 7338<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 7339QualType-matcher matches. 7340</pre></td></tr> 7341 7342<!--END_TRAVERSAL_MATCHERS --> 7343</table> 7344 7345</div> 7346</body> 7347</html> 7348 7349 7350