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