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