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