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