1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 2 "http://www.w3.org/TR/html4/strict.dtd"> 3<html> 4<head> 5<title>AST Matcher Reference</title> 6<link type="text/css" rel="stylesheet" href="../menu.css" /> 7<link type="text/css" rel="stylesheet" href="../content.css" /> 8<style type="text/css"> 9td { 10 padding: .33em; 11} 12td.doc { 13 display: none; 14 border-bottom: 1px solid black; 15} 16td.name:hover { 17 color: blue; 18 cursor: pointer; 19} 20</style> 21<script type="text/javascript"> 22function toggle(id) { 23 if (!id) return; 24 row = document.getElementById(id); 25 if (row.style.display != 'table-cell') 26 row.style.display = 'table-cell'; 27 else 28 row.style.display = 'none'; 29} 30</script> 31</head> 32<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))"> 33 34<!--#include virtual="../menu.html.incl"--> 35 36<div id="content"> 37 38<h1>AST Matcher Reference</h1> 39 40<p>This document shows all currently implemented matchers. The matchers are grouped 41by category and node type they match. You can click on matcher names to show the 42matcher's source documentation.</p> 43 44<p>There are three different basic categories of matchers: 45<ul> 46<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li> 47<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li> 48<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li> 49</ul> 50</p> 51 52<p>Within each category the matchers are ordered by node type they match on. 53Note that if a matcher can match multiple node types, it will appear 54multiple times. This means that by searching for Matcher<Stmt> you can 55find all matchers that can be used to match on Stmt nodes.</p> 56 57<p>The exception to that rule are matchers that can match on any node. Those 58are marked with a * and are listed in the beginning of each category.</p> 59 60<p>Note that the categorization of matchers is a great help when you combine 61them into matcher expressions. You will usually want to form matcher expressions 62that read like english sentences by alternating between node matchers and 63narrowing or traversal matchers, like this: 64<pre> 65recordDecl(hasDescendant( 66 ifStmt(hasTrueExpression( 67 expr(hasDescendant( 68 ifStmt())))))) 69</pre> 70</p> 71 72<!-- ======================================================================= --> 73<h2 id="decl-matchers">Node Matchers</h2> 74<!-- ======================================================================= --> 75 76<p>Node matchers are at the core of matcher expressions - they specify the type 77of node that is expected. Every match expression starts with a node matcher, 78which can then be further refined with a narrowing or traversal matcher. All 79traversal matchers take node matchers as their arguments.</p> 80 81<p>For convenience, all node matchers take an arbitrary number of arguments 82and implicitly act as allOf matchers.</p> 83 84<p>Node matchers are the only matchers that support the bind("id") call to 85bind the matched node to the given string, to be later retrieved from the 86match callback.</p> 87 88<p>It is important to remember that the arguments to node matchers are 89predicates on the same node, just with additional information about the type. 90This is often useful to make matcher expression more readable by inlining bind 91calls into redundant node matchers inside another node matcher: 92<pre> 93// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on 94// the same node. 95recordDecl(decl().bind("id"), hasName("::MyClass")) 96</pre> 97</p> 98 99<table> 100<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 101<!-- START_DECL_MATCHERS --> 102 103<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>...</td></tr> 104<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers. 105 106Examples matches i(42). 107 class C { 108 C() : i(42) {} 109 int i; 110 }; 111</pre></td></tr> 112 113 114<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>>...</td></tr> 115<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations. 116 117Given 118 class C { 119 public: 120 int a; 121 }; 122accessSpecDecl() 123 matches 'public:' 124</pre></td></tr> 125 126 127<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>...</td></tr> 128<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations. 129 130Example matches the declaration of the nameless block printing an input 131integer. 132 133 myFunc(^(int p) { 134 printf("%d", p); 135 }) 136</pre></td></tr> 137 138 139<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>>...</td></tr> 140<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations. 141 142Example matches Z 143 template<class T> class Z {}; 144</pre></td></tr> 145 146 147<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>>...</td></tr> 148<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations. 149 150Given 151 template<class T1, class T2, int I> 152 class A {}; 153 154 template<class T, int I> 155 class A<T, T*, I> {}; 156 157 template<> 158 class A<int, int, 1> {}; 159classTemplatePartialSpecializationDecl() 160 matches the specialization A<T,T*,I> but not A<int,int,1> 161</pre></td></tr> 162 163 164<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>...</td></tr> 165<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations. 166 167Given 168 template<typename T> class A {}; 169 template<> class A<double> {}; 170 A<int> a; 171classTemplateSpecializationDecl() 172 matches the specializations A<int> and A<double> 173</pre></td></tr> 174 175 176<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>>...</td></tr> 177<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. 178 179Example matches Foo::Foo() and Foo::Foo(int) 180 class Foo { 181 public: 182 Foo(); 183 Foo(int); 184 int DoSomething(); 185 }; 186</pre></td></tr> 187 188 189<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>>...</td></tr> 190<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations. 191 192Example matches the operator. 193 class X { operator int() const; }; 194</pre></td></tr> 195 196 197<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>>...</td></tr> 198<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide. 199 200Example matches the deduction guide. 201 template<typename T> 202 class X { X(int) }; 203 X(int) -> X<int>; 204</pre></td></tr> 205 206 207<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>>...</td></tr> 208<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations. 209 210Example matches Foo::~Foo() 211 class Foo { 212 public: 213 virtual ~Foo(); 214 }; 215</pre></td></tr> 216 217 218<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>...</td></tr> 219<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations. 220 221Example matches y 222 class X { void y(); }; 223</pre></td></tr> 224 225 226<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>...</td></tr> 227<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations. 228 229Example matches X, Z 230 class X; 231 template<class T> class Z {}; 232</pre></td></tr> 233 234 235<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>...</td></tr> 236<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 237 238Examples matches X, C, and the friend declaration inside C; 239 void X(); 240 class C { 241 friend X; 242 }; 243</pre></td></tr> 244 245 246<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>...</td></tr> 247<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 248and non-type template parameter declarations). 249 250Given 251 class X { int y; }; 252declaratorDecl() 253 matches int y. 254</pre></td></tr> 255 256 257<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>>...</td></tr> 258<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 259 260Example matches A, B, C 261 enum X { 262 A, B, C 263 }; 264</pre></td></tr> 265 266 267<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>>...</td></tr> 268<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 269 270Example matches X 271 enum X { 272 A, B, C 273 }; 274</pre></td></tr> 275 276 277<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>>...</td></tr> 278<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 279 280Given 281 class X { int m; }; 282fieldDecl() 283 matches 'm'. 284</pre></td></tr> 285 286 287<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>...</td></tr> 288<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 289 290Given 291 class X { friend void foo(); }; 292friendDecl() 293 matches 'friend void foo()'. 294</pre></td></tr> 295 296 297<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>...</td></tr> 298<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 299 300Example matches f 301 void f(); 302</pre></td></tr> 303 304 305<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>>...</td></tr> 306<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 307 308Example matches f 309 template<class T> void f(T t) {} 310</pre></td></tr> 311 312 313<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>>...</td></tr> 314<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations. 315 316Given 317 struct X { struct { int a; }; }; 318indirectFieldDecl() 319 matches 'a'. 320</pre></td></tr> 321 322 323<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>>...</td></tr> 324<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label. 325 326Given 327 goto FOO; 328 FOO: bar(); 329labelDecl() 330 matches 'FOO:' 331</pre></td></tr> 332 333 334<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>>...</td></tr> 335<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification. 336 337Given 338 extern "C" {} 339linkageSpecDecl() 340 matches "extern "C" {}" 341</pre></td></tr> 342 343 344<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>>...</td></tr> 345<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 346 347Example matches X, S, the anonymous union type, i, and U; 348 typedef int X; 349 struct S { 350 union { 351 int i; 352 } U; 353 }; 354</pre></td></tr> 355 356 357<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>>...</td></tr> 358<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias. 359 360Given 361 namespace test {} 362 namespace alias = ::test; 363namespaceAliasDecl() 364 matches "namespace alias" but not "namespace test" 365</pre></td></tr> 366 367 368<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>>...</td></tr> 369<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 370 371Given 372 namespace {} 373 namespace test {} 374namespaceDecl() 375 matches "namespace {}" and "namespace test {}" 376</pre></td></tr> 377 378 379<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>>...</td></tr> 380<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations. 381 382Given 383 template <typename T, int N> struct C {}; 384nonTypeTemplateParmDecl() 385 matches 'N', but not 'T'. 386</pre></td></tr> 387 388 389<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>>...</td></tr> 390<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations. 391 392Example matches Foo (Additions) 393 @interface Foo (Additions) 394 @end 395</pre></td></tr> 396 397 398<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>>...</td></tr> 399<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions. 400 401Example matches Foo (Additions) 402 @implementation Foo (Additions) 403 @end 404</pre></td></tr> 405 406 407<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>>...</td></tr> 408<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations. 409 410Example matches Foo 411 @implementation Foo 412 @end 413</pre></td></tr> 414 415 416<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>...</td></tr> 417<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 418 419Example matches Foo 420 @interface Foo 421 @end 422</pre></td></tr> 423 424 425<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>>...</td></tr> 426<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations. 427 428Example matches _enabled 429 @implementation Foo { 430 BOOL _enabled; 431 } 432 @end 433</pre></td></tr> 434 435 436<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>...</td></tr> 437<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations. 438 439Example matches both declaration and definition of -[Foo method] 440 @interface Foo 441 - (void)method; 442 @end 443 444 @implementation Foo 445 - (void)method {} 446 @end 447</pre></td></tr> 448 449 450<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>...</td></tr> 451<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations. 452 453Example matches enabled 454 @interface Foo 455 @property BOOL enabled; 456 @end 457</pre></td></tr> 458 459 460<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>>...</td></tr> 461<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations. 462 463Example matches FooDelegate 464 @protocol FooDelegate 465 @end 466</pre></td></tr> 467 468 469<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>>...</td></tr> 470<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 471 472Given 473 void f(int x); 474parmVarDecl() 475 matches int x. 476</pre></td></tr> 477 478 479<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>>...</td></tr> 480<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 481 482Example matches X, Z, U, and S 483 class X; 484 template<class T> class Z {}; 485 struct S {}; 486 union U {}; 487</pre></td></tr> 488 489 490<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>>...</td></tr> 491<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 492 493Example: 494 staticAssertExpr() 495matches 496 static_assert(sizeof(S) == sizeof(int)) 497in 498 struct S { 499 int x; 500 }; 501 static_assert(sizeof(S) == sizeof(int)); 502</pre></td></tr> 503 504 505<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>...</td></tr> 506<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations. 507 508Example matches X, Z, U, S, E 509 class X; 510 template<class T> class Z {}; 511 struct S {}; 512 union U {}; 513 enum E { 514 A, B, C 515 }; 516</pre></td></tr> 517 518 519<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTemplateParmDecl0')"><a name="templateTemplateParmDecl0Anchor">templateTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl</a>>...</td></tr> 520<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations. 521 522Given 523 template <template <typename> class Z, int N> struct C {}; 524templateTypeParmDecl() 525 matches 'Z', but not 'N'. 526</pre></td></tr> 527 528 529<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>>...</td></tr> 530<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 531 532Given 533 template <typename T, int N> struct C {}; 534templateTypeParmDecl() 535 matches 'T', but not 'N'. 536</pre></td></tr> 537 538 539<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>>...</td></tr> 540<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 541 542Given 543 int X; 544 namespace NS { 545 int Y; 546 } // namespace NS 547decl(hasDeclContext(translationUnitDecl())) 548 matches "int X", but not "int Y". 549</pre></td></tr> 550 551 552<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>>...</td></tr> 553<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations. 554 555Given 556 typedef int X; 557 using Y = int; 558typeAliasDecl() 559 matches "using Y = int", but not "typedef int X" 560</pre></td></tr> 561 562 563<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>>...</td></tr> 564<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations. 565 566typeAliasTemplateDecl() matches 567 template <typename T> 568 using Y = X<T>; 569</pre></td></tr> 570 571 572<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>>...</td></tr> 573<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 574 575Given 576 typedef int X; 577 using Y = int; 578typedefDecl() 579 matches "typedef int X", but not "using Y = int" 580</pre></td></tr> 581 582 583<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>...</td></tr> 584<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations. 585 586Given 587 typedef int X; 588 using Y = int; 589typedefNameDecl() 590 matches "typedef int X" and "using Y = int" 591</pre></td></tr> 592 593 594<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>>...</td></tr> 595<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 596typename. 597 598Given 599 template <typename T> 600 struct Base { typedef T Foo; }; 601 602 template<typename T> 603 struct S : private Base<T> { 604 using typename Base<T>::Foo; 605 }; 606unresolvedUsingTypenameDecl() 607 matches using Base<T>::Foo </pre></td></tr> 608 609 610<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>>...</td></tr> 611<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 612 613Given 614 template<typename X> 615 class C : private X { 616 using X::x; 617 }; 618unresolvedUsingValueDecl() 619 matches using X::x </pre></td></tr> 620 621 622<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>>...</td></tr> 623<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 624 625Given 626 namespace X { int x; } 627 using X::x; 628usingDecl() 629 matches using X::x </pre></td></tr> 630 631 632<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>>...</td></tr> 633<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 634 635Given 636 namespace X { int x; } 637 using namespace X; 638usingDirectiveDecl() 639 matches using namespace X </pre></td></tr> 640 641 642<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>...</td></tr> 643<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 644 645Example matches A, B, C and F 646 enum X { A, B, C }; 647 void F(); 648</pre></td></tr> 649 650 651<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>...</td></tr> 652<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 653 654Note: this does not match declarations of member variables, which are 655"field" declarations in Clang parlance. 656 657Example matches a 658 int a; 659</pre></td></tr> 660 661 662<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>></td><td class="name" onclick="toggle('decompositionDecl0')"><a name="decompositionDecl0Anchor">decompositionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>>...</td></tr> 663<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations. 664 665Examples matches the declaration node with foo and bar, but not 666number. 667(matcher = declStmt(has(decompositionDecl()))) 668 669 int number = 42; 670 auto [foo, bar] = std::make_pair{42, 42}; 671</pre></td></tr> 672 673 674<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>>...</td></tr> 675<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 676</pre></td></tr> 677 678 679<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>>...</td></tr> 680<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 681 682Given 683 namespace ns { 684 struct A { static void f(); }; 685 void A::f() {} 686 void g() { A::f(); } 687 } 688 ns::A a; 689nestedNameSpecifier() 690 matches "ns::" and both "A::" 691</pre></td></tr> 692 693 694<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>></td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>>...</td></tr> 695<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause. 696 697Given 698 699 #pragma omp parallel default(none) 700 #pragma omp parallel default(shared) 701 #pragma omp parallel default(firstprivate) 702 #pragma omp parallel 703 704``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and 705``default(firstprivate)`` 706</pre></td></tr> 707 708 709<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>...</td></tr> 710<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 711</pre></td></tr> 712 713 714<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>...</td></tr> 715<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension). 716 717Given 718 FOO: bar(); 719 void *ptr = &&FOO; 720 goto *bar; 721addrLabelExpr() 722 matches '&&FOO' 723</pre></td></tr> 724 725 726<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>>...</td></tr> 727<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 728 729Given 730 int i = a[1]; 731arraySubscriptExpr() 732 matches "a[1]" 733</pre></td></tr> 734 735 736<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>>...</td></tr> 737<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 738 739 int i = 100; 740 __asm("mov al, 2"); 741asmStmt() 742 matches '__asm("mov al, 2")' 743</pre></td></tr> 744 745 746<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>>...</td></tr> 747<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins. 748Example matches __atomic_load_n(ptr, 1) 749 void foo() { int *ptr; __atomic_load_n(ptr, 1); } 750</pre></td></tr> 751 752 753<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>>...</td></tr> 754<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement. 755 756Given 757 @autoreleasepool { 758 int x = 0; 759 } 760autoreleasePoolStmt(stmt()) matches the declaration of "x" 761inside the autorelease pool. 762</pre></td></tr> 763 764 765<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>>...</td></tr> 766<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension). 767 768Example matches a ?: b 769 (a ?: b) + 42; 770</pre></td></tr> 771 772 773<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>>...</td></tr> 774<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 775 776Example matches a || b 777 !(a || b) 778</pre></td></tr> 779 780 781<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>>...</td></tr> 782<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block. 783 784Example: matches "^{}": 785 void f() { ^{}(); } 786</pre></td></tr> 787 788 789<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>>...</td></tr> 790<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 791 792Given 793 while (true) { break; } 794breakStmt() 795 matches 'break' 796</pre></td></tr> 797 798 799<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>>...</td></tr> 800<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 801 802Example: Matches (int) 2.2f in 803 int i = (int) 2.2f; 804</pre></td></tr> 805 806 807<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>...</td></tr> 808<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 809 810Example matches x.y() and y() 811 X x; 812 x.y(); 813 y(); 814</pre></td></tr> 815 816 817<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>>...</td></tr> 818<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 819 820Given 821 switch(a) { case 42: break; default: break; } 822caseStmt() 823 matches 'case 42:'. 824</pre></td></tr> 825 826 827<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>>...</td></tr> 828<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 829 830Example: castExpr() matches each of the following: 831 (int) 3; 832 const_cast<Expr *>(SubExpr); 833 char c = 0; 834but does not match 835 int i = (0); 836 int k = 0; 837</pre></td></tr> 838 839 840<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>...</td></tr> 841<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 842 843Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 844though. 845 846Example matches 'a', L'a' 847 char ch = 'a'; 848 wchar_t chw = L'a'; 849</pre></td></tr> 850 851 852<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>>...</td></tr> 853<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr. 854</pre></td></tr> 855 856 857<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>...</td></tr> 858<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 859 860Example match: {1}, (1, 2) 861 int array[4] = {1}; 862 vector int myvec = (vector int)(1, 2); 863</pre></td></tr> 864 865 866<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>>...</td></tr> 867<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 868 869Example matches '{}' and '{{}}' in 'for (;;) {{}}' 870 for (;;) {{}} 871</pre></td></tr> 872 873 874<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>>...</td></tr> 875<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 876 877Example matches a ? b : c 878 (a ? b : c) + 42 879</pre></td></tr> 880 881 882<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>>...</td></tr> 883<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper. 884 885Example matches the constant in the case statement: 886 (matcher = constantExpr()) 887 switch (a) { 888 case 37: break; 889 } 890</pre></td></tr> 891 892 893<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>>...</td></tr> 894<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 895 896Given 897 while (true) { continue; } 898continueStmt() 899 matches 'continue' 900</pre></td></tr> 901 902 903<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>>...</td></tr> 904<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 905 906Example matches, 907 kernel<<<i,j>>>(); 908</pre></td></tr> 909 910 911<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>>...</td></tr> 912<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 913 914Example matches FunctionTakesString(GetStringByValue()) 915 (matcher = cxxBindTemporaryExpr()) 916 FunctionTakesString(GetStringByValue()); 917 FunctionTakesStringByPointer(GetStringPointer()); 918</pre></td></tr> 919 920 921<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>...</td></tr> 922<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 923 924Example matches true 925 true 926</pre></td></tr> 927 928 929<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>>...</td></tr> 930<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 931 932 try {} catch(int i) {} 933cxxCatchStmt() 934 matches 'catch(int i)' 935</pre></td></tr> 936 937 938<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>>...</td></tr> 939<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 940 941Example: Matches const_cast<int*>(&r) in 942 int n = 42; 943 const int &r(n); 944 int* p = const_cast<int*>(&r); 945</pre></td></tr> 946 947 948<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>...</td></tr> 949<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 950 951Example matches string(ptr, n) and ptr within arguments of f 952 (matcher = cxxConstructExpr()) 953 void f(const string &a, const string &b); 954 char *ptr; 955 int n; 956 f(string(ptr, n), ptr); 957</pre></td></tr> 958 959 960<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>>...</td></tr> 961<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 962 963Example matches the CXXDefaultArgExpr placeholder inserted for the 964 default value of the second parameter in the call expression f(42) 965 (matcher = cxxDefaultArgExpr()) 966 void f(int x, int y = 0); 967 f(42); 968</pre></td></tr> 969 970 971<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>>...</td></tr> 972<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 973 974Given 975 delete X; 976cxxDeleteExpr() 977 matches 'delete X'. 978</pre></td></tr> 979 980 981<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>>...</td></tr> 982<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be 983resolved because the base expression or the member name was dependent. 984 985Given 986 template <class T> void f() { T t; t.g(); } 987cxxDependentScopeMemberExpr() 988 matches t.g 989</pre></td></tr> 990 991 992<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>>...</td></tr> 993<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 994 995Example: 996 cxxDynamicCastExpr() 997matches 998 dynamic_cast<D*>(&b); 999in 1000 struct B { virtual ~B() {} }; struct D : B {}; 1001 B b; 1002 D* p = dynamic_cast<D*>(&b); 1003</pre></td></tr> 1004 1005 1006<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>>...</td></tr> 1007<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 1008 1009cxxForRangeStmt() matches 'for (auto a : i)' 1010 int i[] = {1, 2, 3}; for (auto a : i); 1011 for(int j = 0; j < 5; ++j); 1012</pre></td></tr> 1013 1014 1015<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>...</td></tr> 1016<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 1017 1018Example: Matches Foo(bar); 1019 Foo f = bar; 1020 Foo g = (Foo) bar; 1021 Foo h = Foo(bar); 1022</pre></td></tr> 1023 1024 1025<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr> 1026<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 1027 1028Example matches x.y() 1029 X x; 1030 x.y(); 1031</pre></td></tr> 1032 1033 1034<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>...</td></tr> 1035<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 1036 1037Given 1038 new X; 1039cxxNewExpr() 1040 matches 'new X'. 1041</pre></td></tr> 1042 1043 1044<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>>...</td></tr> 1045<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions. 1046 1047Given 1048 bool a() noexcept; 1049 bool b() noexcept(true); 1050 bool c() noexcept(false); 1051 bool d() noexcept(noexcept(a())); 1052 bool e = noexcept(b()) || noexcept(c()); 1053cxxNoexceptExpr() 1054 matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`. 1055 doesn't match the noexcept specifier in the declarations a, b, c or d. 1056</pre></td></tr> 1057 1058 1059<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>>...</td></tr> 1060<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 1061</pre></td></tr> 1062 1063 1064<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr> 1065<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 1066 1067Note that if an operator isn't overloaded, it won't match. Instead, use 1068binaryOperator matcher. 1069Currently it does not match operators such as new delete. 1070FIXME: figure out why these do not match? 1071 1072Example matches both operator<<((o << b), c) and operator<<(o, b) 1073 (matcher = cxxOperatorCallExpr()) 1074 ostream &operator<< (ostream &out, int i) { }; 1075 ostream &o; int b = 1, c = 1; 1076 o << b << c; 1077</pre></td></tr> 1078 1079 1080<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>>...</td></tr> 1081<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 1082 1083Either the source expression or the destination type can be matched 1084using has(), but hasDestinationType() is more specific and can be 1085more readable. 1086 1087Example matches reinterpret_cast<char*>(&p) in 1088 void* p = reinterpret_cast<char*>(&p); 1089</pre></td></tr> 1090 1091 1092<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>>...</td></tr> 1093<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 1094 1095See also: hasDestinationType 1096See also: reinterpretCast 1097 1098Example: 1099 cxxStaticCastExpr() 1100matches 1101 static_cast<long>(8) 1102in 1103 long eight(static_cast<long>(8)); 1104</pre></td></tr> 1105 1106 1107<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>>...</td></tr> 1108<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions. 1109 1110Given 1111 std::vector<int> a({ 1, 2, 3 }); 1112 std::vector<int> b = { 4, 5 }; 1113 int c[] = { 6, 7 }; 1114 std::pair<int, int> d = { 8, 9 }; 1115cxxStdInitializerListExpr() 1116 matches "{ 1, 2, 3 }" and "{ 4, 5 }" 1117</pre></td></tr> 1118 1119 1120<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>...</td></tr> 1121<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 1122 1123Example: Matches Foo(bar, bar) 1124 Foo h = Foo(bar, bar); 1125</pre></td></tr> 1126 1127 1128<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>>...</td></tr> 1129<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 1130 1131Example matches the implicit this expression in "return i". 1132 (matcher = cxxThisExpr()) 1133struct foo { 1134 int i; 1135 int f() { return i; } 1136}; 1137</pre></td></tr> 1138 1139 1140<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>>...</td></tr> 1141<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 1142 1143 try { throw 5; } catch(int i) {} 1144cxxThrowExpr() 1145 matches 'throw 5' 1146</pre></td></tr> 1147 1148 1149<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>>...</td></tr> 1150<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 1151 1152 try {} catch(int i) {} 1153cxxTryStmt() 1154 matches 'try {}' 1155</pre></td></tr> 1156 1157 1158<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>...</td></tr> 1159<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 1160 1161Example matches T(t) in return statement of f 1162 (matcher = cxxUnresolvedConstructExpr()) 1163 template <typename T> 1164 void f(const T& t) { return T(t); } 1165</pre></td></tr> 1166 1167 1168<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>...</td></tr> 1169<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 1170 1171Example matches x in if (x) 1172 bool x; 1173 if (x) {} 1174</pre></td></tr> 1175 1176 1177<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>>...</td></tr> 1178<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 1179 1180Given 1181 int a; 1182declStmt() 1183 matches 'int a'. 1184</pre></td></tr> 1185 1186 1187<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>>...</td></tr> 1188<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 1189 1190Given 1191 switch(a) { case 42: break; default: break; } 1192defaultStmt() 1193 matches 'default:'. 1194</pre></td></tr> 1195 1196 1197<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>>...</td></tr> 1198<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8]. 1199 1200Example: Matches { [2].y = 1.0, [0].x = 1.0 } 1201 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 1202</pre></td></tr> 1203 1204 1205<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>>...</td></tr> 1206<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 1207 1208Given 1209 do {} while (true); 1210doStmt() 1211 matches 'do {} while(true)' 1212</pre></td></tr> 1213 1214 1215<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>...</td></tr> 1216<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 1217 1218Matches any cast expression written in user code, whether it be a 1219C-style cast, a functional-style cast, or a keyword cast. 1220 1221Does not match implicit conversions. 1222 1223Note: the name "explicitCast" is chosen to match Clang's terminology, as 1224Clang uses the term "cast" to apply to implicit conversions as well as to 1225actual cast expressions. 1226 1227See also: hasDestinationType. 1228 1229Example: matches all five of the casts in 1230 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 1231but does not match the implicit conversion in 1232 long ell = 42; 1233</pre></td></tr> 1234 1235 1236<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>...</td></tr> 1237<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 1238 1239Example matches x() 1240 void f() { x(); } 1241</pre></td></tr> 1242 1243 1244<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>>...</td></tr> 1245<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 1246of the sub-expression's evaluation. 1247 1248Example matches std::string() 1249 const std::string str = std::string(); 1250</pre></td></tr> 1251 1252 1253<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('fixedPointLiteral0')"><a name="fixedPointLiteral0Anchor">fixedPointLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FixedPointLiteral.html">FixedPointLiteral</a>>...</td></tr> 1254<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals 1255</pre></td></tr> 1256 1257 1258<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>...</td></tr> 1259<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g. 12601.0, 1.0f, 1.0L and 1e10. 1261 1262Does not match implicit conversions such as 1263 float a = 10; 1264</pre></td></tr> 1265 1266 1267<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>>...</td></tr> 1268<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 1269 1270Example matches 'for (;;) {}' 1271 for (;;) {} 1272 int i[] = {1, 2, 3}; for (auto a : i); 1273</pre></td></tr> 1274 1275 1276<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>>...</td></tr> 1277<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 1278</pre></td></tr> 1279 1280 1281<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>>...</td></tr> 1282<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 1283 1284Given 1285 goto FOO; 1286 FOO: bar(); 1287gotoStmt() 1288 matches 'goto FOO' 1289</pre></td></tr> 1290 1291 1292<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>>...</td></tr> 1293<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 1294 1295Example matches 'if (x) {}' 1296 if (x) {} 1297</pre></td></tr> 1298 1299 1300<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>>...</td></tr> 1301<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating 1302point literals e.g.: 1i, 1.0i 1303</pre></td></tr> 1304 1305 1306<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>>...</td></tr> 1307<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 1308 1309This matches many different places, including function call return value 1310eliding, as well as any type conversions. 1311</pre></td></tr> 1312 1313 1314<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>>...</td></tr> 1315<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions. 1316 1317Given 1318 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 1319implicitValueInitExpr() 1320 matches "[0].y" (implicitly) 1321</pre></td></tr> 1322 1323 1324<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>>...</td></tr> 1325<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 1326 1327Given 1328 int a[] = { 1, 2 }; 1329 struct B { int x, y; }; 1330 B b = { 5, 6 }; 1331initListExpr() 1332 matches "{ 1, 2 }" and "{ 5, 6 }" 1333</pre></td></tr> 1334 1335 1336<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>...</td></tr> 1337<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g. 13381, 1L, 0x1 and 1U. 1339 1340Does not match character-encoded integers such as L'a'. 1341</pre></td></tr> 1342 1343 1344<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>...</td></tr> 1345<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 1346 1347Given 1348 goto FOO; 1349 FOO: bar(); 1350labelStmt() 1351 matches 'FOO:' 1352</pre></td></tr> 1353 1354 1355<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>>...</td></tr> 1356<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1357 1358Example matches [&](){return 5;} 1359 [&](){return 5;} 1360</pre></td></tr> 1361 1362 1363<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>>...</td></tr> 1364<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1365 1366Example: Given 1367 struct T {void func();}; 1368 T f(); 1369 void g(T); 1370materializeTemporaryExpr() matches 'f()' in these statements 1371 T u(f()); 1372 g(f()); 1373 f().func(); 1374but does not match 1375 f(); 1376</pre></td></tr> 1377 1378 1379<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>...</td></tr> 1380<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1381 1382Given 1383 class Y { 1384 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1385 int a; static int b; 1386 }; 1387memberExpr() 1388 matches this->x, x, y.x, a, this->b 1389</pre></td></tr> 1390 1391 1392<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>>...</td></tr> 1393<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1394 1395 foo();; 1396nullStmt() 1397 matches the second ';' 1398</pre></td></tr> 1399 1400 1401<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>>...</td></tr> 1402<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements. 1403 1404Example matches @catch 1405 @try {} 1406 @catch (...) {} 1407</pre></td></tr> 1408 1409 1410<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>>...</td></tr> 1411<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements. 1412 1413Example matches @finally 1414 @try {} 1415 @finally {} 1416</pre></td></tr> 1417 1418 1419<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>>...</td></tr> 1420<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar. 1421 1422Example: matches "a" in "init" method: 1423@implementation A { 1424 NSString *a; 1425} 1426- (void) init { 1427 a = @"hello"; 1428} 1429</pre></td></tr> 1430 1431 1432<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>>...</td></tr> 1433<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 1434 1435The innermost message send invokes the "alloc" class method on the 1436NSString class, while the outermost message send invokes the 1437"initWithString" instance method on the object returned from 1438NSString's "alloc". This matcher should match both message sends. 1439 [[NSString alloc] initWithString:@"Hello"] 1440</pre></td></tr> 1441 1442 1443<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>>...</td></tr> 1444<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements. 1445 1446Example matches @throw obj; 1447</pre></td></tr> 1448 1449 1450<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>>...</td></tr> 1451<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements. 1452 1453Example matches @try 1454 @try {} 1455 @catch (...) {} 1456</pre></td></tr> 1457 1458 1459<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>>...</td></tr> 1460<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive. 1461 1462Given 1463 1464 #pragma omp parallel 1465 #pragma omp parallel default(none) 1466 #pragma omp taskyield 1467 1468``ompExecutableDirective()`` matches ``omp parallel``, 1469``omp parallel default(none)`` and ``omp taskyield``. 1470</pre></td></tr> 1471 1472 1473<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>>...</td></tr> 1474<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers 1475to reference another expressions and can be met 1476in BinaryConditionalOperators, for example. 1477 1478Example matches 'a' 1479 (a ?: c) + 42; 1480</pre></td></tr> 1481 1482 1483<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>>...</td></tr> 1484<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions. 1485 1486Example matches (foo() + 1) 1487 int foo() { return 1; } 1488 int a = (foo() + 1); 1489</pre></td></tr> 1490 1491 1492<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>>...</td></tr> 1493<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions. 1494ParenListExprs don't have a predefined type and are used for late parsing. 1495In the final AST, they can be met in template declarations. 1496 1497Given 1498 template<typename T> class X { 1499 void f() { 1500 X x(*this); 1501 int a = 0, b = 1; int i = (a, b); 1502 } 1503 }; 1504parenListExpr() matches "*this" but NOT matches (a, b) because (a, b) 1505has a predefined type and is a ParenExpr, not a ParenListExpr. 1506</pre></td></tr> 1507 1508 1509<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>>...</td></tr> 1510<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2]. 1511 1512Example: Matches __func__ 1513 printf("%s", __func__); 1514</pre></td></tr> 1515 1516 1517<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>>...</td></tr> 1518<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 1519 1520Given 1521 return 1; 1522returnStmt() 1523 matches 'return 1' 1524</pre></td></tr> 1525 1526 1527<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>...</td></tr> 1528<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 1529 1530Given 1531 { ++a; } 1532stmt() 1533 matches both the compound statement '{ ++a; }' and '++a'. 1534</pre></td></tr> 1535 1536 1537<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>>...</td></tr> 1538<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension). 1539 1540Example match: ({ int X = 4; X; }) 1541 int C = ({ int X = 4; X; }); 1542</pre></td></tr> 1543 1544 1545<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>>...</td></tr> 1546<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 1547 1548Example matches "abcd", L"abcd" 1549 char *s = "abcd"; 1550 wchar_t *ws = L"abcd"; 1551</pre></td></tr> 1552 1553 1554<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>>...</td></tr> 1555<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 1556 1557Given 1558 template <int N> 1559 struct A { static const int n = N; }; 1560 struct B : public A<42> {}; 1561substNonTypeTemplateParmExpr() 1562 matches "N" in the right-hand side of "static const int n = N;" 1563</pre></td></tr> 1564 1565 1566<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>>...</td></tr> 1567<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 1568 1569Given 1570 switch(a) { case 42: break; default: break; } 1571switchCase() 1572 matches 'case 42:' and 'default:'. 1573</pre></td></tr> 1574 1575 1576<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>>...</td></tr> 1577<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 1578 1579Given 1580 switch(a) { case 42: break; default: break; } 1581switchStmt() 1582 matches 'switch(a)'. 1583</pre></td></tr> 1584 1585 1586<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>>...</td></tr> 1587<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 1588 1589Given 1590 Foo x = bar; 1591 int y = sizeof(x) + alignof(x); 1592unaryExprOrTypeTraitExpr() 1593 matches sizeof(x) and alignof(x) 1594</pre></td></tr> 1595 1596 1597<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>>...</td></tr> 1598<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 1599 1600Example matches !a 1601 !a || b 1602</pre></td></tr> 1603 1604 1605<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>>...</td></tr> 1606<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing 1607but could not be resolved to a specific declaration. 1608 1609Given 1610 template<typename T> 1611 T foo() { T a; return a; } 1612 template<typename T> 1613 void bar() { 1614 foo<T>(); 1615 } 1616unresolvedLookupExpr() 1617 matches foo<T>() </pre></td></tr> 1618 1619 1620<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>>...</td></tr> 1621<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions. 1622 1623Given 1624 struct X { 1625 template <class T> void f(); 1626 void g(); 1627 }; 1628 template <class T> void h() { X x; x.f<T>(); x.g(); } 1629unresolvedMemberExpr() 1630 matches x.f<T> 1631</pre></td></tr> 1632 1633 1634<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>>...</td></tr> 1635<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 1636 1637Example match: "foo"_suffix 1638</pre></td></tr> 1639 1640 1641<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>>...</td></tr> 1642<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 1643 1644Given 1645 while (true) {} 1646whileStmt() 1647 matches 'while (true) {}'. 1648</pre></td></tr> 1649 1650 1651<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>></td><td class="name" onclick="toggle('templateArgumentLoc0')"><a name="templateArgumentLoc0Anchor">templateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>...</td></tr> 1652<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info). 1653 1654Given 1655 template <typename T> struct C {}; 1656 C<int> c; 1657templateArgumentLoc() 1658 matches 'int' in C<int>. 1659</pre></td></tr> 1660 1661 1662<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>>...</td></tr> 1663<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 1664 1665Given 1666 template <typename T> struct C {}; 1667 C<int> c; 1668templateArgument() 1669 matches 'int' in C<int>. 1670</pre></td></tr> 1671 1672 1673<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>></td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>>...</td></tr> 1674<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name. 1675 1676Given 1677 template <typename T> class X { }; 1678 X<int> xi; 1679templateName() 1680 matches 'X' in X<int>. 1681</pre></td></tr> 1682 1683 1684<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>...</td></tr> 1685<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 1686</pre></td></tr> 1687 1688 1689<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>...</td></tr> 1690<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 1691 1692Given 1693 int a[] = { 2, 3 }; 1694 int b[4]; 1695 void f() { int c[a[0]]; } 1696arrayType() 1697 matches "int a[]", "int b[4]" and "int c[a[0]]"; 1698</pre></td></tr> 1699 1700 1701<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>>...</td></tr> 1702<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 1703 1704Given 1705 _Atomic(int) i; 1706atomicType() 1707 matches "_Atomic(int) i" 1708</pre></td></tr> 1709 1710 1711<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>>...</td></tr> 1712<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 1713 1714Given: 1715 auto n = 4; 1716 int v[] = { 2, 3 } 1717 for (auto i : v) { } 1718autoType() 1719 matches "auto n" and "auto i" 1720</pre></td></tr> 1721 1722 1723<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>...</td></tr> 1724<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 1725"void (^)(int)". 1726 1727The pointee is always required to be a FunctionType. 1728</pre></td></tr> 1729 1730 1731<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>>...</td></tr> 1732<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 1733 1734Given 1735 struct A {}; 1736 A a; 1737 int b; 1738 float c; 1739 bool d; 1740builtinType() 1741 matches "int b", "float c" and "bool d" 1742</pre></td></tr> 1743 1744 1745<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>>...</td></tr> 1746<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 1747 1748Given 1749 _Complex float f; 1750complexType() 1751 matches "_Complex float f" 1752</pre></td></tr> 1753 1754 1755<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>>...</td></tr> 1756<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 1757 1758Given 1759 void() { 1760 int a[2]; 1761 int b[] = { 2, 3 }; 1762 int c[b[0]]; 1763 } 1764constantArrayType() 1765 matches "int a[2]" 1766</pre></td></tr> 1767 1768 1769<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>>...</td></tr> 1770<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 1771Example matches i[] in declaration of f. 1772 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 1773Example matches i[1]. 1774 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 1775 void f(int i[]) { 1776 i[1] = 0; 1777 } 1778</pre></td></tr> 1779 1780 1781<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>>...</td></tr> 1782<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(<expr>) types. 1783 1784Given: 1785 short i = 1; 1786 int j = 42; 1787 decltype(i + j) result = i + j; 1788decltypeType() 1789 matches "decltype(i + j)" 1790</pre></td></tr> 1791 1792 1793<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>>...</td></tr> 1794<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class 1795template types. 1796 1797Given 1798 template <typename T> 1799 class C { public: C(T); }; 1800 1801 C c(123); 1802deducedTemplateSpecializationType() matches the type in the declaration 1803of the variable c. 1804</pre></td></tr> 1805 1806 1807<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>>...</td></tr> 1808<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 1809 1810Given 1811 template<typename T, int Size> 1812 class array { 1813 T data[Size]; 1814 }; 1815dependentSizedArrayType 1816 matches "T data[Size]" 1817</pre></td></tr> 1818 1819 1820<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>>...</td></tr> 1821<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 1822qualified name. 1823 1824Given 1825 namespace N { 1826 namespace M { 1827 class D {}; 1828 } 1829 } 1830 class C {}; 1831 1832 class C c; 1833 N::M::D d; 1834 1835elaboratedType() matches the type of the variable declarations of both 1836c and d. 1837</pre></td></tr> 1838 1839 1840<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>...</td></tr> 1841<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types. 1842 1843Given 1844 enum C { Green }; 1845 enum class S { Red }; 1846 1847 C c; 1848 S s; 1849 1850enumType() matches the type of the variable declarations of both c and 1851s. 1852</pre></td></tr> 1853 1854 1855<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>>...</td></tr> 1856<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes. 1857 1858Given 1859 int (*f)(int); 1860 void g(); 1861functionProtoType() 1862 matches "int (*f)(int)" and the type of "g" in C++ mode. 1863 In C mode, "g" is not matched because it does not contain a prototype. 1864</pre></td></tr> 1865 1866 1867<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>>...</td></tr> 1868<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 1869 1870Given 1871 int (*f)(int); 1872 void g(); 1873functionType() 1874 matches "int (*f)(int)" and the type of "g". 1875</pre></td></tr> 1876 1877 1878<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>>...</td></tr> 1879<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 1880 1881Given 1882 int a[] = { 2, 3 }; 1883 int b[42]; 1884 void f(int c[]) { int d[a[0]]; }; 1885incompleteArrayType() 1886 matches "int a[]" and "int c[]" 1887</pre></td></tr> 1888 1889 1890<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>...</td></tr> 1891<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 1892 1893Example matches S s, but not S<T> s. 1894 (matcher = parmVarDecl(hasType(injectedClassNameType()))) 1895 template <typename T> struct S { 1896 void f(S s); 1897 void g(S<T> s); 1898 }; 1899</pre></td></tr> 1900 1901 1902<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>>...</td></tr> 1903<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 1904 1905Given: 1906 int *a; 1907 int &b = *a; 1908 int &&c = 1; 1909 auto &d = b; 1910 auto &&e = c; 1911 auto &&f = 2; 1912 int g = 5; 1913 1914lValueReferenceType() matches the types of b, d, and e. e is 1915matched since the type is deduced as int& by reference collapsing rules. 1916</pre></td></tr> 1917 1918 1919<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>...</td></tr> 1920<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 1921Given 1922 struct A { int i; } 1923 A::* ptr = A::i; 1924memberPointerType() 1925 matches "A::* ptr" 1926</pre></td></tr> 1927 1928 1929<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>>...</td></tr> 1930<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 1931a pointer type, despite being syntactically similar. 1932 1933Given 1934 int *a; 1935 1936 @interface Foo 1937 @end 1938 Foo *f; 1939pointerType() 1940 matches "Foo *f", but does not match "int *a". 1941</pre></td></tr> 1942 1943 1944<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>>...</td></tr> 1945<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 1946 1947Given 1948 int (*ptr_to_array)[4]; 1949 int *array_of_ptrs[4]; 1950 1951varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 1952array_of_ptrs. 1953</pre></td></tr> 1954 1955 1956<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>...</td></tr> 1957<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 1958types. 1959 1960Given 1961 int *a; 1962 int &b = *a; 1963 int c = 5; 1964 1965 @interface Foo 1966 @end 1967 Foo *f; 1968pointerType() 1969 matches "int *a", but does not match "Foo *f". 1970</pre></td></tr> 1971 1972 1973<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>>...</td></tr> 1974<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 1975 1976Given: 1977 int *a; 1978 int &b = *a; 1979 int &&c = 1; 1980 auto &d = b; 1981 auto &&e = c; 1982 auto &&f = 2; 1983 int g = 5; 1984 1985rValueReferenceType() matches the types of c and f. e is not 1986matched as it is deduced to int& by reference collapsing rules. 1987</pre></td></tr> 1988 1989 1990<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>...</td></tr> 1991<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 1992 1993Given 1994 class C {}; 1995 struct S {}; 1996 1997 C c; 1998 S s; 1999 2000recordType() matches the type of the variable declarations of both c 2001and s. 2002</pre></td></tr> 2003 2004 2005<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>...</td></tr> 2006<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 2007 2008Given 2009 int *a; 2010 int &b = *a; 2011 int &&c = 1; 2012 auto &d = b; 2013 auto &&e = c; 2014 auto &&f = 2; 2015 int g = 5; 2016 2017referenceType() matches the types of b, c, d, e, and f. 2018</pre></td></tr> 2019 2020 2021<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>>...</td></tr> 2022<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 2023template type parameter. 2024 2025Given 2026 template <typename T> 2027 void F(T t) { 2028 int i = 1 + t; 2029 } 2030 2031substTemplateTypeParmType() matches the type of 't' but not '1' 2032</pre></td></tr> 2033 2034 2035<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>...</td></tr> 2036<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types). 2037 2038Given 2039 enum E {}; 2040 class C {}; 2041 2042 E e; 2043 C c; 2044 2045tagType() matches the type of the variable declarations of both e 2046and c. 2047</pre></td></tr> 2048 2049 2050<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>...</td></tr> 2051<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 2052 2053Given 2054 template <typename T> 2055 class C { }; 2056 2057 template class C<int>; // A 2058 C<char> var; // B 2059 2060templateSpecializationType() matches the type of the explicit 2061instantiation in A and the type of the variable declaration in B. 2062</pre></td></tr> 2063 2064 2065<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>...</td></tr> 2066<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 2067 2068Example matches T, but not int. 2069 (matcher = templateTypeParmType()) 2070 template <typename T> void f(int i); 2071</pre></td></tr> 2072 2073 2074<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>>...</td></tr> 2075<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 2076</pre></td></tr> 2077 2078 2079<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>...</td></tr> 2080<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 2081 2082Given 2083 typedef int X; 2084typedefType() 2085 matches "typedef int X" 2086</pre></td></tr> 2087 2088 2089<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>>...</td></tr> 2090<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 2091 2092Given: 2093 typedef __underlying_type(T) type; 2094unaryTransformType() 2095 matches "__underlying_type(T)" 2096</pre></td></tr> 2097 2098 2099<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>>...</td></tr> 2100<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 2101integer-constant-expression. 2102 2103Given 2104 void f() { 2105 int a[] = { 2, 3 } 2106 int b[42]; 2107 int c[a[0]]; 2108 } 2109variableArrayType() 2110 matches "int c[a[0]]" 2111</pre></td></tr> 2112 2113<!--END_DECL_MATCHERS --> 2114</table> 2115 2116<!-- ======================================================================= --> 2117<h2 id="narrowing-matchers">Narrowing Matchers</h2> 2118<!-- ======================================================================= --> 2119 2120<p>Narrowing matchers match certain attributes on the current node, thus 2121narrowing down the set of nodes of the current type to match on.</p> 2122 2123<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 2124which allow users to create more powerful match expressions.</p> 2125 2126<table> 2127<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 2128<!-- START_NARROWING_MATCHERS --> 2129 2130<tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2131<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 2132 2133Usable as: Any Matcher 2134</pre></td></tr> 2135 2136 2137<tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2138<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 2139 2140Usable as: Any Matcher 2141</pre></td></tr> 2142 2143 2144<tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 2145<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 2146 2147Useful when another matcher requires a child matcher, but there's no 2148additional constraint. This will often be used with an explicit conversion 2149to an internal::Matcher<> type such as TypeMatcher. 2150 2151Example: DeclarationMatcher(anything()) matches all declarations, e.g., 2152"int* p" and "void f()" in 2153 int* p; 2154 void f(); 2155 2156Usable as: Any Matcher 2157</pre></td></tr> 2158 2159 2160<tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 2161<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 2162 2163Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 2164 class X {}; 2165 class Y {}; 2166 2167Usable as: Any Matcher 2168</pre></td></tr> 2169 2170 2171<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName0')"><a name="hasAnyOperatorName0Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 2172<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the 2173specified names. 2174 2175 hasAnyOperatorName("+", "-") 2176 Is equivalent to 2177 anyOf(hasOperatorName("+"), hasOperatorName("-")) 2178</pre></td></tr> 2179 2180 2181<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 2182<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 2183unary). 2184 2185Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 2186 !(a || b) 2187</pre></td></tr> 2188 2189 2190<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr> 2191<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators. 2192 2193Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2194 if (a == b) 2195 a += b; 2196 2197Example 2: matches s1 = s2 2198 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2199 struct S { S& operator=(const S&); }; 2200 void x() { S s1, s2; s1 = s2; } 2201</pre></td></tr> 2202 2203 2204<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('isComparisonOperator0')"><a name="isComparisonOperator0Anchor">isComparisonOperator</a></td><td></td></tr> 2205<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators. 2206 2207Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 2208 if (a == b) 2209 a += b; 2210 2211Example 2: matches s1 < s2 2212 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 2213 struct S { bool operator<(const S& other); }; 2214 void x(S s1, S s2) { bool b1 = s1 < s2; } 2215</pre></td></tr> 2216 2217 2218<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isPrivate1')"><a name="isPrivate1Anchor">isPrivate</a></td><td></td></tr> 2219<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private 2220inheritance. 2221 2222Examples: 2223 class C { 2224 public: int a; 2225 protected: int b; 2226 private: int c; // fieldDecl(isPrivate()) matches 'c' 2227 }; 2228 2229 struct Base {}; 2230 struct Derived1 : private Base {}; // matches 'Base' 2231 class Derived2 : Base {}; // matches 'Base' 2232</pre></td></tr> 2233 2234 2235<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isProtected1')"><a name="isProtected1Anchor">isProtected</a></td><td></td></tr> 2236<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify 2237protected inheritance. 2238 2239Examples: 2240 class C { 2241 public: int a; 2242 protected: int b; // fieldDecl(isProtected()) matches 'b' 2243 private: int c; 2244 }; 2245 2246 class Base {}; 2247 class Derived : protected Base {}; // matches 'Base' 2248</pre></td></tr> 2249 2250 2251<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isPublic1')"><a name="isPublic1Anchor">isPublic</a></td><td></td></tr> 2252<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public 2253inheritance. 2254 2255Examples: 2256 class C { 2257 public: int a; // fieldDecl(isPublic()) matches 'a' 2258 protected: int b; 2259 private: int c; 2260 }; 2261 2262 class Base {}; 2263 class Derived1 : public Base {}; // matches 'Base' 2264 struct Derived2 : Base {}; // matches 'Base' 2265</pre></td></tr> 2266 2267 2268<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isVirtual1')"><a name="isVirtual1Anchor">isVirtual</a></td><td></td></tr> 2269<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify 2270virtual inheritance. 2271 2272Example: 2273 class A { 2274 public: 2275 virtual void x(); // matches x 2276 }; 2277 2278Example: 2279 class Base {}; 2280 class DirectlyDerived : virtual Base {}; // matches Base 2281 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 2282 2283Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 2284</pre></td></tr> 2285 2286 2287<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr> 2288<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr> 2289 2290 2291<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT Value</td></tr> 2292<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT. 2293 2294Given 2295 f('false, 3.14, 42); 2296characterLiteral(equals(0)) 2297 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2298 match false 2299floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2300 match 3.14 2301integerLiteral(equals(42)) 2302 matches 42 2303 2304Note that you cannot directly match a negative numeric literal because the 2305minus sign is not part of the literal: It is a unary operator whose operand 2306is the positive numeric literal. Instead, you must use a unaryOperator() 2307matcher to match the minus sign: 2308 2309unaryOperator(hasOperatorName("-"), 2310 hasUnaryOperand(integerLiteral(equals(13)))) 2311 2312Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 2313 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 2314</pre></td></tr> 2315 2316 2317<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr> 2318<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr> 2319 2320 2321<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr> 2322<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr> 2323 2324 2325<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>></td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr> 2326<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 2327 2328Given 2329 try { 2330 // ... 2331 } catch (int) { 2332 // ... 2333 } catch (...) { 2334 // ... 2335 } 2336cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 2337</pre></td></tr> 2338 2339 2340<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 2341<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 2342a specific number of arguments (including absent default arguments). 2343 2344Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2345 void f(int x, int y); 2346 f(0, 0); 2347</pre></td></tr> 2348 2349 2350<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr> 2351<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 2352</pre></td></tr> 2353 2354 2355<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr> 2356<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 2357zero initialization. 2358 2359Given 2360void foo() { 2361 struct point { double x; double y; }; 2362 point pt[2] = { { 1.0, 2.0 } }; 2363} 2364initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 2365will match the implicit array filler for pt[1]. 2366</pre></td></tr> 2367 2368 2369<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr> 2370<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 2371 2372Given 2373 struct S { 2374 S(); // #1 2375 S(const S &); // #2 2376 S(S &&); // #3 2377 }; 2378cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 2379</pre></td></tr> 2380 2381 2382<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr> 2383<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 2384 2385Given 2386 struct S { 2387 S(); // #1 2388 S(const S &); // #2 2389 S(S &&); // #3 2390 }; 2391cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 2392</pre></td></tr> 2393 2394 2395<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr> 2396<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 2397 2398Given 2399 struct S { 2400 S(); // #1 2401 S(int) {} // #2 2402 S(S &&) : S() {} // #3 2403 }; 2404 S::S() : S(0) {} // #4 2405cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 2406#1 or #2. 2407</pre></td></tr> 2408 2409 2410<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr> 2411<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations 2412that have an explicit specifier if this explicit specifier is resolved to 2413true. 2414 2415Given 2416 template<bool b> 2417 struct S { 2418 S(int); // #1 2419 explicit S(double); // #2 2420 operator int(); // #3 2421 explicit operator bool(); // #4 2422 explicit(false) S(bool) // # 7 2423 explicit(true) S(char) // # 8 2424 explicit(b) S(S) // # 9 2425 }; 2426 S(int) -> S<true> // #5 2427 explicit S(double) -> S<false> // #6 2428cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2429cxxConversionDecl(isExplicit()) will match #4, but not #3. 2430cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2431</pre></td></tr> 2432 2433 2434<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr> 2435<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 2436 2437Given 2438 struct S { 2439 S(); // #1 2440 S(const S &); // #2 2441 S(S &&); // #3 2442 }; 2443cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 2444</pre></td></tr> 2445 2446 2447<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>></td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr> 2448<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations 2449that have an explicit specifier if this explicit specifier is resolved to 2450true. 2451 2452Given 2453 template<bool b> 2454 struct S { 2455 S(int); // #1 2456 explicit S(double); // #2 2457 operator int(); // #3 2458 explicit operator bool(); // #4 2459 explicit(false) S(bool) // # 7 2460 explicit(true) S(char) // # 8 2461 explicit(b) S(S) // # 9 2462 }; 2463 S(int) -> S<true> // #5 2464 explicit S(double) -> S<false> // #6 2465cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2466cxxConversionDecl(isExplicit()) will match #4, but not #3. 2467cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2468</pre></td></tr> 2469 2470 2471<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr> 2472<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 2473opposed to a member. 2474 2475Given 2476 struct B {}; 2477 struct D : B { 2478 int I; 2479 D(int i) : I(i) {} 2480 }; 2481 struct E : B { 2482 E() : B() {} 2483 }; 2484cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 2485 will match E(), but not match D(int). 2486</pre></td></tr> 2487 2488 2489<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr> 2490<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 2491opposed to a base. 2492 2493Given 2494 struct B {}; 2495 struct D : B { 2496 int I; 2497 D(int i) : I(i) {} 2498 }; 2499 struct E : B { 2500 E() : B() {} 2501 }; 2502cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 2503 will match D(int), but not match E(). 2504</pre></td></tr> 2505 2506 2507<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr> 2508<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 2509code (as opposed to implicitly added by the compiler). 2510 2511Given 2512 struct Foo { 2513 Foo() { } 2514 Foo(int) : foo_("A") { } 2515 string foo_; 2516 }; 2517cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 2518 will match Foo(int), but not Foo() 2519</pre></td></tr> 2520 2521 2522<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>></td><td class="name" onclick="toggle('isExplicit2')"><a name="isExplicit2Anchor">isExplicit</a></td><td></td></tr> 2523<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations 2524that have an explicit specifier if this explicit specifier is resolved to 2525true. 2526 2527Given 2528 template<bool b> 2529 struct S { 2530 S(int); // #1 2531 explicit S(double); // #2 2532 operator int(); // #3 2533 explicit operator bool(); // #4 2534 explicit(false) S(bool) // # 7 2535 explicit(true) S(char) // # 8 2536 explicit(b) S(S) // # 9 2537 }; 2538 S(int) -> S<true> // #5 2539 explicit S(double) -> S<false> // #6 2540cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2541cxxConversionDecl(isExplicit()) will match #4, but not #3. 2542cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2543</pre></td></tr> 2544 2545 2546<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr> 2547<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed 2548to '.'. 2549 2550Member calls on the implicit this pointer match as called with '->'. 2551 2552Given 2553 class Y { 2554 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 2555 template <class T> void f() { this->f<T>(); f<T>(); } 2556 int a; 2557 static int b; 2558 }; 2559 template <class T> 2560 class Z { 2561 void x() { this->m; } 2562 }; 2563memberExpr(isArrow()) 2564 matches this->x, x, y.x, a, this->b 2565cxxDependentScopeMemberExpr(isArrow()) 2566 matches this->m 2567unresolvedMemberExpr(isArrow()) 2568 matches this->f<T>, f<T> 2569</pre></td></tr> 2570 2571 2572<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr> 2573<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 2574 2575Given 2576struct A { 2577 void foo() const; 2578 void bar(); 2579}; 2580 2581cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 2582</pre></td></tr> 2583 2584 2585<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr> 2586<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 2587operator. 2588 2589Given 2590struct A { 2591 A &operator=(const A &); 2592 A &operator=(A &&); 2593}; 2594 2595cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 2596the second one. 2597</pre></td></tr> 2598 2599 2600<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr> 2601<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 2602 2603Given: 2604 class A final {}; 2605 2606 struct B { 2607 virtual void f(); 2608 }; 2609 2610 struct C : B { 2611 void f() final; 2612 }; 2613matches A and C::f, but not B, C, or B::f 2614</pre></td></tr> 2615 2616 2617<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr> 2618<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 2619operator. 2620 2621Given 2622struct A { 2623 A &operator=(const A &); 2624 A &operator=(A &&); 2625}; 2626 2627cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 2628the first one. 2629</pre></td></tr> 2630 2631 2632<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr> 2633<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 2634 2635Given 2636 class A { 2637 public: 2638 virtual void x(); 2639 }; 2640 class B : public A { 2641 public: 2642 virtual void x(); 2643 }; 2644 matches B::x 2645</pre></td></tr> 2646 2647 2648<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr> 2649<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 2650 2651Given 2652 class A { 2653 public: 2654 virtual void x() = 0; 2655 }; 2656 matches A::x 2657</pre></td></tr> 2658 2659 2660<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr> 2661<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 2662 2663Given 2664 struct S { 2665 S(); // #1 2666 S(const S &) = default; // #2 2667 S(S &&) = delete; // #3 2668 }; 2669cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 2670</pre></td></tr> 2671 2672 2673<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr> 2674<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify 2675virtual inheritance. 2676 2677Example: 2678 class A { 2679 public: 2680 virtual void x(); // matches x 2681 }; 2682 2683Example: 2684 class Base {}; 2685 class DirectlyDerived : virtual Base {}; // matches Base 2686 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 2687 2688Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 2689</pre></td></tr> 2690 2691 2692<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr> 2693<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 2694 2695Given 2696 class A { 2697 public: 2698 virtual void x(); 2699 }; 2700 class B : public A { 2701 public: 2702 void x(); 2703 }; 2704 matches A::x but not B::x 2705</pre></td></tr> 2706 2707 2708<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr> 2709<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions. 2710 2711Given: 2712 MyClass *p1 = new MyClass[10]; 2713cxxNewExpr(isArray()) 2714 matches the expression 'new MyClass[10]'. 2715</pre></td></tr> 2716 2717 2718<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName0')"><a name="hasAnyOverloadedOperatorName0Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 2719<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names. 2720 2721Matches overloaded operator names specified in strings without the 2722"operator" prefix: e.g. "<<". 2723 2724 hasAnyOverloadesOperatorName("+", "-") 2725Is equivalent to 2726 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 2727</pre></td></tr> 2728 2729 2730<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr> 2731<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 2732 2733Matches overloaded operator names specified in strings without the 2734"operator" prefix: e.g. "<<". 2735 2736Given: 2737 class A { int operator*(); }; 2738 const A &operator<<(const A &a, const A &b); 2739 A a; 2740 a << a; // <-- This matches 2741 2742cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 2743specified line and 2744cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 2745matches the declaration of A. 2746 2747Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 2748</pre></td></tr> 2749 2750 2751<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr> 2752<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators. 2753 2754Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2755 if (a == b) 2756 a += b; 2757 2758Example 2: matches s1 = s2 2759 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2760 struct S { S& operator=(const S&); }; 2761 void x() { S s1, s2; s1 = s2; } 2762</pre></td></tr> 2763 2764 2765<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('isComparisonOperator1')"><a name="isComparisonOperator1Anchor">isComparisonOperator</a></td><td></td></tr> 2766<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators. 2767 2768Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 2769 if (a == b) 2770 a += b; 2771 2772Example 2: matches s1 < s2 2773 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 2774 struct S { bool operator<(const S& other); }; 2775 void x(S s1, S s2) { bool b1 = s1 < s2; } 2776</pre></td></tr> 2777 2778 2779<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr> 2780<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined. 2781 2782Example matches x (matcher = cxxRecordDecl(hasDefinition())) 2783class x {}; 2784class y; 2785</pre></td></tr> 2786 2787 2788<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom2')"><a name="isDerivedFrom2Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr> 2789<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 2790</pre></td></tr> 2791 2792 2793<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom2')"><a name="isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr> 2794<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 2795</pre></td></tr> 2796 2797 2798<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr> 2799<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 2800static member variable template instantiations. 2801 2802Given 2803 template<typename T> void A(T t) { } 2804 template<> void A(int N) { } 2805functionDecl(isExplicitTemplateSpecialization()) 2806 matches the specialization A<int>(). 2807 2808Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 2809</pre></td></tr> 2810 2811 2812<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr> 2813<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 2814 2815Given: 2816 class A final {}; 2817 2818 struct B { 2819 virtual void f(); 2820 }; 2821 2822 struct C : B { 2823 void f() final; 2824 }; 2825matches A and C::f, but not B, C, or B::f 2826</pre></td></tr> 2827 2828 2829<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr> 2830<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 2831 2832Given: 2833 auto x = []{}; 2834 2835cxxRecordDecl(isLambda()) matches the implicit class declaration of 2836decltype(x) 2837</pre></td></tr> 2838 2839 2840<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom2')"><a name="isSameOrDerivedFrom2Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr> 2841<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for 2842isSameOrDerivedFrom(hasName(...)). 2843</pre></td></tr> 2844 2845 2846<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr> 2847<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 2848member variable template instantiations. 2849 2850Given 2851 template <typename T> class X {}; class A {}; X<A> x; 2852or 2853 template <typename T> class X {}; class A {}; template class X<A>; 2854or 2855 template <typename T> class X {}; class A {}; extern template class X<A>; 2856cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2857 matches the template instantiation of X<A>. 2858 2859But given 2860 template <typename T> class X {}; class A {}; 2861 template <> class X<A> {}; X<A> x; 2862cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2863 does not match, as X<A> is an explicit template specialization. 2864 2865Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 2866</pre></td></tr> 2867 2868 2869<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('argumentCountIs0')"><a name="argumentCountIs0Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 2870<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 2871a specific number of arguments (including absent default arguments). 2872 2873Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2874 void f(int x, int y); 2875 f(0, 0); 2876</pre></td></tr> 2877 2878 2879<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('usesADL0')"><a name="usesADL0Anchor">usesADL</a></td><td></td></tr> 2880<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL. 2881 2882Example matches y(x) but not y(42) or NS::y(x). 2883 namespace NS { 2884 struct X {}; 2885 void y(X); 2886 } 2887 2888 void y(...); 2889 2890 void test() { 2891 NS::X x; 2892 y(x); // Matches 2893 NS::y(x); // Doesn't match 2894 y(42); // Doesn't match 2895 using NS::y; 2896 y(x); // Found by both unqualified lookup and ADL, doesn't match 2897 } 2898</pre></td></tr> 2899 2900 2901<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>></td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr> 2902<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 2903 2904Example: matches the implicit cast around 0 2905(matcher = castExpr(hasCastKind(CK_NullToPointer))) 2906 int *p = 0; 2907 2908If the matcher is use from clang-query, CastKind parameter 2909should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer"). 2910</pre></td></tr> 2911 2912 2913<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr> 2914<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr> 2915 2916 2917<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT Value</td></tr> 2918<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT. 2919 2920Given 2921 f('false, 3.14, 42); 2922characterLiteral(equals(0)) 2923 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2924 match false 2925floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2926 match 3.14 2927integerLiteral(equals(42)) 2928 matches 42 2929 2930Note that you cannot directly match a negative numeric literal because the 2931minus sign is not part of the literal: It is a unary operator whose operand 2932is the positive numeric literal. Instead, you must use a unaryOperator() 2933matcher to match the minus sign: 2934 2935unaryOperator(hasOperatorName("-"), 2936 hasUnaryOperand(integerLiteral(equals(13)))) 2937 2938Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 2939 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 2940</pre></td></tr> 2941 2942 2943<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr> 2944<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr> 2945 2946 2947<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr> 2948<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr> 2949 2950 2951<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr> 2952<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 2953 2954Given 2955 template<typename T> struct C {}; 2956 C<int> c; 2957classTemplateSpecializationDecl(templateArgumentCountIs(1)) 2958 matches C<int>. 2959</pre></td></tr> 2960 2961 2962<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>></td><td class="name" onclick="toggle('statementCountIs0')"><a name="statementCountIs0Anchor">statementCountIs</a></td><td>unsigned N</td></tr> 2963<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 2964child statements. 2965 2966Example: Given 2967 { for (;;) {} } 2968compoundStmt(statementCountIs(0))) 2969 matches '{}' 2970 but does not match the outer compound statement. 2971</pre></td></tr> 2972 2973 2974<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>></td><td class="name" onclick="toggle('hasSize0')"><a name="hasSize0Anchor">hasSize</a></td><td>unsigned N</td></tr> 2975<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 2976 2977Given 2978 int a[42]; 2979 int b[2 * 21]; 2980 int c[41], d[43]; 2981 char *s = "abcd"; 2982 wchar_t *ws = L"abcd"; 2983 char *w = "a"; 2984constantArrayType(hasSize(42)) 2985 matches "int a[42]" and "int b[2 * 21]" 2986stringLiteral(hasSize(4)) 2987 matches "abcd", L"abcd" 2988</pre></td></tr> 2989 2990 2991<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>></td><td class="name" onclick="toggle('declCountIs0')"><a name="declCountIs0Anchor">declCountIs</a></td><td>unsigned N</td></tr> 2992<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 2993declarations. 2994 2995Example: Given 2996 int a, b; 2997 int c; 2998 int d = 2, e; 2999declCountIs(2) 3000 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 3001</pre></td></tr> 3002 3003 3004<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 3005<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 3006 3007Matches a node if it equals the node previously bound to ID. 3008 3009Given 3010 class X { int a; int b; }; 3011cxxRecordDecl( 3012 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3013 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3014 matches the class X, as a and b have the same type. 3015 3016Note that when multiple matches are involved via forEach* matchers, 3017equalsBoundNodes acts as a filter. 3018For example: 3019compoundStmt( 3020 forEachDescendant(varDecl().bind("d")), 3021 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3022will trigger a match for each combination of variable declaration 3023and reference to that variable declaration within a compound statement. 3024</pre></td></tr> 3025 3026 3027<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr> 3028<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 3029 3030Decl has pointer identity in the AST. 3031</pre></td></tr> 3032 3033 3034<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr> 3035<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 3036 3037Given 3038 __attribute__((device)) void f() { ... } 3039decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 3040f. If the matcher is used from clang-query, attr::Kind parameter should be 3041passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 3042</pre></td></tr> 3043 3044 3045<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpandedFromMacro0')"><a name="isExpandedFromMacro0Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr> 3046<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro. 3047Does not match if only part of the statement is expanded from that macro or 3048if different parts of the the statement are expanded from different 3049appearances of the macro. 3050</pre></td></tr> 3051 3052 3053<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> 3054<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 3055partially matching a given regex. 3056 3057Example matches Y but not X 3058 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3059 #include "ASTMatcher.h" 3060 class X {}; 3061ASTMatcher.h: 3062 class Y {}; 3063 3064Usable 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>> 3065 3066If the matcher is used in clang-query, RegexFlags parameter 3067should be passed as a quoted string. e.g: "NoFlags". 3068Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3069</pre></td></tr> 3070 3071 3072<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> 3073<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 3074 3075Example matches X but not Y 3076 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3077 #include <Y.h> 3078 class X {}; 3079Y.h: 3080 class Y {}; 3081 3082Usable 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>> 3083</pre></td></tr> 3084 3085 3086<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> 3087<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 3088 3089Example matches Y but not X 3090 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3091 #include <SystemHeader.h> 3092 class X {}; 3093SystemHeader.h: 3094 class Y {}; 3095 3096Usable 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>> 3097</pre></td></tr> 3098 3099 3100<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> 3101<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added 3102by the compiler (eg. implicit default/copy constructors). 3103</pre></td></tr> 3104 3105 3106<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> 3107<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces. 3108 3109Given 3110 class vector {}; 3111 namespace foo { 3112 class vector {}; 3113 namespace std { 3114 class vector {}; 3115 } 3116 } 3117 namespace std { 3118 inline namespace __1 { 3119 class vector {}; // #1 3120 namespace experimental { 3121 class vector {}; 3122 } 3123 } 3124 } 3125cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1. 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('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr> 3130<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3131template instantiations. 3132 3133Given 3134 template<typename T> void A(T t) { T i; } 3135 A(0); 3136 A(0U); 3137functionDecl(isInstantiated()) 3138 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3139</pre></td></tr> 3140 3141 3142<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> 3143<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private 3144inheritance. 3145 3146Examples: 3147 class C { 3148 public: int a; 3149 protected: int b; 3150 private: int c; // fieldDecl(isPrivate()) matches 'c' 3151 }; 3152 3153 struct Base {}; 3154 struct Derived1 : private Base {}; // matches 'Base' 3155 class Derived2 : Base {}; // matches 'Base' 3156</pre></td></tr> 3157 3158 3159<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> 3160<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify 3161protected inheritance. 3162 3163Examples: 3164 class C { 3165 public: int a; 3166 protected: int b; // fieldDecl(isProtected()) matches 'b' 3167 private: int c; 3168 }; 3169 3170 class Base {}; 3171 class Derived : protected Base {}; // matches 'Base' 3172</pre></td></tr> 3173 3174 3175<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> 3176<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public 3177inheritance. 3178 3179Examples: 3180 class C { 3181 public: int a; // fieldDecl(isPublic()) matches 'a' 3182 protected: int b; 3183 private: int c; 3184 }; 3185 3186 class Base {}; 3187 class Derived1 : public Base {}; // matches 'Base' 3188 struct Derived2 : Base {}; // matches 'Base' 3189</pre></td></tr> 3190 3191 3192<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> 3193<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 3194a specific number of designators. 3195 3196Example: Given 3197 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 3198 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 3199designatorCountIs(2) 3200 matches '{ [2].y = 1.0, [0].x = 1.0 }', 3201 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 3202</pre></td></tr> 3203 3204 3205<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> 3206<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration. 3207 3208Example matches Y (matcher = enumDecl(isScoped())) 3209enum X {}; 3210enum class Y {}; 3211</pre></td></tr> 3212 3213 3214<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> 3215<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is 3216neither type- nor value-dependent. 3217 3218In the following example, the expression sizeof(sizeof(T() + T())) 3219is instantiation-dependent (since it involves a template parameter T), 3220but is neither type- nor value-dependent, since the type of the inner 3221sizeof is known (std::size_t) and therefore the size of the outer 3222sizeof is known. 3223 template<typename T> 3224 void f(T x, T y) { sizeof(sizeof(T() + T()); } 3225expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T()) 3226</pre></td></tr> 3227 3228 3229<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> 3230<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type 3231is not yet instantiated. 3232 3233For example, the expressions "x" and "x + y" are type-dependent in 3234the following code, but "y" is not type-dependent: 3235 template<typename T> 3236 void add(T x, int y) { 3237 x + y; 3238 } 3239expr(isTypeDependent()) matches x + y 3240</pre></td></tr> 3241 3242 3243<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> 3244<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a 3245non-type template parameter. 3246 3247For example, the array bound of "Chars" in the following example is 3248value-dependent. 3249 template<int Size> int f() { return Size; } 3250expr(isValueDependent()) matches return Size 3251</pre></td></tr> 3252 3253 3254<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> 3255<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 3256GNU's __null, C++11's nullptr, or C's NULL macro. 3257 3258Given: 3259 void *v1 = NULL; 3260 void *v2 = nullptr; 3261 void *v3 = __null; // GNU extension 3262 char *cp = (char *)0; 3263 int *ip = 0; 3264 int i = 0; 3265expr(nullPointerConstant()) 3266 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 3267 initializer for i. 3268</pre></td></tr> 3269 3270 3271<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> 3272<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 3273bit width. 3274 3275Given 3276 class C { 3277 int a : 2; 3278 int b : 4; 3279 int c : 2; 3280 }; 3281fieldDecl(hasBitWidth(2)) 3282 matches 'int a;' and 'int c;' but not 'int b;'. 3283</pre></td></tr> 3284 3285 3286<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> 3287<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 3288 3289Given 3290 class C { 3291 int a : 2; 3292 int b; 3293 }; 3294fieldDecl(isBitField()) 3295 matches 'int a;' but not 'int b;'. 3296</pre></td></tr> 3297 3298 3299<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> 3300<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 3301 3302Given 3303 f('false, 3.14, 42); 3304characterLiteral(equals(0)) 3305 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3306 match false 3307floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3308 match 3.14 3309integerLiteral(equals(42)) 3310 matches 42 3311 3312Note that you cannot directly match a negative numeric literal because the 3313minus sign is not part of the literal: It is a unary operator whose operand 3314is the positive numeric literal. Instead, you must use a unaryOperator() 3315matcher to match the minus sign: 3316 3317unaryOperator(hasOperatorName("-"), 3318 hasUnaryOperand(integerLiteral(equals(13)))) 3319 3320Usable 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>>, 3321 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>> 3322</pre></td></tr> 3323 3324 3325<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> 3326<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr> 3327 3328 3329<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> 3330<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names. 3331 3332Matches overloaded operator names specified in strings without the 3333"operator" prefix: e.g. "<<". 3334 3335 hasAnyOverloadesOperatorName("+", "-") 3336Is equivalent to 3337 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3338</pre></td></tr> 3339 3340 3341<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> 3342<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 3343 3344Given: 3345 void f(); 3346 void g() noexcept; 3347 void h() noexcept(true); 3348 void i() noexcept(false); 3349 void j() throw(); 3350 void k() throw(int); 3351 void l() throw(...); 3352functionDecl(hasDynamicExceptionSpec()) and 3353 functionProtoType(hasDynamicExceptionSpec()) 3354 match the declarations of j, k, and l, but not f, g, h, or i. 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('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr> 3359<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 3360 3361Matches overloaded operator names specified in strings without the 3362"operator" prefix: e.g. "<<". 3363 3364Given: 3365 class A { int operator*(); }; 3366 const A &operator<<(const A &a, const A &b); 3367 A a; 3368 a << a; // <-- This matches 3369 3370cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3371specified line and 3372cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3373matches the declaration of A. 3374 3375Usable 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>> 3376</pre></td></tr> 3377 3378 3379<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> 3380<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 3381 3382Example matches Y (matcher = functionDecl(hasTrailingReturn())) 3383int X() {} 3384auto Y() -> int {} 3385</pre></td></tr> 3386 3387 3388<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> 3389<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations, 3390 and if constexpr. 3391 3392Given: 3393 constexpr int foo = 42; 3394 constexpr int bar(); 3395 void baz() { if constexpr(1 > 0) {} } 3396varDecl(isConstexpr()) 3397 matches the declaration of foo. 3398functionDecl(isConstexpr()) 3399 matches the declaration of bar. 3400ifStmt(isConstexpr()) 3401 matches the if statement in baz. 3402</pre></td></tr> 3403 3404 3405<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> 3406<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 3407 3408Given: 3409 class A { ~A(); }; 3410 class B { ~B() = default; }; 3411functionDecl(isDefaulted()) 3412 matches the declaration of ~B, but not ~A. 3413</pre></td></tr> 3414 3415 3416<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> 3417<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 3418 3419Example matches A, va, fa 3420 class A {}; 3421 class B; // Doesn't match, as it has no body. 3422 int va; 3423 extern int vb; // Doesn't match, as it doesn't define the variable. 3424 void fa() {} 3425 void fb(); // Doesn't match, as it has no body. 3426 @interface X 3427 - (void)ma; // Doesn't match, interface is declaration. 3428 @end 3429 @implementation X 3430 - (void)ma {} 3431 @end 3432 3433Usable 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>>, 3434 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 3435</pre></td></tr> 3436 3437 3438<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> 3439<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 3440 3441Given: 3442 void Func(); 3443 void DeletedFunc() = delete; 3444functionDecl(isDeleted()) 3445 matches the declaration of DeletedFunc, but not Func. 3446</pre></td></tr> 3447 3448 3449<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> 3450<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 3451static member variable template instantiations. 3452 3453Given 3454 template<typename T> void A(T t) { } 3455 template<> void A(int N) { } 3456functionDecl(isExplicitTemplateSpecialization()) 3457 matches the specialization A<int>(). 3458 3459Usable 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>> 3460</pre></td></tr> 3461 3462 3463<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> 3464<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 3465 3466Given: 3467 extern "C" void f() {} 3468 extern "C" { void g() {} } 3469 void h() {} 3470 extern "C" int x = 1; 3471 extern "C" int y = 2; 3472 int z = 3; 3473functionDecl(isExternC()) 3474 matches the declaration of f and g, but not the declaration of h. 3475varDecl(isExternC()) 3476 matches the declaration of x and y, but not the declaration of z. 3477</pre></td></tr> 3478 3479 3480<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> 3481<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 3482the inline keyword. 3483 3484Given 3485 inline void f(); 3486 void g(); 3487 namespace n { 3488 inline namespace m {} 3489 } 3490functionDecl(isInline()) will match ::f(). 3491namespaceDecl(isInline()) will match n::m. 3492</pre></td></tr> 3493 3494 3495<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> 3496<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point 3497into an executable program. 3498</pre></td></tr> 3499 3500 3501<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> 3502<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 3503 3504Given 3505 void nope(); 3506 [[noreturn]] void a(); 3507 __attribute__((noreturn)) void b(); 3508 struct c { [[noreturn]] c(); }; 3509functionDecl(isNoReturn()) 3510 matches all of those except 3511 void nope(); 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('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr> 3516<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 3517 3518Given: 3519 void f(); 3520 void g() noexcept; 3521 void h() throw(); 3522 void i() throw(int); 3523 void j() noexcept(false); 3524functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 3525 match the declarations of g, and h, but not f, i or j. 3526</pre></td></tr> 3527 3528 3529<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> 3530<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage 3531class specifier ("static" keyword) written in the source. 3532 3533Given: 3534 static void f() {} 3535 static int i = 0; 3536 extern int j; 3537 int k; 3538functionDecl(isStaticStorageClass()) 3539 matches the function declaration f. 3540varDecl(isStaticStorageClass()) 3541 matches the variable declaration i. 3542</pre></td></tr> 3543 3544 3545<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> 3546<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 3547member variable template instantiations. 3548 3549Given 3550 template <typename T> class X {}; class A {}; X<A> x; 3551or 3552 template <typename T> class X {}; class A {}; template class X<A>; 3553or 3554 template <typename T> class X {}; class A {}; extern template class X<A>; 3555cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3556 matches the template instantiation of X<A>. 3557 3558But given 3559 template <typename T> class X {}; class A {}; 3560 template <> class X<A> {}; X<A> x; 3561cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3562 does not match, as X<A> is an explicit template specialization. 3563 3564Usable 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>> 3565</pre></td></tr> 3566 3567 3568<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> 3569<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 3570 3571Example matches f, but not g or h. The function i will not match, even when 3572compiled in C mode. 3573 void f(...); 3574 void g(int); 3575 template <typename... Ts> void h(Ts...); 3576 void i(); 3577</pre></td></tr> 3578 3579 3580<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isWeak0')"><a name="isWeak0Anchor">isWeak</a></td><td></td></tr> 3581<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations. 3582 3583Given: 3584 void foo() __attribute__((__weakref__("__foo"))); 3585 void bar(); 3586functionDecl(isWeak()) 3587 matches the weak declaration "foo", but not "bar". 3588</pre></td></tr> 3589 3590 3591<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> 3592<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 3593specific parameter count. 3594 3595Given 3596 void f(int i) {} 3597 void g(int i, int j) {} 3598 void h(int i, int j); 3599 void j(int i); 3600 void k(int x, int y, int z, ...); 3601functionDecl(parameterCountIs(2)) 3602 matches g and h 3603functionProtoType(parameterCountIs(2)) 3604 matches g and h 3605functionProtoType(parameterCountIs(3)) 3606 matches k 3607</pre></td></tr> 3608 3609 3610<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> 3611<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 3612 3613Given: 3614 void f(); 3615 void g() noexcept; 3616 void h() noexcept(true); 3617 void i() noexcept(false); 3618 void j() throw(); 3619 void k() throw(int); 3620 void l() throw(...); 3621functionDecl(hasDynamicExceptionSpec()) and 3622 functionProtoType(hasDynamicExceptionSpec()) 3623 match the declarations of j, k, and l, but not f, g, h, or i. 3624</pre></td></tr> 3625 3626 3627<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> 3628<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 3629 3630Given: 3631 void f(); 3632 void g() noexcept; 3633 void h() throw(); 3634 void i() throw(int); 3635 void j() noexcept(false); 3636functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 3637 match the declarations of g, and h, but not f, i or j. 3638</pre></td></tr> 3639 3640 3641<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> 3642<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 3643specific parameter count. 3644 3645Given 3646 void f(int i) {} 3647 void g(int i, int j) {} 3648 void h(int i, int j); 3649 void j(int i); 3650 void k(int x, int y, int z, ...); 3651functionDecl(parameterCountIs(2)) 3652 matches g and h 3653functionProtoType(parameterCountIs(2)) 3654 matches g and h 3655functionProtoType(parameterCountIs(3)) 3656 matches k 3657</pre></td></tr> 3658 3659 3660<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> 3661<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations, 3662 and if constexpr. 3663 3664Given: 3665 constexpr int foo = 42; 3666 constexpr int bar(); 3667 void baz() { if constexpr(1 > 0) {} } 3668varDecl(isConstexpr()) 3669 matches the declaration of foo. 3670functionDecl(isConstexpr()) 3671 matches the declaration of bar. 3672ifStmt(isConstexpr()) 3673 matches the if statement in baz. 3674</pre></td></tr> 3675 3676 3677<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> 3678<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 3679 3680 3681<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> 3682<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 3683 3684Given 3685 f('false, 3.14, 42); 3686characterLiteral(equals(0)) 3687 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3688 match false 3689floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3690 match 3.14 3691integerLiteral(equals(42)) 3692 matches 42 3693 3694Note that you cannot directly match a negative numeric literal because the 3695minus sign is not part of the literal: It is a unary operator whose operand 3696is the positive numeric literal. Instead, you must use a unaryOperator() 3697matcher to match the minus sign: 3698 3699unaryOperator(hasOperatorName("-"), 3700 hasUnaryOperand(integerLiteral(equals(13)))) 3701 3702Usable 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>>, 3703 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>> 3704</pre></td></tr> 3705 3706 3707<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> 3708<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 3709 3710 3711<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> 3712<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 3713 3714 3715<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> 3716<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 3717to '.'. 3718 3719Member calls on the implicit this pointer match as called with '->'. 3720 3721Given 3722 class Y { 3723 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3724 template <class T> void f() { this->f<T>(); f<T>(); } 3725 int a; 3726 static int b; 3727 }; 3728 template <class T> 3729 class Z { 3730 void x() { this->m; } 3731 }; 3732memberExpr(isArrow()) 3733 matches this->x, x, y.x, a, this->b 3734cxxDependentScopeMemberExpr(isArrow()) 3735 matches this->m 3736unresolvedMemberExpr(isArrow()) 3737 matches this->f<T>, f<T> 3738</pre></td></tr> 3739 3740 3741<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> 3742<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 3743 3744This matcher is only provided as a performance optimization of hasName. 3745 hasAnyName(a, b, c) 3746 is equivalent to, but faster than 3747 anyOf(hasName(a), hasName(b), hasName(c)) 3748</pre></td></tr> 3749 3750 3751<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> 3752<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 3753 3754Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 3755void f() { 3756 int x; 3757 static int y; 3758} 3759int z; 3760 3761Example matches f() because it has external formal linkage despite being 3762unique to the translation unit as though it has internal likage 3763(matcher = functionDecl(hasExternalFormalLinkage())) 3764 3765namespace { 3766void f() {} 3767} 3768</pre></td></tr> 3769 3770 3771<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> 3772<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 3773 3774Supports specifying enclosing namespaces or classes by prefixing the name 3775with '<enclosing>::'. 3776Does not match typedefs of an underlying type with the given name. 3777 3778Example matches X (Name == "X") 3779 class X; 3780 3781Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 3782 namespace a { namespace b { class X; } } 3783</pre></td></tr> 3784 3785 3786<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> 3787<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 3788a substring matched by the given RegExp. 3789 3790Supports specifying enclosing namespaces or classes by 3791prefixing the name with '<enclosing>::'. Does not match typedefs 3792of an underlying type with the given name. 3793 3794Example matches X (regexp == "::X") 3795 class X; 3796 3797Example matches X (regexp is one of "::X", "^foo::.*X", among others) 3798 namespace foo { namespace bar { class X; } } 3799 3800If the matcher is used in clang-query, RegexFlags parameter 3801should be passed as a quoted string. e.g: "NoFlags". 3802Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3803</pre></td></tr> 3804 3805 3806<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> 3807<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 3808 3809Given 3810 namespace n { 3811 namespace {} // #1 3812 } 3813namespaceDecl(isAnonymous()) will match #1 but not ::n. 3814</pre></td></tr> 3815 3816 3817<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> 3818<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 3819the inline keyword. 3820 3821Given 3822 inline void f(); 3823 void g(); 3824 namespace n { 3825 inline namespace m {} 3826 } 3827functionDecl(isInline()) will match ::f(). 3828namespaceDecl(isInline()) will match n::m. 3829</pre></td></tr> 3830 3831 3832<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> 3833<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind 3834specified. 3835 3836Given 3837 3838 #pragma omp parallel 3839 #pragma omp parallel default(none) 3840 #pragma omp parallel default(shared) 3841 #pragma omp parallel default(firstprivate) 3842 3843``ompDefaultClause(isFirstPrivateKind())`` matches only 3844``default(firstprivate)``. 3845</pre></td></tr> 3846 3847 3848<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> 3849<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified. 3850 3851Given 3852 3853 #pragma omp parallel 3854 #pragma omp parallel default(none) 3855 #pragma omp parallel default(shared) 3856 #pragma omp parallel default(firstprivate) 3857 3858``ompDefaultClause(isNoneKind())`` matches only ``default(none)``. 3859</pre></td></tr> 3860 3861 3862<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> 3863<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified. 3864 3865Given 3866 3867 #pragma omp parallel 3868 #pragma omp parallel default(none) 3869 #pragma omp parallel default(shared) 3870 #pragma omp parallel default(firstprivate) 3871 3872``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``. 3873</pre></td></tr> 3874 3875 3876<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> 3877<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP 3878clause kind. 3879 3880Given 3881 3882 #pragma omp parallel 3883 #pragma omp parallel for 3884 #pragma omp for 3885 3886`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches 3887``omp parallel`` and ``omp parallel for``. 3888 3889If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter 3890should be passed as a quoted string. e.g., 3891``isAllowedToContainClauseKind("OMPC_default").`` 3892</pre></td></tr> 3893 3894 3895<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> 3896<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives, 3897i.e., directives that can't have a structured block. 3898 3899Given 3900 3901 #pragma omp parallel 3902 {} 3903 #pragma omp taskyield 3904 3905``ompExecutableDirective(isStandaloneDirective()))`` matches 3906``omp taskyield``. 3907</pre></td></tr> 3908 3909 3910<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> 3911<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 3912</pre></td></tr> 3913 3914 3915<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> 3916<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 3917</pre></td></tr> 3918 3919 3920<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> 3921<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for 3922isSameOrDerivedFrom(hasName(...)). 3923</pre></td></tr> 3924 3925 3926<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> 3927<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3928a specific number of arguments (including absent default arguments). 3929 3930Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3931 void f(int x, int y); 3932 f(0, 0); 3933</pre></td></tr> 3934 3935 3936<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> 3937<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 3938Selector.getAsString() 3939 3940 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 3941 matches both of the expressions below: 3942 [myObj methodA:argA]; 3943 [myObj methodB:argB]; 3944</pre></td></tr> 3945 3946 3947<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> 3948<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 3949 3950objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 3951message expression in 3952 3953 UIWebView *webView = ...; 3954 CGRect bodyFrame = webView.frame; 3955 bodyFrame.size.height = self.bodyContentHeight; 3956 webView.frame = bodyFrame; 3957 // ^---- matches here 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('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr> 3962<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 3963 3964Matches only when the selector of the objCMessageExpr is NULL. This may 3965represent an error condition in the tree! 3966</pre></td></tr> 3967 3968 3969<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> 3970<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 3971 3972 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 3973 matches the outer message expr in the code below, but NOT the message 3974 invocation for self.bodyView. 3975 [self.bodyView loadHTMLString:html baseURL:NULL]; 3976</pre></td></tr> 3977 3978 3979<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> 3980<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 3981 3982 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 3983 matches self.bodyView in the code below, but NOT the outer message 3984 invocation of "loadHTMLString:baseURL:". 3985 [self.bodyView loadHTMLString:html baseURL:NULL]; 3986</pre></td></tr> 3987 3988 3989<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> 3990<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class. 3991 3992Example 3993matcher = objcMessageExpr(isClassMessage()) 3994matches 3995 [NSString stringWithFormat:@"format"]; 3996but not 3997 NSString *x = @"hello"; 3998 [x containsString:@"h"]; 3999</pre></td></tr> 4000 4001 4002<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> 4003<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance. 4004 4005Example 4006matcher = objcMessageExpr(isInstanceMessage()) 4007matches 4008 NSString *x = @"hello"; 4009 [x containsString:@"h"]; 4010but not 4011 [NSString stringWithFormat:@"format"]; 4012</pre></td></tr> 4013 4014 4015<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> 4016<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 4017a substring matched by the given RegExp. 4018 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 4019 invocation for self.bodyView. 4020 [self.bodyView loadHTMLString:html baseURL:NULL]; 4021 4022If the matcher is used in clang-query, RegexFlags parameter 4023should be passed as a quoted string. e.g: "NoFlags". 4024Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4025</pre></td></tr> 4026 4027 4028<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> 4029<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 4030 4031 matcher = objCMessageExpr(numSelectorArgs(0)); 4032 matches self.bodyView in the code below 4033 4034 matcher = objCMessageExpr(numSelectorArgs(2)); 4035 matches the invocation of "loadHTMLString:baseURL:" but not that 4036 of self.bodyView 4037 [self.bodyView loadHTMLString:html baseURL:NULL]; 4038</pre></td></tr> 4039 4040 4041<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> 4042<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method. 4043 4044Example 4045matcher = objcMethodDecl(isClassMethod()) 4046matches 4047@interface I + (void)foo; @end 4048but not 4049@interface I - (void)bar; @end 4050</pre></td></tr> 4051 4052 4053<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> 4054<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 4055 4056Example matches A, va, fa 4057 class A {}; 4058 class B; // Doesn't match, as it has no body. 4059 int va; 4060 extern int vb; // Doesn't match, as it doesn't define the variable. 4061 void fa() {} 4062 void fb(); // Doesn't match, as it has no body. 4063 @interface X 4064 - (void)ma; // Doesn't match, interface is declaration. 4065 @end 4066 @implementation X 4067 - (void)ma {} 4068 @end 4069 4070Usable 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>>, 4071 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4072</pre></td></tr> 4073 4074 4075<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> 4076<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method. 4077 4078Example 4079matcher = objcMethodDecl(isInstanceMethod()) 4080matches 4081@interface I - (void)bar; @end 4082but not 4083@interface I + (void)foo; @end 4084</pre></td></tr> 4085 4086 4087<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> 4088<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 4089 4090Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 4091void x(int val) {} 4092void y(int val = 0) {} 4093 4094Deprecated. Use hasInitializer() instead to be able to 4095match on the contents of the default argument. For example: 4096 4097void x(int val = 7) {} 4098void y(int val = 42) {} 4099parmVarDecl(hasInitializer(integerLiteral(equals(42)))) 4100 matches the parameter of y 4101 4102A matcher such as 4103 parmVarDecl(hasInitializer(anything())) 4104is equivalent to parmVarDecl(hasDefaultArgument()). 4105</pre></td></tr> 4106 4107 4108<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> 4109<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter 4110list. The parameter list could be that of either a block, function, or 4111objc-method. 4112 4113 4114Given 4115 4116void f(int a, int b, int c) { 4117} 4118 4119``parmVarDecl(isAtPosition(0))`` matches ``int a``. 4120 4121``parmVarDecl(isAtPosition(1))`` matches ``int b``. 4122</pre></td></tr> 4123 4124 4125<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> 4126<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 4127 4128Given 4129 class Y { public: void x(); }; 4130 void z() { Y* y; y->x(); } 4131cxxMemberCallExpr(on(hasType(asString("class Y *")))) 4132 matches y->x() 4133</pre></td></tr> 4134 4135 4136<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> 4137<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 4138 4139Matches a node if it equals the node previously bound to ID. 4140 4141Given 4142 class X { int a; int b; }; 4143cxxRecordDecl( 4144 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4145 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4146 matches the class X, as a and b have the same type. 4147 4148Note that when multiple matches are involved via forEach* matchers, 4149equalsBoundNodes acts as a filter. 4150For example: 4151compoundStmt( 4152 forEachDescendant(varDecl().bind("d")), 4153 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4154will trigger a match for each combination of variable declaration 4155and reference to that variable declaration within a compound statement. 4156</pre></td></tr> 4157 4158 4159<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> 4160<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 4161the node, not hidden within a typedef. 4162 4163Given 4164 typedef const int const_int; 4165 const_int i; 4166 int *const j; 4167 int *volatile k; 4168 int m; 4169varDecl(hasType(hasLocalQualifiers())) matches only j and k. 4170i is const-qualified but the qualifier is not local. 4171</pre></td></tr> 4172 4173 4174<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> 4175<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 4176 4177Given 4178 void a(char); 4179 void b(wchar_t); 4180 void c(double); 4181functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 4182matches "a(char)", "b(wchar_t)", but not "c(double)". 4183</pre></td></tr> 4184 4185 4186<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> 4187<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 4188the Objective-C object pointer type, which is different despite being 4189syntactically similar. 4190 4191Given 4192 int *i = nullptr; 4193 4194 @interface Foo 4195 @end 4196 Foo *f; 4197 4198 int j; 4199varDecl(hasType(isAnyPointer())) 4200 matches "int *i" and "Foo *f", but not "int j". 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('isConstQualified0')"><a name="isConstQualified0Anchor">isConstQualified</a></td><td></td></tr> 4205<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 4206include "top-level" const. 4207 4208Given 4209 void a(int); 4210 void b(int const); 4211 void c(const int); 4212 void d(const int*); 4213 void e(int const) {}; 4214functionDecl(hasAnyParameter(hasType(isConstQualified()))) 4215 matches "void b(int const)", "void c(const int)" and 4216 "void e(int const) {}". It does not match d as there 4217 is no top-level const on the parameter type "const int *". 4218</pre></td></tr> 4219 4220 4221<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> 4222<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 4223 4224Given 4225 void a(int); 4226 void b(long); 4227 void c(double); 4228functionDecl(hasAnyParameter(hasType(isInteger()))) 4229matches "a(int)", "b(long)", but not "c(double)". 4230</pre></td></tr> 4231 4232 4233<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> 4234<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 4235 4236Given 4237 void a(int); 4238 void b(unsigned long); 4239 void c(double); 4240functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 4241matches "a(int)", but not "b(unsigned long)" and "c(double)". 4242</pre></td></tr> 4243 4244 4245<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> 4246<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 4247 4248Given 4249 void a(int); 4250 void b(unsigned long); 4251 void c(double); 4252functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 4253matches "b(unsigned long)", but not "a(int)" and "c(double)". 4254</pre></td></tr> 4255 4256 4257<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> 4258<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 4259include "top-level" volatile. 4260 4261Given 4262 void a(int); 4263 void b(int volatile); 4264 void c(volatile int); 4265 void d(volatile int*); 4266 void e(int volatile) {}; 4267functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 4268 matches "void b(int volatile)", "void c(volatile int)" and 4269 "void e(int volatile) {}". It does not match d as there 4270 is no top-level volatile on the parameter type "volatile int *". 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('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 4275<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 4276 4277Matches a node if it equals the node previously bound to ID. 4278 4279Given 4280 class X { int a; int b; }; 4281cxxRecordDecl( 4282 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4283 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4284 matches the class X, as a and b have the same type. 4285 4286Note that when multiple matches are involved via forEach* matchers, 4287equalsBoundNodes acts as a filter. 4288For example: 4289compoundStmt( 4290 forEachDescendant(varDecl().bind("d")), 4291 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4292will trigger a match for each combination of variable declaration 4293and reference to that variable declaration within a compound statement. 4294</pre></td></tr> 4295 4296 4297<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> 4298<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 4299 4300Stmt has pointer identity in the AST. 4301</pre></td></tr> 4302 4303 4304<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpandedFromMacro1')"><a name="isExpandedFromMacro1Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr> 4305<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro. 4306Does not match if only part of the statement is expanded from that macro or 4307if different parts of the the statement are expanded from different 4308appearances of the macro. 4309</pre></td></tr> 4310 4311 4312<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> 4313<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 4314partially matching a given regex. 4315 4316Example matches Y but not X 4317 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 4318 #include "ASTMatcher.h" 4319 class X {}; 4320ASTMatcher.h: 4321 class Y {}; 4322 4323Usable 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>> 4324 4325If the matcher is used in clang-query, RegexFlags parameter 4326should be passed as a quoted string. e.g: "NoFlags". 4327Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4328</pre></td></tr> 4329 4330 4331<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> 4332<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 4333 4334Example matches X but not Y 4335 (matcher = cxxRecordDecl(isExpansionInMainFile()) 4336 #include <Y.h> 4337 class X {}; 4338Y.h: 4339 class Y {}; 4340 4341Usable 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>> 4342</pre></td></tr> 4343 4344 4345<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> 4346<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 4347 4348Example matches Y but not X 4349 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 4350 #include <SystemHeader.h> 4351 class X {}; 4352SystemHeader.h: 4353 class Y {}; 4354 4355Usable 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>> 4356</pre></td></tr> 4357 4358 4359<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> 4360<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 4361 4362Given 4363 int j; 4364 template<typename T> void A(T t) { T i; j += 42;} 4365 A(0); 4366 A(0U); 4367declStmt(isInTemplateInstantiation()) 4368 matches 'int i;' and 'unsigned i'. 4369unless(stmt(isInTemplateInstantiation())) 4370 will NOT match j += 42; as it's shared between the template definition and 4371 instantiation. 4372</pre></td></tr> 4373 4374 4375<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> 4376<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 4377 4378Given 4379 int a[42]; 4380 int b[2 * 21]; 4381 int c[41], d[43]; 4382 char *s = "abcd"; 4383 wchar_t *ws = L"abcd"; 4384 char *w = "a"; 4385constantArrayType(hasSize(42)) 4386 matches "int a[42]" and "int b[2 * 21]" 4387stringLiteral(hasSize(4)) 4388 matches "abcd", L"abcd" 4389</pre></td></tr> 4390 4391 4392<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> 4393<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class." 4394 4395Example matches C, but not S, U or E. 4396 struct S {}; 4397 class C {}; 4398 union U {}; 4399 enum E {}; 4400</pre></td></tr> 4401 4402 4403<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> 4404<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 4405 4406Example matches A, va, fa 4407 class A {}; 4408 class B; // Doesn't match, as it has no body. 4409 int va; 4410 extern int vb; // Doesn't match, as it doesn't define the variable. 4411 void fa() {} 4412 void fb(); // Doesn't match, as it has no body. 4413 @interface X 4414 - (void)ma; // Doesn't match, interface is declaration. 4415 @end 4416 @implementation X 4417 - (void)ma {} 4418 @end 4419 4420Usable 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>>, 4421 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4422</pre></td></tr> 4423 4424 4425<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> 4426<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum." 4427 4428Example matches E, but not C, S or U. 4429 struct S {}; 4430 class C {}; 4431 union U {}; 4432 enum E {}; 4433</pre></td></tr> 4434 4435 4436<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> 4437<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct." 4438 4439Example matches S, but not C, U or E. 4440 struct S {}; 4441 class C {}; 4442 union U {}; 4443 enum E {}; 4444</pre></td></tr> 4445 4446 4447<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> 4448<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union." 4449 4450Example matches U, but not C, S or E. 4451 struct S {}; 4452 class C {}; 4453 union U {}; 4454 enum E {}; 4455</pre></td></tr> 4456 4457 4458<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> 4459<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 4460 4461Note that 'Value' is a string as the template argument's value is 4462an arbitrary precision integer. 'Value' must be euqal to the canonical 4463representation of that integral value in base 10. 4464 4465Given 4466 template<int T> struct C {}; 4467 C<42> c; 4468classTemplateSpecializationDecl( 4469 hasAnyTemplateArgument(equalsIntegralValue("42"))) 4470 matches the implicit instantiation of C in C<42>. 4471</pre></td></tr> 4472 4473 4474<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> 4475<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 4476 4477Given 4478 template<int T> struct C {}; 4479 C<42> c; 4480classTemplateSpecializationDecl( 4481 hasAnyTemplateArgument(isIntegral())) 4482 matches the implicit instantiation of C in C<42> 4483 with isIntegral() matching 42. 4484</pre></td></tr> 4485 4486 4487<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> 4488<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 4489 4490Given 4491 template<typename T> struct C {}; 4492 C<int> c; 4493classTemplateSpecializationDecl(templateArgumentCountIs(1)) 4494 matches C<int>. 4495</pre></td></tr> 4496 4497 4498<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpandedFromMacro2')"><a name="isExpandedFromMacro2Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr> 4499<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro. 4500Does not match if only part of the statement is expanded from that macro or 4501if different parts of the the statement are expanded from different 4502appearances of the macro. 4503</pre></td></tr> 4504 4505 4506<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> 4507<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 4508partially matching a given regex. 4509 4510Example matches Y but not X 4511 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 4512 #include "ASTMatcher.h" 4513 class X {}; 4514ASTMatcher.h: 4515 class Y {}; 4516 4517Usable 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>> 4518 4519If the matcher is used in clang-query, RegexFlags parameter 4520should be passed as a quoted string. e.g: "NoFlags". 4521Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4522</pre></td></tr> 4523 4524 4525<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> 4526<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 4527 4528Example matches X but not Y 4529 (matcher = cxxRecordDecl(isExpansionInMainFile()) 4530 #include <Y.h> 4531 class X {}; 4532Y.h: 4533 class Y {}; 4534 4535Usable 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>> 4536</pre></td></tr> 4537 4538 4539<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> 4540<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 4541 4542Example matches Y but not X 4543 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 4544 #include <SystemHeader.h> 4545 class X {}; 4546SystemHeader.h: 4547 class Y {}; 4548 4549Usable 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>> 4550</pre></td></tr> 4551 4552 4553<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> 4554<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 4555 4556Given 4557 struct S { bool func(); }; 4558functionDecl(returns(booleanType())) 4559 matches "bool func();" 4560</pre></td></tr> 4561 4562 4563<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> 4564<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 4565 4566Matches a node if it equals the node previously bound to ID. 4567 4568Given 4569 class X { int a; int b; }; 4570cxxRecordDecl( 4571 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4572 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4573 matches the class X, as a and b have the same type. 4574 4575Note that when multiple matches are involved via forEach* matchers, 4576equalsBoundNodes acts as a filter. 4577For example: 4578compoundStmt( 4579 forEachDescendant(varDecl().bind("d")), 4580 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4581will trigger a match for each combination of variable declaration 4582and reference to that variable declaration within a compound statement. 4583</pre></td></tr> 4584 4585 4586<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> 4587<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 4588 4589Type has pointer identity in the AST. 4590</pre></td></tr> 4591 4592 4593<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> 4594<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 4595 4596Given 4597 int i; 4598 float f; 4599realFloatingPointType() 4600 matches "float f" but not "int i" 4601</pre></td></tr> 4602 4603 4604<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> 4605<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 4606 4607Given 4608 struct S { void func(); }; 4609functionDecl(returns(voidType())) 4610 matches "void func();" 4611</pre></td></tr> 4612 4613 4614<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> 4615<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 4616 4617Given 4618 int x; 4619 int s = sizeof(x) + alignof(x) 4620unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 4621 matches sizeof(x) 4622 4623If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter 4624should be passed as a quoted string. e.g., ofKind("UETT_SizeOf"). 4625</pre></td></tr> 4626 4627 4628<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> 4629<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the 4630specified names. 4631 4632 hasAnyOperatorName("+", "-") 4633 Is equivalent to 4634 anyOf(hasOperatorName("+"), hasOperatorName("-")) 4635</pre></td></tr> 4636 4637 4638<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> 4639<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 4640unary). 4641 4642Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 4643 !(a || b) 4644</pre></td></tr> 4645 4646 4647<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> 4648<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed 4649to '.'. 4650 4651Member calls on the implicit this pointer match as called with '->'. 4652 4653Given 4654 class Y { 4655 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 4656 template <class T> void f() { this->f<T>(); f<T>(); } 4657 int a; 4658 static int b; 4659 }; 4660 template <class T> 4661 class Z { 4662 void x() { this->m; } 4663 }; 4664memberExpr(isArrow()) 4665 matches this->x, x, y.x, a, this->b 4666cxxDependentScopeMemberExpr(isArrow()) 4667 matches this->m 4668unresolvedMemberExpr(isArrow()) 4669 matches this->f<T>, f<T> 4670</pre></td></tr> 4671 4672 4673<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> 4674<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 4675 4676Example matches x, but not y, z, or a. 4677(matcher = varDecl(hasAutomaticStorageDuration()) 4678void f() { 4679 int x; 4680 static int y; 4681 thread_local int z; 4682} 4683int a; 4684</pre></td></tr> 4685 4686 4687<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> 4688<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 4689 4690Example matches y and z (matcher = varDecl(hasGlobalStorage()) 4691void f() { 4692 int x; 4693 static int y; 4694} 4695int z; 4696</pre></td></tr> 4697 4698 4699<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr> 4700<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 4701non-static local variable. 4702 4703Example matches x (matcher = varDecl(hasLocalStorage()) 4704void f() { 4705 int x; 4706 static int y; 4707} 4708int z; 4709</pre></td></tr> 4710 4711 4712<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> 4713<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 4714It includes the variable declared at namespace scope and those declared 4715with "static" and "extern" storage class specifiers. 4716 4717void f() { 4718 int x; 4719 static int y; 4720 thread_local int z; 4721} 4722int a; 4723static int b; 4724extern int c; 4725varDecl(hasStaticStorageDuration()) 4726 matches the function declaration y, a, b and c. 4727</pre></td></tr> 4728 4729 4730<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> 4731<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 4732 4733Example matches z, but not x, z, or a. 4734(matcher = varDecl(hasThreadStorageDuration()) 4735void f() { 4736 int x; 4737 static int y; 4738 thread_local int z; 4739} 4740int a; 4741</pre></td></tr> 4742 4743 4744<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> 4745<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations, 4746 and if constexpr. 4747 4748Given: 4749 constexpr int foo = 42; 4750 constexpr int bar(); 4751 void baz() { if constexpr(1 > 0) {} } 4752varDecl(isConstexpr()) 4753 matches the declaration of foo. 4754functionDecl(isConstexpr()) 4755 matches the declaration of bar. 4756ifStmt(isConstexpr()) 4757 matches the if statement in baz. 4758</pre></td></tr> 4759 4760 4761<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> 4762<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 4763 4764Example matches A, va, fa 4765 class A {}; 4766 class B; // Doesn't match, as it has no body. 4767 int va; 4768 extern int vb; // Doesn't match, as it doesn't define the variable. 4769 void fa() {} 4770 void fb(); // Doesn't match, as it has no body. 4771 @interface X 4772 - (void)ma; // Doesn't match, interface is declaration. 4773 @end 4774 @implementation X 4775 - (void)ma {} 4776 @end 4777 4778Usable 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>>, 4779 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4780</pre></td></tr> 4781 4782 4783<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr> 4784<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 4785a C++ catch block, or an Objective-C statement. 4786 4787Example matches x (matcher = varDecl(isExceptionVariable()) 4788void f(int y) { 4789 try { 4790 } catch (int x) { 4791 } 4792} 4793</pre></td></tr> 4794 4795 4796<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> 4797<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 4798static member variable template instantiations. 4799 4800Given 4801 template<typename T> void A(T t) { } 4802 template<> void A(int N) { } 4803functionDecl(isExplicitTemplateSpecialization()) 4804 matches the specialization A<int>(). 4805 4806Usable 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>> 4807</pre></td></tr> 4808 4809 4810<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> 4811<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 4812 4813Given: 4814 extern "C" void f() {} 4815 extern "C" { void g() {} } 4816 void h() {} 4817 extern "C" int x = 1; 4818 extern "C" int y = 2; 4819 int z = 3; 4820functionDecl(isExternC()) 4821 matches the declaration of f and g, but not the declaration of h. 4822varDecl(isExternC()) 4823 matches the declaration of x and y, but not the declaration of z. 4824</pre></td></tr> 4825 4826 4827<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> 4828<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope. 4829 4830Example matches y (matcher = varDecl(isStaticLocal())) 4831void f() { 4832 int x; 4833 static int y; 4834} 4835static int z; 4836</pre></td></tr> 4837 4838 4839<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> 4840<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage 4841class specifier ("static" keyword) written in the source. 4842 4843Given: 4844 static void f() {} 4845 static int i = 0; 4846 extern int j; 4847 int k; 4848functionDecl(isStaticStorageClass()) 4849 matches the function declaration f. 4850varDecl(isStaticStorageClass()) 4851 matches the variable declaration i. 4852</pre></td></tr> 4853 4854 4855<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> 4856<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 4857member variable template instantiations. 4858 4859Given 4860 template <typename T> class X {}; class A {}; X<A> x; 4861or 4862 template <typename T> class X {}; class A {}; template class X<A>; 4863or 4864 template <typename T> class X {}; class A {}; extern template class X<A>; 4865cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4866 matches the template instantiation of X<A>. 4867 4868But given 4869 template <typename T> class X {}; class A {}; 4870 template <> class X<A> {}; X<A> x; 4871cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4872 does not match, as X<A> is an explicit template specialization. 4873 4874Usable 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>> 4875</pre></td></tr> 4876 4877<!--END_NARROWING_MATCHERS --> 4878</table> 4879 4880<!-- ======================================================================= --> 4881<h2 id="traversal-matchers">AST Traversal Matchers</h2> 4882<!-- ======================================================================= --> 4883 4884<p>Traversal matchers specify the relationship to other nodes that are 4885reachable from the current node.</p> 4886 4887<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 4888forEachDescendant) which work on all nodes and allow users to write more generic 4889match expressions.</p> 4890 4891<table> 4892<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 4893<!-- START_TRAVERSAL_MATCHERS --> 4894 4895<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 4896<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 4897 4898Unlike anyOf, eachOf will generate a match result for each 4899matching submatcher. 4900 4901For example, in: 4902 class A { int a; int b; }; 4903The matcher: 4904 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 4905 has(fieldDecl(hasName("b")).bind("v")))) 4906will generate two results binding "v", the first of which binds 4907the field declaration of a, the second the field declaration of 4908b. 4909 4910Usable as: Any Matcher 4911</pre></td></tr> 4912 4913 4914<tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr> 4915<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 4916 4917Generates results for each match. 4918 4919For example, in: 4920 class A { class B {}; class C {}; }; 4921The matcher: 4922 cxxRecordDecl(hasName("::A"), 4923 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 4924will generate results for A, B and C. 4925 4926Usable as: Any Matcher 4927</pre></td></tr> 4928 4929 4930<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 4931<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 4932provided matcher. 4933 4934Example matches X, A, A::X, B, B::C, B::C::X 4935 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 4936 class X {}; 4937 class A { class X {}; }; // Matches A, because A::X is a class of name 4938 // X inside A. 4939 class B { class C { class X {}; }; }; 4940 4941DescendantT must be an AST base type. 4942 4943As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 4944each result that matches instead of only on the first one. 4945 4946Note: Recursively combined ForEachDescendant can cause many matches: 4947 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 4948 forEachDescendant(cxxRecordDecl()) 4949 ))) 4950will match 10 times (plus injected class name matches) on: 4951 class A { class B { class C { class D { class E {}; }; }; }; }; 4952 4953Usable as: Any Matcher 4954</pre></td></tr> 4955 4956 4957<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 4958<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 4959provided matcher. 4960 4961Example matches X, Y, Y::X, Z::Y, Z::Y::X 4962 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 4963 class X {}; 4964 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X 4965 // inside Y. 4966 class Z { class Y { class X {}; }; }; // Does not match Z. 4967 4968ChildT must be an AST base type. 4969 4970As opposed to 'has', 'forEach' will cause a match for each result that 4971matches instead of only on the first one. 4972 4973Usable as: Any Matcher 4974</pre></td></tr> 4975 4976 4977<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 4978<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 4979matcher. 4980 4981Given 4982void f() { if (true) { int x = 42; } } 4983void g() { for (;;) { int x = 43; } } 4984expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 4985 4986Usable as: Any Matcher 4987</pre></td></tr> 4988 4989 4990<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 4991<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 4992provided matcher. 4993 4994Example matches X, Y, Z 4995 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 4996 class X {}; // Matches X, because X::X is a class of name X inside X. 4997 class Y { class X {}; }; 4998 class Z { class Y { class X {}; }; }; 4999 5000DescendantT must be an AST base type. 5001 5002Usable as: Any Matcher 5003</pre></td></tr> 5004 5005 5006<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 5007<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 5008provided matcher. 5009 5010Example matches X, Y 5011 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 5012 class X {}; // Matches X, because X::X is a class of name X inside X. 5013 class Y { class X {}; }; 5014 class Z { class Y { class X {}; }; }; // Does not match Z. 5015 5016ChildT must be an AST base type. 5017 5018Usable as: Any Matcher 5019Note that has is direct matcher, so it also matches things like implicit 5020casts and paren casts. If you are matching with expr then you should 5021probably consider using ignoringParenImpCasts like: 5022has(ignoringParenImpCasts(expr())). 5023</pre></td></tr> 5024 5025 5026<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 5027<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 5028matcher. 5029 5030Given 5031void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 5032compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 5033 5034Usable as: Any Matcher 5035</pre></td></tr> 5036 5037 5038<tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr> 5039<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher. 5040 5041However, optionally will retain any bindings generated by the submatcher. 5042Useful when additional information which may or may not present about a main 5043matching node is desired. 5044 5045For example, in: 5046 class Foo { 5047 int bar; 5048 } 5049The matcher: 5050 cxxRecordDecl( 5051 optionally(has( 5052 fieldDecl(hasName("bar")).bind("var") 5053 ))).bind("record") 5054will produce a result binding for both "record" and "var". 5055The matcher will produce a "record" binding for even if there is no data 5056member named "bar" in that class. 5057 5058Usable as: Any Matcher 5059</pre></td></tr> 5060 5061 5062<tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr> 5063<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind. 5064 5065Given 5066 void foo() 5067 { 5068 int i = 3.0; 5069 } 5070The matcher 5071 traverse(TK_IgnoreImplicitCastsAndParentheses, 5072 varDecl(hasInitializer(floatLiteral().bind("init"))) 5073 ) 5074matches the variable declaration with "init" bound to the "3.0". 5075</pre></td></tr> 5076 5077 5078<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> 5079<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 5080switch statement or conditional operator. 5081 5082Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5083 if (true) {} 5084</pre></td></tr> 5085 5086 5087<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> 5088<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 5089(binary or ternary). 5090 5091Example matches b 5092 condition ? a : b 5093 condition ?: b 5094</pre></td></tr> 5095 5096 5097<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> 5098<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 5099 5100Example 1 (conditional ternary operator): matches a 5101 condition ? a : b 5102 5103Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 5104 condition ?: b 5105</pre></td></tr> 5106 5107 5108<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> 5109<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 5110matches the given matcher. 5111 5112The associated declaration is: 5113- for type nodes, the declaration of the underlying type 5114- for CallExpr, the declaration of the callee 5115- for MemberExpr, the declaration of the referenced member 5116- for CXXConstructExpr, the declaration of the constructor 5117- for CXXNewExpr, the declaration of the operator new 5118- for ObjCIvarExpr, the declaration of the ivar 5119 5120For type nodes, hasDeclaration will generally match the declaration of the 5121sugared type. Given 5122 class X {}; 5123 typedef X Y; 5124 Y y; 5125in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5126typedefDecl. A common use case is to match the underlying, desugared type. 5127This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5128 varDecl(hasType(hasUnqualifiedDesugaredType( 5129 recordType(hasDeclaration(decl()))))) 5130In this matcher, the decl will match the CXXRecordDecl of class X. 5131 5132Usable 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>>, 5133 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>>, 5134 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>>, 5135 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>>, 5136 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>>, 5137 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>>, 5138 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5139</pre></td></tr> 5140 5141 5142<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> 5143<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 5144 5145Given 5146 int i[5]; 5147 void f() { i[1] = 42; } 5148arraySubscriptExpression(hasBase(implicitCastExpr( 5149 hasSourceExpression(declRefExpr())))) 5150 matches i[1] with the declRefExpr() matching i 5151</pre></td></tr> 5152 5153 5154<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> 5155<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 5156 5157Given 5158 int i[5]; 5159 void f() { i[1] = 42; } 5160arraySubscriptExpression(hasIndex(integerLiteral())) 5161 matches i[1] with the integerLiteral() matching 1 5162</pre></td></tr> 5163 5164 5165<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> 5166<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 5167 5168Example matches a (matcher = binaryOperator(hasLHS())) 5169 a || b 5170</pre></td></tr> 5171 5172 5173<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> 5174<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 5175 5176Example matches b (matcher = binaryOperator(hasRHS())) 5177 a || b 5178</pre></td></tr> 5179 5180 5181<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> 5182<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 5183type. 5184 5185Given 5186 struct A {}; 5187 A a[7]; 5188 int b[7]; 5189arrayType(hasElementType(builtinType())) 5190 matches "int b[7]" 5191 5192Usable 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>> 5193</pre></td></tr> 5194 5195 5196<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> 5197<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 5198 5199Given 5200 _Atomic(int) i; 5201 _Atomic(float) f; 5202atomicType(hasValueType(isInteger())) 5203 matches "_Atomic(int) i" 5204 5205Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 5206</pre></td></tr> 5207 5208 5209<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> 5210<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 5211 5212Note: There is no TypeLoc for the deduced type and thus no 5213getDeducedLoc() matcher. 5214 5215Given 5216 auto a = 1; 5217 auto b = 2.0; 5218autoType(hasDeducedType(isInteger())) 5219 matches "auto a" 5220 5221Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 5222</pre></td></tr> 5223 5224 5225<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> 5226<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 5227binary operator matches. 5228</pre></td></tr> 5229 5230 5231<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> 5232<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 5233 5234Example matches a (matcher = binaryOperator(hasLHS())) 5235 a || b 5236</pre></td></tr> 5237 5238 5239<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> 5240<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator. 5241 5242Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 5243 integerLiteral(equals(2))) 5244 1 + 2 // Match 5245 2 + 1 // Match 5246 1 + 1 // No match 5247 2 + 2 // No match 5248</pre></td></tr> 5249 5250 5251<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> 5252<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 5253 5254Example matches b (matcher = binaryOperator(hasRHS())) 5255 a || b 5256</pre></td></tr> 5257 5258 5259<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> 5260<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 5261block. 5262 5263Does not match the 'this' parameter of a method. 5264 5265Given 5266 class X { void f(int x, int y, int z) {} }; 5267cxxMethodDecl(hasAnyParameter(hasName("y"))) 5268 matches f(int x, int y, int z) {} 5269with hasAnyParameter(...) 5270 matching int y 5271 5272For ObjectiveC, given 5273 @interface I - (void) f:(int) y; @end 5274 5275the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 5276matches the declaration of method f with hasParameter 5277matching y. 5278 5279For blocks, given 5280 b = ^(int y) { printf("%d", y) }; 5281 5282the matcher blockDecl(hasAnyParameter(hasName("y"))) 5283matches the declaration of the block b with hasParameter 5284matching y. 5285</pre></td></tr> 5286 5287 5288<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> 5289<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 5290declaration or a block. 5291 5292Given 5293 class X { void f(int x) {} }; 5294cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 5295 matches f(int x) {} 5296with hasParameter(...) 5297 matching int x 5298 5299For ObjectiveC, given 5300 @interface I - (void) f:(int) y; @end 5301 5302the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 5303matches the declaration of method f with hasParameter 5304matching y. 5305</pre></td></tr> 5306 5307 5308<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> 5309<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 5310pointee matches a given matcher. 5311 5312Given 5313 int *a; 5314 int const *b; 5315 float const *f; 5316pointerType(pointee(isConstQualified(), isInteger())) 5317 matches "int const *b" 5318 5319Usable 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>>, 5320 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>> 5321</pre></td></tr> 5322 5323 5324<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> 5325<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value 5326declaration's type. 5327 5328In case of a value declaration (for example a variable declaration), 5329this resolves one layer of indirection. For example, in the value 5330declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 5331X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 5332declaration of x. 5333 5334Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5335 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5336 and friend class X (matcher = friendDecl(hasType("X")) 5337 class X {}; 5338 void y(X &x) { x; X z; } 5339 class Y { friend class X; }; 5340 5341Example matches class Derived 5342(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 5343class Base {}; 5344class Derived : Base {}; 5345 5346Usable 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>>, 5347Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 5348</pre></td></tr> 5349 5350 5351<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> 5352<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 5353 5354Given 5355 void f(int i); 5356 int y; 5357 f(y); 5358callExpr( 5359 forEachArgumentWithParam( 5360 declRefExpr(to(varDecl(hasName("y")))), 5361 parmVarDecl(hasType(isInteger())) 5362)) 5363 matches f(y); 5364with declRefExpr(...) 5365 matching int y 5366and parmVarDecl(...) 5367 matching int i 5368</pre></td></tr> 5369 5370 5371<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParamType1')"><a name="forEachArgumentWithParamType1Anchor">forEachArgumentWithParamType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> ParamMatcher</td></tr> 5372<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or 5373CXXConstructExpr. It is very similar to forEachArgumentWithParam but 5374it works on calls through function pointers as well. 5375 5376The difference is, that function pointers do not provide access to a 5377ParmVarDecl, but only the QualType for each argument. 5378 5379Given 5380 void f(int i); 5381 int y; 5382 f(y); 5383 void (*f_ptr)(int) = f; 5384 f_ptr(y); 5385callExpr( 5386 forEachArgumentWithParamType( 5387 declRefExpr(to(varDecl(hasName("y")))), 5388 qualType(isInteger()).bind("type) 5389)) 5390 matches f(y) and f_ptr(y) 5391with declRefExpr(...) 5392 matching int y 5393and qualType(...) 5394 matching int 5395</pre></td></tr> 5396 5397 5398<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> 5399<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 5400expression, or an ObjC-message-send expression. 5401 5402Given 5403 void x(int, int, int) { int y; x(1, y, 42); } 5404callExpr(hasAnyArgument(declRefExpr())) 5405 matches x(1, y, 42) 5406with hasAnyArgument(...) 5407 matching y 5408 5409For ObjectiveC, given 5410 @interface I - (void) f:(int) y; @end 5411 void foo(I *i) { [i f:12]; } 5412objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5413 matches [i f:12] 5414</pre></td></tr> 5415 5416 5417<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> 5418<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 5419call expression. 5420 5421Example matches y in x(y) 5422 (matcher = callExpr(hasArgument(0, declRefExpr()))) 5423 void x(int) { int y; x(y); } 5424</pre></td></tr> 5425 5426 5427<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> 5428<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 5429matches the given matcher. 5430 5431The associated declaration is: 5432- for type nodes, the declaration of the underlying type 5433- for CallExpr, the declaration of the callee 5434- for MemberExpr, the declaration of the referenced member 5435- for CXXConstructExpr, the declaration of the constructor 5436- for CXXNewExpr, the declaration of the operator new 5437- for ObjCIvarExpr, the declaration of the ivar 5438 5439For type nodes, hasDeclaration will generally match the declaration of the 5440sugared type. Given 5441 class X {}; 5442 typedef X Y; 5443 Y y; 5444in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5445typedefDecl. A common use case is to match the underlying, desugared type. 5446This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5447 varDecl(hasType(hasUnqualifiedDesugaredType( 5448 recordType(hasDeclaration(decl()))))) 5449In this matcher, the decl will match the CXXRecordDecl of class X. 5450 5451Usable 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>>, 5452 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>>, 5453 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>>, 5454 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>>, 5455 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>>, 5456 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>>, 5457 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5458</pre></td></tr> 5459 5460 5461<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> 5462<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 5463 5464Given 5465 class A { A() : i(42), j(42) {} int i; int j; }; 5466cxxConstructorDecl(forEachConstructorInitializer( 5467 forField(decl().bind("x")) 5468)) 5469 will trigger two matches, binding for 'i' and 'j' respectively. 5470</pre></td></tr> 5471 5472 5473<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> 5474<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 5475 5476Given 5477 struct Foo { 5478 Foo() : foo_(1) { } 5479 int foo_; 5480 }; 5481cxxRecordDecl(has(cxxConstructorDecl( 5482 hasAnyConstructorInitializer(anything()) 5483))) 5484 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 5485</pre></td></tr> 5486 5487 5488<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> 5489<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 5490 5491Given 5492 struct Foo { 5493 Foo() : foo_(1) { } 5494 int foo_; 5495 }; 5496cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 5497 forField(hasName("foo_")))))) 5498 matches Foo 5499with forField matching foo_ 5500</pre></td></tr> 5501 5502 5503<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> 5504<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 5505 5506Given 5507 struct Foo { 5508 Foo() : foo_(1) { } 5509 int foo_; 5510 }; 5511cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 5512 withInitializer(integerLiteral(equals(1))))))) 5513 matches Foo 5514with withInitializer matching (1) 5515</pre></td></tr> 5516 5517 5518<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> 5519<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 5520given matcher. Implicit object expressions are included; that is, it matches 5521use of implicit `this`. 5522 5523Given 5524 struct X { 5525 int m; 5526 int f(X x) { x.m; return m; } 5527 }; 5528memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 5529 matches `x.m`, but not `m`; however, 5530memberExpr(hasObjectExpression(hasType(pointsTo( 5531 cxxRecordDecl(hasName("X")))))) 5532 matches `m` (aka. `this->m`), but not `x.m`. 5533</pre></td></tr> 5534 5535 5536<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> 5537<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr> 5538 5539 5540<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> 5541<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer. 5542 5543Given: 5544 void foo() { 5545 if (int i = foobar(); i > 0) {} 5546 switch (int i = foobar(); i) {} 5547 for (auto& a = get_range(); auto& x : a) {} 5548 } 5549 void bar() { 5550 if (foobar() > 0) {} 5551 switch (foobar()) {} 5552 for (auto& x : get_range()) {} 5553 } 5554ifStmt(hasInitStatement(anything())) 5555 matches the if statement in foo but not in bar. 5556switchStmt(hasInitStatement(anything())) 5557 matches the switch statement in foo but not in bar. 5558cxxForRangeStmt(hasInitStatement(anything())) 5559 matches the range for statement in foo but not in bar. 5560</pre></td></tr> 5561 5562 5563<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> 5564<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 5565 5566Example: 5567 forStmt(hasLoopVariable(anything())) 5568matches 'int x' in 5569 for (int x : a) { } 5570</pre></td></tr> 5571 5572 5573<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> 5574<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 5575 5576Example: 5577 forStmt(hasRangeInit(anything())) 5578matches 'a' in 5579 for (int x : a) { } 5580</pre></td></tr> 5581 5582 5583<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> 5584<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 5585`on`, matches the argument directly without stripping away anything. 5586 5587Given 5588 class Y { public: void m(); }; 5589 Y g(); 5590 class X : public Y { void g(); }; 5591 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 5592cxxMemberCallExpr(onImplicitObjectArgument(hasType( 5593 cxxRecordDecl(hasName("Y"))))) 5594 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 5595cxxMemberCallExpr(on(callExpr())) 5596 does not match `(g()).m()`, because the parens are not ignored. 5597 5598FIXME: Overload to allow directly matching types? 5599</pre></td></tr> 5600 5601 5602<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> 5603<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 5604stripping off any parentheses or implicit casts. 5605 5606Given 5607 class Y { public: void m(); }; 5608 Y g(); 5609 class X : public Y {}; 5610 void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 5611cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 5612 matches `y.m()` and `(g()).m()`. 5613cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 5614 matches `x.m()`. 5615cxxMemberCallExpr(on(callExpr())) 5616 matches `(g()).m()`. 5617 5618FIXME: Overload to allow directly matching types? 5619</pre></td></tr> 5620 5621 5622<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> 5623<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 5624</pre></td></tr> 5625 5626 5627<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> 5628<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 5629matches the InnerMatcher, or is a pointer to a type that matches the 5630InnerMatcher. 5631 5632Given 5633 class Y { public: void m(); }; 5634 class X : public Y { void g(); }; 5635 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 5636cxxMemberCallExpr(thisPointerType(hasDeclaration( 5637 cxxRecordDecl(hasName("Y"))))) 5638 matches `y.m()`, `p->m()` and `x.m()`. 5639cxxMemberCallExpr(thisPointerType(hasDeclaration( 5640 cxxRecordDecl(hasName("X"))))) 5641 matches `x.g()`. 5642</pre></td></tr> 5643 5644 5645<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> 5646<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 5647produce multiple matches. 5648 5649Given 5650 class A { virtual void f(); }; 5651 class B : public A { void f(); }; 5652 class C : public B { void f(); }; 5653cxxMethodDecl(ofClass(hasName("C")), 5654 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 5655 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 5656 that B::f is not overridden by C::f). 5657 5658The check can produce multiple matches in case of multiple inheritance, e.g. 5659 class A1 { virtual void f(); }; 5660 class A2 { virtual void f(); }; 5661 class C : public A1, public A2 { void f(); }; 5662cxxMethodDecl(ofClass(hasName("C")), 5663 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 5664 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 5665 once with "b" binding "A2::f" and "d" binding "C::f". 5666</pre></td></tr> 5667 5668 5669<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> 5670<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 5671belongs to. 5672 5673FIXME: Generalize this for other kinds of declarations. 5674FIXME: What other kind of declarations would we need to generalize 5675this to? 5676 5677Example matches A() in the last line 5678 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 5679 ofClass(hasName("A")))))) 5680 class A { 5681 public: 5682 A(); 5683 }; 5684 A a = A(); 5685</pre></td></tr> 5686 5687 5688<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> 5689<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments. 5690 5691Given: 5692 MyClass *p1 = new (Storage) MyClass(); 5693cxxNewExpr(hasAnyPlacementArg(anything())) 5694 matches the expression 'new (Storage, 16) MyClass()'. 5695</pre></td></tr> 5696 5697 5698<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> 5699<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 5700 5701Given: 5702 MyClass *p1 = new MyClass[10]; 5703cxxNewExpr(hasArraySize(integerLiteral(equals(10)))) 5704 matches the expression 'new MyClass[10]'. 5705</pre></td></tr> 5706 5707 5708<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> 5709<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 5710matches the given matcher. 5711 5712The associated declaration is: 5713- for type nodes, the declaration of the underlying type 5714- for CallExpr, the declaration of the callee 5715- for MemberExpr, the declaration of the referenced member 5716- for CXXConstructExpr, the declaration of the constructor 5717- for CXXNewExpr, the declaration of the operator new 5718- for ObjCIvarExpr, the declaration of the ivar 5719 5720For type nodes, hasDeclaration will generally match the declaration of the 5721sugared type. Given 5722 class X {}; 5723 typedef X Y; 5724 Y y; 5725in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5726typedefDecl. A common use case is to match the underlying, desugared type. 5727This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5728 varDecl(hasType(hasUnqualifiedDesugaredType( 5729 recordType(hasDeclaration(decl()))))) 5730In this matcher, the decl will match the CXXRecordDecl of class X. 5731 5732Usable 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>>, 5733 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>>, 5734 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>>, 5735 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>>, 5736 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>>, 5737 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>>, 5738 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5739</pre></td></tr> 5740 5741 5742<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> 5743<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments. 5744 5745Given: 5746 MyClass *p1 = new (Storage, 16) MyClass(); 5747cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16)))) 5748 matches the expression 'new (Storage, 16) MyClass()'. 5749</pre></td></tr> 5750 5751 5752<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> 5753<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher. 5754 5755Example: 5756matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 5757 class Foo; 5758 class Bar : Foo {}; 5759 class Baz : Bar {}; 5760 class SpecialBase; 5761 class Proxy : SpecialBase {}; // matches Proxy 5762 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived 5763 5764FIXME: Refactor this and isDerivedFrom to reuse implementation. 5765</pre></td></tr> 5766 5767 5768<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> 5769<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher. 5770 5771Example: 5772matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 5773 class Foo; 5774 class Bar : Foo {}; 5775 class Baz : Bar {}; 5776 class SpecialBase; 5777 class Proxy : SpecialBase {}; // matches Proxy 5778 class IndirectlyDerived : Proxy {}; // doesn't match 5779</pre></td></tr> 5780 5781 5782<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> 5783<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 5784 5785Given: 5786 class A { void func(); }; 5787 class B { void member(); }; 5788 5789cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 5790A but not B. 5791</pre></td></tr> 5792 5793 5794<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> 5795<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class 5796matching Base, or Objective-C classes that directly or indirectly 5797subclass a class matching Base. 5798 5799Note that a class is not considered to be derived from itself. 5800 5801Example matches Y, Z, C (Base == hasName("X")) 5802 class X; 5803 class Y : public X {}; // directly derived 5804 class Z : public Y {}; // indirectly derived 5805 typedef X A; 5806 typedef A B; 5807 class C : public B {}; // derived from a typedef of X 5808 5809In the following example, Bar matches isDerivedFrom(hasName("X")): 5810 class Foo; 5811 typedef Foo X; 5812 class Bar : public Foo {}; // derived from a type that X is a typedef of 5813 5814In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 5815 @interface NSObject @end 5816 @interface Bar : NSObject @end 5817 5818Usable 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>> 5819</pre></td></tr> 5820 5821 5822<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> 5823<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class 5824matching Base. 5825 5826Note that a class is not considered to be derived from itself. 5827 5828Example matches Y, C (Base == hasName("X")) 5829 class X; 5830 class Y : public X {}; // directly derived 5831 class Z : public Y {}; // indirectly derived 5832 typedef X A; 5833 typedef A B; 5834 class C : public B {}; // derived from a typedef of X 5835 5836In the following example, Bar matches isDerivedFrom(hasName("X")): 5837 class Foo; 5838 typedef Foo X; 5839 class Bar : public Foo {}; // derived from a type that X is a typedef of 5840</pre></td></tr> 5841 5842 5843<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> 5844<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 5845match Base. 5846</pre></td></tr> 5847 5848 5849<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> 5850<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 5851expression, or an ObjC-message-send expression. 5852 5853Given 5854 void x(int, int, int) { int y; x(1, y, 42); } 5855callExpr(hasAnyArgument(declRefExpr())) 5856 matches x(1, y, 42) 5857with hasAnyArgument(...) 5858 matching y 5859 5860For ObjectiveC, given 5861 @interface I - (void) f:(int) y; @end 5862 void foo(I *i) { [i f:12]; } 5863objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5864 matches [i f:12] 5865</pre></td></tr> 5866 5867 5868<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> 5869<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 5870given matcher. 5871 5872Example matches y.x() (matcher = callExpr(callee( 5873 cxxMethodDecl(hasName("x"))))) 5874 class Y { public: void x(); }; 5875 void z() { Y y; y.x(); } 5876</pre></td></tr> 5877 5878 5879<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> 5880<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 5881 5882Given 5883 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 5884 void f() { f(); } 5885callExpr(callee(expr())) 5886 matches this->x(), x(), y.x(), f() 5887with callee(...) 5888 matching this->x, x, y.x, f respectively 5889 5890Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 5891because this introduces ambiguous overloads with calls to Callee taking a 5892internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 5893implemented in terms of implicit casts. 5894</pre></td></tr> 5895 5896 5897<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> 5898<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 5899 5900Given 5901 void f(int i); 5902 int y; 5903 f(y); 5904callExpr( 5905 forEachArgumentWithParam( 5906 declRefExpr(to(varDecl(hasName("y")))), 5907 parmVarDecl(hasType(isInteger())) 5908)) 5909 matches f(y); 5910with declRefExpr(...) 5911 matching int y 5912and parmVarDecl(...) 5913 matching int i 5914</pre></td></tr> 5915 5916 5917<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParamType0')"><a name="forEachArgumentWithParamType0Anchor">forEachArgumentWithParamType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> ParamMatcher</td></tr> 5918<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or 5919CXXConstructExpr. It is very similar to forEachArgumentWithParam but 5920it works on calls through function pointers as well. 5921 5922The difference is, that function pointers do not provide access to a 5923ParmVarDecl, but only the QualType for each argument. 5924 5925Given 5926 void f(int i); 5927 int y; 5928 f(y); 5929 void (*f_ptr)(int) = f; 5930 f_ptr(y); 5931callExpr( 5932 forEachArgumentWithParamType( 5933 declRefExpr(to(varDecl(hasName("y")))), 5934 qualType(isInteger()).bind("type) 5935)) 5936 matches f(y) and f_ptr(y) 5937with declRefExpr(...) 5938 matching int y 5939and qualType(...) 5940 matching int 5941</pre></td></tr> 5942 5943 5944<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> 5945<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 5946expression, or an ObjC-message-send expression. 5947 5948Given 5949 void x(int, int, int) { int y; x(1, y, 42); } 5950callExpr(hasAnyArgument(declRefExpr())) 5951 matches x(1, y, 42) 5952with hasAnyArgument(...) 5953 matching y 5954 5955For ObjectiveC, given 5956 @interface I - (void) f:(int) y; @end 5957 void foo(I *i) { [i f:12]; } 5958objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5959 matches [i f:12] 5960</pre></td></tr> 5961 5962 5963<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> 5964<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 5965call expression. 5966 5967Example matches y in x(y) 5968 (matcher = callExpr(hasArgument(0, declRefExpr()))) 5969 void x(int) { int y; x(y); } 5970</pre></td></tr> 5971 5972 5973<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> 5974<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 5975matches the given matcher. 5976 5977The associated declaration is: 5978- for type nodes, the declaration of the underlying type 5979- for CallExpr, the declaration of the callee 5980- for MemberExpr, the declaration of the referenced member 5981- for CXXConstructExpr, the declaration of the constructor 5982- for CXXNewExpr, the declaration of the operator new 5983- for ObjCIvarExpr, the declaration of the ivar 5984 5985For type nodes, hasDeclaration will generally match the declaration of the 5986sugared type. Given 5987 class X {}; 5988 typedef X Y; 5989 Y y; 5990in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5991typedefDecl. A common use case is to match the underlying, desugared type. 5992This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5993 varDecl(hasType(hasUnqualifiedDesugaredType( 5994 recordType(hasDeclaration(decl()))))) 5995In this matcher, the decl will match the CXXRecordDecl of class X. 5996 5997Usable 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>>, 5998 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>>, 5999 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>>, 6000 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>>, 6001 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>>, 6002 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>>, 6003 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6004</pre></td></tr> 6005 6006 6007<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> 6008<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 6009extension, matches the constant given in the statement. 6010 6011Given 6012 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 6013caseStmt(hasCaseConstant(integerLiteral())) 6014 matches "case 1:" 6015</pre></td></tr> 6016 6017 6018<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> 6019<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 6020or opaque value's source expression matches the given matcher. 6021 6022Example 1: matches "a string" 6023(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 6024class URL { URL(string); }; 6025URL url = "a string"; 6026 6027Example 2: matches 'b' (matcher = 6028opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 6029int a = b ?: 1; 6030</pre></td></tr> 6031 6032 6033<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> 6034<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6035functionDecl that have at least one TemplateArgument matching the given 6036InnerMatcher. 6037 6038Given 6039 template<typename T> class A {}; 6040 template<> class A<double> {}; 6041 A<int> a; 6042 6043 template<typename T> f() {}; 6044 void func() { f<int>(); }; 6045 6046classTemplateSpecializationDecl(hasAnyTemplateArgument( 6047 refersToType(asString("int")))) 6048 matches the specialization A<int> 6049 6050functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 6051 matches the specialization f<int> 6052</pre></td></tr> 6053 6054 6055<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> 6056<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 6057 6058Given 6059 template<typename T> class A {}; #1 6060 template<> class A<int> {}; #2 6061classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 6062 matches '#2' with classTemplateDecl() matching the class template 6063 declaration of 'A' at #1. 6064</pre></td></tr> 6065 6066 6067<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> 6068<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6069functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 6070 6071Given 6072 template<typename T, typename U> class A {}; 6073 A<bool, int> b; 6074 A<int, bool> c; 6075 6076 template<typename T> void f() {} 6077 void func() { f<int>(); }; 6078classTemplateSpecializationDecl(hasTemplateArgument( 6079 1, refersToType(asString("int")))) 6080 matches the specialization A<bool, int> 6081 6082functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 6083 matches the specialization f<int> 6084</pre></td></tr> 6085 6086 6087<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> 6088<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 6089type. 6090 6091Given 6092 struct A {}; 6093 A a[7]; 6094 int b[7]; 6095arrayType(hasElementType(builtinType())) 6096 matches "int b[7]" 6097 6098Usable 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>> 6099</pre></td></tr> 6100 6101 6102<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> 6103<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 6104a given matcher. Also matches StmtExprs that have CompoundStmt as children. 6105 6106Given 6107 { {}; 1+2; } 6108hasAnySubstatement(compoundStmt()) 6109 matches '{ {}; 1+2; }' 6110with compoundStmt() 6111 matching '{}' 6112</pre></td></tr> 6113 6114 6115<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> 6116<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher 6117</pre></td></tr> 6118 6119 6120<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> 6121<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 6122matches the given matcher. 6123 6124The associated declaration is: 6125- for type nodes, the declaration of the underlying type 6126- for CallExpr, the declaration of the callee 6127- for MemberExpr, the declaration of the referenced member 6128- for CXXConstructExpr, the declaration of the constructor 6129- for CXXNewExpr, the declaration of the operator new 6130- for ObjCIvarExpr, the declaration of the ivar 6131 6132For type nodes, hasDeclaration will generally match the declaration of the 6133sugared type. Given 6134 class X {}; 6135 typedef X Y; 6136 Y y; 6137in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6138typedefDecl. A common use case is to match the underlying, desugared type. 6139This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6140 varDecl(hasType(hasUnqualifiedDesugaredType( 6141 recordType(hasDeclaration(decl()))))) 6142In this matcher, the decl will match the CXXRecordDecl of class X. 6143 6144Usable 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>>, 6145 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>>, 6146 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>>, 6147 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>>, 6148 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>>, 6149 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>>, 6150 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6151</pre></td></tr> 6152 6153 6154<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> 6155<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 6156specific using shadow declaration. 6157 6158Given 6159 namespace a { void f() {} } 6160 using a::f; 6161 void g() { 6162 f(); // Matches this .. 6163 a::f(); // .. but not this. 6164 } 6165declRefExpr(throughUsingDecl(anything())) 6166 matches f() 6167</pre></td></tr> 6168 6169 6170<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> 6171<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 6172specified matcher. 6173 6174Example matches x in if(x) 6175 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 6176 bool x; 6177 if (x) {} 6178</pre></td></tr> 6179 6180 6181<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> 6182<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 6183 6184Note that this does not work for global declarations because the AST 6185breaks up multiple-declaration DeclStmt's into multiple single-declaration 6186DeclStmt's. 6187Example: Given non-global declarations 6188 int a, b = 0; 6189 int c; 6190 int d = 2, e; 6191declStmt(containsDeclaration( 6192 0, varDecl(hasInitializer(anything())))) 6193 matches only 'int d = 2, e;', and 6194declStmt(containsDeclaration(1, varDecl())) 6195 matches 'int a, b = 0' as well as 'int d = 2, e;' 6196 but 'int c;' is not matched. 6197</pre></td></tr> 6198 6199 6200<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> 6201<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 6202 6203Given 6204 int a, b; 6205 int c; 6206declStmt(hasSingleDecl(anything())) 6207 matches 'int c;' but not 'int a, b;'. 6208</pre></td></tr> 6209 6210 6211<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> 6212<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 6213the inner matcher. 6214 6215Given 6216 int x; 6217declaratorDecl(hasTypeLoc(loc(asString("int")))) 6218 matches int x 6219</pre></td></tr> 6220 6221 6222<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> 6223<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 6224Decl, matches InnerMatcher. 6225 6226Given 6227 namespace N { 6228 namespace M { 6229 class D {}; 6230 } 6231 } 6232 6233cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 6234declaration of class D. 6235</pre></td></tr> 6236 6237 6238<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> 6239<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type. 6240 6241Given 6242 decltype(1) a = 1; 6243 decltype(2.0) b = 2.0; 6244decltypeType(hasUnderlyingType(isInteger())) 6245 matches the type of "a" 6246 6247Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>> 6248</pre></td></tr> 6249 6250 6251<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> 6252<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr> 6253 6254 6255<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> 6256<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 6257switch statement or conditional operator. 6258 6259Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6260 if (true) {} 6261</pre></td></tr> 6262 6263 6264<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> 6265<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 6266matches InnerMatcher if the qualifier exists. 6267 6268Given 6269 namespace N { 6270 namespace M { 6271 class D {}; 6272 } 6273 } 6274 N::M::D d; 6275 6276elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 6277matches the type of the variable declaration of d. 6278</pre></td></tr> 6279 6280 6281<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> 6282<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 6283 6284Given 6285 namespace N { 6286 namespace M { 6287 class D {}; 6288 } 6289 } 6290 N::M::D d; 6291 6292elaboratedType(namesType(recordType( 6293hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 6294declaration of d. 6295</pre></td></tr> 6296 6297 6298<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> 6299<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 6300matches the given matcher. 6301 6302The associated declaration is: 6303- for type nodes, the declaration of the underlying type 6304- for CallExpr, the declaration of the callee 6305- for MemberExpr, the declaration of the referenced member 6306- for CXXConstructExpr, the declaration of the constructor 6307- for CXXNewExpr, the declaration of the operator new 6308- for ObjCIvarExpr, the declaration of the ivar 6309 6310For type nodes, hasDeclaration will generally match the declaration of the 6311sugared type. Given 6312 class X {}; 6313 typedef X Y; 6314 Y y; 6315in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6316typedefDecl. A common use case is to match the underlying, desugared type. 6317This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6318 varDecl(hasType(hasUnqualifiedDesugaredType( 6319 recordType(hasDeclaration(decl()))))) 6320In this matcher, the decl will match the CXXRecordDecl of class X. 6321 6322Usable 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>>, 6323 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>>, 6324 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>>, 6325 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>>, 6326 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>>, 6327 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>>, 6328 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6329</pre></td></tr> 6330 6331 6332<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> 6333<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 6334 6335(Note: Clang's AST refers to other conversions as "casts" too, and calls 6336actual casts "explicit" casts.) 6337</pre></td></tr> 6338 6339 6340<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> 6341<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value 6342declaration's type. 6343 6344In case of a value declaration (for example a variable declaration), 6345this resolves one layer of indirection. For example, in the value 6346declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6347X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6348declaration of x. 6349 6350Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6351 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6352 and friend class X (matcher = friendDecl(hasType("X")) 6353 class X {}; 6354 void y(X &x) { x; X z; } 6355 class Y { friend class X; }; 6356 6357Example matches class Derived 6358(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6359class Base {}; 6360class Derived : Base {}; 6361 6362Usable 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>>, 6363Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 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('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> 6368<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 6369matcher. 6370 6371Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6372 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6373 and U (matcher = typedefDecl(hasType(asString("int"))) 6374 and friend class X (matcher = friendDecl(hasType("X")) 6375 class X {}; 6376 void y(X &x) { x; X z; } 6377 typedef int U; 6378 class Y { friend class X; }; 6379</pre></td></tr> 6380 6381 6382<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> 6383<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 6384elidable constructor and other corresponding bookkeeping nodes. 6385 6386In C++17, elidable copy constructors are no longer being generated in the 6387AST as it is not permitted by the standard. They are, however, part of the 6388AST in C++14 and earlier. So, a matcher must abstract over these differences 6389to work in all language modes. This matcher skips elidable constructor-call 6390AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 6391various implicit nodes inside the constructor calls, all of which will not 6392appear in the C++17 AST. 6393 6394Given 6395 6396struct H {}; 6397H G(); 6398void f() { 6399 H D = G(); 6400} 6401 6402``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 6403matches ``H D = G()`` in C++11 through C++17 (and beyond). 6404</pre></td></tr> 6405 6406 6407<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> 6408<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 6409are stripped off. 6410 6411Parentheses and explicit casts are not discarded. 6412Given 6413 int arr[5]; 6414 int a = 0; 6415 char b = 0; 6416 const int c = a; 6417 int *d = arr; 6418 long e = (long) 0l; 6419The matchers 6420 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 6421 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 6422would match the declarations for a, b, c, and d, but not e. 6423While 6424 varDecl(hasInitializer(integerLiteral())) 6425 varDecl(hasInitializer(declRefExpr())) 6426only match the declarations for b, c, and d. 6427</pre></td></tr> 6428 6429 6430<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> 6431<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 6432nodes are stripped off. 6433 6434Parentheses and explicit casts are not discarded. 6435Given 6436 class C {}; 6437 C a = C(); 6438 C b; 6439 C c = b; 6440The matchers 6441 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 6442would match the declarations for a, b, and c. 6443While 6444 varDecl(hasInitializer(cxxConstructExpr())) 6445only match the declarations for b and c. 6446</pre></td></tr> 6447 6448 6449<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> 6450<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 6451casts are stripped off. 6452 6453Implicit and non-C Style casts are also discarded. 6454Given 6455 int a = 0; 6456 char b = (0); 6457 void* c = reinterpret_cast<char*>(0); 6458 char d = char(0); 6459The matcher 6460 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 6461would match the declarations for a, b, c, and d. 6462while 6463 varDecl(hasInitializer(integerLiteral())) 6464only match the declaration for a. 6465</pre></td></tr> 6466 6467 6468<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> 6469<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 6470parentheses are stripped off. 6471 6472Explicit casts are not discarded. 6473Given 6474 int arr[5]; 6475 int a = 0; 6476 char b = (0); 6477 const int c = a; 6478 int *d = (arr); 6479 long e = ((long) 0l); 6480The matchers 6481 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 6482 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 6483would match the declarations for a, b, c, and d, but not e. 6484while 6485 varDecl(hasInitializer(integerLiteral())) 6486 varDecl(hasInitializer(declRefExpr())) 6487would only match the declaration for a. 6488</pre></td></tr> 6489 6490 6491<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> 6492<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 6493 6494Given 6495 const char* str = ("my-string"); 6496The matcher 6497 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 6498would match the implicit cast resulting from the assignment. 6499</pre></td></tr> 6500 6501 6502<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> 6503<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 6504 6505Given 6506 class C { 6507 int a = 2; 6508 int b = 3; 6509 int c; 6510 }; 6511fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 6512 matches 'int a;' but not 'int b;'. 6513fieldDecl(hasInClassInitializer(anything())) 6514 matches 'int a;' and 'int b;' but not 'int c;'. 6515</pre></td></tr> 6516 6517 6518<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('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> 6519<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr> 6520 6521 6522<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> 6523<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 6524switch statement or conditional operator. 6525 6526Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6527 if (true) {} 6528</pre></td></tr> 6529 6530 6531<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> 6532<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 6533 6534Example: 6535 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 6536matches '++x' in 6537 for (x; x < N; ++x) { } 6538</pre></td></tr> 6539 6540 6541<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> 6542<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 6543 6544Example: 6545 forStmt(hasLoopInit(declStmt())) 6546matches 'int x = 0' in 6547 for (int x = 0; x < N; ++x) { } 6548</pre></td></tr> 6549 6550 6551<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> 6552<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 6553declaration's type. 6554 6555In case of a value declaration (for example a variable declaration), 6556this resolves one layer of indirection. For example, in the value 6557declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6558X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6559declaration of x. 6560 6561Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6562 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6563 and friend class X (matcher = friendDecl(hasType("X")) 6564 class X {}; 6565 void y(X &x) { x; X z; } 6566 class Y { friend class X; }; 6567 6568Example matches class Derived 6569(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6570class Base {}; 6571class Derived : Base {}; 6572 6573Usable 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>>, 6574Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6575</pre></td></tr> 6576 6577 6578<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> 6579<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 6580matcher. 6581 6582Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6583 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6584 and U (matcher = typedefDecl(hasType(asString("int"))) 6585 and friend class X (matcher = friendDecl(hasType("X")) 6586 class X {}; 6587 void y(X &x) { x; X z; } 6588 typedef int U; 6589 class Y { friend class X; }; 6590</pre></td></tr> 6591 6592 6593<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyBody0')"><a name="hasAnyBody0Anchor">hasAnyBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 6594<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST. 6595Note that this matcher matches all the declarations of a function whose 6596body is present in the AST. 6597 6598Given 6599 void f(); 6600 void f() {} 6601 void g(); 6602hasAnyBody(functionDecl()) 6603 matches both 'void f();' 6604 and 'void f() {}' 6605with compoundStmt() 6606 matching '{}' 6607 but does not match 'void g();' 6608</pre></td></tr> 6609 6610 6611<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> 6612<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 6613block. 6614 6615Does not match the 'this' parameter of a method. 6616 6617Given 6618 class X { void f(int x, int y, int z) {} }; 6619cxxMethodDecl(hasAnyParameter(hasName("y"))) 6620 matches f(int x, int y, int z) {} 6621with hasAnyParameter(...) 6622 matching int y 6623 6624For ObjectiveC, given 6625 @interface I - (void) f:(int) y; @end 6626 6627the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 6628matches the declaration of method f with hasParameter 6629matching y. 6630 6631For blocks, given 6632 b = ^(int y) { printf("%d", y) }; 6633 6634the matcher blockDecl(hasAnyParameter(hasName("y"))) 6635matches the declaration of the block b with hasParameter 6636matching y. 6637</pre></td></tr> 6638 6639 6640<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> 6641<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6642functionDecl that have at least one TemplateArgument matching the given 6643InnerMatcher. 6644 6645Given 6646 template<typename T> class A {}; 6647 template<> class A<double> {}; 6648 A<int> a; 6649 6650 template<typename T> f() {}; 6651 void func() { f<int>(); }; 6652 6653classTemplateSpecializationDecl(hasAnyTemplateArgument( 6654 refersToType(asString("int")))) 6655 matches the specialization A<int> 6656 6657functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 6658 matches the specialization f<int> 6659</pre></td></tr> 6660 6661 6662<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> 6663<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr> 6664 6665 6666<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> 6667<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 6668declaration. 6669 6670Given 6671 template<bool b> 6672 struct S { 6673 S(int); // #1 6674 explicit S(double); // #2 6675 operator int(); // #3 6676 explicit operator bool(); // #4 6677 explicit(false) S(bool) // # 7 6678 explicit(true) S(char) // # 8 6679 explicit(b) S(S) // # 9 6680 }; 6681 S(int) -> S<true> // #5 6682 explicit S(double) -> S<false> // #6 6683cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 6684cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 6685cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 6686</pre></td></tr> 6687 6688 6689<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> 6690<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 6691declaration or a block. 6692 6693Given 6694 class X { void f(int x) {} }; 6695cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6696 matches f(int x) {} 6697with hasParameter(...) 6698 matching int x 6699 6700For ObjectiveC, given 6701 @interface I - (void) f:(int) y; @end 6702 6703the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6704matches the declaration of method f with hasParameter 6705matching y. 6706</pre></td></tr> 6707 6708 6709<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> 6710<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6711functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 6712 6713Given 6714 template<typename T, typename U> class A {}; 6715 A<bool, int> b; 6716 A<int, bool> c; 6717 6718 template<typename T> void f() {} 6719 void func() { f<int>(); }; 6720classTemplateSpecializationDecl(hasTemplateArgument( 6721 1, refersToType(asString("int")))) 6722 matches the specialization A<bool, int> 6723 6724functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 6725 matches the specialization f<int> 6726</pre></td></tr> 6727 6728 6729<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> 6730<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 6731 6732Given: 6733 class X { int f() { return 1; } }; 6734cxxMethodDecl(returns(asString("int"))) 6735 matches int f() { return 1; } 6736</pre></td></tr> 6737 6738 6739<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> 6740<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 6741switch statement or conditional operator. 6742 6743Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6744 if (true) {} 6745</pre></td></tr> 6746 6747 6748<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> 6749<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 6750 6751Given 6752 if (A* a = GetAPointer()) {} 6753hasConditionVariableStatement(...) 6754 matches 'A* a = GetAPointer()'. 6755</pre></td></tr> 6756 6757 6758<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> 6759<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 6760 6761Examples matches the if statement 6762 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 6763 if (false) false; else true; 6764</pre></td></tr> 6765 6766 6767<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> 6768<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 6769 6770Given: 6771 void foo() { 6772 if (int i = foobar(); i > 0) {} 6773 switch (int i = foobar(); i) {} 6774 for (auto& a = get_range(); auto& x : a) {} 6775 } 6776 void bar() { 6777 if (foobar() > 0) {} 6778 switch (foobar()) {} 6779 for (auto& x : get_range()) {} 6780 } 6781ifStmt(hasInitStatement(anything())) 6782 matches the if statement in foo but not in bar. 6783switchStmt(hasInitStatement(anything())) 6784 matches the switch statement in foo but not in bar. 6785cxxForRangeStmt(hasInitStatement(anything())) 6786 matches the range for statement in foo but not in bar. 6787</pre></td></tr> 6788 6789 6790<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> 6791<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 6792 6793Examples matches the if statement 6794 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 6795 if (false) true; else false; 6796</pre></td></tr> 6797 6798 6799<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> 6800<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 6801matcher. 6802 6803FIXME: Unit test this matcher 6804</pre></td></tr> 6805 6806 6807<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> 6808<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 6809 6810Example matches y. 6811 (matcher = initListExpr(hasInit(0, expr()))) 6812 int x{y}. 6813</pre></td></tr> 6814 6815 6816<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> 6817<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 6818(if expression have it). 6819</pre></td></tr> 6820 6821 6822<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> 6823<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 6824matches the given matcher. 6825 6826The associated declaration is: 6827- for type nodes, the declaration of the underlying type 6828- for CallExpr, the declaration of the callee 6829- for MemberExpr, the declaration of the referenced member 6830- for CXXConstructExpr, the declaration of the constructor 6831- for CXXNewExpr, the declaration of the operator new 6832- for ObjCIvarExpr, the declaration of the ivar 6833 6834For type nodes, hasDeclaration will generally match the declaration of the 6835sugared type. Given 6836 class X {}; 6837 typedef X Y; 6838 Y y; 6839in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6840typedefDecl. A common use case is to match the underlying, desugared type. 6841This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6842 varDecl(hasType(hasUnqualifiedDesugaredType( 6843 recordType(hasDeclaration(decl()))))) 6844In this matcher, the decl will match the CXXRecordDecl of class X. 6845 6846Usable 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>>, 6847 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>>, 6848 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>>, 6849 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>>, 6850 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>>, 6851 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>>, 6852 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6853</pre></td></tr> 6854 6855 6856<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> 6857<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 6858matches the given matcher. 6859 6860The associated declaration is: 6861- for type nodes, the declaration of the underlying type 6862- for CallExpr, the declaration of the callee 6863- for MemberExpr, the declaration of the referenced member 6864- for CXXConstructExpr, the declaration of the constructor 6865- for CXXNewExpr, the declaration of the operator new 6866- for ObjCIvarExpr, the declaration of the ivar 6867 6868For type nodes, hasDeclaration will generally match the declaration of the 6869sugared type. Given 6870 class X {}; 6871 typedef X Y; 6872 Y y; 6873in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6874typedefDecl. A common use case is to match the underlying, desugared type. 6875This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6876 varDecl(hasType(hasUnqualifiedDesugaredType( 6877 recordType(hasDeclaration(decl()))))) 6878In this matcher, the decl will match the CXXRecordDecl of class X. 6879 6880Usable 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>>, 6881 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>>, 6882 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>>, 6883 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>>, 6884 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>>, 6885 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>>, 6886 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6887</pre></td></tr> 6888 6889 6890<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> 6891<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression. 6892 6893Given 6894 struct foo { 6895 void bar() { 6896 auto f = [this](){}; 6897 } 6898 } 6899lambdaExpr(hasAnyCapture(cxxThisExpr())) 6900 matches [this](){}; 6901</pre></td></tr> 6902 6903 6904<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> 6905<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression. 6906 6907Given 6908 void foo() { 6909 int x; 6910 auto f = [x](){}; 6911 } 6912lambdaExpr(hasAnyCapture(anything())) 6913 matches [x](){}; 6914</pre></td></tr> 6915 6916 6917<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> 6918<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 6919matches the given matcher. 6920 6921The associated declaration is: 6922- for type nodes, the declaration of the underlying type 6923- for CallExpr, the declaration of the callee 6924- for MemberExpr, the declaration of the referenced member 6925- for CXXConstructExpr, the declaration of the constructor 6926- for CXXNewExpr, the declaration of the operator new 6927- for ObjCIvarExpr, the declaration of the ivar 6928 6929For type nodes, hasDeclaration will generally match the declaration of the 6930sugared type. Given 6931 class X {}; 6932 typedef X Y; 6933 Y y; 6934in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6935typedefDecl. A common use case is to match the underlying, desugared type. 6936This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6937 varDecl(hasType(hasUnqualifiedDesugaredType( 6938 recordType(hasDeclaration(decl()))))) 6939In this matcher, the decl will match the CXXRecordDecl of class X. 6940 6941Usable 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>>, 6942 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>>, 6943 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>>, 6944 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>>, 6945 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>>, 6946 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>>, 6947 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6948</pre></td></tr> 6949 6950 6951<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> 6952<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 6953given matcher. Implicit object expressions are included; that is, it matches 6954use of implicit `this`. 6955 6956Given 6957 struct X { 6958 int m; 6959 int f(X x) { x.m; return m; } 6960 }; 6961memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6962 matches `x.m`, but not `m`; however, 6963memberExpr(hasObjectExpression(hasType(pointsTo( 6964 cxxRecordDecl(hasName("X")))))) 6965 matches `m` (aka. `this->m`), but not `x.m`. 6966</pre></td></tr> 6967 6968 6969<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> 6970<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 6971given matcher. 6972 6973Given 6974 struct { int first, second; } first, second; 6975 int i(second.first); 6976 int j(first.second); 6977memberExpr(member(hasName("first"))) 6978 matches second.first 6979 but not first.second (because the member name there is "second"). 6980</pre></td></tr> 6981 6982 6983<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> 6984<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 6985pointee matches a given matcher. 6986 6987Given 6988 int *a; 6989 int const *b; 6990 float const *f; 6991pointerType(pointee(isConstQualified(), isInteger())) 6992 matches "int const *b" 6993 6994Usable 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>>, 6995 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>> 6996</pre></td></tr> 6997 6998 6999<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> 7000<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 7001matcher. 7002 7003Given 7004 namespace N { template<class T> void f(T t); } 7005 template <class T> void g() { using N::f; f(T()); } 7006unresolvedLookupExpr(hasAnyDeclaration( 7007 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 7008 matches the use of f in g() . 7009</pre></td></tr> 7010 7011 7012<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> 7013<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 7014 7015Given 7016 struct A { struct B { struct C {}; }; }; 7017 A::B::C c; 7018nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 7019 matches "A::" 7020</pre></td></tr> 7021 7022 7023<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> 7024<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 7025NestedNameSpecifier-matcher matches. 7026</pre></td></tr> 7027 7028 7029<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> 7030<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 7031given TypeLoc. 7032 7033Given 7034 struct A { struct B { struct C {}; }; }; 7035 A::B::C c; 7036nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 7037 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 7038 matches "A::" 7039</pre></td></tr> 7040 7041 7042<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> 7043<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 7044 7045Given 7046 struct A { struct B { struct C {}; }; }; 7047 A::B::C c; 7048nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 7049 matches "A::" 7050</pre></td></tr> 7051 7052 7053<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> 7054<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 7055given namespace matcher. 7056 7057Given 7058 namespace ns { struct A {}; } 7059 ns::A a; 7060nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 7061 matches "ns::" 7062</pre></td></tr> 7063 7064 7065<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> 7066<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 7067given QualType matcher without qualifiers. 7068 7069Given 7070 struct A { struct B { struct C {}; }; }; 7071 A::B::C c; 7072nestedNameSpecifier(specifiesType( 7073 hasDeclaration(cxxRecordDecl(hasName("A"))) 7074)) 7075 matches "A::" 7076</pre></td></tr> 7077 7078 7079<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('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> 7080<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 7081 7082Given 7083 7084 #pragma omp parallel 7085 #pragma omp parallel default(none) 7086 7087``ompExecutableDirective(hasAnyClause(anything()))`` matches 7088``omp parallel default(none)``. 7089</pre></td></tr> 7090 7091 7092<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> 7093<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 7094 7095Prerequisite: the executable directive must not be standalone directive. 7096If it is, it will never match. 7097 7098Given 7099 7100 #pragma omp parallel 7101 ; 7102 #pragma omp parallel 7103 {} 7104 7105``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 7106</pre></td></tr> 7107 7108 7109<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> 7110<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 7111matching Base, or Objective-C classes that directly or indirectly 7112subclass a class matching Base. 7113 7114Note that a class is not considered to be derived from itself. 7115 7116Example matches Y, Z, C (Base == hasName("X")) 7117 class X; 7118 class Y : public X {}; // directly derived 7119 class Z : public Y {}; // indirectly derived 7120 typedef X A; 7121 typedef A B; 7122 class C : public B {}; // derived from a typedef of X 7123 7124In the following example, Bar matches isDerivedFrom(hasName("X")): 7125 class Foo; 7126 typedef Foo X; 7127 class Bar : public Foo {}; // derived from a type that X is a typedef of 7128 7129In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 7130 @interface NSObject @end 7131 @interface Bar : NSObject @end 7132 7133Usable 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>> 7134</pre></td></tr> 7135 7136 7137<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> 7138<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 7139matching Base. 7140 7141Note that a class is not considered to be derived from itself. 7142 7143Example matches Y, C (Base == hasName("X")) 7144 class X; 7145 class Y : public X {}; // directly derived 7146 class Z : public Y {}; // indirectly derived 7147 typedef X A; 7148 typedef A B; 7149 class C : public B {}; // derived from a typedef of X 7150 7151In the following example, Bar matches isDerivedFrom(hasName("X")): 7152 class Foo; 7153 typedef Foo X; 7154 class Bar : public Foo {}; // derived from a type that X is a typedef of 7155</pre></td></tr> 7156 7157 7158<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> 7159<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 7160match Base. 7161</pre></td></tr> 7162 7163 7164<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> 7165<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 7166expression, or an ObjC-message-send expression. 7167 7168Given 7169 void x(int, int, int) { int y; x(1, y, 42); } 7170callExpr(hasAnyArgument(declRefExpr())) 7171 matches x(1, y, 42) 7172with hasAnyArgument(...) 7173 matching y 7174 7175For ObjectiveC, given 7176 @interface I - (void) f:(int) y; @end 7177 void foo(I *i) { [i f:12]; } 7178objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 7179 matches [i f:12] 7180</pre></td></tr> 7181 7182 7183<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> 7184<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 7185call expression. 7186 7187Example matches y in x(y) 7188 (matcher = callExpr(hasArgument(0, declRefExpr()))) 7189 void x(int) { int y; x(y); } 7190</pre></td></tr> 7191 7192 7193<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> 7194<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 7195and the inner matcher matches on that instance. 7196 7197For example the method call in 7198 NSString *x = @"hello"; 7199 [x containsString:@"h"]; 7200is matched by 7201objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 7202</pre></td></tr> 7203 7204 7205<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> 7206<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 7207 7208Example 7209matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 7210matches the [webView ...] message invocation. 7211 NSString *webViewJavaScript = ... 7212 UIWebView *webView = ... 7213 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 7214</pre></td></tr> 7215 7216 7217<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> 7218<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 7219block. 7220 7221Does not match the 'this' parameter of a method. 7222 7223Given 7224 class X { void f(int x, int y, int z) {} }; 7225cxxMethodDecl(hasAnyParameter(hasName("y"))) 7226 matches f(int x, int y, int z) {} 7227with hasAnyParameter(...) 7228 matching int y 7229 7230For ObjectiveC, given 7231 @interface I - (void) f:(int) y; @end 7232 7233the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 7234matches the declaration of method f with hasParameter 7235matching y. 7236 7237For blocks, given 7238 b = ^(int y) { printf("%d", y) }; 7239 7240the matcher blockDecl(hasAnyParameter(hasName("y"))) 7241matches the declaration of the block b with hasParameter 7242matching y. 7243</pre></td></tr> 7244 7245 7246<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> 7247<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 7248declaration or a block. 7249 7250Given 7251 class X { void f(int x) {} }; 7252cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 7253 matches f(int x) {} 7254with hasParameter(...) 7255 matching int x 7256 7257For ObjectiveC, given 7258 @interface I - (void) f:(int) y; @end 7259 7260the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 7261matches the declaration of method f with hasParameter 7262matching y. 7263</pre></td></tr> 7264 7265 7266<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> 7267<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 7268or opaque value's source expression matches the given matcher. 7269 7270Example 1: matches "a string" 7271(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 7272class URL { URL(string); }; 7273URL url = "a string"; 7274 7275Example 2: matches 'b' (matcher = 7276opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 7277int a = b ?: 1; 7278</pre></td></tr> 7279 7280 7281<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> 7282<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 7283overloads matches the given matcher. 7284 7285Given 7286 template <typename T> void foo(T); 7287 template <typename T> void bar(T); 7288 template <typename T> void baz(T t) { 7289 foo(t); 7290 bar(t); 7291 } 7292unresolvedLookupExpr(hasAnyDeclaration( 7293 functionTemplateDecl(hasName("foo")))) 7294 matches foo in foo(t); but not bar in bar(t); 7295</pre></td></tr> 7296 7297 7298<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> 7299<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 7300 7301Given 7302 int (*ptr_to_array)[4]; 7303 int (*ptr_to_func)(int); 7304 7305varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 7306ptr_to_func but not ptr_to_array. 7307 7308Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 7309</pre></td></tr> 7310 7311 7312<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> 7313<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 7314pointee matches a given matcher. 7315 7316Given 7317 int *a; 7318 int const *b; 7319 float const *f; 7320pointerType(pointee(isConstQualified(), isInteger())) 7321 matches "int const *b" 7322 7323Usable 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>>, 7324 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>> 7325</pre></td></tr> 7326 7327 7328<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('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> 7329<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 7330 7331Given: 7332 typedef int &int_ref; 7333 int a; 7334 int_ref b = a; 7335 7336varDecl(hasType(qualType(referenceType()))))) will not match the 7337declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 7338</pre></td></tr> 7339 7340 7341<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> 7342<tr><td colspan="4" class="doc" id="hasDeclaration6"><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_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> 7376<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 7377 7378Given 7379 void (*fp)(void); 7380The matcher 7381 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 7382would match the declaration for fp. 7383</pre></td></tr> 7384 7385 7386<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> 7387<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 7388</pre></td></tr> 7389 7390 7391<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> 7392<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 7393matches the specified matcher. 7394 7395Example matches y->x() 7396 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 7397 cxxRecordDecl(hasName("Y"))))))) 7398 class Y { public: void x(); }; 7399 void z() { Y *y; y->x(); } 7400</pre></td></tr> 7401 7402 7403<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> 7404<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 7405</pre></td></tr> 7406 7407 7408<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> 7409<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 7410type matches the specified matcher. 7411 7412Example matches X &x and const X &y 7413 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 7414 class X { 7415 void a(X b) { 7416 X &x = b; 7417 const X &y = b; 7418 } 7419 }; 7420</pre></td></tr> 7421 7422 7423<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> 7424<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 7425matches the given matcher. 7426 7427The associated declaration is: 7428- for type nodes, the declaration of the underlying type 7429- for CallExpr, the declaration of the callee 7430- for MemberExpr, the declaration of the referenced member 7431- for CXXConstructExpr, the declaration of the constructor 7432- for CXXNewExpr, the declaration of the operator new 7433- for ObjCIvarExpr, the declaration of the ivar 7434 7435For type nodes, hasDeclaration will generally match the declaration of the 7436sugared type. Given 7437 class X {}; 7438 typedef X Y; 7439 Y y; 7440in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7441typedefDecl. A common use case is to match the underlying, desugared type. 7442This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7443 varDecl(hasType(hasUnqualifiedDesugaredType( 7444 recordType(hasDeclaration(decl()))))) 7445In this matcher, the decl will match the CXXRecordDecl of class X. 7446 7447Usable 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>>, 7448 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>>, 7449 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>>, 7450 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>>, 7451 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>>, 7452 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>>, 7453 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7454</pre></td></tr> 7455 7456 7457<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> 7458<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 7459pointee matches a given matcher. 7460 7461Given 7462 int *a; 7463 int const *b; 7464 float const *f; 7465pointerType(pointee(isConstQualified(), isInteger())) 7466 matches "int const *b" 7467 7468Usable 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>>, 7469 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>> 7470</pre></td></tr> 7471 7472 7473<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> 7474<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 7475 7476Given 7477 return a + b; 7478hasReturnValue(binaryOperator()) 7479 matches 'return a + b' 7480with binaryOperator() 7481 matching 'a + b' 7482</pre></td></tr> 7483 7484 7485<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> 7486<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 7487a given matcher. Also matches StmtExprs that have CompoundStmt as children. 7488 7489Given 7490 { {}; 1+2; } 7491hasAnySubstatement(compoundStmt()) 7492 matches '{ {}; 1+2; }' 7493with compoundStmt() 7494 matching '{}' 7495</pre></td></tr> 7496 7497 7498<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> 7499<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 7500alignof. 7501</pre></td></tr> 7502 7503 7504<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> 7505<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to 7506 7507Given: 7508F& operator=(const F& o) { 7509 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 7510 return *this; 7511} 7512returnStmt(forFunction(hasName("operator="))) 7513 matches 'return *this' 7514 but does not match 'return v > 0' 7515</pre></td></tr> 7516 7517 7518<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> 7519<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 7520sizeof. 7521</pre></td></tr> 7522 7523 7524<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> 7525<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 7526type that matches the provided matcher. 7527 7528Given 7529 template <typename T> 7530 double F(T t); 7531 int i; 7532 double j = F(i); 7533 7534substTemplateTypeParmType(hasReplacementType(type())) matches int 7535</pre></td></tr> 7536 7537 7538<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>></td><td class="name" onclick="toggle('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> 7539<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 7540statement. This matcher may produce multiple matches. 7541 7542Given 7543 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 7544switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 7545 matches four times, with "c" binding each of "case 1:", "case 2:", 7546"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 7547"switch (1)", "switch (2)" and "switch (2)". 7548</pre></td></tr> 7549 7550 7551<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> 7552<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 7553switch statement or conditional operator. 7554 7555Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7556 if (true) {} 7557</pre></td></tr> 7558 7559 7560<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> 7561<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 7562 7563Given: 7564 void foo() { 7565 if (int i = foobar(); i > 0) {} 7566 switch (int i = foobar(); i) {} 7567 for (auto& a = get_range(); auto& x : a) {} 7568 } 7569 void bar() { 7570 if (foobar() > 0) {} 7571 switch (foobar()) {} 7572 for (auto& x : get_range()) {} 7573 } 7574ifStmt(hasInitStatement(anything())) 7575 matches the if statement in foo but not in bar. 7576switchStmt(hasInitStatement(anything())) 7577 matches the switch statement in foo but not in bar. 7578cxxForRangeStmt(hasInitStatement(anything())) 7579 matches the range for statement in foo but not in bar. 7580</pre></td></tr> 7581 7582 7583<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> 7584<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 7585matches the given matcher. 7586 7587The associated declaration is: 7588- for type nodes, the declaration of the underlying type 7589- for CallExpr, the declaration of the callee 7590- for MemberExpr, the declaration of the referenced member 7591- for CXXConstructExpr, the declaration of the constructor 7592- for CXXNewExpr, the declaration of the operator new 7593- for ObjCIvarExpr, the declaration of the ivar 7594 7595For type nodes, hasDeclaration will generally match the declaration of the 7596sugared type. Given 7597 class X {}; 7598 typedef X Y; 7599 Y y; 7600in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7601typedefDecl. A common use case is to match the underlying, desugared type. 7602This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7603 varDecl(hasType(hasUnqualifiedDesugaredType( 7604 recordType(hasDeclaration(decl()))))) 7605In this matcher, the decl will match the CXXRecordDecl of class X. 7606 7607Usable 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>>, 7608 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>>, 7609 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>>, 7610 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>>, 7611 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>>, 7612 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>>, 7613 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7614</pre></td></tr> 7615 7616 7617<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> 7618<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 7619 7620Given 7621 struct B { int next; }; 7622 template<int(B::*next_ptr)> struct A {}; 7623 A<&B::next> a; 7624templateSpecializationType(hasAnyTemplateArgument( 7625 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 7626 matches the specialization A<&B::next> with fieldDecl(...) matching 7627 B::next 7628</pre></td></tr> 7629 7630 7631<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> 7632<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 7633declaration. 7634 7635Given 7636 struct B { int next; }; 7637 template<int(B::*next_ptr)> struct A {}; 7638 A<&B::next> a; 7639classTemplateSpecializationDecl(hasAnyTemplateArgument( 7640 refersToDeclaration(fieldDecl(hasName("next"))))) 7641 matches the specialization A<&B::next> with fieldDecl(...) matching 7642 B::next 7643</pre></td></tr> 7644 7645 7646<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> 7647<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type. 7648 7649Given 7650 template<int T> struct C {}; 7651 C<42> c; 7652classTemplateSpecializationDecl( 7653 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 7654 matches the implicit instantiation of C in C<42>. 7655</pre></td></tr> 7656 7657 7658<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('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> 7659<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 7660 7661Given 7662 template<template <typename> class S> class X {}; 7663 template<typename T> class Y {}; 7664 X<Y> xi; 7665classTemplateSpecializationDecl(hasAnyTemplateArgument( 7666 refersToTemplate(templateName()))) 7667 matches the specialization X<Y> 7668</pre></td></tr> 7669 7670 7671<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> 7672<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 7673 7674Given 7675 struct X {}; 7676 template<typename T> struct A {}; 7677 A<X> a; 7678classTemplateSpecializationDecl(hasAnyTemplateArgument( 7679 refersToType(class(hasName("X"))))) 7680 matches the specialization A<X> 7681</pre></td></tr> 7682 7683 7684<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> 7685<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7686functionDecl that have at least one TemplateArgument matching the given 7687InnerMatcher. 7688 7689Given 7690 template<typename T> class A {}; 7691 template<> class A<double> {}; 7692 A<int> a; 7693 7694 template<typename T> f() {}; 7695 void func() { f<int>(); }; 7696 7697classTemplateSpecializationDecl(hasAnyTemplateArgument( 7698 refersToType(asString("int")))) 7699 matches the specialization A<int> 7700 7701functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7702 matches the specialization f<int> 7703</pre></td></tr> 7704 7705 7706<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> 7707<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 7708matches the given matcher. 7709 7710The associated declaration is: 7711- for type nodes, the declaration of the underlying type 7712- for CallExpr, the declaration of the callee 7713- for MemberExpr, the declaration of the referenced member 7714- for CXXConstructExpr, the declaration of the constructor 7715- for CXXNewExpr, the declaration of the operator new 7716- for ObjCIvarExpr, the declaration of the ivar 7717 7718For type nodes, hasDeclaration will generally match the declaration of the 7719sugared type. Given 7720 class X {}; 7721 typedef X Y; 7722 Y y; 7723in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7724typedefDecl. A common use case is to match the underlying, desugared type. 7725This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7726 varDecl(hasType(hasUnqualifiedDesugaredType( 7727 recordType(hasDeclaration(decl()))))) 7728In this matcher, the decl will match the CXXRecordDecl of class X. 7729 7730Usable 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>>, 7731 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>>, 7732 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>>, 7733 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>>, 7734 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>>, 7735 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>>, 7736 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7737</pre></td></tr> 7738 7739 7740<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> 7741<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7742functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7743 7744Given 7745 template<typename T, typename U> class A {}; 7746 A<bool, int> b; 7747 A<int, bool> c; 7748 7749 template<typename T> void f() {} 7750 void func() { f<int>(); }; 7751classTemplateSpecializationDecl(hasTemplateArgument( 7752 1, refersToType(asString("int")))) 7753 matches the specialization A<bool, int> 7754 7755functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7756 matches the specialization f<int> 7757</pre></td></tr> 7758 7759 7760<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> 7761<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 7762matches the given matcher. 7763 7764The associated declaration is: 7765- for type nodes, the declaration of the underlying type 7766- for CallExpr, the declaration of the callee 7767- for MemberExpr, the declaration of the referenced member 7768- for CXXConstructExpr, the declaration of the constructor 7769- for CXXNewExpr, the declaration of the operator new 7770- for ObjCIvarExpr, the declaration of the ivar 7771 7772For type nodes, hasDeclaration will generally match the declaration of the 7773sugared type. Given 7774 class X {}; 7775 typedef X Y; 7776 Y y; 7777in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7778typedefDecl. A common use case is to match the underlying, desugared type. 7779This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7780 varDecl(hasType(hasUnqualifiedDesugaredType( 7781 recordType(hasDeclaration(decl()))))) 7782In this matcher, the decl will match the CXXRecordDecl of class X. 7783 7784Usable 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>>, 7785 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>>, 7786 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>>, 7787 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>>, 7788 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>>, 7789 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>>, 7790 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7791</pre></td></tr> 7792 7793 7794<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> 7795<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 7796QualType-matcher matches. 7797</pre></td></tr> 7798 7799 7800<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> 7801<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 7802matcher. 7803 7804Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7805 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7806 and U (matcher = typedefDecl(hasType(asString("int"))) 7807 and friend class X (matcher = friendDecl(hasType("X")) 7808 class X {}; 7809 void y(X &x) { x; X z; } 7810 typedef int U; 7811 class Y { friend class X; }; 7812</pre></td></tr> 7813 7814 7815<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> 7816<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 7817matches the given matcher. 7818 7819The associated declaration is: 7820- for type nodes, the declaration of the underlying type 7821- for CallExpr, the declaration of the callee 7822- for MemberExpr, the declaration of the referenced member 7823- for CXXConstructExpr, the declaration of the constructor 7824- for CXXNewExpr, the declaration of the operator new 7825- for ObjCIvarExpr, the declaration of the ivar 7826 7827For type nodes, hasDeclaration will generally match the declaration of the 7828sugared type. Given 7829 class X {}; 7830 typedef X Y; 7831 Y y; 7832in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7833typedefDecl. A common use case is to match the underlying, desugared type. 7834This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7835 varDecl(hasType(hasUnqualifiedDesugaredType( 7836 recordType(hasDeclaration(decl()))))) 7837In this matcher, the decl will match the CXXRecordDecl of class X. 7838 7839Usable 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>>, 7840 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>>, 7841 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>>, 7842 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>>, 7843 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>>, 7844 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>>, 7845 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7846</pre></td></tr> 7847 7848 7849<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> 7850<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 7851type of the matched node. 7852 7853For example, in: 7854 class A {}; 7855 using B = A; 7856The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 7857both B and A. 7858</pre></td></tr> 7859 7860 7861<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> 7862<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 7863 7864Given 7865 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 7866unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 7867 matches sizeof(a) and alignof(c) 7868</pre></td></tr> 7869 7870 7871<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> 7872<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 7873 7874Example matches true (matcher = hasUnaryOperand( 7875 cxxBoolLiteral(equals(true)))) 7876 !true 7877</pre></td></tr> 7878 7879 7880<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> 7881<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 7882given matcher. Implicit object expressions are included; that is, it matches 7883use of implicit `this`. 7884 7885Given 7886 struct X { 7887 int m; 7888 int f(X x) { x.m; return m; } 7889 }; 7890memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 7891 matches `x.m`, but not `m`; however, 7892memberExpr(hasObjectExpression(hasType(pointsTo( 7893 cxxRecordDecl(hasName("X")))))) 7894 matches `m` (aka. `this->m`), but not `x.m`. 7895</pre></td></tr> 7896 7897 7898<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> 7899<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 7900matches the given matcher. 7901 7902The associated declaration is: 7903- for type nodes, the declaration of the underlying type 7904- for CallExpr, the declaration of the callee 7905- for MemberExpr, the declaration of the referenced member 7906- for CXXConstructExpr, the declaration of the constructor 7907- for CXXNewExpr, the declaration of the operator new 7908- for ObjCIvarExpr, the declaration of the ivar 7909 7910For type nodes, hasDeclaration will generally match the declaration of the 7911sugared type. Given 7912 class X {}; 7913 typedef X Y; 7914 Y y; 7915in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7916typedefDecl. A common use case is to match the underlying, desugared type. 7917This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7918 varDecl(hasType(hasUnqualifiedDesugaredType( 7919 recordType(hasDeclaration(decl()))))) 7920In this matcher, the decl will match the CXXRecordDecl of class X. 7921 7922Usable 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>>, 7923 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>>, 7924 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>>, 7925 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>>, 7926 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>>, 7927 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>>, 7928 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7929</pre></td></tr> 7930 7931 7932<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> 7933<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 7934 7935Given 7936 namespace X { void b(); } 7937 using X::b; 7938usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 7939 matches using X::b </pre></td></tr> 7940 7941 7942<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> 7943<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 7944matched by the given matcher. 7945 7946Given 7947 namespace X { int a; void b(); } 7948 using X::a; 7949 using X::b; 7950usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 7951 matches using X::b but not using X::a </pre></td></tr> 7952 7953 7954<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> 7955<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 7956declaration's type. 7957 7958In case of a value declaration (for example a variable declaration), 7959this resolves one layer of indirection. For example, in the value 7960declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7961X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7962declaration of x. 7963 7964Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7965 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7966 and friend class X (matcher = friendDecl(hasType("X")) 7967 class X {}; 7968 void y(X &x) { x; X z; } 7969 class Y { friend class X; }; 7970 7971Example matches class Derived 7972(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7973class Base {}; 7974class Derived : Base {}; 7975 7976Usable 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>>, 7977Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7978</pre></td></tr> 7979 7980 7981<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> 7982<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 7983matcher. 7984 7985Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7986 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7987 and U (matcher = typedefDecl(hasType(asString("int"))) 7988 and friend class X (matcher = friendDecl(hasType("X")) 7989 class X {}; 7990 void y(X &x) { x; X z; } 7991 typedef int U; 7992 class Y { friend class X; }; 7993</pre></td></tr> 7994 7995 7996<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> 7997<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 7998that matches the given matcher. 7999 8000Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 8001 bool y() { return true; } 8002 bool x = y(); 8003</pre></td></tr> 8004 8005 8006<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> 8007<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 8008expression. 8009 8010Given 8011 void f(int b) { 8012 int a[b]; 8013 } 8014variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 8015 varDecl(hasName("b"))))))) 8016 matches "int a[b]" 8017</pre></td></tr> 8018 8019 8020<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> 8021<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr> 8022 8023 8024<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> 8025<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 8026switch statement or conditional operator. 8027 8028Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8029 if (true) {} 8030</pre></td></tr> 8031 8032<!--END_TRAVERSAL_MATCHERS --> 8033</table> 8034 8035</div> 8036</body> 8037</html> 8038 8039 8040