1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 2 "http://www.w3.org/TR/html4/strict.dtd"> 3<html> 4<head> 5<title>AST Matcher Reference</title> 6<link type="text/css" rel="stylesheet" href="../menu.css" /> 7<link type="text/css" rel="stylesheet" href="../content.css" /> 8<style type="text/css"> 9td { 10 padding: .33em; 11} 12td.doc { 13 display: none; 14 border-bottom: 1px solid black; 15} 16td.name:hover { 17 color: blue; 18 cursor: pointer; 19} 20</style> 21<script type="text/javascript"> 22function toggle(id) { 23 if (!id) return; 24 row = document.getElementById(id); 25 if (row.style.display != 'table-cell') 26 row.style.display = 'table-cell'; 27 else 28 row.style.display = 'none'; 29} 30</script> 31</head> 32<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))"> 33 34<!--#include virtual="../menu.html.incl"--> 35 36<div id="content"> 37 38<h1>AST Matcher Reference</h1> 39 40<p>This document shows all currently implemented matchers. The matchers are grouped 41by category and node type they match. You can click on matcher names to show the 42matcher's source documentation.</p> 43 44<p>There are three different basic categories of matchers: 45<ul> 46<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li> 47<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li> 48<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li> 49</ul> 50</p> 51 52<p>Within each category the matchers are ordered by node type they match on. 53Note that if a matcher can match multiple node types, it will appear 54multiple times. This means that by searching for Matcher<Stmt> you can 55find all matchers that can be used to match on Stmt nodes.</p> 56 57<p>The exception to that rule are matchers that can match on any node. Those 58are marked with a * and are listed in the beginning of each category.</p> 59 60<p>Note that the categorization of matchers is a great help when you combine 61them into matcher expressions. You will usually want to form matcher expressions 62that read like english sentences by alternating between node matchers and 63narrowing or traversal matchers, like this: 64<pre> 65recordDecl(hasDescendant( 66 ifStmt(hasTrueExpression( 67 expr(hasDescendant( 68 ifStmt())))))) 69</pre> 70</p> 71 72<!-- ======================================================================= --> 73<h2 id="decl-matchers">Node Matchers</h2> 74<!-- ======================================================================= --> 75 76<p>Node matchers are at the core of matcher expressions - they specify the type 77of node that is expected. Every match expression starts with a node matcher, 78which can then be further refined with a narrowing or traversal matcher. All 79traversal matchers take node matchers as their arguments.</p> 80 81<p>For convenience, all node matchers take an arbitrary number of arguments 82and implicitly act as allOf matchers.</p> 83 84<p>Node matchers are the only matchers that support the bind("id") call to 85bind the matched node to the given string, to be later retrieved from the 86match callback.</p> 87 88<p>It is important to remember that the arguments to node matchers are 89predicates on the same node, just with additional information about the type. 90This is often useful to make matcher expression more readable by inlining bind 91calls into redundant node matchers inside another node matcher: 92<pre> 93// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on 94// the same node. 95recordDecl(decl().bind("id"), hasName("::MyClass")) 96</pre> 97</p> 98 99<table> 100<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 101<!-- START_DECL_MATCHERS --> 102 103<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>...</td></tr> 104<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers. 105 106Examples matches i(42). 107 class C { 108 C() : i(42) {} 109 int i; 110 }; 111</pre></td></tr> 112 113 114<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>>...</td></tr> 115<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations. 116 117Given 118 class C { 119 public: 120 int a; 121 }; 122accessSpecDecl() 123 matches 'public:' 124</pre></td></tr> 125 126 127<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>...</td></tr> 128<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations. 129 130Example matches the declaration of the nameless block printing an input 131integer. 132 133 myFunc(^(int p) { 134 printf("%d", p); 135 }) 136</pre></td></tr> 137 138 139<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>>...</td></tr> 140<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations. 141 142Example matches Z 143 template<class T> class Z {}; 144</pre></td></tr> 145 146 147<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>>...</td></tr> 148<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations. 149 150Given 151 template<class T1, class T2, int I> 152 class A {}; 153 154 template<class T, int I> 155 class A<T, T*, I> {}; 156 157 template<> 158 class A<int, int, 1> {}; 159classTemplatePartialSpecializationDecl() 160 matches the specialization A<T,T*,I> but not A<int,int,1> 161</pre></td></tr> 162 163 164<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>...</td></tr> 165<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations. 166 167Given 168 template<typename T> class A {}; 169 template<> class A<double> {}; 170 A<int> a; 171classTemplateSpecializationDecl() 172 matches the specializations A<int> and A<double> 173</pre></td></tr> 174 175 176<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>>...</td></tr> 177<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. 178 179Example matches Foo::Foo() and Foo::Foo(int) 180 class Foo { 181 public: 182 Foo(); 183 Foo(int); 184 int DoSomething(); 185 }; 186</pre></td></tr> 187 188 189<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>>...</td></tr> 190<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations. 191 192Example matches the operator. 193 class X { operator int() const; }; 194</pre></td></tr> 195 196 197<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>>...</td></tr> 198<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide. 199 200Example matches the deduction guide. 201 template<typename T> 202 class X { X(int) }; 203 X(int) -> X<int>; 204</pre></td></tr> 205 206 207<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>>...</td></tr> 208<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations. 209 210Example matches Foo::~Foo() 211 class Foo { 212 public: 213 virtual ~Foo(); 214 }; 215</pre></td></tr> 216 217 218<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>...</td></tr> 219<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations. 220 221Example matches y 222 class X { void y(); }; 223</pre></td></tr> 224 225 226<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>...</td></tr> 227<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations. 228 229Example matches X, Z 230 class X; 231 template<class T> class Z {}; 232</pre></td></tr> 233 234 235<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>...</td></tr> 236<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 237 238Examples matches X, C, and the friend declaration inside C; 239 void X(); 240 class C { 241 friend X; 242 }; 243</pre></td></tr> 244 245 246<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>...</td></tr> 247<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 248and non-type template parameter declarations). 249 250Given 251 class X { int y; }; 252declaratorDecl() 253 matches int y. 254</pre></td></tr> 255 256 257<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>>...</td></tr> 258<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 259 260Example matches A, B, C 261 enum X { 262 A, B, C 263 }; 264</pre></td></tr> 265 266 267<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>>...</td></tr> 268<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 269 270Example matches X 271 enum X { 272 A, B, C 273 }; 274</pre></td></tr> 275 276 277<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>>...</td></tr> 278<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 279 280Given 281 class X { int m; }; 282fieldDecl() 283 matches 'm'. 284</pre></td></tr> 285 286 287<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>...</td></tr> 288<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 289 290Given 291 class X { friend void foo(); }; 292friendDecl() 293 matches 'friend void foo()'. 294</pre></td></tr> 295 296 297<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>...</td></tr> 298<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 299 300Example matches f 301 void f(); 302</pre></td></tr> 303 304 305<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>>...</td></tr> 306<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 307 308Example matches f 309 template<class T> void f(T t) {} 310</pre></td></tr> 311 312 313<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>>...</td></tr> 314<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations. 315 316Given 317 struct X { struct { int a; }; }; 318indirectFieldDecl() 319 matches 'a'. 320</pre></td></tr> 321 322 323<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>>...</td></tr> 324<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label. 325 326Given 327 goto FOO; 328 FOO: bar(); 329labelDecl() 330 matches 'FOO:' 331</pre></td></tr> 332 333 334<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>>...</td></tr> 335<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification. 336 337Given 338 extern "C" {} 339linkageSpecDecl() 340 matches "extern "C" {}" 341</pre></td></tr> 342 343 344<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>>...</td></tr> 345<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 346 347Example matches X, S, the anonymous union type, i, and U; 348 typedef int X; 349 struct S { 350 union { 351 int i; 352 } U; 353 }; 354</pre></td></tr> 355 356 357<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>>...</td></tr> 358<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias. 359 360Given 361 namespace test {} 362 namespace alias = ::test; 363namespaceAliasDecl() 364 matches "namespace alias" but not "namespace test" 365</pre></td></tr> 366 367 368<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>>...</td></tr> 369<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 370 371Given 372 namespace {} 373 namespace test {} 374namespaceDecl() 375 matches "namespace {}" and "namespace test {}" 376</pre></td></tr> 377 378 379<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>>...</td></tr> 380<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations. 381 382Given 383 template <typename T, int N> struct C {}; 384nonTypeTemplateParmDecl() 385 matches 'N', but not 'T'. 386</pre></td></tr> 387 388 389<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>>...</td></tr> 390<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations. 391 392Example matches Foo (Additions) 393 @interface Foo (Additions) 394 @end 395</pre></td></tr> 396 397 398<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>>...</td></tr> 399<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions. 400 401Example matches Foo (Additions) 402 @implementation Foo (Additions) 403 @end 404</pre></td></tr> 405 406 407<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>>...</td></tr> 408<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations. 409 410Example matches Foo 411 @implementation Foo 412 @end 413</pre></td></tr> 414 415 416<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>...</td></tr> 417<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 418 419Example matches Foo 420 @interface Foo 421 @end 422</pre></td></tr> 423 424 425<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>>...</td></tr> 426<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations. 427 428Example matches _enabled 429 @implementation Foo { 430 BOOL _enabled; 431 } 432 @end 433</pre></td></tr> 434 435 436<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>...</td></tr> 437<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations. 438 439Example matches both declaration and definition of -[Foo method] 440 @interface Foo 441 - (void)method; 442 @end 443 444 @implementation Foo 445 - (void)method {} 446 @end 447</pre></td></tr> 448 449 450<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>...</td></tr> 451<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations. 452 453Example matches enabled 454 @interface Foo 455 @property BOOL enabled; 456 @end 457</pre></td></tr> 458 459 460<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>>...</td></tr> 461<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations. 462 463Example matches FooDelegate 464 @protocol FooDelegate 465 @end 466</pre></td></tr> 467 468 469<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>>...</td></tr> 470<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 471 472Given 473 void f(int x); 474parmVarDecl() 475 matches int x. 476</pre></td></tr> 477 478 479<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>>...</td></tr> 480<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 481 482Example matches X, Z, U, and S 483 class X; 484 template<class T> class Z {}; 485 struct S {}; 486 union U {}; 487</pre></td></tr> 488 489 490<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>>...</td></tr> 491<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 492 493Example: 494 staticAssertExpr() 495matches 496 static_assert(sizeof(S) == sizeof(int)) 497in 498 struct S { 499 int x; 500 }; 501 static_assert(sizeof(S) == sizeof(int)); 502</pre></td></tr> 503 504 505<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>...</td></tr> 506<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations. 507 508Example matches X, Z, U, S, E 509 class X; 510 template<class T> class Z {}; 511 struct S {}; 512 union U {}; 513 enum E { 514 A, B, C 515 }; 516</pre></td></tr> 517 518 519<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTemplateParmDecl0')"><a name="templateTemplateParmDecl0Anchor">templateTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl</a>>...</td></tr> 520<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations. 521 522Given 523 template <template <typename> class Z, int N> struct C {}; 524templateTypeParmDecl() 525 matches 'Z', but not 'N'. 526</pre></td></tr> 527 528 529<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>>...</td></tr> 530<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 531 532Given 533 template <typename T, int N> struct C {}; 534templateTypeParmDecl() 535 matches 'T', but not 'N'. 536</pre></td></tr> 537 538 539<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>>...</td></tr> 540<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 541 542Given 543 int X; 544 namespace NS { 545 int Y; 546 } // namespace NS 547decl(hasDeclContext(translationUnitDecl())) 548 matches "int X", but not "int Y". 549</pre></td></tr> 550 551 552<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>>...</td></tr> 553<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations. 554 555Given 556 typedef int X; 557 using Y = int; 558typeAliasDecl() 559 matches "using Y = int", but not "typedef int X" 560</pre></td></tr> 561 562 563<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>>...</td></tr> 564<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations. 565 566typeAliasTemplateDecl() matches 567 template <typename T> 568 using Y = X<T>; 569</pre></td></tr> 570 571 572<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>>...</td></tr> 573<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 574 575Given 576 typedef int X; 577 using Y = int; 578typedefDecl() 579 matches "typedef int X", but not "using Y = int" 580</pre></td></tr> 581 582 583<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>...</td></tr> 584<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations. 585 586Given 587 typedef int X; 588 using Y = int; 589typedefNameDecl() 590 matches "typedef int X" and "using Y = int" 591</pre></td></tr> 592 593 594<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>>...</td></tr> 595<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 596typename. 597 598Given 599 template <typename T> 600 struct Base { typedef T Foo; }; 601 602 template<typename T> 603 struct S : private Base<T> { 604 using typename Base<T>::Foo; 605 }; 606unresolvedUsingTypenameDecl() 607 matches using Base<T>::Foo </pre></td></tr> 608 609 610<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>>...</td></tr> 611<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 612 613Given 614 template<typename X> 615 class C : private X { 616 using X::x; 617 }; 618unresolvedUsingValueDecl() 619 matches using X::x </pre></td></tr> 620 621 622<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>>...</td></tr> 623<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 624 625Given 626 namespace X { int x; } 627 using X::x; 628usingDecl() 629 matches using X::x </pre></td></tr> 630 631 632<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>>...</td></tr> 633<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 634 635Given 636 namespace X { int x; } 637 using namespace X; 638usingDirectiveDecl() 639 matches using namespace X </pre></td></tr> 640 641 642<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>...</td></tr> 643<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 644 645Example matches A, B, C and F 646 enum X { A, B, C }; 647 void F(); 648</pre></td></tr> 649 650 651<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>...</td></tr> 652<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 653 654Note: this does not match declarations of member variables, which are 655"field" declarations in Clang parlance. 656 657Example matches a 658 int a; 659</pre></td></tr> 660 661 662<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>></td><td class="name" onclick="toggle('decompositionDecl0')"><a name="decompositionDecl0Anchor">decompositionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>>...</td></tr> 663<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations. 664 665Examples matches the declaration node with foo and bar, but not 666number. 667(matcher = declStmt(has(decompositionDecl()))) 668 669 int number = 42; 670 auto [foo, bar] = std::make_pair{42, 42}; 671</pre></td></tr> 672 673 674<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>>...</td></tr> 675<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 676</pre></td></tr> 677 678 679<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>>...</td></tr> 680<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 681 682Given 683 namespace ns { 684 struct A { static void f(); }; 685 void A::f() {} 686 void g() { A::f(); } 687 } 688 ns::A a; 689nestedNameSpecifier() 690 matches "ns::" and both "A::" 691</pre></td></tr> 692 693 694<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>></td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>>...</td></tr> 695<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause. 696 697Given 698 699 #pragma omp parallel default(none) 700 #pragma omp parallel default(shared) 701 #pragma omp parallel default(firstprivate) 702 #pragma omp parallel 703 704``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and 705``default(firstprivate)`` 706</pre></td></tr> 707 708 709<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>...</td></tr> 710<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 711</pre></td></tr> 712 713 714<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>...</td></tr> 715<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension). 716 717Given 718 FOO: bar(); 719 void *ptr = &&FOO; 720 goto *bar; 721addrLabelExpr() 722 matches '&&FOO' 723</pre></td></tr> 724 725 726<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>>...</td></tr> 727<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 728 729Given 730 int i = a[1]; 731arraySubscriptExpr() 732 matches "a[1]" 733</pre></td></tr> 734 735 736<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>>...</td></tr> 737<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 738 739 int i = 100; 740 __asm("mov al, 2"); 741asmStmt() 742 matches '__asm("mov al, 2")' 743</pre></td></tr> 744 745 746<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>>...</td></tr> 747<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins. 748Example matches __atomic_load_n(ptr, 1) 749 void foo() { int *ptr; __atomic_load_n(ptr, 1); } 750</pre></td></tr> 751 752 753<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>>...</td></tr> 754<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement. 755 756Given 757 @autoreleasepool { 758 int x = 0; 759 } 760autoreleasePoolStmt(stmt()) matches the declaration of "x" 761inside the autorelease pool. 762</pre></td></tr> 763 764 765<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>>...</td></tr> 766<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension). 767 768Example matches a ?: b 769 (a ?: b) + 42; 770</pre></td></tr> 771 772 773<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>>...</td></tr> 774<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 775 776Example matches a || b 777 !(a || b) 778</pre></td></tr> 779 780 781<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>>...</td></tr> 782<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block. 783 784Example: matches "^{}": 785 void f() { ^{}(); } 786</pre></td></tr> 787 788 789<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>>...</td></tr> 790<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 791 792Given 793 while (true) { break; } 794breakStmt() 795 matches 'break' 796</pre></td></tr> 797 798 799<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>>...</td></tr> 800<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 801 802Example: Matches (int) 2.2f in 803 int i = (int) 2.2f; 804</pre></td></tr> 805 806 807<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>...</td></tr> 808<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 809 810Example matches x.y() and y() 811 X x; 812 x.y(); 813 y(); 814</pre></td></tr> 815 816 817<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>>...</td></tr> 818<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 819 820Given 821 switch(a) { case 42: break; default: break; } 822caseStmt() 823 matches 'case 42:'. 824</pre></td></tr> 825 826 827<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>>...</td></tr> 828<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 829 830Example: castExpr() matches each of the following: 831 (int) 3; 832 const_cast<Expr *>(SubExpr); 833 char c = 0; 834but does not match 835 int i = (0); 836 int k = 0; 837</pre></td></tr> 838 839 840<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>...</td></tr> 841<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 842 843Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 844though. 845 846Example matches 'a', L'a' 847 char ch = 'a'; 848 wchar_t chw = L'a'; 849</pre></td></tr> 850 851 852<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>>...</td></tr> 853<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr. 854</pre></td></tr> 855 856 857<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>...</td></tr> 858<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 859 860Example match: {1}, (1, 2) 861 int array[4] = {1}; 862 vector int myvec = (vector int)(1, 2); 863</pre></td></tr> 864 865 866<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>>...</td></tr> 867<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 868 869Example matches '{}' and '{{}}' in 'for (;;) {{}}' 870 for (;;) {{}} 871</pre></td></tr> 872 873 874<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>>...</td></tr> 875<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 876 877Example matches a ? b : c 878 (a ? b : c) + 42 879</pre></td></tr> 880 881 882<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>>...</td></tr> 883<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper. 884 885Example matches the constant in the case statement: 886 (matcher = constantExpr()) 887 switch (a) { 888 case 37: break; 889 } 890</pre></td></tr> 891 892 893<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>>...</td></tr> 894<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 895 896Given 897 while (true) { continue; } 898continueStmt() 899 matches 'continue' 900</pre></td></tr> 901 902 903<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>>...</td></tr> 904<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 905 906Example matches, 907 kernel<<<i,j>>>(); 908</pre></td></tr> 909 910 911<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>>...</td></tr> 912<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 913 914Example matches FunctionTakesString(GetStringByValue()) 915 (matcher = cxxBindTemporaryExpr()) 916 FunctionTakesString(GetStringByValue()); 917 FunctionTakesStringByPointer(GetStringPointer()); 918</pre></td></tr> 919 920 921<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>...</td></tr> 922<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 923 924Example matches true 925 true 926</pre></td></tr> 927 928 929<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>>...</td></tr> 930<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 931 932 try {} catch(int i) {} 933cxxCatchStmt() 934 matches 'catch(int i)' 935</pre></td></tr> 936 937 938<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>>...</td></tr> 939<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 940 941Example: Matches const_cast<int*>(&r) in 942 int n = 42; 943 const int &r(n); 944 int* p = const_cast<int*>(&r); 945</pre></td></tr> 946 947 948<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>...</td></tr> 949<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 950 951Example matches string(ptr, n) and ptr within arguments of f 952 (matcher = cxxConstructExpr()) 953 void f(const string &a, const string &b); 954 char *ptr; 955 int n; 956 f(string(ptr, n), ptr); 957</pre></td></tr> 958 959 960<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>>...</td></tr> 961<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 962 963Example matches the CXXDefaultArgExpr placeholder inserted for the 964 default value of the second parameter in the call expression f(42) 965 (matcher = cxxDefaultArgExpr()) 966 void f(int x, int y = 0); 967 f(42); 968</pre></td></tr> 969 970 971<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>>...</td></tr> 972<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 973 974Given 975 delete X; 976cxxDeleteExpr() 977 matches 'delete X'. 978</pre></td></tr> 979 980 981<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>>...</td></tr> 982<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be 983resolved because the base expression or the member name was dependent. 984 985Given 986 template <class T> void f() { T t; t.g(); } 987cxxDependentScopeMemberExpr() 988 matches t.g 989</pre></td></tr> 990 991 992<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>>...</td></tr> 993<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 994 995Example: 996 cxxDynamicCastExpr() 997matches 998 dynamic_cast<D*>(&b); 999in 1000 struct B { virtual ~B() {} }; struct D : B {}; 1001 B b; 1002 D* p = dynamic_cast<D*>(&b); 1003</pre></td></tr> 1004 1005 1006<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>>...</td></tr> 1007<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 1008 1009cxxForRangeStmt() matches 'for (auto a : i)' 1010 int i[] = {1, 2, 3}; for (auto a : i); 1011 for(int j = 0; j < 5; ++j); 1012</pre></td></tr> 1013 1014 1015<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>...</td></tr> 1016<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 1017 1018Example: Matches Foo(bar); 1019 Foo f = bar; 1020 Foo g = (Foo) bar; 1021 Foo h = Foo(bar); 1022</pre></td></tr> 1023 1024 1025<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr> 1026<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 1027 1028Example matches x.y() 1029 X x; 1030 x.y(); 1031</pre></td></tr> 1032 1033 1034<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>...</td></tr> 1035<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 1036 1037Given 1038 new X; 1039cxxNewExpr() 1040 matches 'new X'. 1041</pre></td></tr> 1042 1043 1044<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>>...</td></tr> 1045<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions. 1046 1047Given 1048 bool a() noexcept; 1049 bool b() noexcept(true); 1050 bool c() noexcept(false); 1051 bool d() noexcept(noexcept(a())); 1052 bool e = noexcept(b()) || noexcept(c()); 1053cxxNoexceptExpr() 1054 matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`. 1055 doesn't match the noexcept specifier in the declarations a, b, c or d. 1056</pre></td></tr> 1057 1058 1059<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>>...</td></tr> 1060<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 1061</pre></td></tr> 1062 1063 1064<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr> 1065<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 1066 1067Note that if an operator isn't overloaded, it won't match. Instead, use 1068binaryOperator matcher. 1069Currently it does not match operators such as new delete. 1070FIXME: figure out why these do not match? 1071 1072Example matches both operator<<((o << b), c) and operator<<(o, b) 1073 (matcher = cxxOperatorCallExpr()) 1074 ostream &operator<< (ostream &out, int i) { }; 1075 ostream &o; int b = 1, c = 1; 1076 o << b << c; 1077</pre></td></tr> 1078 1079 1080<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>>...</td></tr> 1081<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 1082 1083Either the source expression or the destination type can be matched 1084using has(), but hasDestinationType() is more specific and can be 1085more readable. 1086 1087Example matches reinterpret_cast<char*>(&p) in 1088 void* p = reinterpret_cast<char*>(&p); 1089</pre></td></tr> 1090 1091 1092<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>>...</td></tr> 1093<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 1094 1095See also: hasDestinationType 1096See also: reinterpretCast 1097 1098Example: 1099 cxxStaticCastExpr() 1100matches 1101 static_cast<long>(8) 1102in 1103 long eight(static_cast<long>(8)); 1104</pre></td></tr> 1105 1106 1107<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>>...</td></tr> 1108<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions. 1109 1110Given 1111 std::vector<int> a({ 1, 2, 3 }); 1112 std::vector<int> b = { 4, 5 }; 1113 int c[] = { 6, 7 }; 1114 std::pair<int, int> d = { 8, 9 }; 1115cxxStdInitializerListExpr() 1116 matches "{ 1, 2, 3 }" and "{ 4, 5 }" 1117</pre></td></tr> 1118 1119 1120<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>...</td></tr> 1121<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 1122 1123Example: Matches Foo(bar, bar) 1124 Foo h = Foo(bar, bar); 1125</pre></td></tr> 1126 1127 1128<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>>...</td></tr> 1129<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 1130 1131Example matches the implicit this expression in "return i". 1132 (matcher = cxxThisExpr()) 1133struct foo { 1134 int i; 1135 int f() { return i; } 1136}; 1137</pre></td></tr> 1138 1139 1140<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>>...</td></tr> 1141<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 1142 1143 try { throw 5; } catch(int i) {} 1144cxxThrowExpr() 1145 matches 'throw 5' 1146</pre></td></tr> 1147 1148 1149<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>>...</td></tr> 1150<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 1151 1152 try {} catch(int i) {} 1153cxxTryStmt() 1154 matches 'try {}' 1155</pre></td></tr> 1156 1157 1158<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>...</td></tr> 1159<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 1160 1161Example matches T(t) in return statement of f 1162 (matcher = cxxUnresolvedConstructExpr()) 1163 template <typename T> 1164 void f(const T& t) { return T(t); } 1165</pre></td></tr> 1166 1167 1168<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>...</td></tr> 1169<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 1170 1171Example matches x in if (x) 1172 bool x; 1173 if (x) {} 1174</pre></td></tr> 1175 1176 1177<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>>...</td></tr> 1178<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 1179 1180Given 1181 int a; 1182declStmt() 1183 matches 'int a'. 1184</pre></td></tr> 1185 1186 1187<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>>...</td></tr> 1188<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 1189 1190Given 1191 switch(a) { case 42: break; default: break; } 1192defaultStmt() 1193 matches 'default:'. 1194</pre></td></tr> 1195 1196 1197<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>>...</td></tr> 1198<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8]. 1199 1200Example: Matches { [2].y = 1.0, [0].x = 1.0 } 1201 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 1202</pre></td></tr> 1203 1204 1205<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>>...</td></tr> 1206<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 1207 1208Given 1209 do {} while (true); 1210doStmt() 1211 matches 'do {} while(true)' 1212</pre></td></tr> 1213 1214 1215<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>...</td></tr> 1216<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 1217 1218Matches any cast expression written in user code, whether it be a 1219C-style cast, a functional-style cast, or a keyword cast. 1220 1221Does not match implicit conversions. 1222 1223Note: the name "explicitCast" is chosen to match Clang's terminology, as 1224Clang uses the term "cast" to apply to implicit conversions as well as to 1225actual cast expressions. 1226 1227See also: hasDestinationType. 1228 1229Example: matches all five of the casts in 1230 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 1231but does not match the implicit conversion in 1232 long ell = 42; 1233</pre></td></tr> 1234 1235 1236<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>...</td></tr> 1237<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 1238 1239Example matches x() 1240 void f() { x(); } 1241</pre></td></tr> 1242 1243 1244<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>>...</td></tr> 1245<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 1246of the sub-expression's evaluation. 1247 1248Example matches std::string() 1249 const std::string str = std::string(); 1250</pre></td></tr> 1251 1252 1253<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('fixedPointLiteral0')"><a name="fixedPointLiteral0Anchor">fixedPointLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FixedPointLiteral.html">FixedPointLiteral</a>>...</td></tr> 1254<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals 1255</pre></td></tr> 1256 1257 1258<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>...</td></tr> 1259<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g. 12601.0, 1.0f, 1.0L and 1e10. 1261 1262Does not match implicit conversions such as 1263 float a = 10; 1264</pre></td></tr> 1265 1266 1267<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>>...</td></tr> 1268<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 1269 1270Example matches 'for (;;) {}' 1271 for (;;) {} 1272 int i[] = {1, 2, 3}; for (auto a : i); 1273</pre></td></tr> 1274 1275 1276<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>>...</td></tr> 1277<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 1278</pre></td></tr> 1279 1280 1281<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>>...</td></tr> 1282<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 1283 1284Given 1285 goto FOO; 1286 FOO: bar(); 1287gotoStmt() 1288 matches 'goto FOO' 1289</pre></td></tr> 1290 1291 1292<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>>...</td></tr> 1293<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 1294 1295Example matches 'if (x) {}' 1296 if (x) {} 1297</pre></td></tr> 1298 1299 1300<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>>...</td></tr> 1301<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating 1302point literals e.g.: 1i, 1.0i 1303</pre></td></tr> 1304 1305 1306<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>>...</td></tr> 1307<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 1308 1309This matches many different places, including function call return value 1310eliding, as well as any type conversions. 1311</pre></td></tr> 1312 1313 1314<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>>...</td></tr> 1315<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions. 1316 1317Given 1318 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 1319implicitValueInitExpr() 1320 matches "[0].y" (implicitly) 1321</pre></td></tr> 1322 1323 1324<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>>...</td></tr> 1325<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 1326 1327Given 1328 int a[] = { 1, 2 }; 1329 struct B { int x, y; }; 1330 B b = { 5, 6 }; 1331initListExpr() 1332 matches "{ 1, 2 }" and "{ 5, 6 }" 1333</pre></td></tr> 1334 1335 1336<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>...</td></tr> 1337<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g. 13381, 1L, 0x1 and 1U. 1339 1340Does not match character-encoded integers such as L'a'. 1341</pre></td></tr> 1342 1343 1344<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>...</td></tr> 1345<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 1346 1347Given 1348 goto FOO; 1349 FOO: bar(); 1350labelStmt() 1351 matches 'FOO:' 1352</pre></td></tr> 1353 1354 1355<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>>...</td></tr> 1356<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1357 1358Example matches [&](){return 5;} 1359 [&](){return 5;} 1360</pre></td></tr> 1361 1362 1363<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>>...</td></tr> 1364<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1365 1366Example: Given 1367 struct T {void func();}; 1368 T f(); 1369 void g(T); 1370materializeTemporaryExpr() matches 'f()' in these statements 1371 T u(f()); 1372 g(f()); 1373 f().func(); 1374but does not match 1375 f(); 1376</pre></td></tr> 1377 1378 1379<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>...</td></tr> 1380<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1381 1382Given 1383 class Y { 1384 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1385 int a; static int b; 1386 }; 1387memberExpr() 1388 matches this->x, x, y.x, a, this->b 1389</pre></td></tr> 1390 1391 1392<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>>...</td></tr> 1393<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1394 1395 foo();; 1396nullStmt() 1397 matches the second ';' 1398</pre></td></tr> 1399 1400 1401<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>>...</td></tr> 1402<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements. 1403 1404Example matches @catch 1405 @try {} 1406 @catch (...) {} 1407</pre></td></tr> 1408 1409 1410<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>>...</td></tr> 1411<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements. 1412 1413Example matches @finally 1414 @try {} 1415 @finally {} 1416</pre></td></tr> 1417 1418 1419<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>>...</td></tr> 1420<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar. 1421 1422Example: matches "a" in "init" method: 1423@implementation A { 1424 NSString *a; 1425} 1426- (void) init { 1427 a = @"hello"; 1428} 1429</pre></td></tr> 1430 1431 1432<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>>...</td></tr> 1433<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 1434 1435The innermost message send invokes the "alloc" class method on the 1436NSString class, while the outermost message send invokes the 1437"initWithString" instance method on the object returned from 1438NSString's "alloc". This matcher should match both message sends. 1439 [[NSString alloc] initWithString:@"Hello"] 1440</pre></td></tr> 1441 1442 1443<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>>...</td></tr> 1444<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements. 1445 1446Example matches @throw obj; 1447</pre></td></tr> 1448 1449 1450<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>>...</td></tr> 1451<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements. 1452 1453Example matches @try 1454 @try {} 1455 @catch (...) {} 1456</pre></td></tr> 1457 1458 1459<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>>...</td></tr> 1460<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive. 1461 1462Given 1463 1464 #pragma omp parallel 1465 #pragma omp parallel default(none) 1466 #pragma omp taskyield 1467 1468``ompExecutableDirective()`` matches ``omp parallel``, 1469``omp parallel default(none)`` and ``omp taskyield``. 1470</pre></td></tr> 1471 1472 1473<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>>...</td></tr> 1474<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers 1475to reference another expressions and can be met 1476in BinaryConditionalOperators, for example. 1477 1478Example matches 'a' 1479 (a ?: c) + 42; 1480</pre></td></tr> 1481 1482 1483<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>>...</td></tr> 1484<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions. 1485 1486Example matches (foo() + 1) 1487 int foo() { return 1; } 1488 int a = (foo() + 1); 1489</pre></td></tr> 1490 1491 1492<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>>...</td></tr> 1493<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions. 1494ParenListExprs don't have a predefined type and are used for late parsing. 1495In the final AST, they can be met in template declarations. 1496 1497Given 1498 template<typename T> class X { 1499 void f() { 1500 X x(*this); 1501 int a = 0, b = 1; int i = (a, b); 1502 } 1503 }; 1504parenListExpr() matches "*this" but NOT matches (a, b) because (a, b) 1505has a predefined type and is a ParenExpr, not a ParenListExpr. 1506</pre></td></tr> 1507 1508 1509<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>>...</td></tr> 1510<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2]. 1511 1512Example: Matches __func__ 1513 printf("%s", __func__); 1514</pre></td></tr> 1515 1516 1517<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>>...</td></tr> 1518<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 1519 1520Given 1521 return 1; 1522returnStmt() 1523 matches 'return 1' 1524</pre></td></tr> 1525 1526 1527<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>...</td></tr> 1528<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 1529 1530Given 1531 { ++a; } 1532stmt() 1533 matches both the compound statement '{ ++a; }' and '++a'. 1534</pre></td></tr> 1535 1536 1537<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>>...</td></tr> 1538<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension). 1539 1540Example match: ({ int X = 4; X; }) 1541 int C = ({ int X = 4; X; }); 1542</pre></td></tr> 1543 1544 1545<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>>...</td></tr> 1546<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 1547 1548Example matches "abcd", L"abcd" 1549 char *s = "abcd"; 1550 wchar_t *ws = L"abcd"; 1551</pre></td></tr> 1552 1553 1554<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>>...</td></tr> 1555<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 1556 1557Given 1558 template <int N> 1559 struct A { static const int n = N; }; 1560 struct B : public A<42> {}; 1561substNonTypeTemplateParmExpr() 1562 matches "N" in the right-hand side of "static const int n = N;" 1563</pre></td></tr> 1564 1565 1566<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>>...</td></tr> 1567<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 1568 1569Given 1570 switch(a) { case 42: break; default: break; } 1571switchCase() 1572 matches 'case 42:' and 'default:'. 1573</pre></td></tr> 1574 1575 1576<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>>...</td></tr> 1577<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 1578 1579Given 1580 switch(a) { case 42: break; default: break; } 1581switchStmt() 1582 matches 'switch(a)'. 1583</pre></td></tr> 1584 1585 1586<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>>...</td></tr> 1587<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 1588 1589Given 1590 Foo x = bar; 1591 int y = sizeof(x) + alignof(x); 1592unaryExprOrTypeTraitExpr() 1593 matches sizeof(x) and alignof(x) 1594</pre></td></tr> 1595 1596 1597<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>>...</td></tr> 1598<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 1599 1600Example matches !a 1601 !a || b 1602</pre></td></tr> 1603 1604 1605<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>>...</td></tr> 1606<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing 1607but could not be resolved to a specific declaration. 1608 1609Given 1610 template<typename T> 1611 T foo() { T a; return a; } 1612 template<typename T> 1613 void bar() { 1614 foo<T>(); 1615 } 1616unresolvedLookupExpr() 1617 matches foo<T>() </pre></td></tr> 1618 1619 1620<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>>...</td></tr> 1621<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions. 1622 1623Given 1624 struct X { 1625 template <class T> void f(); 1626 void g(); 1627 }; 1628 template <class T> void h() { X x; x.f<T>(); x.g(); } 1629unresolvedMemberExpr() 1630 matches x.f<T> 1631</pre></td></tr> 1632 1633 1634<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>>...</td></tr> 1635<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 1636 1637Example match: "foo"_suffix 1638</pre></td></tr> 1639 1640 1641<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>>...</td></tr> 1642<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 1643 1644Given 1645 while (true) {} 1646whileStmt() 1647 matches 'while (true) {}'. 1648</pre></td></tr> 1649 1650 1651<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>></td><td class="name" onclick="toggle('templateArgumentLoc0')"><a name="templateArgumentLoc0Anchor">templateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>...</td></tr> 1652<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info). 1653 1654Given 1655 template <typename T> struct C {}; 1656 C<int> c; 1657templateArgumentLoc() 1658 matches 'int' in C<int>. 1659</pre></td></tr> 1660 1661 1662<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>>...</td></tr> 1663<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 1664 1665Given 1666 template <typename T> struct C {}; 1667 C<int> c; 1668templateArgument() 1669 matches 'int' in C<int>. 1670</pre></td></tr> 1671 1672 1673<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>></td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>>...</td></tr> 1674<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name. 1675 1676Given 1677 template <typename T> class X { }; 1678 X<int> xi; 1679templateName() 1680 matches 'X' in X<int>. 1681</pre></td></tr> 1682 1683 1684<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>...</td></tr> 1685<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 1686</pre></td></tr> 1687 1688 1689<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>...</td></tr> 1690<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 1691 1692Given 1693 int a[] = { 2, 3 }; 1694 int b[4]; 1695 void f() { int c[a[0]]; } 1696arrayType() 1697 matches "int a[]", "int b[4]" and "int c[a[0]]"; 1698</pre></td></tr> 1699 1700 1701<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>>...</td></tr> 1702<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 1703 1704Given 1705 _Atomic(int) i; 1706atomicType() 1707 matches "_Atomic(int) i" 1708</pre></td></tr> 1709 1710 1711<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>>...</td></tr> 1712<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 1713 1714Given: 1715 auto n = 4; 1716 int v[] = { 2, 3 } 1717 for (auto i : v) { } 1718autoType() 1719 matches "auto n" and "auto i" 1720</pre></td></tr> 1721 1722 1723<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>...</td></tr> 1724<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 1725"void (^)(int)". 1726 1727The pointee is always required to be a FunctionType. 1728</pre></td></tr> 1729 1730 1731<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>>...</td></tr> 1732<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 1733 1734Given 1735 struct A {}; 1736 A a; 1737 int b; 1738 float c; 1739 bool d; 1740builtinType() 1741 matches "int b", "float c" and "bool d" 1742</pre></td></tr> 1743 1744 1745<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>>...</td></tr> 1746<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 1747 1748Given 1749 _Complex float f; 1750complexType() 1751 matches "_Complex float f" 1752</pre></td></tr> 1753 1754 1755<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>>...</td></tr> 1756<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 1757 1758Given 1759 void() { 1760 int a[2]; 1761 int b[] = { 2, 3 }; 1762 int c[b[0]]; 1763 } 1764constantArrayType() 1765 matches "int a[2]" 1766</pre></td></tr> 1767 1768 1769<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>>...</td></tr> 1770<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 1771Example matches i[] in declaration of f. 1772 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 1773Example matches i[1]. 1774 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 1775 void f(int i[]) { 1776 i[1] = 0; 1777 } 1778</pre></td></tr> 1779 1780 1781<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>>...</td></tr> 1782<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(<expr>) types. 1783 1784Given: 1785 short i = 1; 1786 int j = 42; 1787 decltype(i + j) result = i + j; 1788decltypeType() 1789 matches "decltype(i + j)" 1790</pre></td></tr> 1791 1792 1793<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>>...</td></tr> 1794<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class 1795template types. 1796 1797Given 1798 template <typename T> 1799 class C { public: C(T); }; 1800 1801 C c(123); 1802deducedTemplateSpecializationType() matches the type in the declaration 1803of the variable c. 1804</pre></td></tr> 1805 1806 1807<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>>...</td></tr> 1808<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 1809 1810Given 1811 template<typename T, int Size> 1812 class array { 1813 T data[Size]; 1814 }; 1815dependentSizedArrayType 1816 matches "T data[Size]" 1817</pre></td></tr> 1818 1819 1820<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>>...</td></tr> 1821<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 1822qualified name. 1823 1824Given 1825 namespace N { 1826 namespace M { 1827 class D {}; 1828 } 1829 } 1830 class C {}; 1831 1832 class C c; 1833 N::M::D d; 1834 1835elaboratedType() matches the type of the variable declarations of both 1836c and d. 1837</pre></td></tr> 1838 1839 1840<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>...</td></tr> 1841<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types. 1842 1843Given 1844 enum C { Green }; 1845 enum class S { Red }; 1846 1847 C c; 1848 S s; 1849 1850enumType() matches the type of the variable declarations of both c and 1851s. 1852</pre></td></tr> 1853 1854 1855<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>>...</td></tr> 1856<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes. 1857 1858Given 1859 int (*f)(int); 1860 void g(); 1861functionProtoType() 1862 matches "int (*f)(int)" and the type of "g" in C++ mode. 1863 In C mode, "g" is not matched because it does not contain a prototype. 1864</pre></td></tr> 1865 1866 1867<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>>...</td></tr> 1868<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 1869 1870Given 1871 int (*f)(int); 1872 void g(); 1873functionType() 1874 matches "int (*f)(int)" and the type of "g". 1875</pre></td></tr> 1876 1877 1878<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>>...</td></tr> 1879<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 1880 1881Given 1882 int a[] = { 2, 3 }; 1883 int b[42]; 1884 void f(int c[]) { int d[a[0]]; }; 1885incompleteArrayType() 1886 matches "int a[]" and "int c[]" 1887</pre></td></tr> 1888 1889 1890<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>...</td></tr> 1891<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 1892 1893Example matches S s, but not S<T> s. 1894 (matcher = parmVarDecl(hasType(injectedClassNameType()))) 1895 template <typename T> struct S { 1896 void f(S s); 1897 void g(S<T> s); 1898 }; 1899</pre></td></tr> 1900 1901 1902<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>>...</td></tr> 1903<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 1904 1905Given: 1906 int *a; 1907 int &b = *a; 1908 int &&c = 1; 1909 auto &d = b; 1910 auto &&e = c; 1911 auto &&f = 2; 1912 int g = 5; 1913 1914lValueReferenceType() matches the types of b, d, and e. e is 1915matched since the type is deduced as int& by reference collapsing rules. 1916</pre></td></tr> 1917 1918 1919<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>...</td></tr> 1920<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 1921Given 1922 struct A { int i; } 1923 A::* ptr = A::i; 1924memberPointerType() 1925 matches "A::* ptr" 1926</pre></td></tr> 1927 1928 1929<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>>...</td></tr> 1930<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 1931a pointer type, despite being syntactically similar. 1932 1933Given 1934 int *a; 1935 1936 @interface Foo 1937 @end 1938 Foo *f; 1939pointerType() 1940 matches "Foo *f", but does not match "int *a". 1941</pre></td></tr> 1942 1943 1944<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>>...</td></tr> 1945<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 1946 1947Given 1948 int (*ptr_to_array)[4]; 1949 int *array_of_ptrs[4]; 1950 1951varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 1952array_of_ptrs. 1953</pre></td></tr> 1954 1955 1956<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>...</td></tr> 1957<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 1958types. 1959 1960Given 1961 int *a; 1962 int &b = *a; 1963 int c = 5; 1964 1965 @interface Foo 1966 @end 1967 Foo *f; 1968pointerType() 1969 matches "int *a", but does not match "Foo *f". 1970</pre></td></tr> 1971 1972 1973<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>>...</td></tr> 1974<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 1975 1976Given: 1977 int *a; 1978 int &b = *a; 1979 int &&c = 1; 1980 auto &d = b; 1981 auto &&e = c; 1982 auto &&f = 2; 1983 int g = 5; 1984 1985rValueReferenceType() matches the types of c and f. e is not 1986matched as it is deduced to int& by reference collapsing rules. 1987</pre></td></tr> 1988 1989 1990<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>...</td></tr> 1991<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 1992 1993Given 1994 class C {}; 1995 struct S {}; 1996 1997 C c; 1998 S s; 1999 2000recordType() matches the type of the variable declarations of both c 2001and s. 2002</pre></td></tr> 2003 2004 2005<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>...</td></tr> 2006<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 2007 2008Given 2009 int *a; 2010 int &b = *a; 2011 int &&c = 1; 2012 auto &d = b; 2013 auto &&e = c; 2014 auto &&f = 2; 2015 int g = 5; 2016 2017referenceType() matches the types of b, c, d, e, and f. 2018</pre></td></tr> 2019 2020 2021<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>>...</td></tr> 2022<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 2023template type parameter. 2024 2025Given 2026 template <typename T> 2027 void F(T t) { 2028 int i = 1 + t; 2029 } 2030 2031substTemplateTypeParmType() matches the type of 't' but not '1' 2032</pre></td></tr> 2033 2034 2035<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>...</td></tr> 2036<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types). 2037 2038Given 2039 enum E {}; 2040 class C {}; 2041 2042 E e; 2043 C c; 2044 2045tagType() matches the type of the variable declarations of both e 2046and c. 2047</pre></td></tr> 2048 2049 2050<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>...</td></tr> 2051<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 2052 2053Given 2054 template <typename T> 2055 class C { }; 2056 2057 template class C<int>; // A 2058 C<char> var; // B 2059 2060templateSpecializationType() matches the type of the explicit 2061instantiation in A and the type of the variable declaration in B. 2062</pre></td></tr> 2063 2064 2065<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>...</td></tr> 2066<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 2067 2068Example matches T, but not int. 2069 (matcher = templateTypeParmType()) 2070 template <typename T> void f(int i); 2071</pre></td></tr> 2072 2073 2074<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>>...</td></tr> 2075<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 2076</pre></td></tr> 2077 2078 2079<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>...</td></tr> 2080<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 2081 2082Given 2083 typedef int X; 2084typedefType() 2085 matches "typedef int X" 2086</pre></td></tr> 2087 2088 2089<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>>...</td></tr> 2090<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 2091 2092Given: 2093 typedef __underlying_type(T) type; 2094unaryTransformType() 2095 matches "__underlying_type(T)" 2096</pre></td></tr> 2097 2098 2099<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>>...</td></tr> 2100<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 2101integer-constant-expression. 2102 2103Given 2104 void f() { 2105 int a[] = { 2, 3 } 2106 int b[42]; 2107 int c[a[0]]; 2108 } 2109variableArrayType() 2110 matches "int c[a[0]]" 2111</pre></td></tr> 2112 2113<!--END_DECL_MATCHERS --> 2114</table> 2115 2116<!-- ======================================================================= --> 2117<h2 id="narrowing-matchers">Narrowing Matchers</h2> 2118<!-- ======================================================================= --> 2119 2120<p>Narrowing matchers match certain attributes on the current node, thus 2121narrowing down the set of nodes of the current type to match on.</p> 2122 2123<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 2124which allow users to create more powerful match expressions.</p> 2125 2126<table> 2127<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 2128<!-- START_NARROWING_MATCHERS --> 2129 2130<tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2131<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 2132 2133Usable as: Any Matcher 2134</pre></td></tr> 2135 2136 2137<tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2138<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 2139 2140Usable as: Any Matcher 2141</pre></td></tr> 2142 2143 2144<tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 2145<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 2146 2147Useful when another matcher requires a child matcher, but there's no 2148additional constraint. This will often be used with an explicit conversion 2149to an internal::Matcher<> type such as TypeMatcher. 2150 2151Example: DeclarationMatcher(anything()) matches all declarations, e.g., 2152"int* p" and "void f()" in 2153 int* p; 2154 void f(); 2155 2156Usable as: Any Matcher 2157</pre></td></tr> 2158 2159 2160<tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 2161<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 2162 2163Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 2164 class X {}; 2165 class Y {}; 2166 2167Usable as: Any Matcher 2168</pre></td></tr> 2169 2170 2171<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName0')"><a name="hasAnyOperatorName0Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 2172<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the 2173specified names. 2174 2175 hasAnyOperatorName("+", "-") 2176 Is equivalent to 2177 anyOf(hasOperatorName("+"), hasOperatorName("-")) 2178</pre></td></tr> 2179 2180 2181<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 2182<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 2183unary). 2184 2185Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 2186 !(a || b) 2187</pre></td></tr> 2188 2189 2190<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr> 2191<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators. 2192 2193Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2194 if (a == b) 2195 a += b; 2196 2197Example 2: matches s1 = s2 2198 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2199 struct S { S& operator=(const S&); }; 2200 void x() { S s1, s2; s1 = s2; } 2201</pre></td></tr> 2202 2203 2204<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('isComparisonOperator0')"><a name="isComparisonOperator0Anchor">isComparisonOperator</a></td><td></td></tr> 2205<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators. 2206 2207Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 2208 if (a == b) 2209 a += b; 2210 2211Example 2: matches s1 < s2 2212 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 2213 struct S { bool operator<(const S& other); }; 2214 void x(S s1, S s2) { bool b1 = s1 < s2; } 2215</pre></td></tr> 2216 2217 2218<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isPrivate1')"><a name="isPrivate1Anchor">isPrivate</a></td><td></td></tr> 2219<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private 2220inheritance. 2221 2222Examples: 2223 class C { 2224 public: int a; 2225 protected: int b; 2226 private: int c; // fieldDecl(isPrivate()) matches 'c' 2227 }; 2228 2229 struct Base {}; 2230 struct Derived1 : private Base {}; // matches 'Base' 2231 class Derived2 : Base {}; // matches 'Base' 2232</pre></td></tr> 2233 2234 2235<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isProtected1')"><a name="isProtected1Anchor">isProtected</a></td><td></td></tr> 2236<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify 2237protected inheritance. 2238 2239Examples: 2240 class C { 2241 public: int a; 2242 protected: int b; // fieldDecl(isProtected()) matches 'b' 2243 private: int c; 2244 }; 2245 2246 class Base {}; 2247 class Derived : protected Base {}; // matches 'Base' 2248</pre></td></tr> 2249 2250 2251<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isPublic1')"><a name="isPublic1Anchor">isPublic</a></td><td></td></tr> 2252<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public 2253inheritance. 2254 2255Examples: 2256 class C { 2257 public: int a; // fieldDecl(isPublic()) matches 'a' 2258 protected: int b; 2259 private: int c; 2260 }; 2261 2262 class Base {}; 2263 class Derived1 : public Base {}; // matches 'Base' 2264 struct Derived2 : Base {}; // matches 'Base' 2265</pre></td></tr> 2266 2267 2268<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isVirtual1')"><a name="isVirtual1Anchor">isVirtual</a></td><td></td></tr> 2269<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify 2270virtual inheritance. 2271 2272Example: 2273 class A { 2274 public: 2275 virtual void x(); // matches x 2276 }; 2277 2278Example: 2279 class Base {}; 2280 class DirectlyDerived : virtual Base {}; // matches Base 2281 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 2282 2283Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 2284</pre></td></tr> 2285 2286 2287<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr> 2288<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr> 2289 2290 2291<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT Value</td></tr> 2292<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT. 2293 2294Given 2295 f('false, 3.14, 42); 2296characterLiteral(equals(0)) 2297 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2298 match false 2299floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2300 match 3.14 2301integerLiteral(equals(42)) 2302 matches 42 2303 2304Note that you cannot directly match a negative numeric literal because the 2305minus sign is not part of the literal: It is a unary operator whose operand 2306is the positive numeric literal. Instead, you must use a unaryOperator() 2307matcher to match the minus sign: 2308 2309unaryOperator(hasOperatorName("-"), 2310 hasUnaryOperand(integerLiteral(equals(13)))) 2311 2312Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 2313 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 2314</pre></td></tr> 2315 2316 2317<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr> 2318<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr> 2319 2320 2321<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr> 2322<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr> 2323 2324 2325<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>></td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr> 2326<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 2327 2328Given 2329 try { 2330 // ... 2331 } catch (int) { 2332 // ... 2333 } catch (...) { 2334 // ... 2335 } 2336cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 2337</pre></td></tr> 2338 2339 2340<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 2341<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 2342a specific number of arguments (including absent default arguments). 2343 2344Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2345 void f(int x, int y); 2346 f(0, 0); 2347</pre></td></tr> 2348 2349 2350<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr> 2351<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 2352</pre></td></tr> 2353 2354 2355<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr> 2356<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 2357zero initialization. 2358 2359Given 2360void foo() { 2361 struct point { double x; double y; }; 2362 point pt[2] = { { 1.0, 2.0 } }; 2363} 2364initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 2365will match the implicit array filler for pt[1]. 2366</pre></td></tr> 2367 2368 2369<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr> 2370<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 2371 2372Given 2373 struct S { 2374 S(); // #1 2375 S(const S &); // #2 2376 S(S &&); // #3 2377 }; 2378cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 2379</pre></td></tr> 2380 2381 2382<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr> 2383<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 2384 2385Given 2386 struct S { 2387 S(); // #1 2388 S(const S &); // #2 2389 S(S &&); // #3 2390 }; 2391cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 2392</pre></td></tr> 2393 2394 2395<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr> 2396<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 2397 2398Given 2399 struct S { 2400 S(); // #1 2401 S(int) {} // #2 2402 S(S &&) : S() {} // #3 2403 }; 2404 S::S() : S(0) {} // #4 2405cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 2406#1 or #2. 2407</pre></td></tr> 2408 2409 2410<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr> 2411<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations 2412that have an explicit specifier if this explicit specifier is resolved to 2413true. 2414 2415Given 2416 template<bool b> 2417 struct S { 2418 S(int); // #1 2419 explicit S(double); // #2 2420 operator int(); // #3 2421 explicit operator bool(); // #4 2422 explicit(false) S(bool) // # 7 2423 explicit(true) S(char) // # 8 2424 explicit(b) S(S) // # 9 2425 }; 2426 S(int) -> S<true> // #5 2427 explicit S(double) -> S<false> // #6 2428cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2429cxxConversionDecl(isExplicit()) will match #4, but not #3. 2430cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2431</pre></td></tr> 2432 2433 2434<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr> 2435<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 2436 2437Given 2438 struct S { 2439 S(); // #1 2440 S(const S &); // #2 2441 S(S &&); // #3 2442 }; 2443cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 2444</pre></td></tr> 2445 2446 2447<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>></td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr> 2448<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations 2449that have an explicit specifier if this explicit specifier is resolved to 2450true. 2451 2452Given 2453 template<bool b> 2454 struct S { 2455 S(int); // #1 2456 explicit S(double); // #2 2457 operator int(); // #3 2458 explicit operator bool(); // #4 2459 explicit(false) S(bool) // # 7 2460 explicit(true) S(char) // # 8 2461 explicit(b) S(S) // # 9 2462 }; 2463 S(int) -> S<true> // #5 2464 explicit S(double) -> S<false> // #6 2465cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2466cxxConversionDecl(isExplicit()) will match #4, but not #3. 2467cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2468</pre></td></tr> 2469 2470 2471<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr> 2472<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 2473opposed to a member. 2474 2475Given 2476 struct B {}; 2477 struct D : B { 2478 int I; 2479 D(int i) : I(i) {} 2480 }; 2481 struct E : B { 2482 E() : B() {} 2483 }; 2484cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 2485 will match E(), but not match D(int). 2486</pre></td></tr> 2487 2488 2489<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr> 2490<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 2491opposed to a base. 2492 2493Given 2494 struct B {}; 2495 struct D : B { 2496 int I; 2497 D(int i) : I(i) {} 2498 }; 2499 struct E : B { 2500 E() : B() {} 2501 }; 2502cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 2503 will match D(int), but not match E(). 2504</pre></td></tr> 2505 2506 2507<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr> 2508<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 2509code (as opposed to implicitly added by the compiler). 2510 2511Given 2512 struct Foo { 2513 Foo() { } 2514 Foo(int) : foo_("A") { } 2515 string foo_; 2516 }; 2517cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 2518 will match Foo(int), but not Foo() 2519</pre></td></tr> 2520 2521 2522<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>></td><td class="name" onclick="toggle('isExplicit2')"><a name="isExplicit2Anchor">isExplicit</a></td><td></td></tr> 2523<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations 2524that have an explicit specifier if this explicit specifier is resolved to 2525true. 2526 2527Given 2528 template<bool b> 2529 struct S { 2530 S(int); // #1 2531 explicit S(double); // #2 2532 operator int(); // #3 2533 explicit operator bool(); // #4 2534 explicit(false) S(bool) // # 7 2535 explicit(true) S(char) // # 8 2536 explicit(b) S(S) // # 9 2537 }; 2538 S(int) -> S<true> // #5 2539 explicit S(double) -> S<false> // #6 2540cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2541cxxConversionDecl(isExplicit()) will match #4, but not #3. 2542cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2543</pre></td></tr> 2544 2545 2546<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr> 2547<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed 2548to '.'. 2549 2550Member calls on the implicit this pointer match as called with '->'. 2551 2552Given 2553 class Y { 2554 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 2555 template <class T> void f() { this->f<T>(); f<T>(); } 2556 int a; 2557 static int b; 2558 }; 2559 template <class T> 2560 class Z { 2561 void x() { this->m; } 2562 }; 2563memberExpr(isArrow()) 2564 matches this->x, x, y.x, a, this->b 2565cxxDependentScopeMemberExpr(isArrow()) 2566 matches this->m 2567unresolvedMemberExpr(isArrow()) 2568 matches this->f<T>, f<T> 2569</pre></td></tr> 2570 2571 2572<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr> 2573<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 2574 2575Given 2576struct A { 2577 void foo() const; 2578 void bar(); 2579}; 2580 2581cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 2582</pre></td></tr> 2583 2584 2585<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr> 2586<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 2587operator. 2588 2589Given 2590struct A { 2591 A &operator=(const A &); 2592 A &operator=(A &&); 2593}; 2594 2595cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 2596the second one. 2597</pre></td></tr> 2598 2599 2600<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr> 2601<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 2602 2603Given: 2604 class A final {}; 2605 2606 struct B { 2607 virtual void f(); 2608 }; 2609 2610 struct C : B { 2611 void f() final; 2612 }; 2613matches A and C::f, but not B, C, or B::f 2614</pre></td></tr> 2615 2616 2617<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr> 2618<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 2619operator. 2620 2621Given 2622struct A { 2623 A &operator=(const A &); 2624 A &operator=(A &&); 2625}; 2626 2627cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 2628the first one. 2629</pre></td></tr> 2630 2631 2632<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr> 2633<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 2634 2635Given 2636 class A { 2637 public: 2638 virtual void x(); 2639 }; 2640 class B : public A { 2641 public: 2642 virtual void x(); 2643 }; 2644 matches B::x 2645</pre></td></tr> 2646 2647 2648<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr> 2649<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 2650 2651Given 2652 class A { 2653 public: 2654 virtual void x() = 0; 2655 }; 2656 matches A::x 2657</pre></td></tr> 2658 2659 2660<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr> 2661<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 2662 2663Given 2664 struct S { 2665 S(); // #1 2666 S(const S &) = default; // #2 2667 S(S &&) = delete; // #3 2668 }; 2669cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 2670</pre></td></tr> 2671 2672 2673<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr> 2674<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify 2675virtual inheritance. 2676 2677Example: 2678 class A { 2679 public: 2680 virtual void x(); // matches x 2681 }; 2682 2683Example: 2684 class Base {}; 2685 class DirectlyDerived : virtual Base {}; // matches Base 2686 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 2687 2688Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 2689</pre></td></tr> 2690 2691 2692<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr> 2693<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 2694 2695Given 2696 class A { 2697 public: 2698 virtual void x(); 2699 }; 2700 class B : public A { 2701 public: 2702 void x(); 2703 }; 2704 matches A::x but not B::x 2705</pre></td></tr> 2706 2707 2708<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr> 2709<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions. 2710 2711Given: 2712 MyClass *p1 = new MyClass[10]; 2713cxxNewExpr(isArray()) 2714 matches the expression 'new MyClass[10]'. 2715</pre></td></tr> 2716 2717 2718<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName0')"><a name="hasAnyOverloadedOperatorName0Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 2719<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names. 2720 2721Matches overloaded operator names specified in strings without the 2722"operator" prefix: e.g. "<<". 2723 2724 hasAnyOverloadesOperatorName("+", "-") 2725Is equivalent to 2726 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 2727</pre></td></tr> 2728 2729 2730<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr> 2731<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 2732 2733Matches overloaded operator names specified in strings without the 2734"operator" prefix: e.g. "<<". 2735 2736Given: 2737 class A { int operator*(); }; 2738 const A &operator<<(const A &a, const A &b); 2739 A a; 2740 a << a; // <-- This matches 2741 2742cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 2743specified line and 2744cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 2745matches the declaration of A. 2746 2747Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 2748</pre></td></tr> 2749 2750 2751<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr> 2752<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators. 2753 2754Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2755 if (a == b) 2756 a += b; 2757 2758Example 2: matches s1 = s2 2759 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2760 struct S { S& operator=(const S&); }; 2761 void x() { S s1, s2; s1 = s2; } 2762</pre></td></tr> 2763 2764 2765<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('isComparisonOperator1')"><a name="isComparisonOperator1Anchor">isComparisonOperator</a></td><td></td></tr> 2766<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators. 2767 2768Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 2769 if (a == b) 2770 a += b; 2771 2772Example 2: matches s1 < s2 2773 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 2774 struct S { bool operator<(const S& other); }; 2775 void x(S s1, S s2) { bool b1 = s1 < s2; } 2776</pre></td></tr> 2777 2778 2779<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr> 2780<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined. 2781 2782Example matches x (matcher = cxxRecordDecl(hasDefinition())) 2783class x {}; 2784class y; 2785</pre></td></tr> 2786 2787 2788<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom2')"><a name="isDerivedFrom2Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr> 2789<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 2790</pre></td></tr> 2791 2792 2793<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom2')"><a name="isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr> 2794<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 2795</pre></td></tr> 2796 2797 2798<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr> 2799<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 2800static member variable template instantiations. 2801 2802Given 2803 template<typename T> void A(T t) { } 2804 template<> void A(int N) { } 2805functionDecl(isExplicitTemplateSpecialization()) 2806 matches the specialization A<int>(). 2807 2808Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 2809</pre></td></tr> 2810 2811 2812<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr> 2813<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 2814 2815Given: 2816 class A final {}; 2817 2818 struct B { 2819 virtual void f(); 2820 }; 2821 2822 struct C : B { 2823 void f() final; 2824 }; 2825matches A and C::f, but not B, C, or B::f 2826</pre></td></tr> 2827 2828 2829<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr> 2830<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 2831 2832Given: 2833 auto x = []{}; 2834 2835cxxRecordDecl(isLambda()) matches the implicit class declaration of 2836decltype(x) 2837</pre></td></tr> 2838 2839 2840<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom2')"><a name="isSameOrDerivedFrom2Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr> 2841<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for 2842isSameOrDerivedFrom(hasName(...)). 2843</pre></td></tr> 2844 2845 2846<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr> 2847<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 2848member variable template instantiations. 2849 2850Given 2851 template <typename T> class X {}; class A {}; X<A> x; 2852or 2853 template <typename T> class X {}; class A {}; template class X<A>; 2854or 2855 template <typename T> class X {}; class A {}; extern template class X<A>; 2856cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2857 matches the template instantiation of X<A>. 2858 2859But given 2860 template <typename T> class X {}; class A {}; 2861 template <> class X<A> {}; X<A> x; 2862cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2863 does not match, as X<A> is an explicit template specialization. 2864 2865Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 2866</pre></td></tr> 2867 2868 2869<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('argumentCountIs0')"><a name="argumentCountIs0Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 2870<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 2871a specific number of arguments (including absent default arguments). 2872 2873Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2874 void f(int x, int y); 2875 f(0, 0); 2876</pre></td></tr> 2877 2878 2879<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('usesADL0')"><a name="usesADL0Anchor">usesADL</a></td><td></td></tr> 2880<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL. 2881 2882Example matches y(x) but not y(42) or NS::y(x). 2883 namespace NS { 2884 struct X {}; 2885 void y(X); 2886 } 2887 2888 void y(...); 2889 2890 void test() { 2891 NS::X x; 2892 y(x); // Matches 2893 NS::y(x); // Doesn't match 2894 y(42); // Doesn't match 2895 using NS::y; 2896 y(x); // Found by both unqualified lookup and ADL, doesn't match 2897 } 2898</pre></td></tr> 2899 2900 2901<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>></td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr> 2902<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 2903 2904Example: matches the implicit cast around 0 2905(matcher = castExpr(hasCastKind(CK_NullToPointer))) 2906 int *p = 0; 2907 2908If the matcher is use from clang-query, CastKind parameter 2909should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer"). 2910</pre></td></tr> 2911 2912 2913<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr> 2914<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr> 2915 2916 2917<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT Value</td></tr> 2918<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT. 2919 2920Given 2921 f('false, 3.14, 42); 2922characterLiteral(equals(0)) 2923 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2924 match false 2925floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2926 match 3.14 2927integerLiteral(equals(42)) 2928 matches 42 2929 2930Note that you cannot directly match a negative numeric literal because the 2931minus sign is not part of the literal: It is a unary operator whose operand 2932is the positive numeric literal. Instead, you must use a unaryOperator() 2933matcher to match the minus sign: 2934 2935unaryOperator(hasOperatorName("-"), 2936 hasUnaryOperand(integerLiteral(equals(13)))) 2937 2938Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 2939 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 2940</pre></td></tr> 2941 2942 2943<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr> 2944<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr> 2945 2946 2947<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr> 2948<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr> 2949 2950 2951<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr> 2952<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 2953 2954Given 2955 template<typename T> struct C {}; 2956 C<int> c; 2957classTemplateSpecializationDecl(templateArgumentCountIs(1)) 2958 matches C<int>. 2959</pre></td></tr> 2960 2961 2962<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>></td><td class="name" onclick="toggle('statementCountIs0')"><a name="statementCountIs0Anchor">statementCountIs</a></td><td>unsigned N</td></tr> 2963<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 2964child statements. 2965 2966Example: Given 2967 { for (;;) {} } 2968compoundStmt(statementCountIs(0))) 2969 matches '{}' 2970 but does not match the outer compound statement. 2971</pre></td></tr> 2972 2973 2974<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>></td><td class="name" onclick="toggle('hasSize0')"><a name="hasSize0Anchor">hasSize</a></td><td>unsigned N</td></tr> 2975<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 2976 2977Given 2978 int a[42]; 2979 int b[2 * 21]; 2980 int c[41], d[43]; 2981 char *s = "abcd"; 2982 wchar_t *ws = L"abcd"; 2983 char *w = "a"; 2984constantArrayType(hasSize(42)) 2985 matches "int a[42]" and "int b[2 * 21]" 2986stringLiteral(hasSize(4)) 2987 matches "abcd", L"abcd" 2988</pre></td></tr> 2989 2990 2991<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>></td><td class="name" onclick="toggle('declCountIs0')"><a name="declCountIs0Anchor">declCountIs</a></td><td>unsigned N</td></tr> 2992<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 2993declarations. 2994 2995Example: Given 2996 int a, b; 2997 int c; 2998 int d = 2, e; 2999declCountIs(2) 3000 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 3001</pre></td></tr> 3002 3003 3004<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 3005<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 3006 3007Matches a node if it equals the node previously bound to ID. 3008 3009Given 3010 class X { int a; int b; }; 3011cxxRecordDecl( 3012 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3013 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3014 matches the class X, as a and b have the same type. 3015 3016Note that when multiple matches are involved via forEach* matchers, 3017equalsBoundNodes acts as a filter. 3018For example: 3019compoundStmt( 3020 forEachDescendant(varDecl().bind("d")), 3021 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3022will trigger a match for each combination of variable declaration 3023and reference to that variable declaration within a compound statement. 3024</pre></td></tr> 3025 3026 3027<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr> 3028<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 3029 3030Decl has pointer identity in the AST. 3031</pre></td></tr> 3032 3033 3034<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr> 3035<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 3036 3037Given 3038 __attribute__((device)) void f() { ... } 3039decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 3040f. If the matcher is used from clang-query, attr::Kind parameter should be 3041passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 3042</pre></td></tr> 3043 3044 3045<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 3046<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 3047partially matching a given regex. 3048 3049Example matches Y but not X 3050 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3051 #include "ASTMatcher.h" 3052 class X {}; 3053ASTMatcher.h: 3054 class Y {}; 3055 3056Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3057 3058If the matcher is used in clang-query, RegexFlags parameter 3059should be passed as a quoted string. e.g: "NoFlags". 3060Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3061</pre></td></tr> 3062 3063 3064<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr> 3065<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 3066 3067Example matches X but not Y 3068 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3069 #include <Y.h> 3070 class X {}; 3071Y.h: 3072 class Y {}; 3073 3074Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3075</pre></td></tr> 3076 3077 3078<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr> 3079<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 3080 3081Example matches Y but not X 3082 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3083 #include <SystemHeader.h> 3084 class X {}; 3085SystemHeader.h: 3086 class Y {}; 3087 3088Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3089</pre></td></tr> 3090 3091 3092<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr> 3093<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added 3094by the compiler (eg. implicit default/copy constructors). 3095</pre></td></tr> 3096 3097 3098<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isInStdNamespace0')"><a name="isInStdNamespace0Anchor">isInStdNamespace</a></td><td></td></tr> 3099<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces. 3100 3101Given 3102 class vector {}; 3103 namespace foo { 3104 class vector {}; 3105 namespace std { 3106 class vector {}; 3107 } 3108 } 3109 namespace std { 3110 inline namespace __1 { 3111 class vector {}; // #1 3112 namespace experimental { 3113 class vector {}; 3114 } 3115 } 3116 } 3117cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1. 3118</pre></td></tr> 3119 3120 3121<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr> 3122<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3123template instantiations. 3124 3125Given 3126 template<typename T> void A(T t) { T i; } 3127 A(0); 3128 A(0U); 3129functionDecl(isInstantiated()) 3130 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3131</pre></td></tr> 3132 3133 3134<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr> 3135<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private 3136inheritance. 3137 3138Examples: 3139 class C { 3140 public: int a; 3141 protected: int b; 3142 private: int c; // fieldDecl(isPrivate()) matches 'c' 3143 }; 3144 3145 struct Base {}; 3146 struct Derived1 : private Base {}; // matches 'Base' 3147 class Derived2 : Base {}; // matches 'Base' 3148</pre></td></tr> 3149 3150 3151<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr> 3152<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify 3153protected inheritance. 3154 3155Examples: 3156 class C { 3157 public: int a; 3158 protected: int b; // fieldDecl(isProtected()) matches 'b' 3159 private: int c; 3160 }; 3161 3162 class Base {}; 3163 class Derived : protected Base {}; // matches 'Base' 3164</pre></td></tr> 3165 3166 3167<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr> 3168<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public 3169inheritance. 3170 3171Examples: 3172 class C { 3173 public: int a; // fieldDecl(isPublic()) matches 'a' 3174 protected: int b; 3175 private: int c; 3176 }; 3177 3178 class Base {}; 3179 class Derived1 : public Base {}; // matches 'Base' 3180 struct Derived2 : Base {}; // matches 'Base' 3181</pre></td></tr> 3182 3183 3184<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>></td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr> 3185<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 3186a specific number of designators. 3187 3188Example: Given 3189 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 3190 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 3191designatorCountIs(2) 3192 matches '{ [2].y = 1.0, [0].x = 1.0 }', 3193 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 3194</pre></td></tr> 3195 3196 3197<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>></td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr> 3198<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration. 3199 3200Example matches Y (matcher = enumDecl(isScoped())) 3201enum X {}; 3202enum class Y {}; 3203</pre></td></tr> 3204 3205 3206<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isInstantiationDependent0')"><a name="isInstantiationDependent0Anchor">isInstantiationDependent</a></td><td></td></tr> 3207<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is 3208neither type- nor value-dependent. 3209 3210In the following example, the expression sizeof(sizeof(T() + T())) 3211is instantiation-dependent (since it involves a template parameter T), 3212but is neither type- nor value-dependent, since the type of the inner 3213sizeof is known (std::size_t) and therefore the size of the outer 3214sizeof is known. 3215 template<typename T> 3216 void f(T x, T y) { sizeof(sizeof(T() + T()); } 3217expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T()) 3218</pre></td></tr> 3219 3220 3221<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr> 3222<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type 3223is not yet instantiated. 3224 3225For example, the expressions "x" and "x + y" are type-dependent in 3226the following code, but "y" is not type-dependent: 3227 template<typename T> 3228 void add(T x, int y) { 3229 x + y; 3230 } 3231expr(isTypeDependent()) matches x + y 3232</pre></td></tr> 3233 3234 3235<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr> 3236<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a 3237non-type template parameter. 3238 3239For example, the array bound of "Chars" in the following example is 3240value-dependent. 3241 template<int Size> int f() { return Size; } 3242expr(isValueDependent()) matches return Size 3243</pre></td></tr> 3244 3245 3246<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr> 3247<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 3248GNU's __null, C++11's nullptr, or C's NULL macro. 3249 3250Given: 3251 void *v1 = NULL; 3252 void *v2 = nullptr; 3253 void *v3 = __null; // GNU extension 3254 char *cp = (char *)0; 3255 int *ip = 0; 3256 int i = 0; 3257expr(nullPointerConstant()) 3258 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 3259 initializer for i. 3260</pre></td></tr> 3261 3262 3263<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr> 3264<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 3265bit width. 3266 3267Given 3268 class C { 3269 int a : 2; 3270 int b : 4; 3271 int c : 2; 3272 }; 3273fieldDecl(hasBitWidth(2)) 3274 matches 'int a;' and 'int c;' but not 'int b;'. 3275</pre></td></tr> 3276 3277 3278<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr> 3279<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 3280 3281Given 3282 class C { 3283 int a : 2; 3284 int b; 3285 }; 3286fieldDecl(isBitField()) 3287 matches 'int a;' but not 'int b;'. 3288</pre></td></tr> 3289 3290 3291<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>const ValueT Value</td></tr> 3292<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 3293 3294Given 3295 f('false, 3.14, 42); 3296characterLiteral(equals(0)) 3297 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3298 match false 3299floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3300 match 3.14 3301integerLiteral(equals(42)) 3302 matches 42 3303 3304Note that you cannot directly match a negative numeric literal because the 3305minus sign is not part of the literal: It is a unary operator whose operand 3306is the positive numeric literal. Instead, you must use a unaryOperator() 3307matcher to match the minus sign: 3308 3309unaryOperator(hasOperatorName("-"), 3310 hasUnaryOperand(integerLiteral(equals(13)))) 3311 3312Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 3313 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 3314</pre></td></tr> 3315 3316 3317<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name" onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr> 3318<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr> 3319 3320 3321<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName1')"><a name="hasAnyOverloadedOperatorName1Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 3322<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names. 3323 3324Matches overloaded operator names specified in strings without the 3325"operator" prefix: e.g. "<<". 3326 3327 hasAnyOverloadesOperatorName("+", "-") 3328Is equivalent to 3329 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3330</pre></td></tr> 3331 3332 3333<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr> 3334<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 3335 3336Given: 3337 void f(); 3338 void g() noexcept; 3339 void h() noexcept(true); 3340 void i() noexcept(false); 3341 void j() throw(); 3342 void k() throw(int); 3343 void l() throw(...); 3344functionDecl(hasDynamicExceptionSpec()) and 3345 functionProtoType(hasDynamicExceptionSpec()) 3346 match the declarations of j, k, and l, but not f, g, h, or i. 3347</pre></td></tr> 3348 3349 3350<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr> 3351<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 3352 3353Matches overloaded operator names specified in strings without the 3354"operator" prefix: e.g. "<<". 3355 3356Given: 3357 class A { int operator*(); }; 3358 const A &operator<<(const A &a, const A &b); 3359 A a; 3360 a << a; // <-- This matches 3361 3362cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3363specified line and 3364cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3365matches the declaration of A. 3366 3367Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 3368</pre></td></tr> 3369 3370 3371<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr> 3372<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 3373 3374Example matches Y (matcher = functionDecl(hasTrailingReturn())) 3375int X() {} 3376auto Y() -> int {} 3377</pre></td></tr> 3378 3379 3380<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr> 3381<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations, 3382 and if constexpr. 3383 3384Given: 3385 constexpr int foo = 42; 3386 constexpr int bar(); 3387 void baz() { if constexpr(1 > 0) {} } 3388varDecl(isConstexpr()) 3389 matches the declaration of foo. 3390functionDecl(isConstexpr()) 3391 matches the declaration of bar. 3392ifStmt(isConstexpr()) 3393 matches the if statement in baz. 3394</pre></td></tr> 3395 3396 3397<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr> 3398<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 3399 3400Given: 3401 class A { ~A(); }; 3402 class B { ~B() = default; }; 3403functionDecl(isDefaulted()) 3404 matches the declaration of ~B, but not ~A. 3405</pre></td></tr> 3406 3407 3408<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr> 3409<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 3410 3411Example matches A, va, fa 3412 class A {}; 3413 class B; // Doesn't match, as it has no body. 3414 int va; 3415 extern int vb; // Doesn't match, as it doesn't define the variable. 3416 void fa() {} 3417 void fb(); // Doesn't match, as it has no body. 3418 @interface X 3419 - (void)ma; // Doesn't match, interface is declaration. 3420 @end 3421 @implementation X 3422 - (void)ma {} 3423 @end 3424 3425Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, 3426 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 3427</pre></td></tr> 3428 3429 3430<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr> 3431<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 3432 3433Given: 3434 void Func(); 3435 void DeletedFunc() = delete; 3436functionDecl(isDeleted()) 3437 matches the declaration of DeletedFunc, but not Func. 3438</pre></td></tr> 3439 3440 3441<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization0')"><a name="isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr> 3442<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 3443static member variable template instantiations. 3444 3445Given 3446 template<typename T> void A(T t) { } 3447 template<> void A(int N) { } 3448functionDecl(isExplicitTemplateSpecialization()) 3449 matches the specialization A<int>(). 3450 3451Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 3452</pre></td></tr> 3453 3454 3455<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr> 3456<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 3457 3458Given: 3459 extern "C" void f() {} 3460 extern "C" { void g() {} } 3461 void h() {} 3462 extern "C" int x = 1; 3463 extern "C" int y = 2; 3464 int z = 3; 3465functionDecl(isExternC()) 3466 matches the declaration of f and g, but not the declaration of h. 3467varDecl(isExternC()) 3468 matches the declaration of x and y, but not the declaration of z. 3469</pre></td></tr> 3470 3471 3472<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr> 3473<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 3474the inline keyword. 3475 3476Given 3477 inline void f(); 3478 void g(); 3479 namespace n { 3480 inline namespace m {} 3481 } 3482functionDecl(isInline()) will match ::f(). 3483namespaceDecl(isInline()) will match n::m. 3484</pre></td></tr> 3485 3486 3487<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isMain0')"><a name="isMain0Anchor">isMain</a></td><td></td></tr> 3488<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point 3489into an executable program. 3490</pre></td></tr> 3491 3492 3493<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr> 3494<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 3495 3496Given 3497 void nope(); 3498 [[noreturn]] void a(); 3499 __attribute__((noreturn)) void b(); 3500 struct c { [[noreturn]] c(); }; 3501functionDecl(isNoReturn()) 3502 matches all of those except 3503 void nope(); 3504</pre></td></tr> 3505 3506 3507<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr> 3508<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 3509 3510Given: 3511 void f(); 3512 void g() noexcept; 3513 void h() throw(); 3514 void i() throw(int); 3515 void j() noexcept(false); 3516functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 3517 match the declarations of g, and h, but not f, i or j. 3518</pre></td></tr> 3519 3520 3521<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr> 3522<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage 3523class specifier ("static" keyword) written in the source. 3524 3525Given: 3526 static void f() {} 3527 static int i = 0; 3528 extern int j; 3529 int k; 3530functionDecl(isStaticStorageClass()) 3531 matches the function declaration f. 3532varDecl(isStaticStorageClass()) 3533 matches the variable declaration i. 3534</pre></td></tr> 3535 3536 3537<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr> 3538<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 3539member variable template instantiations. 3540 3541Given 3542 template <typename T> class X {}; class A {}; X<A> x; 3543or 3544 template <typename T> class X {}; class A {}; template class X<A>; 3545or 3546 template <typename T> class X {}; class A {}; extern template class X<A>; 3547cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3548 matches the template instantiation of X<A>. 3549 3550But given 3551 template <typename T> class X {}; class A {}; 3552 template <> class X<A> {}; X<A> x; 3553cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3554 does not match, as X<A> is an explicit template specialization. 3555 3556Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 3557</pre></td></tr> 3558 3559 3560<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr> 3561<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 3562 3563Example matches f, but not g or h. The function i will not match, even when 3564compiled in C mode. 3565 void f(...); 3566 void g(int); 3567 template <typename... Ts> void h(Ts...); 3568 void i(); 3569</pre></td></tr> 3570 3571 3572<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('parameterCountIs0')"><a name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned N</td></tr> 3573<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 3574specific parameter count. 3575 3576Given 3577 void f(int i) {} 3578 void g(int i, int j) {} 3579 void h(int i, int j); 3580 void j(int i); 3581 void k(int x, int y, int z, ...); 3582functionDecl(parameterCountIs(2)) 3583 matches g and h 3584functionProtoType(parameterCountIs(2)) 3585 matches g and h 3586functionProtoType(parameterCountIs(3)) 3587 matches k 3588</pre></td></tr> 3589 3590 3591<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> 3592<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 3593 3594Given: 3595 void f(); 3596 void g() noexcept; 3597 void h() noexcept(true); 3598 void i() noexcept(false); 3599 void j() throw(); 3600 void k() throw(int); 3601 void l() throw(...); 3602functionDecl(hasDynamicExceptionSpec()) and 3603 functionProtoType(hasDynamicExceptionSpec()) 3604 match the declarations of j, k, and l, but not f, g, h, or i. 3605</pre></td></tr> 3606 3607 3608<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> 3609<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 3610 3611Given: 3612 void f(); 3613 void g() noexcept; 3614 void h() throw(); 3615 void i() throw(int); 3616 void j() noexcept(false); 3617functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 3618 match the declarations of g, and h, but not f, i or j. 3619</pre></td></tr> 3620 3621 3622<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> 3623<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 3624specific parameter count. 3625 3626Given 3627 void f(int i) {} 3628 void g(int i, int j) {} 3629 void h(int i, int j); 3630 void j(int i); 3631 void k(int x, int y, int z, ...); 3632functionDecl(parameterCountIs(2)) 3633 matches g and h 3634functionProtoType(parameterCountIs(2)) 3635 matches g and h 3636functionProtoType(parameterCountIs(3)) 3637 matches k 3638</pre></td></tr> 3639 3640 3641<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> 3642<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations, 3643 and if constexpr. 3644 3645Given: 3646 constexpr int foo = 42; 3647 constexpr int bar(); 3648 void baz() { if constexpr(1 > 0) {} } 3649varDecl(isConstexpr()) 3650 matches the declaration of foo. 3651functionDecl(isConstexpr()) 3652 matches the declaration of bar. 3653ifStmt(isConstexpr()) 3654 matches the if statement in baz. 3655</pre></td></tr> 3656 3657 3658<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> 3659<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 3660 3661 3662<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> 3663<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 3664 3665Given 3666 f('false, 3.14, 42); 3667characterLiteral(equals(0)) 3668 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3669 match false 3670floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3671 match 3.14 3672integerLiteral(equals(42)) 3673 matches 42 3674 3675Note that you cannot directly match a negative numeric literal because the 3676minus sign is not part of the literal: It is a unary operator whose operand 3677is the positive numeric literal. Instead, you must use a unaryOperator() 3678matcher to match the minus sign: 3679 3680unaryOperator(hasOperatorName("-"), 3681 hasUnaryOperand(integerLiteral(equals(13)))) 3682 3683Usable 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>>, 3684 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>> 3685</pre></td></tr> 3686 3687 3688<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> 3689<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 3690 3691 3692<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> 3693<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 3694 3695 3696<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> 3697<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 3698to '.'. 3699 3700Member calls on the implicit this pointer match as called with '->'. 3701 3702Given 3703 class Y { 3704 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3705 template <class T> void f() { this->f<T>(); f<T>(); } 3706 int a; 3707 static int b; 3708 }; 3709 template <class T> 3710 class Z { 3711 void x() { this->m; } 3712 }; 3713memberExpr(isArrow()) 3714 matches this->x, x, y.x, a, this->b 3715cxxDependentScopeMemberExpr(isArrow()) 3716 matches this->m 3717unresolvedMemberExpr(isArrow()) 3718 matches this->f<T>, f<T> 3719</pre></td></tr> 3720 3721 3722<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> 3723<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 3724 3725This matcher is only provided as a performance optimization of hasName. 3726 hasAnyName(a, b, c) 3727 is equivalent to, but faster than 3728 anyOf(hasName(a), hasName(b), hasName(c)) 3729</pre></td></tr> 3730 3731 3732<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> 3733<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 3734 3735Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 3736void f() { 3737 int x; 3738 static int y; 3739} 3740int z; 3741 3742Example matches f() because it has external formal linkage despite being 3743unique to the translation unit as though it has internal likage 3744(matcher = functionDecl(hasExternalFormalLinkage())) 3745 3746namespace { 3747void f() {} 3748} 3749</pre></td></tr> 3750 3751 3752<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> 3753<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 3754 3755Supports specifying enclosing namespaces or classes by prefixing the name 3756with '<enclosing>::'. 3757Does not match typedefs of an underlying type with the given name. 3758 3759Example matches X (Name == "X") 3760 class X; 3761 3762Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 3763 namespace a { namespace b { class X; } } 3764</pre></td></tr> 3765 3766 3767<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> 3768<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 3769a substring matched by the given RegExp. 3770 3771Supports specifying enclosing namespaces or classes by 3772prefixing the name with '<enclosing>::'. Does not match typedefs 3773of an underlying type with the given name. 3774 3775Example matches X (regexp == "::X") 3776 class X; 3777 3778Example matches X (regexp is one of "::X", "^foo::.*X", among others) 3779 namespace foo { namespace bar { class X; } } 3780 3781If the matcher is used in clang-query, RegexFlags parameter 3782should be passed as a quoted string. e.g: "NoFlags". 3783Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3784</pre></td></tr> 3785 3786 3787<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> 3788<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 3789 3790Given 3791 namespace n { 3792 namespace {} // #1 3793 } 3794namespaceDecl(isAnonymous()) will match #1 but not ::n. 3795</pre></td></tr> 3796 3797 3798<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>></td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr> 3799<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 3800the inline keyword. 3801 3802Given 3803 inline void f(); 3804 void g(); 3805 namespace n { 3806 inline namespace m {} 3807 } 3808functionDecl(isInline()) will match ::f(). 3809namespaceDecl(isInline()) will match n::m. 3810</pre></td></tr> 3811 3812 3813<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> 3814<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind 3815specified. 3816 3817Given 3818 3819 #pragma omp parallel 3820 #pragma omp parallel default(none) 3821 #pragma omp parallel default(shared) 3822 #pragma omp parallel default(firstprivate) 3823 3824``ompDefaultClause(isFirstPrivateKind())`` matches only 3825``default(firstprivate)``. 3826</pre></td></tr> 3827 3828 3829<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> 3830<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified. 3831 3832Given 3833 3834 #pragma omp parallel 3835 #pragma omp parallel default(none) 3836 #pragma omp parallel default(shared) 3837 #pragma omp parallel default(firstprivate) 3838 3839``ompDefaultClause(isNoneKind())`` matches only ``default(none)``. 3840</pre></td></tr> 3841 3842 3843<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> 3844<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified. 3845 3846Given 3847 3848 #pragma omp parallel 3849 #pragma omp parallel default(none) 3850 #pragma omp parallel default(shared) 3851 #pragma omp parallel default(firstprivate) 3852 3853``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``. 3854</pre></td></tr> 3855 3856 3857<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> 3858<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP 3859clause kind. 3860 3861Given 3862 3863 #pragma omp parallel 3864 #pragma omp parallel for 3865 #pragma omp for 3866 3867`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches 3868``omp parallel`` and ``omp parallel for``. 3869 3870If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter 3871should be passed as a quoted string. e.g., 3872``isAllowedToContainClauseKind("OMPC_default").`` 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('isStandaloneDirective0')"><a name="isStandaloneDirective0Anchor">isStandaloneDirective</a></td><td></td></tr> 3877<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives, 3878i.e., directives that can't have a structured block. 3879 3880Given 3881 3882 #pragma omp parallel 3883 {} 3884 #pragma omp taskyield 3885 3886``ompExecutableDirective(isStandaloneDirective()))`` matches 3887``omp taskyield``. 3888</pre></td></tr> 3889 3890 3891<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> 3892<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 3893</pre></td></tr> 3894 3895 3896<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> 3897<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 3898</pre></td></tr> 3899 3900 3901<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> 3902<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for 3903isSameOrDerivedFrom(hasName(...)). 3904</pre></td></tr> 3905 3906 3907<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> 3908<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3909a specific number of arguments (including absent default arguments). 3910 3911Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3912 void f(int x, int y); 3913 f(0, 0); 3914</pre></td></tr> 3915 3916 3917<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> 3918<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 3919Selector.getAsString() 3920 3921 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 3922 matches both of the expressions below: 3923 [myObj methodA:argA]; 3924 [myObj methodB:argB]; 3925</pre></td></tr> 3926 3927 3928<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr> 3929<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 3930 3931objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 3932message expression in 3933 3934 UIWebView *webView = ...; 3935 CGRect bodyFrame = webView.frame; 3936 bodyFrame.size.height = self.bodyContentHeight; 3937 webView.frame = bodyFrame; 3938 // ^---- matches here 3939</pre></td></tr> 3940 3941 3942<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> 3943<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 3944 3945Matches only when the selector of the objCMessageExpr is NULL. This may 3946represent an error condition in the tree! 3947</pre></td></tr> 3948 3949 3950<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> 3951<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 3952 3953 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 3954 matches the outer message expr in the code below, but NOT the message 3955 invocation for self.bodyView. 3956 [self.bodyView loadHTMLString:html baseURL:NULL]; 3957</pre></td></tr> 3958 3959 3960<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> 3961<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 3962 3963 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 3964 matches self.bodyView in the code below, but NOT the outer message 3965 invocation of "loadHTMLString:baseURL:". 3966 [self.bodyView loadHTMLString:html baseURL:NULL]; 3967</pre></td></tr> 3968 3969 3970<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> 3971<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class. 3972 3973Example 3974matcher = objcMessageExpr(isClassMessage()) 3975matches 3976 [NSString stringWithFormat:@"format"]; 3977but not 3978 NSString *x = @"hello"; 3979 [x containsString:@"h"]; 3980</pre></td></tr> 3981 3982 3983<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> 3984<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance. 3985 3986Example 3987matcher = objcMessageExpr(isInstanceMessage()) 3988matches 3989 NSString *x = @"hello"; 3990 [x containsString:@"h"]; 3991but not 3992 [NSString stringWithFormat:@"format"]; 3993</pre></td></tr> 3994 3995 3996<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> 3997<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 3998a substring matched by the given RegExp. 3999 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 4000 invocation for self.bodyView. 4001 [self.bodyView loadHTMLString:html baseURL:NULL]; 4002 4003If the matcher is used in clang-query, RegexFlags parameter 4004should be passed as a quoted string. e.g: "NoFlags". 4005Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4006</pre></td></tr> 4007 4008 4009<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> 4010<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 4011 4012 matcher = objCMessageExpr(numSelectorArgs(0)); 4013 matches self.bodyView in the code below 4014 4015 matcher = objCMessageExpr(numSelectorArgs(2)); 4016 matches the invocation of "loadHTMLString:baseURL:" but not that 4017 of self.bodyView 4018 [self.bodyView loadHTMLString:html baseURL:NULL]; 4019</pre></td></tr> 4020 4021 4022<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> 4023<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method. 4024 4025Example 4026matcher = objcMethodDecl(isClassMethod()) 4027matches 4028@interface I + (void)foo; @end 4029but not 4030@interface I - (void)bar; @end 4031</pre></td></tr> 4032 4033 4034<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr> 4035<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 4036 4037Example matches A, va, fa 4038 class A {}; 4039 class B; // Doesn't match, as it has no body. 4040 int va; 4041 extern int vb; // Doesn't match, as it doesn't define the variable. 4042 void fa() {} 4043 void fb(); // Doesn't match, as it has no body. 4044 @interface X 4045 - (void)ma; // Doesn't match, interface is declaration. 4046 @end 4047 @implementation X 4048 - (void)ma {} 4049 @end 4050 4051Usable 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>>, 4052 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4053</pre></td></tr> 4054 4055 4056<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> 4057<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method. 4058 4059Example 4060matcher = objcMethodDecl(isInstanceMethod()) 4061matches 4062@interface I - (void)bar; @end 4063but not 4064@interface I + (void)foo; @end 4065</pre></td></tr> 4066 4067 4068<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> 4069<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 4070 4071Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 4072void x(int val) {} 4073void y(int val = 0) {} 4074 4075Deprecated. Use hasInitializer() instead to be able to 4076match on the contents of the default argument. For example: 4077 4078void x(int val = 7) {} 4079void y(int val = 42) {} 4080parmVarDecl(hasInitializer(integerLiteral(equals(42)))) 4081 matches the parameter of y 4082 4083A matcher such as 4084 parmVarDecl(hasInitializer(anything())) 4085is equivalent to parmVarDecl(hasDefaultArgument()). 4086</pre></td></tr> 4087 4088 4089<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> 4090<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter 4091list. The parameter list could be that of either a block, function, or 4092objc-method. 4093 4094 4095Given 4096 4097void f(int a, int b, int c) { 4098} 4099 4100``parmVarDecl(isAtPosition(0))`` matches ``int a``. 4101 4102``parmVarDecl(isAtPosition(1))`` matches ``int b``. 4103</pre></td></tr> 4104 4105 4106<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> 4107<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 4108 4109Given 4110 class Y { public: void x(); }; 4111 void z() { Y* y; y->x(); } 4112cxxMemberCallExpr(on(hasType(asString("class Y *")))) 4113 matches y->x() 4114</pre></td></tr> 4115 4116 4117<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 4118<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 4119 4120Matches a node if it equals the node previously bound to ID. 4121 4122Given 4123 class X { int a; int b; }; 4124cxxRecordDecl( 4125 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4126 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4127 matches the class X, as a and b have the same type. 4128 4129Note that when multiple matches are involved via forEach* matchers, 4130equalsBoundNodes acts as a filter. 4131For example: 4132compoundStmt( 4133 forEachDescendant(varDecl().bind("d")), 4134 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4135will trigger a match for each combination of variable declaration 4136and reference to that variable declaration within a compound statement. 4137</pre></td></tr> 4138 4139 4140<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> 4141<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 4142the node, not hidden within a typedef. 4143 4144Given 4145 typedef const int const_int; 4146 const_int i; 4147 int *const j; 4148 int *volatile k; 4149 int m; 4150varDecl(hasType(hasLocalQualifiers())) matches only j and k. 4151i is const-qualified but the qualifier is not local. 4152</pre></td></tr> 4153 4154 4155<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> 4156<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 4157 4158Given 4159 void a(char); 4160 void b(wchar_t); 4161 void c(double); 4162functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 4163matches "a(char)", "b(wchar_t)", but not "c(double)". 4164</pre></td></tr> 4165 4166 4167<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> 4168<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 4169the Objective-C object pointer type, which is different despite being 4170syntactically similar. 4171 4172Given 4173 int *i = nullptr; 4174 4175 @interface Foo 4176 @end 4177 Foo *f; 4178 4179 int j; 4180varDecl(hasType(isAnyPointer())) 4181 matches "int *i" and "Foo *f", but not "int j". 4182</pre></td></tr> 4183 4184 4185<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> 4186<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 4187include "top-level" const. 4188 4189Given 4190 void a(int); 4191 void b(int const); 4192 void c(const int); 4193 void d(const int*); 4194 void e(int const) {}; 4195functionDecl(hasAnyParameter(hasType(isConstQualified()))) 4196 matches "void b(int const)", "void c(const int)" and 4197 "void e(int const) {}". It does not match d as there 4198 is no top-level const on the parameter type "const int *". 4199</pre></td></tr> 4200 4201 4202<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> 4203<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 4204 4205Given 4206 void a(int); 4207 void b(long); 4208 void c(double); 4209functionDecl(hasAnyParameter(hasType(isInteger()))) 4210matches "a(int)", "b(long)", but not "c(double)". 4211</pre></td></tr> 4212 4213 4214<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> 4215<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 4216 4217Given 4218 void a(int); 4219 void b(unsigned long); 4220 void c(double); 4221functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 4222matches "a(int)", but not "b(unsigned long)" and "c(double)". 4223</pre></td></tr> 4224 4225 4226<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> 4227<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 4228 4229Given 4230 void a(int); 4231 void b(unsigned long); 4232 void c(double); 4233functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 4234matches "b(unsigned long)", but not "a(int)" and "c(double)". 4235</pre></td></tr> 4236 4237 4238<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> 4239<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 4240include "top-level" volatile. 4241 4242Given 4243 void a(int); 4244 void b(int volatile); 4245 void c(volatile int); 4246 void d(volatile int*); 4247 void e(int volatile) {}; 4248functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 4249 matches "void b(int volatile)", "void c(volatile int)" and 4250 "void e(int volatile) {}". It does not match d as there 4251 is no top-level volatile on the parameter type "volatile int *". 4252</pre></td></tr> 4253 4254 4255<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> 4256<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 4257 4258Matches a node if it equals the node previously bound to ID. 4259 4260Given 4261 class X { int a; int b; }; 4262cxxRecordDecl( 4263 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4264 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4265 matches the class X, as a and b have the same type. 4266 4267Note that when multiple matches are involved via forEach* matchers, 4268equalsBoundNodes acts as a filter. 4269For example: 4270compoundStmt( 4271 forEachDescendant(varDecl().bind("d")), 4272 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4273will trigger a match for each combination of variable declaration 4274and reference to that variable declaration within a compound statement. 4275</pre></td></tr> 4276 4277 4278<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> 4279<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 4280 4281Stmt has pointer identity in the AST. 4282</pre></td></tr> 4283 4284 4285<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpandedFromMacro0')"><a name="isExpandedFromMacro0Anchor">isExpandedFromMacro</a></td><td>llvm::StringRef MacroName</td></tr> 4286<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro. 4287Does not match if only part of the statement is expanded from that macro or 4288if different parts of the the statement are expanded from different 4289appearances of the macro. 4290 4291FIXME: Change to be a polymorphic matcher that works on any syntactic 4292node. There's nothing `Stmt`-specific about it. 4293</pre></td></tr> 4294 4295 4296<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 4297<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 4298partially matching a given regex. 4299 4300Example matches Y but not X 4301 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 4302 #include "ASTMatcher.h" 4303 class X {}; 4304ASTMatcher.h: 4305 class Y {}; 4306 4307Usable 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>> 4308 4309If the matcher is used in clang-query, RegexFlags parameter 4310should be passed as a quoted string. e.g: "NoFlags". 4311Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4312</pre></td></tr> 4313 4314 4315<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> 4316<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 4317 4318Example matches X but not Y 4319 (matcher = cxxRecordDecl(isExpansionInMainFile()) 4320 #include <Y.h> 4321 class X {}; 4322Y.h: 4323 class Y {}; 4324 4325Usable 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>> 4326</pre></td></tr> 4327 4328 4329<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> 4330<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 4331 4332Example matches Y but not X 4333 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 4334 #include <SystemHeader.h> 4335 class X {}; 4336SystemHeader.h: 4337 class Y {}; 4338 4339Usable 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>> 4340</pre></td></tr> 4341 4342 4343<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> 4344<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 4345 4346Given 4347 int j; 4348 template<typename T> void A(T t) { T i; j += 42;} 4349 A(0); 4350 A(0U); 4351declStmt(isInTemplateInstantiation()) 4352 matches 'int i;' and 'unsigned i'. 4353unless(stmt(isInTemplateInstantiation())) 4354 will NOT match j += 42; as it's shared between the template definition and 4355 instantiation. 4356</pre></td></tr> 4357 4358 4359<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> 4360<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 4361 4362Given 4363 int a[42]; 4364 int b[2 * 21]; 4365 int c[41], d[43]; 4366 char *s = "abcd"; 4367 wchar_t *ws = L"abcd"; 4368 char *w = "a"; 4369constantArrayType(hasSize(42)) 4370 matches "int a[42]" and "int b[2 * 21]" 4371stringLiteral(hasSize(4)) 4372 matches "abcd", L"abcd" 4373</pre></td></tr> 4374 4375 4376<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> 4377<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class." 4378 4379Example matches C, but not S, U or E. 4380 struct S {}; 4381 class C {}; 4382 union U {}; 4383 enum E {}; 4384</pre></td></tr> 4385 4386 4387<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isDefinition0')"><a name="isDefinition0Anchor">isDefinition</a></td><td></td></tr> 4388<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 4389 4390Example matches A, va, fa 4391 class A {}; 4392 class B; // Doesn't match, as it has no body. 4393 int va; 4394 extern int vb; // Doesn't match, as it doesn't define the variable. 4395 void fa() {} 4396 void fb(); // Doesn't match, as it has no body. 4397 @interface X 4398 - (void)ma; // Doesn't match, interface is declaration. 4399 @end 4400 @implementation X 4401 - (void)ma {} 4402 @end 4403 4404Usable 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>>, 4405 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4406</pre></td></tr> 4407 4408 4409<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isEnum0')"><a name="isEnum0Anchor">isEnum</a></td><td></td></tr> 4410<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum." 4411 4412Example matches E, but not C, S or U. 4413 struct S {}; 4414 class C {}; 4415 union U {}; 4416 enum E {}; 4417</pre></td></tr> 4418 4419 4420<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr> 4421<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct." 4422 4423Example matches S, but not C, U or E. 4424 struct S {}; 4425 class C {}; 4426 union U {}; 4427 enum E {}; 4428</pre></td></tr> 4429 4430 4431<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr> 4432<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union." 4433 4434Example matches U, but not C, S or E. 4435 struct S {}; 4436 class C {}; 4437 union U {}; 4438 enum E {}; 4439</pre></td></tr> 4440 4441 4442<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr> 4443<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 4444 4445Note that 'Value' is a string as the template argument's value is 4446an arbitrary precision integer. 'Value' must be euqal to the canonical 4447representation of that integral value in base 10. 4448 4449Given 4450 template<int T> struct C {}; 4451 C<42> c; 4452classTemplateSpecializationDecl( 4453 hasAnyTemplateArgument(equalsIntegralValue("42"))) 4454 matches the implicit instantiation of C in C<42>. 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('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr> 4459<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 4460 4461Given 4462 template<int T> struct C {}; 4463 C<42> c; 4464classTemplateSpecializationDecl( 4465 hasAnyTemplateArgument(isIntegral())) 4466 matches the implicit instantiation of C in C<42> 4467 with isIntegral() matching 42. 4468</pre></td></tr> 4469 4470 4471<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> 4472<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 4473 4474Given 4475 template<typename T> struct C {}; 4476 C<int> c; 4477classTemplateSpecializationDecl(templateArgumentCountIs(1)) 4478 matches C<int>. 4479</pre></td></tr> 4480 4481 4482<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> 4483<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 4484partially matching a given regex. 4485 4486Example matches Y but not X 4487 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 4488 #include "ASTMatcher.h" 4489 class X {}; 4490ASTMatcher.h: 4491 class Y {}; 4492 4493Usable 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>> 4494 4495If the matcher is used in clang-query, RegexFlags parameter 4496should be passed as a quoted string. e.g: "NoFlags". 4497Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4498</pre></td></tr> 4499 4500 4501<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> 4502<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 4503 4504Example matches X but not Y 4505 (matcher = cxxRecordDecl(isExpansionInMainFile()) 4506 #include <Y.h> 4507 class X {}; 4508Y.h: 4509 class Y {}; 4510 4511Usable 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>> 4512</pre></td></tr> 4513 4514 4515<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> 4516<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 4517 4518Example matches Y but not X 4519 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 4520 #include <SystemHeader.h> 4521 class X {}; 4522SystemHeader.h: 4523 class Y {}; 4524 4525Usable 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>> 4526</pre></td></tr> 4527 4528 4529<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> 4530<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 4531 4532Given 4533 struct S { bool func(); }; 4534functionDecl(returns(booleanType())) 4535 matches "bool func();" 4536</pre></td></tr> 4537 4538 4539<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> 4540<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 4541 4542Matches a node if it equals the node previously bound to ID. 4543 4544Given 4545 class X { int a; int b; }; 4546cxxRecordDecl( 4547 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4548 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4549 matches the class X, as a and b have the same type. 4550 4551Note that when multiple matches are involved via forEach* matchers, 4552equalsBoundNodes acts as a filter. 4553For example: 4554compoundStmt( 4555 forEachDescendant(varDecl().bind("d")), 4556 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4557will trigger a match for each combination of variable declaration 4558and reference to that variable declaration within a compound statement. 4559</pre></td></tr> 4560 4561 4562<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> 4563<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 4564 4565Type has pointer identity in the AST. 4566</pre></td></tr> 4567 4568 4569<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> 4570<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 4571 4572Given 4573 int i; 4574 float f; 4575realFloatingPointType() 4576 matches "float f" but not "int i" 4577</pre></td></tr> 4578 4579 4580<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr> 4581<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 4582 4583Given 4584 struct S { void func(); }; 4585functionDecl(returns(voidType())) 4586 matches "void func();" 4587</pre></td></tr> 4588 4589 4590<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> 4591<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 4592 4593Given 4594 int x; 4595 int s = sizeof(x) + alignof(x) 4596unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 4597 matches sizeof(x) 4598 4599If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter 4600should be passed as a quoted string. e.g., ofKind("UETT_SizeOf"). 4601</pre></td></tr> 4602 4603 4604<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> 4605<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the 4606specified names. 4607 4608 hasAnyOperatorName("+", "-") 4609 Is equivalent to 4610 anyOf(hasOperatorName("+"), hasOperatorName("-")) 4611</pre></td></tr> 4612 4613 4614<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> 4615<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 4616unary). 4617 4618Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 4619 !(a || b) 4620</pre></td></tr> 4621 4622 4623<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> 4624<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed 4625to '.'. 4626 4627Member calls on the implicit this pointer match as called with '->'. 4628 4629Given 4630 class Y { 4631 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 4632 template <class T> void f() { this->f<T>(); f<T>(); } 4633 int a; 4634 static int b; 4635 }; 4636 template <class T> 4637 class Z { 4638 void x() { this->m; } 4639 }; 4640memberExpr(isArrow()) 4641 matches this->x, x, y.x, a, this->b 4642cxxDependentScopeMemberExpr(isArrow()) 4643 matches this->m 4644unresolvedMemberExpr(isArrow()) 4645 matches this->f<T>, f<T> 4646</pre></td></tr> 4647 4648 4649<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> 4650<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 4651 4652Example matches x, but not y, z, or a. 4653(matcher = varDecl(hasAutomaticStorageDuration()) 4654void f() { 4655 int x; 4656 static int y; 4657 thread_local int z; 4658} 4659int a; 4660</pre></td></tr> 4661 4662 4663<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> 4664<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 4665 4666Example matches y and z (matcher = varDecl(hasGlobalStorage()) 4667void f() { 4668 int x; 4669 static int y; 4670} 4671int z; 4672</pre></td></tr> 4673 4674 4675<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> 4676<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 4677non-static local variable. 4678 4679Example matches x (matcher = varDecl(hasLocalStorage()) 4680void f() { 4681 int x; 4682 static int y; 4683} 4684int z; 4685</pre></td></tr> 4686 4687 4688<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> 4689<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 4690It includes the variable declared at namespace scope and those declared 4691with "static" and "extern" storage class specifiers. 4692 4693void f() { 4694 int x; 4695 static int y; 4696 thread_local int z; 4697} 4698int a; 4699static int b; 4700extern int c; 4701varDecl(hasStaticStorageDuration()) 4702 matches the function declaration y, a, b and c. 4703</pre></td></tr> 4704 4705 4706<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> 4707<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 4708 4709Example matches z, but not x, z, or a. 4710(matcher = varDecl(hasThreadStorageDuration()) 4711void f() { 4712 int x; 4713 static int y; 4714 thread_local int z; 4715} 4716int a; 4717</pre></td></tr> 4718 4719 4720<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> 4721<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations, 4722 and if constexpr. 4723 4724Given: 4725 constexpr int foo = 42; 4726 constexpr int bar(); 4727 void baz() { if constexpr(1 > 0) {} } 4728varDecl(isConstexpr()) 4729 matches the declaration of foo. 4730functionDecl(isConstexpr()) 4731 matches the declaration of bar. 4732ifStmt(isConstexpr()) 4733 matches the if statement in baz. 4734</pre></td></tr> 4735 4736 4737<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isDefinition1')"><a name="isDefinition1Anchor">isDefinition</a></td><td></td></tr> 4738<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 4739 4740Example matches A, va, fa 4741 class A {}; 4742 class B; // Doesn't match, as it has no body. 4743 int va; 4744 extern int vb; // Doesn't match, as it doesn't define the variable. 4745 void fa() {} 4746 void fb(); // Doesn't match, as it has no body. 4747 @interface X 4748 - (void)ma; // Doesn't match, interface is declaration. 4749 @end 4750 @implementation X 4751 - (void)ma {} 4752 @end 4753 4754Usable 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>>, 4755 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4756</pre></td></tr> 4757 4758 4759<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> 4760<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 4761a C++ catch block, or an Objective-C statement. 4762 4763Example matches x (matcher = varDecl(isExceptionVariable()) 4764void f(int y) { 4765 try { 4766 } catch (int x) { 4767 } 4768} 4769</pre></td></tr> 4770 4771 4772<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> 4773<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 4774static member variable template instantiations. 4775 4776Given 4777 template<typename T> void A(T t) { } 4778 template<> void A(int N) { } 4779functionDecl(isExplicitTemplateSpecialization()) 4780 matches the specialization A<int>(). 4781 4782Usable 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>> 4783</pre></td></tr> 4784 4785 4786<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> 4787<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 4788 4789Given: 4790 extern "C" void f() {} 4791 extern "C" { void g() {} } 4792 void h() {} 4793 extern "C" int x = 1; 4794 extern "C" int y = 2; 4795 int z = 3; 4796functionDecl(isExternC()) 4797 matches the declaration of f and g, but not the declaration of h. 4798varDecl(isExternC()) 4799 matches the declaration of x and y, but not the declaration of z. 4800</pre></td></tr> 4801 4802 4803<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> 4804<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope. 4805 4806Example matches y (matcher = varDecl(isStaticLocal())) 4807void f() { 4808 int x; 4809 static int y; 4810} 4811static int z; 4812</pre></td></tr> 4813 4814 4815<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> 4816<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage 4817class specifier ("static" keyword) written in the source. 4818 4819Given: 4820 static void f() {} 4821 static int i = 0; 4822 extern int j; 4823 int k; 4824functionDecl(isStaticStorageClass()) 4825 matches the function declaration f. 4826varDecl(isStaticStorageClass()) 4827 matches the variable declaration i. 4828</pre></td></tr> 4829 4830 4831<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> 4832<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 4833member variable template instantiations. 4834 4835Given 4836 template <typename T> class X {}; class A {}; X<A> x; 4837or 4838 template <typename T> class X {}; class A {}; template class X<A>; 4839or 4840 template <typename T> class X {}; class A {}; extern template class X<A>; 4841cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4842 matches the template instantiation of X<A>. 4843 4844But given 4845 template <typename T> class X {}; class A {}; 4846 template <> class X<A> {}; X<A> x; 4847cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4848 does not match, as X<A> is an explicit template specialization. 4849 4850Usable 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>> 4851</pre></td></tr> 4852 4853<!--END_NARROWING_MATCHERS --> 4854</table> 4855 4856<!-- ======================================================================= --> 4857<h2 id="traversal-matchers">AST Traversal Matchers</h2> 4858<!-- ======================================================================= --> 4859 4860<p>Traversal matchers specify the relationship to other nodes that are 4861reachable from the current node.</p> 4862 4863<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 4864forEachDescendant) which work on all nodes and allow users to write more generic 4865match expressions.</p> 4866 4867<table> 4868<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 4869<!-- START_TRAVERSAL_MATCHERS --> 4870 4871<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 4872<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 4873 4874Unlike anyOf, eachOf will generate a match result for each 4875matching submatcher. 4876 4877For example, in: 4878 class A { int a; int b; }; 4879The matcher: 4880 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 4881 has(fieldDecl(hasName("b")).bind("v")))) 4882will generate two results binding "v", the first of which binds 4883the field declaration of a, the second the field declaration of 4884b. 4885 4886Usable as: Any Matcher 4887</pre></td></tr> 4888 4889 4890<tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr> 4891<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 4892 4893Generates results for each match. 4894 4895For example, in: 4896 class A { class B {}; class C {}; }; 4897The matcher: 4898 cxxRecordDecl(hasName("::A"), 4899 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 4900will generate results for A, B and C. 4901 4902Usable as: Any Matcher 4903</pre></td></tr> 4904 4905 4906<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 4907<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 4908provided matcher. 4909 4910Example matches X, A, A::X, B, B::C, B::C::X 4911 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 4912 class X {}; 4913 class A { class X {}; }; // Matches A, because A::X is a class of name 4914 // X inside A. 4915 class B { class C { class X {}; }; }; 4916 4917DescendantT must be an AST base type. 4918 4919As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 4920each result that matches instead of only on the first one. 4921 4922Note: Recursively combined ForEachDescendant can cause many matches: 4923 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 4924 forEachDescendant(cxxRecordDecl()) 4925 ))) 4926will match 10 times (plus injected class name matches) on: 4927 class A { class B { class C { class D { class E {}; }; }; }; }; 4928 4929Usable as: Any Matcher 4930</pre></td></tr> 4931 4932 4933<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 4934<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 4935provided matcher. 4936 4937Example matches X, Y, Y::X, Z::Y, Z::Y::X 4938 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 4939 class X {}; 4940 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X 4941 // inside Y. 4942 class Z { class Y { class X {}; }; }; // Does not match Z. 4943 4944ChildT must be an AST base type. 4945 4946As opposed to 'has', 'forEach' will cause a match for each result that 4947matches instead of only on the first one. 4948 4949Usable as: Any Matcher 4950</pre></td></tr> 4951 4952 4953<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 4954<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 4955matcher. 4956 4957Given 4958void f() { if (true) { int x = 42; } } 4959void g() { for (;;) { int x = 43; } } 4960expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 4961 4962Usable as: Any Matcher 4963</pre></td></tr> 4964 4965 4966<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 4967<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 4968provided matcher. 4969 4970Example matches X, Y, Z 4971 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 4972 class X {}; // Matches X, because X::X is a class of name X inside X. 4973 class Y { class X {}; }; 4974 class Z { class Y { class X {}; }; }; 4975 4976DescendantT must be an AST base type. 4977 4978Usable as: Any Matcher 4979</pre></td></tr> 4980 4981 4982<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 4983<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 4984provided matcher. 4985 4986Example matches X, Y 4987 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 4988 class X {}; // Matches X, because X::X is a class of name X inside X. 4989 class Y { class X {}; }; 4990 class Z { class Y { class X {}; }; }; // Does not match Z. 4991 4992ChildT must be an AST base type. 4993 4994Usable as: Any Matcher 4995Note that has is direct matcher, so it also matches things like implicit 4996casts and paren casts. If you are matching with expr then you should 4997probably consider using ignoringParenImpCasts like: 4998has(ignoringParenImpCasts(expr())). 4999</pre></td></tr> 5000 5001 5002<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 5003<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 5004matcher. 5005 5006Given 5007void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 5008compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 5009 5010Usable as: Any Matcher 5011</pre></td></tr> 5012 5013 5014<tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr> 5015<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher. 5016 5017However, optionally will retain any bindings generated by the submatcher. 5018Useful when additional information which may or may not present about a main 5019matching node is desired. 5020 5021For example, in: 5022 class Foo { 5023 int bar; 5024 } 5025The matcher: 5026 cxxRecordDecl( 5027 optionally(has( 5028 fieldDecl(hasName("bar")).bind("var") 5029 ))).bind("record") 5030will produce a result binding for both "record" and "var". 5031The matcher will produce a "record" binding for even if there is no data 5032member named "bar" in that class. 5033 5034Usable as: Any Matcher 5035</pre></td></tr> 5036 5037 5038<tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr> 5039<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind. 5040 5041Given 5042 void foo() 5043 { 5044 int i = 3.0; 5045 } 5046The matcher 5047 traverse(TK_IgnoreImplicitCastsAndParentheses, 5048 varDecl(hasInitializer(floatLiteral().bind("init"))) 5049 ) 5050matches the variable declaration with "init" bound to the "3.0". 5051</pre></td></tr> 5052 5053 5054<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> 5055<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 5056switch statement or conditional operator. 5057 5058Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5059 if (true) {} 5060</pre></td></tr> 5061 5062 5063<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> 5064<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 5065(binary or ternary). 5066 5067Example matches b 5068 condition ? a : b 5069 condition ?: b 5070</pre></td></tr> 5071 5072 5073<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> 5074<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 5075 5076Example 1 (conditional ternary operator): matches a 5077 condition ? a : b 5078 5079Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 5080 condition ?: b 5081</pre></td></tr> 5082 5083 5084<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> 5085<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 5086matches the given matcher. 5087 5088The associated declaration is: 5089- for type nodes, the declaration of the underlying type 5090- for CallExpr, the declaration of the callee 5091- for MemberExpr, the declaration of the referenced member 5092- for CXXConstructExpr, the declaration of the constructor 5093- for CXXNewExpr, the declaration of the operator new 5094- for ObjCIvarExpr, the declaration of the ivar 5095 5096For type nodes, hasDeclaration will generally match the declaration of the 5097sugared type. Given 5098 class X {}; 5099 typedef X Y; 5100 Y y; 5101in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5102typedefDecl. A common use case is to match the underlying, desugared type. 5103This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5104 varDecl(hasType(hasUnqualifiedDesugaredType( 5105 recordType(hasDeclaration(decl()))))) 5106In this matcher, the decl will match the CXXRecordDecl of class X. 5107 5108Usable 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>>, 5109 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>>, 5110 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>>, 5111 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>>, 5112 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>>, 5113 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>>, 5114 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5115</pre></td></tr> 5116 5117 5118<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> 5119<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 5120 5121Given 5122 int i[5]; 5123 void f() { i[1] = 42; } 5124arraySubscriptExpression(hasBase(implicitCastExpr( 5125 hasSourceExpression(declRefExpr())))) 5126 matches i[1] with the declRefExpr() matching i 5127</pre></td></tr> 5128 5129 5130<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> 5131<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 5132 5133Given 5134 int i[5]; 5135 void f() { i[1] = 42; } 5136arraySubscriptExpression(hasIndex(integerLiteral())) 5137 matches i[1] with the integerLiteral() matching 1 5138</pre></td></tr> 5139 5140 5141<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('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> 5142<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 5143 5144Example matches a (matcher = binaryOperator(hasLHS())) 5145 a || b 5146</pre></td></tr> 5147 5148 5149<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> 5150<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 5151 5152Example matches b (matcher = binaryOperator(hasRHS())) 5153 a || b 5154</pre></td></tr> 5155 5156 5157<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> 5158<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 5159type. 5160 5161Given 5162 struct A {}; 5163 A a[7]; 5164 int b[7]; 5165arrayType(hasElementType(builtinType())) 5166 matches "int b[7]" 5167 5168Usable 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>> 5169</pre></td></tr> 5170 5171 5172<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> 5173<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 5174 5175Given 5176 _Atomic(int) i; 5177 _Atomic(float) f; 5178atomicType(hasValueType(isInteger())) 5179 matches "_Atomic(int) i" 5180 5181Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 5182</pre></td></tr> 5183 5184 5185<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> 5186<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 5187 5188Note: There is no TypeLoc for the deduced type and thus no 5189getDeducedLoc() matcher. 5190 5191Given 5192 auto a = 1; 5193 auto b = 2.0; 5194autoType(hasDeducedType(isInteger())) 5195 matches "auto a" 5196 5197Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 5198</pre></td></tr> 5199 5200 5201<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> 5202<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 5203binary operator matches. 5204</pre></td></tr> 5205 5206 5207<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> 5208<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 5209 5210Example matches a (matcher = binaryOperator(hasLHS())) 5211 a || b 5212</pre></td></tr> 5213 5214 5215<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> 5216<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator. 5217 5218Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 5219 integerLiteral(equals(2))) 5220 1 + 2 // Match 5221 2 + 1 // Match 5222 1 + 1 // No match 5223 2 + 2 // No match 5224</pre></td></tr> 5225 5226 5227<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> 5228<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 5229 5230Example matches b (matcher = binaryOperator(hasRHS())) 5231 a || b 5232</pre></td></tr> 5233 5234 5235<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> 5236<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 5237block. 5238 5239Does not match the 'this' parameter of a method. 5240 5241Given 5242 class X { void f(int x, int y, int z) {} }; 5243cxxMethodDecl(hasAnyParameter(hasName("y"))) 5244 matches f(int x, int y, int z) {} 5245with hasAnyParameter(...) 5246 matching int y 5247 5248For ObjectiveC, given 5249 @interface I - (void) f:(int) y; @end 5250 5251the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 5252matches the declaration of method f with hasParameter 5253matching y. 5254 5255For blocks, given 5256 b = ^(int y) { printf("%d", y) }; 5257 5258the matcher blockDecl(hasAnyParameter(hasName("y"))) 5259matches the declaration of the block b with hasParameter 5260matching y. 5261</pre></td></tr> 5262 5263 5264<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> 5265<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 5266declaration or a block. 5267 5268Given 5269 class X { void f(int x) {} }; 5270cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 5271 matches f(int x) {} 5272with hasParameter(...) 5273 matching int x 5274 5275For ObjectiveC, given 5276 @interface I - (void) f:(int) y; @end 5277 5278the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 5279matches the declaration of method f with hasParameter 5280matching y. 5281</pre></td></tr> 5282 5283 5284<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> 5285<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 5286pointee matches a given matcher. 5287 5288Given 5289 int *a; 5290 int const *b; 5291 float const *f; 5292pointerType(pointee(isConstQualified(), isInteger())) 5293 matches "int const *b" 5294 5295Usable 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>>, 5296 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>> 5297</pre></td></tr> 5298 5299 5300<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> 5301<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value 5302declaration's type. 5303 5304In case of a value declaration (for example a variable declaration), 5305this resolves one layer of indirection. For example, in the value 5306declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 5307X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 5308declaration of x. 5309 5310Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5311 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5312 and friend class X (matcher = friendDecl(hasType("X")) 5313 class X {}; 5314 void y(X &x) { x; X z; } 5315 class Y { friend class X; }; 5316 5317Example matches class Derived 5318(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 5319class Base {}; 5320class Derived : Base {}; 5321 5322Usable 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>>, 5323Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 5324</pre></td></tr> 5325 5326 5327<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> 5328<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 5329 5330Given 5331 void f(int i); 5332 int y; 5333 f(y); 5334callExpr( 5335 forEachArgumentWithParam( 5336 declRefExpr(to(varDecl(hasName("y")))), 5337 parmVarDecl(hasType(isInteger())) 5338)) 5339 matches f(y); 5340with declRefExpr(...) 5341 matching int y 5342and parmVarDecl(...) 5343 matching int i 5344</pre></td></tr> 5345 5346 5347<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> 5348<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or 5349CXXConstructExpr. It is very similar to forEachArgumentWithParam but 5350it works on calls through function pointers as well. 5351 5352The difference is, that function pointers do not provide access to a 5353ParmVarDecl, but only the QualType for each argument. 5354 5355Given 5356 void f(int i); 5357 int y; 5358 f(y); 5359 void (*f_ptr)(int) = f; 5360 f_ptr(y); 5361callExpr( 5362 forEachArgumentWithParamType( 5363 declRefExpr(to(varDecl(hasName("y")))), 5364 qualType(isInteger()).bind("type) 5365)) 5366 matches f(y) and f_ptr(y) 5367with declRefExpr(...) 5368 matching int y 5369and qualType(...) 5370 matching int 5371</pre></td></tr> 5372 5373 5374<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> 5375<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 5376expression, or an ObjC-message-send expression. 5377 5378Given 5379 void x(int, int, int) { int y; x(1, y, 42); } 5380callExpr(hasAnyArgument(declRefExpr())) 5381 matches x(1, y, 42) 5382with hasAnyArgument(...) 5383 matching y 5384 5385For ObjectiveC, given 5386 @interface I - (void) f:(int) y; @end 5387 void foo(I *i) { [i f:12]; } 5388objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5389 matches [i f:12] 5390</pre></td></tr> 5391 5392 5393<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> 5394<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 5395call expression. 5396 5397Example matches y in x(y) 5398 (matcher = callExpr(hasArgument(0, declRefExpr()))) 5399 void x(int) { int y; x(y); } 5400</pre></td></tr> 5401 5402 5403<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> 5404<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 5405matches the given matcher. 5406 5407The associated declaration is: 5408- for type nodes, the declaration of the underlying type 5409- for CallExpr, the declaration of the callee 5410- for MemberExpr, the declaration of the referenced member 5411- for CXXConstructExpr, the declaration of the constructor 5412- for CXXNewExpr, the declaration of the operator new 5413- for ObjCIvarExpr, the declaration of the ivar 5414 5415For type nodes, hasDeclaration will generally match the declaration of the 5416sugared type. Given 5417 class X {}; 5418 typedef X Y; 5419 Y y; 5420in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5421typedefDecl. A common use case is to match the underlying, desugared type. 5422This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5423 varDecl(hasType(hasUnqualifiedDesugaredType( 5424 recordType(hasDeclaration(decl()))))) 5425In this matcher, the decl will match the CXXRecordDecl of class X. 5426 5427Usable 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>>, 5428 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>>, 5429 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>>, 5430 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>>, 5431 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>>, 5432 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>>, 5433 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5434</pre></td></tr> 5435 5436 5437<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> 5438<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 5439 5440Given 5441 class A { A() : i(42), j(42) {} int i; int j; }; 5442cxxConstructorDecl(forEachConstructorInitializer( 5443 forField(decl().bind("x")) 5444)) 5445 will trigger two matches, binding for 'i' and 'j' respectively. 5446</pre></td></tr> 5447 5448 5449<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> 5450<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 5451 5452Given 5453 struct Foo { 5454 Foo() : foo_(1) { } 5455 int foo_; 5456 }; 5457cxxRecordDecl(has(cxxConstructorDecl( 5458 hasAnyConstructorInitializer(anything()) 5459))) 5460 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 5461</pre></td></tr> 5462 5463 5464<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> 5465<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 5466 5467Given 5468 struct Foo { 5469 Foo() : foo_(1) { } 5470 int foo_; 5471 }; 5472cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 5473 forField(hasName("foo_")))))) 5474 matches Foo 5475with forField matching foo_ 5476</pre></td></tr> 5477 5478 5479<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> 5480<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 5481 5482Given 5483 struct Foo { 5484 Foo() : foo_(1) { } 5485 int foo_; 5486 }; 5487cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 5488 withInitializer(integerLiteral(equals(1))))))) 5489 matches Foo 5490with withInitializer matching (1) 5491</pre></td></tr> 5492 5493 5494<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> 5495<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 5496given matcher. Implicit object expressions are included; that is, it matches 5497use of implicit `this`. 5498 5499Given 5500 struct X { 5501 int m; 5502 int f(X x) { x.m; return m; } 5503 }; 5504memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 5505 matches `x.m`, but not `m`; however, 5506memberExpr(hasObjectExpression(hasType(pointsTo( 5507 cxxRecordDecl(hasName("X")))))) 5508 matches `m` (aka. `this->m`), but not `x.m`. 5509</pre></td></tr> 5510 5511 5512<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> 5513<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr> 5514 5515 5516<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> 5517<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer. 5518 5519Given: 5520 void foo() { 5521 if (int i = foobar(); i > 0) {} 5522 switch (int i = foobar(); i) {} 5523 for (auto& a = get_range(); auto& x : a) {} 5524 } 5525 void bar() { 5526 if (foobar() > 0) {} 5527 switch (foobar()) {} 5528 for (auto& x : get_range()) {} 5529 } 5530ifStmt(hasInitStatement(anything())) 5531 matches the if statement in foo but not in bar. 5532switchStmt(hasInitStatement(anything())) 5533 matches the switch statement in foo but not in bar. 5534cxxForRangeStmt(hasInitStatement(anything())) 5535 matches the range for statement in foo but not in bar. 5536</pre></td></tr> 5537 5538 5539<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> 5540<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 5541 5542Example: 5543 forStmt(hasLoopVariable(anything())) 5544matches 'int x' in 5545 for (int x : a) { } 5546</pre></td></tr> 5547 5548 5549<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> 5550<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 5551 5552Example: 5553 forStmt(hasRangeInit(anything())) 5554matches 'a' in 5555 for (int x : a) { } 5556</pre></td></tr> 5557 5558 5559<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> 5560<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 5561`on`, matches the argument directly without stripping away anything. 5562 5563Given 5564 class Y { public: void m(); }; 5565 Y g(); 5566 class X : public Y { void g(); }; 5567 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 5568cxxMemberCallExpr(onImplicitObjectArgument(hasType( 5569 cxxRecordDecl(hasName("Y"))))) 5570 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 5571cxxMemberCallExpr(on(callExpr())) 5572 does not match `(g()).m()`, because the parens are not ignored. 5573 5574FIXME: Overload to allow directly matching types? 5575</pre></td></tr> 5576 5577 5578<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> 5579<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 5580stripping off any parentheses or implicit casts. 5581 5582Given 5583 class Y { public: void m(); }; 5584 Y g(); 5585 class X : public Y {}; 5586 void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 5587cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 5588 matches `y.m()` and `(g()).m()`. 5589cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 5590 matches `x.m()`. 5591cxxMemberCallExpr(on(callExpr())) 5592 matches `(g()).m()`. 5593 5594FIXME: Overload to allow directly matching types? 5595</pre></td></tr> 5596 5597 5598<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> 5599<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 5600</pre></td></tr> 5601 5602 5603<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> 5604<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 5605matches the InnerMatcher, or is a pointer to a type that matches the 5606InnerMatcher. 5607 5608Given 5609 class Y { public: void m(); }; 5610 class X : public Y { void g(); }; 5611 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 5612cxxMemberCallExpr(thisPointerType(hasDeclaration( 5613 cxxRecordDecl(hasName("Y"))))) 5614 matches `y.m()`, `p->m()` and `x.m()`. 5615cxxMemberCallExpr(thisPointerType(hasDeclaration( 5616 cxxRecordDecl(hasName("X"))))) 5617 matches `x.g()`. 5618</pre></td></tr> 5619 5620 5621<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> 5622<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 5623produce multiple matches. 5624 5625Given 5626 class A { virtual void f(); }; 5627 class B : public A { void f(); }; 5628 class C : public B { void f(); }; 5629cxxMethodDecl(ofClass(hasName("C")), 5630 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 5631 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 5632 that B::f is not overridden by C::f). 5633 5634The check can produce multiple matches in case of multiple inheritance, e.g. 5635 class A1 { virtual void f(); }; 5636 class A2 { virtual void f(); }; 5637 class C : public A1, public A2 { void f(); }; 5638cxxMethodDecl(ofClass(hasName("C")), 5639 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 5640 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 5641 once with "b" binding "A2::f" and "d" binding "C::f". 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('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> 5646<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 5647belongs to. 5648 5649FIXME: Generalize this for other kinds of declarations. 5650FIXME: What other kind of declarations would we need to generalize 5651this to? 5652 5653Example matches A() in the last line 5654 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 5655 ofClass(hasName("A")))))) 5656 class A { 5657 public: 5658 A(); 5659 }; 5660 A a = A(); 5661</pre></td></tr> 5662 5663 5664<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> 5665<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments. 5666 5667Given: 5668 MyClass *p1 = new (Storage) MyClass(); 5669cxxNewExpr(hasAnyPlacementArg(anything())) 5670 matches the expression 'new (Storage, 16) MyClass()'. 5671</pre></td></tr> 5672 5673 5674<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> 5675<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 5676 5677Given: 5678 MyClass *p1 = new MyClass[10]; 5679cxxNewExpr(hasArraySize(integerLiteral(equals(10)))) 5680 matches the expression 'new MyClass[10]'. 5681</pre></td></tr> 5682 5683 5684<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> 5685<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 5686matches the given matcher. 5687 5688The associated declaration is: 5689- for type nodes, the declaration of the underlying type 5690- for CallExpr, the declaration of the callee 5691- for MemberExpr, the declaration of the referenced member 5692- for CXXConstructExpr, the declaration of the constructor 5693- for CXXNewExpr, the declaration of the operator new 5694- for ObjCIvarExpr, the declaration of the ivar 5695 5696For type nodes, hasDeclaration will generally match the declaration of the 5697sugared type. Given 5698 class X {}; 5699 typedef X Y; 5700 Y y; 5701in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5702typedefDecl. A common use case is to match the underlying, desugared type. 5703This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5704 varDecl(hasType(hasUnqualifiedDesugaredType( 5705 recordType(hasDeclaration(decl()))))) 5706In this matcher, the decl will match the CXXRecordDecl of class X. 5707 5708Usable 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>>, 5709 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>>, 5710 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>>, 5711 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>>, 5712 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>>, 5713 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>>, 5714 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5715</pre></td></tr> 5716 5717 5718<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> 5719<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments. 5720 5721Given: 5722 MyClass *p1 = new (Storage, 16) MyClass(); 5723cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16)))) 5724 matches the expression 'new (Storage, 16) MyClass()'. 5725</pre></td></tr> 5726 5727 5728<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> 5729<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher. 5730 5731Example: 5732matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 5733 class Foo; 5734 class Bar : Foo {}; 5735 class Baz : Bar {}; 5736 class SpecialBase; 5737 class Proxy : SpecialBase {}; // matches Proxy 5738 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived 5739 5740FIXME: Refactor this and isDerivedFrom to reuse implementation. 5741</pre></td></tr> 5742 5743 5744<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> 5745<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher. 5746 5747Example: 5748matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 5749 class Foo; 5750 class Bar : Foo {}; 5751 class Baz : Bar {}; 5752 class SpecialBase; 5753 class Proxy : SpecialBase {}; // matches Proxy 5754 class IndirectlyDerived : Proxy {}; // doesn't match 5755</pre></td></tr> 5756 5757 5758<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('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> 5759<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 5760 5761Given: 5762 class A { void func(); }; 5763 class B { void member(); }; 5764 5765cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 5766A but not B. 5767</pre></td></tr> 5768 5769 5770<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> 5771<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class 5772matching Base, or Objective-C classes that directly or indirectly 5773subclass a class matching Base. 5774 5775Note that a class is not considered to be derived from itself. 5776 5777Example matches Y, Z, C (Base == hasName("X")) 5778 class X; 5779 class Y : public X {}; // directly derived 5780 class Z : public Y {}; // indirectly derived 5781 typedef X A; 5782 typedef A B; 5783 class C : public B {}; // derived from a typedef of X 5784 5785In the following example, Bar matches isDerivedFrom(hasName("X")): 5786 class Foo; 5787 typedef Foo X; 5788 class Bar : public Foo {}; // derived from a type that X is a typedef of 5789 5790In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 5791 @interface NSObject @end 5792 @interface Bar : NSObject @end 5793 5794Usable 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>> 5795</pre></td></tr> 5796 5797 5798<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> 5799<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class 5800matching Base. 5801 5802Note that a class is not considered to be derived from itself. 5803 5804Example matches Y, C (Base == hasName("X")) 5805 class X; 5806 class Y : public X {}; // directly derived 5807 class Z : public Y {}; // indirectly derived 5808 typedef X A; 5809 typedef A B; 5810 class C : public B {}; // derived from a typedef of X 5811 5812In the following example, Bar matches isDerivedFrom(hasName("X")): 5813 class Foo; 5814 typedef Foo X; 5815 class Bar : public Foo {}; // derived from a type that X is a typedef of 5816</pre></td></tr> 5817 5818 5819<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> 5820<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 5821match Base. 5822</pre></td></tr> 5823 5824 5825<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> 5826<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 5827expression, or an ObjC-message-send expression. 5828 5829Given 5830 void x(int, int, int) { int y; x(1, y, 42); } 5831callExpr(hasAnyArgument(declRefExpr())) 5832 matches x(1, y, 42) 5833with hasAnyArgument(...) 5834 matching y 5835 5836For ObjectiveC, given 5837 @interface I - (void) f:(int) y; @end 5838 void foo(I *i) { [i f:12]; } 5839objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5840 matches [i f:12] 5841</pre></td></tr> 5842 5843 5844<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> 5845<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 5846given matcher. 5847 5848Example matches y.x() (matcher = callExpr(callee( 5849 cxxMethodDecl(hasName("x"))))) 5850 class Y { public: void x(); }; 5851 void z() { Y y; y.x(); } 5852</pre></td></tr> 5853 5854 5855<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('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> 5856<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 5857 5858Given 5859 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 5860 void f() { f(); } 5861callExpr(callee(expr())) 5862 matches this->x(), x(), y.x(), f() 5863with callee(...) 5864 matching this->x, x, y.x, f respectively 5865 5866Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 5867because this introduces ambiguous overloads with calls to Callee taking a 5868internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 5869implemented in terms of implicit casts. 5870</pre></td></tr> 5871 5872 5873<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> 5874<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 5875 5876Given 5877 void f(int i); 5878 int y; 5879 f(y); 5880callExpr( 5881 forEachArgumentWithParam( 5882 declRefExpr(to(varDecl(hasName("y")))), 5883 parmVarDecl(hasType(isInteger())) 5884)) 5885 matches f(y); 5886with declRefExpr(...) 5887 matching int y 5888and parmVarDecl(...) 5889 matching int i 5890</pre></td></tr> 5891 5892 5893<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> 5894<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or 5895CXXConstructExpr. It is very similar to forEachArgumentWithParam but 5896it works on calls through function pointers as well. 5897 5898The difference is, that function pointers do not provide access to a 5899ParmVarDecl, but only the QualType for each argument. 5900 5901Given 5902 void f(int i); 5903 int y; 5904 f(y); 5905 void (*f_ptr)(int) = f; 5906 f_ptr(y); 5907callExpr( 5908 forEachArgumentWithParamType( 5909 declRefExpr(to(varDecl(hasName("y")))), 5910 qualType(isInteger()).bind("type) 5911)) 5912 matches f(y) and f_ptr(y) 5913with declRefExpr(...) 5914 matching int y 5915and qualType(...) 5916 matching int 5917</pre></td></tr> 5918 5919 5920<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> 5921<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 5922expression, or an ObjC-message-send expression. 5923 5924Given 5925 void x(int, int, int) { int y; x(1, y, 42); } 5926callExpr(hasAnyArgument(declRefExpr())) 5927 matches x(1, y, 42) 5928with hasAnyArgument(...) 5929 matching y 5930 5931For ObjectiveC, given 5932 @interface I - (void) f:(int) y; @end 5933 void foo(I *i) { [i f:12]; } 5934objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5935 matches [i f:12] 5936</pre></td></tr> 5937 5938 5939<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> 5940<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 5941call expression. 5942 5943Example matches y in x(y) 5944 (matcher = callExpr(hasArgument(0, declRefExpr()))) 5945 void x(int) { int y; x(y); } 5946</pre></td></tr> 5947 5948 5949<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> 5950<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 5951matches the given matcher. 5952 5953The associated declaration is: 5954- for type nodes, the declaration of the underlying type 5955- for CallExpr, the declaration of the callee 5956- for MemberExpr, the declaration of the referenced member 5957- for CXXConstructExpr, the declaration of the constructor 5958- for CXXNewExpr, the declaration of the operator new 5959- for ObjCIvarExpr, the declaration of the ivar 5960 5961For type nodes, hasDeclaration will generally match the declaration of the 5962sugared type. Given 5963 class X {}; 5964 typedef X Y; 5965 Y y; 5966in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5967typedefDecl. A common use case is to match the underlying, desugared type. 5968This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5969 varDecl(hasType(hasUnqualifiedDesugaredType( 5970 recordType(hasDeclaration(decl()))))) 5971In this matcher, the decl will match the CXXRecordDecl of class X. 5972 5973Usable 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>>, 5974 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>>, 5975 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>>, 5976 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>>, 5977 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>>, 5978 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>>, 5979 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5980</pre></td></tr> 5981 5982 5983<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> 5984<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 5985extension, matches the constant given in the statement. 5986 5987Given 5988 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 5989caseStmt(hasCaseConstant(integerLiteral())) 5990 matches "case 1:" 5991</pre></td></tr> 5992 5993 5994<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> 5995<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 5996or opaque value's source expression matches the given matcher. 5997 5998Example 1: matches "a string" 5999(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 6000class URL { URL(string); }; 6001URL url = "a string"; 6002 6003Example 2: matches 'b' (matcher = 6004opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 6005int a = b ?: 1; 6006</pre></td></tr> 6007 6008 6009<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> 6010<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6011functionDecl that have at least one TemplateArgument matching the given 6012InnerMatcher. 6013 6014Given 6015 template<typename T> class A {}; 6016 template<> class A<double> {}; 6017 A<int> a; 6018 6019 template<typename T> f() {}; 6020 void func() { f<int>(); }; 6021 6022classTemplateSpecializationDecl(hasAnyTemplateArgument( 6023 refersToType(asString("int")))) 6024 matches the specialization A<int> 6025 6026functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 6027 matches the specialization f<int> 6028</pre></td></tr> 6029 6030 6031<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> 6032<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 6033 6034Given 6035 template<typename T> class A {}; #1 6036 template<> class A<int> {}; #2 6037classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 6038 matches '#2' with classTemplateDecl() matching the class template 6039 declaration of 'A' at #1. 6040</pre></td></tr> 6041 6042 6043<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> 6044<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6045functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 6046 6047Given 6048 template<typename T, typename U> class A {}; 6049 A<bool, int> b; 6050 A<int, bool> c; 6051 6052 template<typename T> void f() {} 6053 void func() { f<int>(); }; 6054classTemplateSpecializationDecl(hasTemplateArgument( 6055 1, refersToType(asString("int")))) 6056 matches the specialization A<bool, int> 6057 6058functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 6059 matches the specialization f<int> 6060</pre></td></tr> 6061 6062 6063<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> 6064<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 6065type. 6066 6067Given 6068 struct A {}; 6069 A a[7]; 6070 int b[7]; 6071arrayType(hasElementType(builtinType())) 6072 matches "int b[7]" 6073 6074Usable 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>> 6075</pre></td></tr> 6076 6077 6078<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> 6079<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 6080a given matcher. Also matches StmtExprs that have CompoundStmt as children. 6081 6082Given 6083 { {}; 1+2; } 6084hasAnySubstatement(compoundStmt()) 6085 matches '{ {}; 1+2; }' 6086with compoundStmt() 6087 matching '{}' 6088</pre></td></tr> 6089 6090 6091<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> 6092<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher 6093</pre></td></tr> 6094 6095 6096<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> 6097<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 6098matches the given matcher. 6099 6100The associated declaration is: 6101- for type nodes, the declaration of the underlying type 6102- for CallExpr, the declaration of the callee 6103- for MemberExpr, the declaration of the referenced member 6104- for CXXConstructExpr, the declaration of the constructor 6105- for CXXNewExpr, the declaration of the operator new 6106- for ObjCIvarExpr, the declaration of the ivar 6107 6108For type nodes, hasDeclaration will generally match the declaration of the 6109sugared type. Given 6110 class X {}; 6111 typedef X Y; 6112 Y y; 6113in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6114typedefDecl. A common use case is to match the underlying, desugared type. 6115This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6116 varDecl(hasType(hasUnqualifiedDesugaredType( 6117 recordType(hasDeclaration(decl()))))) 6118In this matcher, the decl will match the CXXRecordDecl of class X. 6119 6120Usable 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>>, 6121 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>>, 6122 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>>, 6123 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>>, 6124 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>>, 6125 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>>, 6126 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6127</pre></td></tr> 6128 6129 6130<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> 6131<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 6132specific using shadow declaration. 6133 6134Given 6135 namespace a { void f() {} } 6136 using a::f; 6137 void g() { 6138 f(); // Matches this .. 6139 a::f(); // .. but not this. 6140 } 6141declRefExpr(throughUsingDecl(anything())) 6142 matches f() 6143</pre></td></tr> 6144 6145 6146<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> 6147<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 6148specified matcher. 6149 6150Example matches x in if(x) 6151 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 6152 bool x; 6153 if (x) {} 6154</pre></td></tr> 6155 6156 6157<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> 6158<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 6159 6160Note that this does not work for global declarations because the AST 6161breaks up multiple-declaration DeclStmt's into multiple single-declaration 6162DeclStmt's. 6163Example: Given non-global declarations 6164 int a, b = 0; 6165 int c; 6166 int d = 2, e; 6167declStmt(containsDeclaration( 6168 0, varDecl(hasInitializer(anything())))) 6169 matches only 'int d = 2, e;', and 6170declStmt(containsDeclaration(1, varDecl())) 6171 matches 'int a, b = 0' as well as 'int d = 2, e;' 6172 but 'int c;' is not matched. 6173</pre></td></tr> 6174 6175 6176<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> 6177<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 6178 6179Given 6180 int a, b; 6181 int c; 6182declStmt(hasSingleDecl(anything())) 6183 matches 'int c;' but not 'int a, b;'. 6184</pre></td></tr> 6185 6186 6187<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> 6188<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 6189the inner matcher. 6190 6191Given 6192 int x; 6193declaratorDecl(hasTypeLoc(loc(asString("int")))) 6194 matches int x 6195</pre></td></tr> 6196 6197 6198<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> 6199<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 6200Decl, matches InnerMatcher. 6201 6202Given 6203 namespace N { 6204 namespace M { 6205 class D {}; 6206 } 6207 } 6208 6209cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 6210declaration of class D. 6211</pre></td></tr> 6212 6213 6214<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> 6215<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type. 6216 6217Given 6218 decltype(1) a = 1; 6219 decltype(2.0) b = 2.0; 6220decltypeType(hasUnderlyingType(isInteger())) 6221 matches the type of "a" 6222 6223Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>> 6224</pre></td></tr> 6225 6226 6227<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> 6228<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr> 6229 6230 6231<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> 6232<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 6233switch statement or conditional operator. 6234 6235Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6236 if (true) {} 6237</pre></td></tr> 6238 6239 6240<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> 6241<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 6242matches InnerMatcher if the qualifier exists. 6243 6244Given 6245 namespace N { 6246 namespace M { 6247 class D {}; 6248 } 6249 } 6250 N::M::D d; 6251 6252elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 6253matches the type of the variable declaration of d. 6254</pre></td></tr> 6255 6256 6257<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> 6258<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 6259 6260Given 6261 namespace N { 6262 namespace M { 6263 class D {}; 6264 } 6265 } 6266 N::M::D d; 6267 6268elaboratedType(namesType(recordType( 6269hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 6270declaration of d. 6271</pre></td></tr> 6272 6273 6274<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> 6275<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 6276matches the given matcher. 6277 6278The associated declaration is: 6279- for type nodes, the declaration of the underlying type 6280- for CallExpr, the declaration of the callee 6281- for MemberExpr, the declaration of the referenced member 6282- for CXXConstructExpr, the declaration of the constructor 6283- for CXXNewExpr, the declaration of the operator new 6284- for ObjCIvarExpr, the declaration of the ivar 6285 6286For type nodes, hasDeclaration will generally match the declaration of the 6287sugared type. Given 6288 class X {}; 6289 typedef X Y; 6290 Y y; 6291in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6292typedefDecl. A common use case is to match the underlying, desugared type. 6293This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6294 varDecl(hasType(hasUnqualifiedDesugaredType( 6295 recordType(hasDeclaration(decl()))))) 6296In this matcher, the decl will match the CXXRecordDecl of class X. 6297 6298Usable 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>>, 6299 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>>, 6300 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>>, 6301 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>>, 6302 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>>, 6303 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>>, 6304 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6305</pre></td></tr> 6306 6307 6308<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> 6309<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 6310 6311(Note: Clang's AST refers to other conversions as "casts" too, and calls 6312actual casts "explicit" casts.) 6313</pre></td></tr> 6314 6315 6316<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> 6317<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value 6318declaration's type. 6319 6320In case of a value declaration (for example a variable declaration), 6321this resolves one layer of indirection. For example, in the value 6322declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6323X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6324declaration of x. 6325 6326Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6327 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6328 and friend class X (matcher = friendDecl(hasType("X")) 6329 class X {}; 6330 void y(X &x) { x; X z; } 6331 class Y { friend class X; }; 6332 6333Example matches class Derived 6334(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6335class Base {}; 6336class Derived : Base {}; 6337 6338Usable 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>>, 6339Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6340</pre></td></tr> 6341 6342 6343<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> 6344<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 6345matcher. 6346 6347Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6348 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6349 and U (matcher = typedefDecl(hasType(asString("int"))) 6350 and friend class X (matcher = friendDecl(hasType("X")) 6351 class X {}; 6352 void y(X &x) { x; X z; } 6353 typedef int U; 6354 class Y { friend class X; }; 6355</pre></td></tr> 6356 6357 6358<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> 6359<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 6360elidable constructor and other corresponding bookkeeping nodes. 6361 6362In C++17, elidable copy constructors are no longer being generated in the 6363AST as it is not permitted by the standard. They are, however, part of the 6364AST in C++14 and earlier. So, a matcher must abstract over these differences 6365to work in all language modes. This matcher skips elidable constructor-call 6366AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 6367various implicit nodes inside the constructor calls, all of which will not 6368appear in the C++17 AST. 6369 6370Given 6371 6372struct H {}; 6373H G(); 6374void f() { 6375 H D = G(); 6376} 6377 6378``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 6379matches ``H D = G()`` in C++11 through C++17 (and beyond). 6380</pre></td></tr> 6381 6382 6383<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> 6384<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 6385are stripped off. 6386 6387Parentheses and explicit casts are not discarded. 6388Given 6389 int arr[5]; 6390 int a = 0; 6391 char b = 0; 6392 const int c = a; 6393 int *d = arr; 6394 long e = (long) 0l; 6395The matchers 6396 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 6397 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 6398would match the declarations for a, b, c, and d, but not e. 6399While 6400 varDecl(hasInitializer(integerLiteral())) 6401 varDecl(hasInitializer(declRefExpr())) 6402only match the declarations for b, c, and d. 6403</pre></td></tr> 6404 6405 6406<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> 6407<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 6408nodes are stripped off. 6409 6410Parentheses and explicit casts are not discarded. 6411Given 6412 class C {}; 6413 C a = C(); 6414 C b; 6415 C c = b; 6416The matchers 6417 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 6418would match the declarations for a, b, and c. 6419While 6420 varDecl(hasInitializer(cxxConstructExpr())) 6421only match the declarations for b and c. 6422</pre></td></tr> 6423 6424 6425<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> 6426<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 6427casts are stripped off. 6428 6429Implicit and non-C Style casts are also discarded. 6430Given 6431 int a = 0; 6432 char b = (0); 6433 void* c = reinterpret_cast<char*>(0); 6434 char d = char(0); 6435The matcher 6436 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 6437would match the declarations for a, b, c, and d. 6438while 6439 varDecl(hasInitializer(integerLiteral())) 6440only match the declaration for a. 6441</pre></td></tr> 6442 6443 6444<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> 6445<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 6446parentheses are stripped off. 6447 6448Explicit casts are not discarded. 6449Given 6450 int arr[5]; 6451 int a = 0; 6452 char b = (0); 6453 const int c = a; 6454 int *d = (arr); 6455 long e = ((long) 0l); 6456The matchers 6457 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 6458 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 6459would match the declarations for a, b, c, and d, but not e. 6460while 6461 varDecl(hasInitializer(integerLiteral())) 6462 varDecl(hasInitializer(declRefExpr())) 6463would only match the declaration for a. 6464</pre></td></tr> 6465 6466 6467<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> 6468<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 6469 6470Given 6471 const char* str = ("my-string"); 6472The matcher 6473 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 6474would match the implicit cast resulting from the assignment. 6475</pre></td></tr> 6476 6477 6478<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> 6479<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 6480 6481Given 6482 class C { 6483 int a = 2; 6484 int b = 3; 6485 int c; 6486 }; 6487fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 6488 matches 'int a;' but not 'int b;'. 6489fieldDecl(hasInClassInitializer(anything())) 6490 matches 'int a;' and 'int b;' but not 'int c;'. 6491</pre></td></tr> 6492 6493 6494<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> 6495<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr> 6496 6497 6498<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> 6499<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 6500switch statement or conditional operator. 6501 6502Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6503 if (true) {} 6504</pre></td></tr> 6505 6506 6507<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> 6508<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 6509 6510Example: 6511 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 6512matches '++x' in 6513 for (x; x < N; ++x) { } 6514</pre></td></tr> 6515 6516 6517<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> 6518<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 6519 6520Example: 6521 forStmt(hasLoopInit(declStmt())) 6522matches 'int x = 0' in 6523 for (int x = 0; x < N; ++x) { } 6524</pre></td></tr> 6525 6526 6527<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> 6528<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 6529declaration's type. 6530 6531In case of a value declaration (for example a variable declaration), 6532this resolves one layer of indirection. For example, in the value 6533declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6534X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6535declaration of x. 6536 6537Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6538 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6539 and friend class X (matcher = friendDecl(hasType("X")) 6540 class X {}; 6541 void y(X &x) { x; X z; } 6542 class Y { friend class X; }; 6543 6544Example matches class Derived 6545(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6546class Base {}; 6547class Derived : Base {}; 6548 6549Usable 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>>, 6550Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6551</pre></td></tr> 6552 6553 6554<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> 6555<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 6556matcher. 6557 6558Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6559 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6560 and U (matcher = typedefDecl(hasType(asString("int"))) 6561 and friend class X (matcher = friendDecl(hasType("X")) 6562 class X {}; 6563 void y(X &x) { x; X z; } 6564 typedef int U; 6565 class Y { friend class X; }; 6566</pre></td></tr> 6567 6568 6569<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> 6570<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST. 6571Note that this matcher matches all the declarations of a function whose 6572body is present in the AST. 6573 6574Given 6575 void f(); 6576 void f() {} 6577 void g(); 6578hasAnyBody(functionDecl()) 6579 matches both 'void f();' 6580 and 'void f() {}' 6581with compoundStmt() 6582 matching '{}' 6583 but does not match 'void g();' 6584</pre></td></tr> 6585 6586 6587<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> 6588<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 6589block. 6590 6591Does not match the 'this' parameter of a method. 6592 6593Given 6594 class X { void f(int x, int y, int z) {} }; 6595cxxMethodDecl(hasAnyParameter(hasName("y"))) 6596 matches f(int x, int y, int z) {} 6597with hasAnyParameter(...) 6598 matching int y 6599 6600For ObjectiveC, given 6601 @interface I - (void) f:(int) y; @end 6602 6603the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 6604matches the declaration of method f with hasParameter 6605matching y. 6606 6607For blocks, given 6608 b = ^(int y) { printf("%d", y) }; 6609 6610the matcher blockDecl(hasAnyParameter(hasName("y"))) 6611matches the declaration of the block b with hasParameter 6612matching y. 6613</pre></td></tr> 6614 6615 6616<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> 6617<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6618functionDecl that have at least one TemplateArgument matching the given 6619InnerMatcher. 6620 6621Given 6622 template<typename T> class A {}; 6623 template<> class A<double> {}; 6624 A<int> a; 6625 6626 template<typename T> f() {}; 6627 void func() { f<int>(); }; 6628 6629classTemplateSpecializationDecl(hasAnyTemplateArgument( 6630 refersToType(asString("int")))) 6631 matches the specialization A<int> 6632 6633functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 6634 matches the specialization f<int> 6635</pre></td></tr> 6636 6637 6638<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> 6639<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr> 6640 6641 6642<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> 6643<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 6644declaration. 6645 6646Given 6647 template<bool b> 6648 struct S { 6649 S(int); // #1 6650 explicit S(double); // #2 6651 operator int(); // #3 6652 explicit operator bool(); // #4 6653 explicit(false) S(bool) // # 7 6654 explicit(true) S(char) // # 8 6655 explicit(b) S(S) // # 9 6656 }; 6657 S(int) -> S<true> // #5 6658 explicit S(double) -> S<false> // #6 6659cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 6660cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 6661cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 6662</pre></td></tr> 6663 6664 6665<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> 6666<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 6667declaration or a block. 6668 6669Given 6670 class X { void f(int x) {} }; 6671cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6672 matches f(int x) {} 6673with hasParameter(...) 6674 matching int x 6675 6676For ObjectiveC, given 6677 @interface I - (void) f:(int) y; @end 6678 6679the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6680matches the declaration of method f with hasParameter 6681matching y. 6682</pre></td></tr> 6683 6684 6685<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> 6686<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6687functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 6688 6689Given 6690 template<typename T, typename U> class A {}; 6691 A<bool, int> b; 6692 A<int, bool> c; 6693 6694 template<typename T> void f() {} 6695 void func() { f<int>(); }; 6696classTemplateSpecializationDecl(hasTemplateArgument( 6697 1, refersToType(asString("int")))) 6698 matches the specialization A<bool, int> 6699 6700functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 6701 matches the specialization f<int> 6702</pre></td></tr> 6703 6704 6705<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> 6706<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 6707 6708Given: 6709 class X { int f() { return 1; } }; 6710cxxMethodDecl(returns(asString("int"))) 6711 matches int f() { return 1; } 6712</pre></td></tr> 6713 6714 6715<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> 6716<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 6717switch statement or conditional operator. 6718 6719Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6720 if (true) {} 6721</pre></td></tr> 6722 6723 6724<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> 6725<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 6726 6727Given 6728 if (A* a = GetAPointer()) {} 6729hasConditionVariableStatement(...) 6730 matches 'A* a = GetAPointer()'. 6731</pre></td></tr> 6732 6733 6734<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> 6735<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 6736 6737Examples matches the if statement 6738 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 6739 if (false) false; else true; 6740</pre></td></tr> 6741 6742 6743<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> 6744<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 6745 6746Given: 6747 void foo() { 6748 if (int i = foobar(); i > 0) {} 6749 switch (int i = foobar(); i) {} 6750 for (auto& a = get_range(); auto& x : a) {} 6751 } 6752 void bar() { 6753 if (foobar() > 0) {} 6754 switch (foobar()) {} 6755 for (auto& x : get_range()) {} 6756 } 6757ifStmt(hasInitStatement(anything())) 6758 matches the if statement in foo but not in bar. 6759switchStmt(hasInitStatement(anything())) 6760 matches the switch statement in foo but not in bar. 6761cxxForRangeStmt(hasInitStatement(anything())) 6762 matches the range for statement in foo but not in bar. 6763</pre></td></tr> 6764 6765 6766<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> 6767<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 6768 6769Examples matches the if statement 6770 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 6771 if (false) true; else false; 6772</pre></td></tr> 6773 6774 6775<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> 6776<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 6777matcher. 6778 6779FIXME: Unit test this matcher 6780</pre></td></tr> 6781 6782 6783<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> 6784<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 6785 6786Example matches y. 6787 (matcher = initListExpr(hasInit(0, expr()))) 6788 int x{y}. 6789</pre></td></tr> 6790 6791 6792<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> 6793<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 6794(if expression have it). 6795</pre></td></tr> 6796 6797 6798<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> 6799<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 6800matches the given matcher. 6801 6802The associated declaration is: 6803- for type nodes, the declaration of the underlying type 6804- for CallExpr, the declaration of the callee 6805- for MemberExpr, the declaration of the referenced member 6806- for CXXConstructExpr, the declaration of the constructor 6807- for CXXNewExpr, the declaration of the operator new 6808- for ObjCIvarExpr, the declaration of the ivar 6809 6810For type nodes, hasDeclaration will generally match the declaration of the 6811sugared type. Given 6812 class X {}; 6813 typedef X Y; 6814 Y y; 6815in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6816typedefDecl. A common use case is to match the underlying, desugared type. 6817This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6818 varDecl(hasType(hasUnqualifiedDesugaredType( 6819 recordType(hasDeclaration(decl()))))) 6820In this matcher, the decl will match the CXXRecordDecl of class X. 6821 6822Usable 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>>, 6823 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>>, 6824 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>>, 6825 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>>, 6826 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>>, 6827 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>>, 6828 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6829</pre></td></tr> 6830 6831 6832<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> 6833<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 6834matches the given matcher. 6835 6836The associated declaration is: 6837- for type nodes, the declaration of the underlying type 6838- for CallExpr, the declaration of the callee 6839- for MemberExpr, the declaration of the referenced member 6840- for CXXConstructExpr, the declaration of the constructor 6841- for CXXNewExpr, the declaration of the operator new 6842- for ObjCIvarExpr, the declaration of the ivar 6843 6844For type nodes, hasDeclaration will generally match the declaration of the 6845sugared type. Given 6846 class X {}; 6847 typedef X Y; 6848 Y y; 6849in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6850typedefDecl. A common use case is to match the underlying, desugared type. 6851This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6852 varDecl(hasType(hasUnqualifiedDesugaredType( 6853 recordType(hasDeclaration(decl()))))) 6854In this matcher, the decl will match the CXXRecordDecl of class X. 6855 6856Usable 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>>, 6857 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>>, 6858 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>>, 6859 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>>, 6860 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>>, 6861 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>>, 6862 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6863</pre></td></tr> 6864 6865 6866<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> 6867<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression. 6868 6869Given 6870 struct foo { 6871 void bar() { 6872 auto f = [this](){}; 6873 } 6874 } 6875lambdaExpr(hasAnyCapture(cxxThisExpr())) 6876 matches [this](){}; 6877</pre></td></tr> 6878 6879 6880<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> 6881<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression. 6882 6883Given 6884 void foo() { 6885 int x; 6886 auto f = [x](){}; 6887 } 6888lambdaExpr(hasAnyCapture(anything())) 6889 matches [x](){}; 6890</pre></td></tr> 6891 6892 6893<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> 6894<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 6895matches the given matcher. 6896 6897The associated declaration is: 6898- for type nodes, the declaration of the underlying type 6899- for CallExpr, the declaration of the callee 6900- for MemberExpr, the declaration of the referenced member 6901- for CXXConstructExpr, the declaration of the constructor 6902- for CXXNewExpr, the declaration of the operator new 6903- for ObjCIvarExpr, the declaration of the ivar 6904 6905For type nodes, hasDeclaration will generally match the declaration of the 6906sugared type. Given 6907 class X {}; 6908 typedef X Y; 6909 Y y; 6910in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6911typedefDecl. A common use case is to match the underlying, desugared type. 6912This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6913 varDecl(hasType(hasUnqualifiedDesugaredType( 6914 recordType(hasDeclaration(decl()))))) 6915In this matcher, the decl will match the CXXRecordDecl of class X. 6916 6917Usable 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>>, 6918 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>>, 6919 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>>, 6920 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>>, 6921 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>>, 6922 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>>, 6923 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6924</pre></td></tr> 6925 6926 6927<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> 6928<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 6929given matcher. Implicit object expressions are included; that is, it matches 6930use of implicit `this`. 6931 6932Given 6933 struct X { 6934 int m; 6935 int f(X x) { x.m; return m; } 6936 }; 6937memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6938 matches `x.m`, but not `m`; however, 6939memberExpr(hasObjectExpression(hasType(pointsTo( 6940 cxxRecordDecl(hasName("X")))))) 6941 matches `m` (aka. `this->m`), but not `x.m`. 6942</pre></td></tr> 6943 6944 6945<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> 6946<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 6947given matcher. 6948 6949Given 6950 struct { int first, second; } first, second; 6951 int i(second.first); 6952 int j(first.second); 6953memberExpr(member(hasName("first"))) 6954 matches second.first 6955 but not first.second (because the member name there is "second"). 6956</pre></td></tr> 6957 6958 6959<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> 6960<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 6961pointee matches a given matcher. 6962 6963Given 6964 int *a; 6965 int const *b; 6966 float const *f; 6967pointerType(pointee(isConstQualified(), isInteger())) 6968 matches "int const *b" 6969 6970Usable 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>>, 6971 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>> 6972</pre></td></tr> 6973 6974 6975<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> 6976<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 6977matcher. 6978 6979Given 6980 namespace N { template<class T> void f(T t); } 6981 template <class T> void g() { using N::f; f(T()); } 6982unresolvedLookupExpr(hasAnyDeclaration( 6983 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 6984 matches the use of f in g() . 6985</pre></td></tr> 6986 6987 6988<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> 6989<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 6990 6991Given 6992 struct A { struct B { struct C {}; }; }; 6993 A::B::C c; 6994nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 6995 matches "A::" 6996</pre></td></tr> 6997 6998 6999<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('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> 7000<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 7001NestedNameSpecifier-matcher matches. 7002</pre></td></tr> 7003 7004 7005<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> 7006<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 7007given TypeLoc. 7008 7009Given 7010 struct A { struct B { struct C {}; }; }; 7011 A::B::C c; 7012nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 7013 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 7014 matches "A::" 7015</pre></td></tr> 7016 7017 7018<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> 7019<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 7020 7021Given 7022 struct A { struct B { struct C {}; }; }; 7023 A::B::C c; 7024nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 7025 matches "A::" 7026</pre></td></tr> 7027 7028 7029<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('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> 7030<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 7031given namespace matcher. 7032 7033Given 7034 namespace ns { struct A {}; } 7035 ns::A a; 7036nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 7037 matches "ns::" 7038</pre></td></tr> 7039 7040 7041<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> 7042<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 7043given QualType matcher without qualifiers. 7044 7045Given 7046 struct A { struct B { struct C {}; }; }; 7047 A::B::C c; 7048nestedNameSpecifier(specifiesType( 7049 hasDeclaration(cxxRecordDecl(hasName("A"))) 7050)) 7051 matches "A::" 7052</pre></td></tr> 7053 7054 7055<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> 7056<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 7057 7058Given 7059 7060 #pragma omp parallel 7061 #pragma omp parallel default(none) 7062 7063``ompExecutableDirective(hasAnyClause(anything()))`` matches 7064``omp parallel default(none)``. 7065</pre></td></tr> 7066 7067 7068<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> 7069<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 7070 7071Prerequisite: the executable directive must not be standalone directive. 7072If it is, it will never match. 7073 7074Given 7075 7076 #pragma omp parallel 7077 ; 7078 #pragma omp parallel 7079 {} 7080 7081``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 7082</pre></td></tr> 7083 7084 7085<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> 7086<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 7087matching Base, or Objective-C classes that directly or indirectly 7088subclass a class matching Base. 7089 7090Note that a class is not considered to be derived from itself. 7091 7092Example matches Y, Z, C (Base == hasName("X")) 7093 class X; 7094 class Y : public X {}; // directly derived 7095 class Z : public Y {}; // indirectly derived 7096 typedef X A; 7097 typedef A B; 7098 class C : public B {}; // derived from a typedef of X 7099 7100In the following example, Bar matches isDerivedFrom(hasName("X")): 7101 class Foo; 7102 typedef Foo X; 7103 class Bar : public Foo {}; // derived from a type that X is a typedef of 7104 7105In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 7106 @interface NSObject @end 7107 @interface Bar : NSObject @end 7108 7109Usable 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>> 7110</pre></td></tr> 7111 7112 7113<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> 7114<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 7115matching Base. 7116 7117Note that a class is not considered to be derived from itself. 7118 7119Example matches Y, C (Base == hasName("X")) 7120 class X; 7121 class Y : public X {}; // directly derived 7122 class Z : public Y {}; // indirectly derived 7123 typedef X A; 7124 typedef A B; 7125 class C : public B {}; // derived from a typedef of X 7126 7127In the following example, Bar matches isDerivedFrom(hasName("X")): 7128 class Foo; 7129 typedef Foo X; 7130 class Bar : public Foo {}; // derived from a type that X is a typedef of 7131</pre></td></tr> 7132 7133 7134<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> 7135<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 7136match Base. 7137</pre></td></tr> 7138 7139 7140<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> 7141<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 7142expression, or an ObjC-message-send expression. 7143 7144Given 7145 void x(int, int, int) { int y; x(1, y, 42); } 7146callExpr(hasAnyArgument(declRefExpr())) 7147 matches x(1, y, 42) 7148with hasAnyArgument(...) 7149 matching y 7150 7151For ObjectiveC, given 7152 @interface I - (void) f:(int) y; @end 7153 void foo(I *i) { [i f:12]; } 7154objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 7155 matches [i f:12] 7156</pre></td></tr> 7157 7158 7159<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> 7160<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 7161call expression. 7162 7163Example matches y in x(y) 7164 (matcher = callExpr(hasArgument(0, declRefExpr()))) 7165 void x(int) { int y; x(y); } 7166</pre></td></tr> 7167 7168 7169<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> 7170<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 7171and the inner matcher matches on that instance. 7172 7173For example the method call in 7174 NSString *x = @"hello"; 7175 [x containsString:@"h"]; 7176is matched by 7177objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 7178</pre></td></tr> 7179 7180 7181<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> 7182<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 7183 7184Example 7185matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 7186matches the [webView ...] message invocation. 7187 NSString *webViewJavaScript = ... 7188 UIWebView *webView = ... 7189 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 7190</pre></td></tr> 7191 7192 7193<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> 7194<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 7195block. 7196 7197Does not match the 'this' parameter of a method. 7198 7199Given 7200 class X { void f(int x, int y, int z) {} }; 7201cxxMethodDecl(hasAnyParameter(hasName("y"))) 7202 matches f(int x, int y, int z) {} 7203with hasAnyParameter(...) 7204 matching int y 7205 7206For ObjectiveC, given 7207 @interface I - (void) f:(int) y; @end 7208 7209the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 7210matches the declaration of method f with hasParameter 7211matching y. 7212 7213For blocks, given 7214 b = ^(int y) { printf("%d", y) }; 7215 7216the matcher blockDecl(hasAnyParameter(hasName("y"))) 7217matches the declaration of the block b with hasParameter 7218matching y. 7219</pre></td></tr> 7220 7221 7222<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> 7223<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 7224declaration or a block. 7225 7226Given 7227 class X { void f(int x) {} }; 7228cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 7229 matches f(int x) {} 7230with hasParameter(...) 7231 matching int x 7232 7233For ObjectiveC, given 7234 @interface I - (void) f:(int) y; @end 7235 7236the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 7237matches the declaration of method f with hasParameter 7238matching y. 7239</pre></td></tr> 7240 7241 7242<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> 7243<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 7244or opaque value's source expression matches the given matcher. 7245 7246Example 1: matches "a string" 7247(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 7248class URL { URL(string); }; 7249URL url = "a string"; 7250 7251Example 2: matches 'b' (matcher = 7252opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 7253int a = b ?: 1; 7254</pre></td></tr> 7255 7256 7257<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> 7258<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 7259overloads matches the given matcher. 7260 7261Given 7262 template <typename T> void foo(T); 7263 template <typename T> void bar(T); 7264 template <typename T> void baz(T t) { 7265 foo(t); 7266 bar(t); 7267 } 7268unresolvedLookupExpr(hasAnyDeclaration( 7269 functionTemplateDecl(hasName("foo")))) 7270 matches foo in foo(t); but not bar in bar(t); 7271</pre></td></tr> 7272 7273 7274<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> 7275<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 7276 7277Given 7278 int (*ptr_to_array)[4]; 7279 int (*ptr_to_func)(int); 7280 7281varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 7282ptr_to_func but not ptr_to_array. 7283 7284Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 7285</pre></td></tr> 7286 7287 7288<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> 7289<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 7290pointee matches a given matcher. 7291 7292Given 7293 int *a; 7294 int const *b; 7295 float const *f; 7296pointerType(pointee(isConstQualified(), isInteger())) 7297 matches "int const *b" 7298 7299Usable 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>>, 7300 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>> 7301</pre></td></tr> 7302 7303 7304<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('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> 7305<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 7306 7307Given: 7308 typedef int &int_ref; 7309 int a; 7310 int_ref b = a; 7311 7312varDecl(hasType(qualType(referenceType()))))) will not match the 7313declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 7314</pre></td></tr> 7315 7316 7317<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> 7318<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 7319matches the given matcher. 7320 7321The associated declaration is: 7322- for type nodes, the declaration of the underlying type 7323- for CallExpr, the declaration of the callee 7324- for MemberExpr, the declaration of the referenced member 7325- for CXXConstructExpr, the declaration of the constructor 7326- for CXXNewExpr, the declaration of the operator new 7327- for ObjCIvarExpr, the declaration of the ivar 7328 7329For type nodes, hasDeclaration will generally match the declaration of the 7330sugared type. Given 7331 class X {}; 7332 typedef X Y; 7333 Y y; 7334in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7335typedefDecl. A common use case is to match the underlying, desugared type. 7336This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7337 varDecl(hasType(hasUnqualifiedDesugaredType( 7338 recordType(hasDeclaration(decl()))))) 7339In this matcher, the decl will match the CXXRecordDecl of class X. 7340 7341Usable 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>>, 7342 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>>, 7343 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>>, 7344 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>>, 7345 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>>, 7346 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>>, 7347 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7348</pre></td></tr> 7349 7350 7351<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> 7352<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 7353 7354Given 7355 void (*fp)(void); 7356The matcher 7357 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 7358would match the declaration for fp. 7359</pre></td></tr> 7360 7361 7362<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('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> 7363<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 7364</pre></td></tr> 7365 7366 7367<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> 7368<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 7369matches the specified matcher. 7370 7371Example matches y->x() 7372 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 7373 cxxRecordDecl(hasName("Y"))))))) 7374 class Y { public: void x(); }; 7375 void z() { Y *y; y->x(); } 7376</pre></td></tr> 7377 7378 7379<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> 7380<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 7381</pre></td></tr> 7382 7383 7384<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> 7385<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 7386type matches the specified matcher. 7387 7388Example matches X &x and const X &y 7389 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 7390 class X { 7391 void a(X b) { 7392 X &x = b; 7393 const X &y = b; 7394 } 7395 }; 7396</pre></td></tr> 7397 7398 7399<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> 7400<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 7401matches the given matcher. 7402 7403The associated declaration is: 7404- for type nodes, the declaration of the underlying type 7405- for CallExpr, the declaration of the callee 7406- for MemberExpr, the declaration of the referenced member 7407- for CXXConstructExpr, the declaration of the constructor 7408- for CXXNewExpr, the declaration of the operator new 7409- for ObjCIvarExpr, the declaration of the ivar 7410 7411For type nodes, hasDeclaration will generally match the declaration of the 7412sugared type. Given 7413 class X {}; 7414 typedef X Y; 7415 Y y; 7416in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7417typedefDecl. A common use case is to match the underlying, desugared type. 7418This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7419 varDecl(hasType(hasUnqualifiedDesugaredType( 7420 recordType(hasDeclaration(decl()))))) 7421In this matcher, the decl will match the CXXRecordDecl of class X. 7422 7423Usable 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>>, 7424 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>>, 7425 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>>, 7426 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>>, 7427 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>>, 7428 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>>, 7429 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7430</pre></td></tr> 7431 7432 7433<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> 7434<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 7435pointee matches a given matcher. 7436 7437Given 7438 int *a; 7439 int const *b; 7440 float const *f; 7441pointerType(pointee(isConstQualified(), isInteger())) 7442 matches "int const *b" 7443 7444Usable 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>>, 7445 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>> 7446</pre></td></tr> 7447 7448 7449<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> 7450<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 7451 7452Given 7453 return a + b; 7454hasReturnValue(binaryOperator()) 7455 matches 'return a + b' 7456with binaryOperator() 7457 matching 'a + b' 7458</pre></td></tr> 7459 7460 7461<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> 7462<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 7463a given matcher. Also matches StmtExprs that have CompoundStmt as children. 7464 7465Given 7466 { {}; 1+2; } 7467hasAnySubstatement(compoundStmt()) 7468 matches '{ {}; 1+2; }' 7469with compoundStmt() 7470 matching '{}' 7471</pre></td></tr> 7472 7473 7474<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> 7475<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 7476alignof. 7477</pre></td></tr> 7478 7479 7480<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> 7481<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to 7482 7483Given: 7484F& operator=(const F& o) { 7485 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 7486 return *this; 7487} 7488returnStmt(forFunction(hasName("operator="))) 7489 matches 'return *this' 7490 but does not match 'return v > 0' 7491</pre></td></tr> 7492 7493 7494<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> 7495<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 7496sizeof. 7497</pre></td></tr> 7498 7499 7500<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> 7501<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 7502type that matches the provided matcher. 7503 7504Given 7505 template <typename T> 7506 double F(T t); 7507 int i; 7508 double j = F(i); 7509 7510substTemplateTypeParmType(hasReplacementType(type())) matches int 7511</pre></td></tr> 7512 7513 7514<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> 7515<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 7516statement. This matcher may produce multiple matches. 7517 7518Given 7519 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 7520switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 7521 matches four times, with "c" binding each of "case 1:", "case 2:", 7522"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 7523"switch (1)", "switch (2)" and "switch (2)". 7524</pre></td></tr> 7525 7526 7527<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> 7528<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 7529switch statement or conditional operator. 7530 7531Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7532 if (true) {} 7533</pre></td></tr> 7534 7535 7536<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> 7537<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 7538 7539Given: 7540 void foo() { 7541 if (int i = foobar(); i > 0) {} 7542 switch (int i = foobar(); i) {} 7543 for (auto& a = get_range(); auto& x : a) {} 7544 } 7545 void bar() { 7546 if (foobar() > 0) {} 7547 switch (foobar()) {} 7548 for (auto& x : get_range()) {} 7549 } 7550ifStmt(hasInitStatement(anything())) 7551 matches the if statement in foo but not in bar. 7552switchStmt(hasInitStatement(anything())) 7553 matches the switch statement in foo but not in bar. 7554cxxForRangeStmt(hasInitStatement(anything())) 7555 matches the range for statement in foo but not in bar. 7556</pre></td></tr> 7557 7558 7559<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> 7560<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 7561matches the given matcher. 7562 7563The associated declaration is: 7564- for type nodes, the declaration of the underlying type 7565- for CallExpr, the declaration of the callee 7566- for MemberExpr, the declaration of the referenced member 7567- for CXXConstructExpr, the declaration of the constructor 7568- for CXXNewExpr, the declaration of the operator new 7569- for ObjCIvarExpr, the declaration of the ivar 7570 7571For type nodes, hasDeclaration will generally match the declaration of the 7572sugared type. Given 7573 class X {}; 7574 typedef X Y; 7575 Y y; 7576in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7577typedefDecl. A common use case is to match the underlying, desugared type. 7578This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7579 varDecl(hasType(hasUnqualifiedDesugaredType( 7580 recordType(hasDeclaration(decl()))))) 7581In this matcher, the decl will match the CXXRecordDecl of class X. 7582 7583Usable 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>>, 7584 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>>, 7585 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>>, 7586 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>>, 7587 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>>, 7588 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>>, 7589 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7590</pre></td></tr> 7591 7592 7593<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> 7594<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 7595 7596Given 7597 struct B { int next; }; 7598 template<int(B::*next_ptr)> struct A {}; 7599 A<&B::next> a; 7600templateSpecializationType(hasAnyTemplateArgument( 7601 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 7602 matches the specialization A<&B::next> with fieldDecl(...) matching 7603 B::next 7604</pre></td></tr> 7605 7606 7607<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> 7608<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 7609declaration. 7610 7611Given 7612 struct B { int next; }; 7613 template<int(B::*next_ptr)> struct A {}; 7614 A<&B::next> a; 7615classTemplateSpecializationDecl(hasAnyTemplateArgument( 7616 refersToDeclaration(fieldDecl(hasName("next"))))) 7617 matches the specialization A<&B::next> with fieldDecl(...) matching 7618 B::next 7619</pre></td></tr> 7620 7621 7622<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> 7623<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type. 7624 7625Given 7626 template<int T> struct C {}; 7627 C<42> c; 7628classTemplateSpecializationDecl( 7629 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 7630 matches the implicit instantiation of C in C<42>. 7631</pre></td></tr> 7632 7633 7634<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> 7635<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 7636 7637Given 7638 template<template <typename> class S> class X {}; 7639 template<typename T> class Y {}; 7640 X<Y> xi; 7641classTemplateSpecializationDecl(hasAnyTemplateArgument( 7642 refersToTemplate(templateName()))) 7643 matches the specialization X<Y> 7644</pre></td></tr> 7645 7646 7647<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> 7648<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 7649 7650Given 7651 struct X {}; 7652 template<typename T> struct A {}; 7653 A<X> a; 7654classTemplateSpecializationDecl(hasAnyTemplateArgument( 7655 refersToType(class(hasName("X"))))) 7656 matches the specialization A<X> 7657</pre></td></tr> 7658 7659 7660<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> 7661<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7662functionDecl that have at least one TemplateArgument matching the given 7663InnerMatcher. 7664 7665Given 7666 template<typename T> class A {}; 7667 template<> class A<double> {}; 7668 A<int> a; 7669 7670 template<typename T> f() {}; 7671 void func() { f<int>(); }; 7672 7673classTemplateSpecializationDecl(hasAnyTemplateArgument( 7674 refersToType(asString("int")))) 7675 matches the specialization A<int> 7676 7677functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7678 matches the specialization f<int> 7679</pre></td></tr> 7680 7681 7682<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> 7683<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 7684matches the given matcher. 7685 7686The associated declaration is: 7687- for type nodes, the declaration of the underlying type 7688- for CallExpr, the declaration of the callee 7689- for MemberExpr, the declaration of the referenced member 7690- for CXXConstructExpr, the declaration of the constructor 7691- for CXXNewExpr, the declaration of the operator new 7692- for ObjCIvarExpr, the declaration of the ivar 7693 7694For type nodes, hasDeclaration will generally match the declaration of the 7695sugared type. Given 7696 class X {}; 7697 typedef X Y; 7698 Y y; 7699in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7700typedefDecl. A common use case is to match the underlying, desugared type. 7701This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7702 varDecl(hasType(hasUnqualifiedDesugaredType( 7703 recordType(hasDeclaration(decl()))))) 7704In this matcher, the decl will match the CXXRecordDecl of class X. 7705 7706Usable 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>>, 7707 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>>, 7708 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>>, 7709 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>>, 7710 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>>, 7711 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>>, 7712 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7713</pre></td></tr> 7714 7715 7716<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> 7717<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7718functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7719 7720Given 7721 template<typename T, typename U> class A {}; 7722 A<bool, int> b; 7723 A<int, bool> c; 7724 7725 template<typename T> void f() {} 7726 void func() { f<int>(); }; 7727classTemplateSpecializationDecl(hasTemplateArgument( 7728 1, refersToType(asString("int")))) 7729 matches the specialization A<bool, int> 7730 7731functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7732 matches the specialization f<int> 7733</pre></td></tr> 7734 7735 7736<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> 7737<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 7738matches the given matcher. 7739 7740The associated declaration is: 7741- for type nodes, the declaration of the underlying type 7742- for CallExpr, the declaration of the callee 7743- for MemberExpr, the declaration of the referenced member 7744- for CXXConstructExpr, the declaration of the constructor 7745- for CXXNewExpr, the declaration of the operator new 7746- for ObjCIvarExpr, the declaration of the ivar 7747 7748For type nodes, hasDeclaration will generally match the declaration of the 7749sugared type. Given 7750 class X {}; 7751 typedef X Y; 7752 Y y; 7753in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7754typedefDecl. A common use case is to match the underlying, desugared type. 7755This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7756 varDecl(hasType(hasUnqualifiedDesugaredType( 7757 recordType(hasDeclaration(decl()))))) 7758In this matcher, the decl will match the CXXRecordDecl of class X. 7759 7760Usable 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>>, 7761 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>>, 7762 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>>, 7763 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>>, 7764 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>>, 7765 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>>, 7766 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7767</pre></td></tr> 7768 7769 7770<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> 7771<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 7772QualType-matcher matches. 7773</pre></td></tr> 7774 7775 7776<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> 7777<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 7778matcher. 7779 7780Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7781 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7782 and U (matcher = typedefDecl(hasType(asString("int"))) 7783 and friend class X (matcher = friendDecl(hasType("X")) 7784 class X {}; 7785 void y(X &x) { x; X z; } 7786 typedef int U; 7787 class Y { friend class X; }; 7788</pre></td></tr> 7789 7790 7791<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> 7792<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 7793matches the given matcher. 7794 7795The associated declaration is: 7796- for type nodes, the declaration of the underlying type 7797- for CallExpr, the declaration of the callee 7798- for MemberExpr, the declaration of the referenced member 7799- for CXXConstructExpr, the declaration of the constructor 7800- for CXXNewExpr, the declaration of the operator new 7801- for ObjCIvarExpr, the declaration of the ivar 7802 7803For type nodes, hasDeclaration will generally match the declaration of the 7804sugared type. Given 7805 class X {}; 7806 typedef X Y; 7807 Y y; 7808in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7809typedefDecl. A common use case is to match the underlying, desugared type. 7810This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7811 varDecl(hasType(hasUnqualifiedDesugaredType( 7812 recordType(hasDeclaration(decl()))))) 7813In this matcher, the decl will match the CXXRecordDecl of class X. 7814 7815Usable 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>>, 7816 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>>, 7817 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>>, 7818 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>>, 7819 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>>, 7820 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>>, 7821 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7822</pre></td></tr> 7823 7824 7825<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> 7826<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 7827type of the matched node. 7828 7829For example, in: 7830 class A {}; 7831 using B = A; 7832The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 7833both B and A. 7834</pre></td></tr> 7835 7836 7837<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> 7838<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 7839 7840Given 7841 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 7842unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 7843 matches sizeof(a) and alignof(c) 7844</pre></td></tr> 7845 7846 7847<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> 7848<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 7849 7850Example matches true (matcher = hasUnaryOperand( 7851 cxxBoolLiteral(equals(true)))) 7852 !true 7853</pre></td></tr> 7854 7855 7856<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> 7857<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 7858given matcher. Implicit object expressions are included; that is, it matches 7859use of implicit `this`. 7860 7861Given 7862 struct X { 7863 int m; 7864 int f(X x) { x.m; return m; } 7865 }; 7866memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 7867 matches `x.m`, but not `m`; however, 7868memberExpr(hasObjectExpression(hasType(pointsTo( 7869 cxxRecordDecl(hasName("X")))))) 7870 matches `m` (aka. `this->m`), but not `x.m`. 7871</pre></td></tr> 7872 7873 7874<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> 7875<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 7876matches the given matcher. 7877 7878The associated declaration is: 7879- for type nodes, the declaration of the underlying type 7880- for CallExpr, the declaration of the callee 7881- for MemberExpr, the declaration of the referenced member 7882- for CXXConstructExpr, the declaration of the constructor 7883- for CXXNewExpr, the declaration of the operator new 7884- for ObjCIvarExpr, the declaration of the ivar 7885 7886For type nodes, hasDeclaration will generally match the declaration of the 7887sugared type. Given 7888 class X {}; 7889 typedef X Y; 7890 Y y; 7891in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7892typedefDecl. A common use case is to match the underlying, desugared type. 7893This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7894 varDecl(hasType(hasUnqualifiedDesugaredType( 7895 recordType(hasDeclaration(decl()))))) 7896In this matcher, the decl will match the CXXRecordDecl of class X. 7897 7898Usable 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>>, 7899 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>>, 7900 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>>, 7901 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>>, 7902 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>>, 7903 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>>, 7904 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7905</pre></td></tr> 7906 7907 7908<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> 7909<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 7910 7911Given 7912 namespace X { void b(); } 7913 using X::b; 7914usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 7915 matches using X::b </pre></td></tr> 7916 7917 7918<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> 7919<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 7920matched by the given matcher. 7921 7922Given 7923 namespace X { int a; void b(); } 7924 using X::a; 7925 using X::b; 7926usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 7927 matches using X::b but not using X::a </pre></td></tr> 7928 7929 7930<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> 7931<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 7932declaration's type. 7933 7934In case of a value declaration (for example a variable declaration), 7935this resolves one layer of indirection. For example, in the value 7936declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7937X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7938declaration of x. 7939 7940Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7941 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7942 and friend class X (matcher = friendDecl(hasType("X")) 7943 class X {}; 7944 void y(X &x) { x; X z; } 7945 class Y { friend class X; }; 7946 7947Example matches class Derived 7948(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7949class Base {}; 7950class Derived : Base {}; 7951 7952Usable 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>>, 7953Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7954</pre></td></tr> 7955 7956 7957<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> 7958<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 7959matcher. 7960 7961Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7962 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7963 and U (matcher = typedefDecl(hasType(asString("int"))) 7964 and friend class X (matcher = friendDecl(hasType("X")) 7965 class X {}; 7966 void y(X &x) { x; X z; } 7967 typedef int U; 7968 class Y { friend class X; }; 7969</pre></td></tr> 7970 7971 7972<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> 7973<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 7974that matches the given matcher. 7975 7976Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 7977 bool y() { return true; } 7978 bool x = y(); 7979</pre></td></tr> 7980 7981 7982<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> 7983<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 7984expression. 7985 7986Given 7987 void f(int b) { 7988 int a[b]; 7989 } 7990variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 7991 varDecl(hasName("b"))))))) 7992 matches "int a[b]" 7993</pre></td></tr> 7994 7995 7996<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> 7997<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr> 7998 7999 8000<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> 8001<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 8002switch statement or conditional operator. 8003 8004Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8005 if (true) {} 8006</pre></td></tr> 8007 8008<!--END_TRAVERSAL_MATCHERS --> 8009</table> 8010 8011</div> 8012</body> 8013</html> 8014 8015 8016