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"> 9 td { 10 padding: .33em; 11 } 12 td.doc { 13 display: none; 14 border-bottom: 1px solid black; 15 } 16 td.name:hover { 17 color: blue; 18 cursor: pointer; 19 } 20 </style> 21 <script type="text/javascript"> 22 function 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 41 by category and node type they match. You can click on matcher names to show the 42 matcher'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. 53 Note that if a matcher can match multiple node types, it will it will appear 54 multiple times. This means that by searching for Matcher<Stmt> you can 55 find 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 58 are 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 61 them into matcher expressions. You will usually want to form matcher expressions 62 that read like english sentences by alternating between node matchers and 63 narrowing or traversal matchers, like this: 64 <pre> 65 recordDecl(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 77 of node that is expected. Every match expression starts with a node matcher, 78 which can then be further refined with a narrowing or traversal matcher. All 79 traversal matchers take node matchers as their arguments.</p> 80 81 <p>For convenience, all node matchers take an arbitrary number of arguments 82 and implicitly act as allOf matchers.</p> 83 84 <p>Node matchers are the only matchers that support the bind("id") call to 85 bind the matched node to the given string, to be later retrieved from the 86 match callback.</p> 87 88 <p>It is important to remember that the arguments to node matchers are 89 predicates on the same node, just with additional information about the type. 90 This is often useful to make matcher expression more readable by inlining bind 91 calls 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. 95 recordDecl(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="http://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="http://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 106 Examples 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="http://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="http://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 117 Given 118 class C { 119 public: 120 int a; 121 }; 122 accessSpecDecl() 123 matches 'public:' 124 </pre></td></tr> 125 126 127 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>>...</td></tr> 128 <tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations. 129 130 Example matches Z 131 template<class T> class Z {}; 132 </pre></td></tr> 133 134 135 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>...</td></tr> 136 <tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations. 137 138 Given 139 template<typename T> class A {}; 140 template<> class A<double> {}; 141 A<int> a; 142 classTemplateSpecializationDecl() 143 matches the specializations A<int> and A<double> 144 </pre></td></tr> 145 146 147 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>>...</td></tr> 148 <tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. 149 150 Example matches Foo::Foo() and Foo::Foo(int) 151 class Foo { 152 public: 153 Foo(); 154 Foo(int); 155 int DoSomething(); 156 }; 157 </pre></td></tr> 158 159 160 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>>...</td></tr> 161 <tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations. 162 163 Example matches the operator. 164 class X { operator int() const; }; 165 </pre></td></tr> 166 167 168 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>>...</td></tr> 169 <tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations. 170 171 Example matches Foo::~Foo() 172 class Foo { 173 public: 174 virtual ~Foo(); 175 }; 176 </pre></td></tr> 177 178 179 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>...</td></tr> 180 <tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations. 181 182 Example matches y 183 class X { void y(); }; 184 </pre></td></tr> 185 186 187 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>...</td></tr> 188 <tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations. 189 190 Example matches X, Z 191 class X; 192 template<class T> class Z {}; 193 </pre></td></tr> 194 195 196 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>...</td></tr> 197 <tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 198 199 Examples matches X, C, and the friend declaration inside C; 200 void X(); 201 class C { 202 friend X; 203 }; 204 </pre></td></tr> 205 206 207 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>...</td></tr> 208 <tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 209 and non-type template parameter declarations). 210 211 Given 212 class X { int y; }; 213 declaratorDecl() 214 matches int y. 215 </pre></td></tr> 216 217 218 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>>...</td></tr> 219 <tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 220 221 Example matches A, B, C 222 enum X { 223 A, B, C 224 }; 225 </pre></td></tr> 226 227 228 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>>...</td></tr> 229 <tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 230 231 Example matches X 232 enum X { 233 A, B, C 234 }; 235 </pre></td></tr> 236 237 238 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>>...</td></tr> 239 <tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 240 241 Given 242 class X { int m; }; 243 fieldDecl() 244 matches 'm'. 245 </pre></td></tr> 246 247 248 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>...</td></tr> 249 <tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 250 251 Given 252 class X { friend void foo(); }; 253 friendDecl() 254 matches 'friend void foo()'. 255 </pre></td></tr> 256 257 258 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>...</td></tr> 259 <tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 260 261 Example matches f 262 void f(); 263 </pre></td></tr> 264 265 266 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>>...</td></tr> 267 <tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 268 269 Example matches f 270 template<class T> void f(T t) {} 271 </pre></td></tr> 272 273 274 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>>...</td></tr> 275 <tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification. 276 277 Given 278 extern "C" {} 279 linkageSpecDecl() 280 matches "extern "C" {}" 281 </pre></td></tr> 282 283 284 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>>...</td></tr> 285 <tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 286 287 Example matches X, S, the anonymous union type, i, and U; 288 typedef int X; 289 struct S { 290 union { 291 int i; 292 } U; 293 }; 294 </pre></td></tr> 295 296 297 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>>...</td></tr> 298 <tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias. 299 300 Given 301 namespace test {} 302 namespace alias = ::test; 303 namespaceAliasDecl() 304 matches "namespace alias" but not "namespace test" 305 </pre></td></tr> 306 307 308 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>>...</td></tr> 309 <tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 310 311 Given 312 namespace {} 313 namespace test {} 314 namespaceDecl() 315 matches "namespace {}" and "namespace test {}" 316 </pre></td></tr> 317 318 319 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>>...</td></tr> 320 <tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations. 321 322 Given 323 template <typename T, int N> struct C {}; 324 nonTypeTemplateParmDecl() 325 matches 'N', but not 'T'. 326 </pre></td></tr> 327 328 329 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>...</td></tr> 330 <tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 331 332 Example matches Foo 333 @interface Foo 334 @end 335 </pre></td></tr> 336 337 338 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>>...</td></tr> 339 <tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 340 341 Given 342 void f(int x); 343 parmVarDecl() 344 matches int x. 345 </pre></td></tr> 346 347 348 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>>...</td></tr> 349 <tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 350 351 Example matches X, Z, U, and S 352 class X; 353 template<class T> class Z {}; 354 struct S {}; 355 union U {}; 356 </pre></td></tr> 357 358 359 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>>...</td></tr> 360 <tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 361 362 Example: 363 staticAssertExpr() 364 matches 365 static_assert(sizeof(S) == sizeof(int)) 366 in 367 struct S { 368 int x; 369 }; 370 static_assert(sizeof(S) == sizeof(int)); 371 </pre></td></tr> 372 373 374 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>>...</td></tr> 375 <tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 376 377 Given 378 template <typename T, int N> struct C {}; 379 templateTypeParmDecl() 380 matches 'T', but not 'N'. 381 </pre></td></tr> 382 383 384 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>>...</td></tr> 385 <tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 386 387 Given 388 int X; 389 namespace NS { 390 int Y; 391 } namespace NS 392 decl(hasDeclContext(translationUnitDecl())) 393 matches "int X", but not "int Y". 394 </pre></td></tr> 395 396 397 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>>...</td></tr> 398 <tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 399 400 Given 401 typedef int X; 402 typedefDecl() 403 matches "typedef int X" 404 </pre></td></tr> 405 406 407 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>>...</td></tr> 408 <tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 409 typename. 410 411 Given 412 template <typename T> 413 struct Base { typedef T Foo; }; 414 415 template<typename T> 416 struct S : private Base<T> { 417 using typename Base<T>::Foo; 418 }; 419 unresolvedUsingTypenameDecl() 420 matches using Base<T>::Foo </pre></td></tr> 421 422 423 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>>...</td></tr> 424 <tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 425 426 Given 427 template<typename X> 428 class C : private X { 429 using X::x; 430 }; 431 unresolvedUsingValueDecl() 432 matches using X::x </pre></td></tr> 433 434 435 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>>...</td></tr> 436 <tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 437 438 Given 439 namespace X { int x; } 440 using X::x; 441 usingDecl() 442 matches using X::x </pre></td></tr> 443 444 445 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>>...</td></tr> 446 <tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 447 448 Given 449 namespace X { int x; } 450 using namespace X; 451 usingDirectiveDecl() 452 matches using namespace X </pre></td></tr> 453 454 455 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>...</td></tr> 456 <tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 457 458 Example matches A, B, C and F 459 enum X { A, B, C }; 460 void F(); 461 </pre></td></tr> 462 463 464 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>...</td></tr> 465 <tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 466 467 Note: this does not match declarations of member variables, which are 468 "field" declarations in Clang parlance. 469 470 Example matches a 471 int a; 472 </pre></td></tr> 473 474 475 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>>...</td></tr> 476 <tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 477 </pre></td></tr> 478 479 480 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>>...</td></tr> 481 <tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 482 483 Given 484 namespace ns { 485 struct A { static void f(); }; 486 void A::f() {} 487 void g() { A::f(); } 488 } 489 ns::A a; 490 nestedNameSpecifier() 491 matches "ns::" and both "A::" 492 </pre></td></tr> 493 494 495 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>...</td></tr> 496 <tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 497 </pre></td></tr> 498 499 500 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>>...</td></tr> 501 <tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 502 503 Given 504 int i = a[1]; 505 arraySubscriptExpr() 506 matches "a[1]" 507 </pre></td></tr> 508 509 510 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>>...</td></tr> 511 <tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 512 513 int i = 100; 514 __asm("mov al, 2"); 515 asmStmt() 516 matches '__asm("mov al, 2")' 517 </pre></td></tr> 518 519 520 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>>...</td></tr> 521 <tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 522 523 Example matches a || b 524 !(a || b) 525 </pre></td></tr> 526 527 528 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>>...</td></tr> 529 <tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 530 531 Given 532 while (true) { break; } 533 breakStmt() 534 matches 'break' 535 </pre></td></tr> 536 537 538 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>>...</td></tr> 539 <tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 540 541 Example: Matches (int*) 2.2f in 542 int i = (int) 2.2f; 543 </pre></td></tr> 544 545 546 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>...</td></tr> 547 <tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 548 549 Example matches x.y() and y() 550 X x; 551 x.y(); 552 y(); 553 </pre></td></tr> 554 555 556 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>>...</td></tr> 557 <tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 558 559 Given 560 switch(a) { case 42: break; default: break; } 561 caseStmt() 562 matches 'case 42: break;'. 563 </pre></td></tr> 564 565 566 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>>...</td></tr> 567 <tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 568 569 Example: castExpr() matches each of the following: 570 (int) 3; 571 const_cast<Expr *>(SubExpr); 572 char c = 0; 573 but does not match 574 int i = (0); 575 int k = 0; 576 </pre></td></tr> 577 578 579 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>...</td></tr> 580 <tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 581 582 Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 583 though. 584 585 Example matches 'a', L'a' 586 char ch = 'a'; wchar_t chw = L'a'; 587 </pre></td></tr> 588 589 590 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>...</td></tr> 591 <tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 592 593 Example match: {1}, (1, 2) 594 int array[4] = {1}; vector int myvec = (vector int)(1, 2); 595 </pre></td></tr> 596 597 598 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>>...</td></tr> 599 <tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 600 601 Example matches '{}' and '{{}}'in 'for (;;) {{}}' 602 for (;;) {{}} 603 </pre></td></tr> 604 605 606 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>>...</td></tr> 607 <tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 608 609 Example matches a ? b : c 610 (a ? b : c) + 42 611 </pre></td></tr> 612 613 614 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>>...</td></tr> 615 <tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 616 617 Given 618 while (true) { continue; } 619 continueStmt() 620 matches 'continue' 621 </pre></td></tr> 622 623 624 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>>...</td></tr> 625 <tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 626 627 Example matches, 628 kernel<<<i,j>>>(); 629 </pre></td></tr> 630 631 632 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>>...</td></tr> 633 <tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 634 635 Example matches FunctionTakesString(GetStringByValue()) 636 (matcher = cxxBindTemporaryExpr()) 637 FunctionTakesString(GetStringByValue()); 638 FunctionTakesStringByPointer(GetStringPointer()); 639 </pre></td></tr> 640 641 642 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>...</td></tr> 643 <tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 644 645 Example matches true 646 true 647 </pre></td></tr> 648 649 650 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>>...</td></tr> 651 <tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 652 653 try {} catch(int i) {} 654 cxxCatchStmt() 655 matches 'catch(int i)' 656 </pre></td></tr> 657 658 659 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>>...</td></tr> 660 <tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 661 662 Example: Matches const_cast<int*>(&r) in 663 int n = 42; 664 const int &r(n); 665 int* p = const_cast<int*>(&r); 666 </pre></td></tr> 667 668 669 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>...</td></tr> 670 <tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 671 672 Example matches string(ptr, n) and ptr within arguments of f 673 (matcher = cxxConstructExpr()) 674 void f(const string &a, const string &b); 675 char *ptr; 676 int n; 677 f(string(ptr, n), ptr); 678 </pre></td></tr> 679 680 681 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>>...</td></tr> 682 <tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 683 684 Example matches the CXXDefaultArgExpr placeholder inserted for the 685 default value of the second parameter in the call expression f(42) 686 (matcher = cxxDefaultArgExpr()) 687 void f(int x, int y = 0); 688 f(42); 689 </pre></td></tr> 690 691 692 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>>...</td></tr> 693 <tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 694 695 Given 696 delete X; 697 cxxDeleteExpr() 698 matches 'delete X'. 699 </pre></td></tr> 700 701 702 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>>...</td></tr> 703 <tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 704 705 Example: 706 cxxDynamicCastExpr() 707 matches 708 dynamic_cast<D*>(&b); 709 in 710 struct B { virtual ~B() {} }; struct D : B {}; 711 B b; 712 D* p = dynamic_cast<D*>(&b); 713 </pre></td></tr> 714 715 716 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>>...</td></tr> 717 <tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 718 719 cxxForRangeStmt() matches 'for (auto a : i)' 720 int i[] = {1, 2, 3}; for (auto a : i); 721 for(int j = 0; j < 5; ++j); 722 </pre></td></tr> 723 724 725 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>...</td></tr> 726 <tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 727 728 Example: Matches Foo(bar); 729 Foo f = bar; 730 Foo g = (Foo) bar; 731 Foo h = Foo(bar); 732 </pre></td></tr> 733 734 735 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr> 736 <tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 737 738 Example matches x.y() 739 X x; 740 x.y(); 741 </pre></td></tr> 742 743 744 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>...</td></tr> 745 <tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 746 747 Given 748 new X; 749 cxxNewExpr() 750 matches 'new X'. 751 </pre></td></tr> 752 753 754 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>>...</td></tr> 755 <tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 756 </pre></td></tr> 757 758 759 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr> 760 <tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 761 762 Note that if an operator isn't overloaded, it won't match. Instead, use 763 binaryOperator matcher. 764 Currently it does not match operators such as new delete. 765 FIXME: figure out why these do not match? 766 767 Example matches both operator<<((o << b), c) and operator<<(o, b) 768 (matcher = cxxOperatorCallExpr()) 769 ostream &operator<< (ostream &out, int i) { }; 770 ostream &o; int b = 1, c = 1; 771 o << b << c; 772 </pre></td></tr> 773 774 775 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>>...</td></tr> 776 <tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 777 778 Either the source expression or the destination type can be matched 779 using has(), but hasDestinationType() is more specific and can be 780 more readable. 781 782 Example matches reinterpret_cast<char*>(&p) in 783 void* p = reinterpret_cast<char*>(&p); 784 </pre></td></tr> 785 786 787 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>>...</td></tr> 788 <tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 789 790 hasDestinationType 791 reinterpretCast 792 793 Example: 794 cxxStaticCastExpr() 795 matches 796 static_cast<long>(8) 797 in 798 long eight(static_cast<long>(8)); 799 </pre></td></tr> 800 801 802 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>...</td></tr> 803 <tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 804 805 Example: Matches Foo(bar, bar) 806 Foo h = Foo(bar, bar); 807 </pre></td></tr> 808 809 810 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>>...</td></tr> 811 <tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 812 813 Example matches the implicit this expression in "return i". 814 (matcher = cxxThisExpr()) 815 struct foo { 816 int i; 817 int f() { return i; } 818 }; 819 </pre></td></tr> 820 821 822 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>>...</td></tr> 823 <tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 824 825 try { throw 5; } catch(int i) {} 826 cxxThrowExpr() 827 matches 'throw 5' 828 </pre></td></tr> 829 830 831 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>>...</td></tr> 832 <tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 833 834 try {} catch(int i) {} 835 cxxTryStmt() 836 matches 'try {}' 837 </pre></td></tr> 838 839 840 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>...</td></tr> 841 <tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 842 843 Example matches T(t) in return statement of f 844 (matcher = cxxUnresolvedConstructExpr()) 845 template <typename T> 846 void f(const T& t) { return T(t); } 847 </pre></td></tr> 848 849 850 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>...</td></tr> 851 <tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 852 853 Example matches x in if (x) 854 bool x; 855 if (x) {} 856 </pre></td></tr> 857 858 859 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>>...</td></tr> 860 <tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 861 862 Given 863 int a; 864 declStmt() 865 matches 'int a'. 866 </pre></td></tr> 867 868 869 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>>...</td></tr> 870 <tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 871 872 Given 873 switch(a) { case 42: break; default: break; } 874 defaultStmt() 875 matches 'default: break;'. 876 </pre></td></tr> 877 878 879 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>>...</td></tr> 880 <tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 881 882 Given 883 do {} while (true); 884 doStmt() 885 matches 'do {} while(true)' 886 </pre></td></tr> 887 888 889 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>...</td></tr> 890 <tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 891 892 Matches any cast expression written in user code, whether it be a 893 C-style cast, a functional-style cast, or a keyword cast. 894 895 Does not match implicit conversions. 896 897 Note: the name "explicitCast" is chosen to match Clang's terminology, as 898 Clang uses the term "cast" to apply to implicit conversions as well as to 899 actual cast expressions. 900 901 hasDestinationType. 902 903 Example: matches all five of the casts in 904 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 905 but does not match the implicit conversion in 906 long ell = 42; 907 </pre></td></tr> 908 909 910 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>...</td></tr> 911 <tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 912 913 Example matches x() 914 void f() { x(); } 915 </pre></td></tr> 916 917 918 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>>...</td></tr> 919 <tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 920 of the sub-expression's evaluation. 921 922 Example matches std::string() 923 const std::string str = std::string(); 924 </pre></td></tr> 925 926 927 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>...</td></tr> 928 <tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g. 929 1.0, 1.0f, 1.0L and 1e10. 930 931 Does not match implicit conversions such as 932 float a = 10; 933 </pre></td></tr> 934 935 936 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>>...</td></tr> 937 <tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 938 939 Example matches 'for (;;) {}' 940 for (;;) {} 941 int i[] = {1, 2, 3}; for (auto a : i); 942 </pre></td></tr> 943 944 945 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>>...</td></tr> 946 <tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 947 </pre></td></tr> 948 949 950 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>>...</td></tr> 951 <tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 952 953 Given 954 goto FOO; 955 FOO: bar(); 956 gotoStmt() 957 matches 'goto FOO' 958 </pre></td></tr> 959 960 961 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>>...</td></tr> 962 <tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 963 964 Example matches 'if (x) {}' 965 if (x) {} 966 </pre></td></tr> 967 968 969 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>>...</td></tr> 970 <tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 971 972 This matches many different places, including function call return value 973 eliding, as well as any type conversions. 974 </pre></td></tr> 975 976 977 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>>...</td></tr> 978 <tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 979 980 Given 981 int a[] = { 1, 2 }; 982 struct B { int x, y; }; 983 B b = { 5, 6 }; 984 initListExpr() 985 matches "{ 1, 2 }" and "{ 5, 6 }" 986 </pre></td></tr> 987 988 989 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>...</td></tr> 990 <tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g. 991 1, 1L, 0x1 and 1U. 992 993 Does not match character-encoded integers such as L'a'. 994 </pre></td></tr> 995 996 997 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>...</td></tr> 998 <tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 999 1000 Given 1001 goto FOO; 1002 FOO: bar(); 1003 labelStmt() 1004 matches 'FOO:' 1005 </pre></td></tr> 1006 1007 1008 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>>...</td></tr> 1009 <tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1010 1011 Example matches [&](){return 5;} 1012 [&](){return 5;} 1013 </pre></td></tr> 1014 1015 1016 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>>...</td></tr> 1017 <tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1018 1019 Example: Given 1020 struct T {void func()}; 1021 T f(); 1022 void g(T); 1023 materializeTemporaryExpr() matches 'f()' in these statements 1024 T u(f()); 1025 g(f()); 1026 but does not match 1027 f(); 1028 f().func(); 1029 </pre></td></tr> 1030 1031 1032 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>...</td></tr> 1033 <tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1034 1035 Given 1036 class Y { 1037 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1038 int a; static int b; 1039 }; 1040 memberExpr() 1041 matches this->x, x, y.x, a, this->b 1042 </pre></td></tr> 1043 1044 1045 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>>...</td></tr> 1046 <tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1047 1048 foo();; 1049 nullStmt() 1050 matches the second ';' 1051 </pre></td></tr> 1052 1053 1054 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>>...</td></tr> 1055 <tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 1056 1057 The innermost message send invokes the "alloc" class method on the 1058 NSString class, while the outermost message send invokes the 1059 "initWithString" instance method on the object returned from 1060 NSString's "alloc". This matcher should match both message sends. 1061 [[NSString alloc] initWithString:@"Hello"] 1062 </pre></td></tr> 1063 1064 1065 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>>...</td></tr> 1066 <tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 1067 1068 Given 1069 return 1; 1070 returnStmt() 1071 matches 'return 1' 1072 </pre></td></tr> 1073 1074 1075 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>...</td></tr> 1076 <tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 1077 1078 Given 1079 { ++a; } 1080 stmt() 1081 matches both the compound statement '{ ++a; }' and '++a'. 1082 </pre></td></tr> 1083 1084 1085 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>>...</td></tr> 1086 <tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 1087 1088 Example matches "abcd", L"abcd" 1089 char *s = "abcd"; wchar_t *ws = L"abcd" 1090 </pre></td></tr> 1091 1092 1093 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>>...</td></tr> 1094 <tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 1095 1096 Given 1097 template <int N> 1098 struct A { static const int n = N; }; 1099 struct B : public A<42> {}; 1100 substNonTypeTemplateParmExpr() 1101 matches "N" in the right-hand side of "static const int n = N;" 1102 </pre></td></tr> 1103 1104 1105 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>>...</td></tr> 1106 <tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 1107 1108 Given 1109 switch(a) { case 42: break; default: break; } 1110 switchCase() 1111 matches 'case 42: break;' and 'default: break;'. 1112 </pre></td></tr> 1113 1114 1115 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>>...</td></tr> 1116 <tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 1117 1118 Given 1119 switch(a) { case 42: break; default: break; } 1120 switchStmt() 1121 matches 'switch(a)'. 1122 </pre></td></tr> 1123 1124 1125 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>>...</td></tr> 1126 <tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 1127 1128 Given 1129 Foo x = bar; 1130 int y = sizeof(x) + alignof(x); 1131 unaryExprOrTypeTraitExpr() 1132 matches sizeof(x) and alignof(x) 1133 </pre></td></tr> 1134 1135 1136 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>>...</td></tr> 1137 <tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 1138 1139 Example matches !a 1140 !a || b 1141 </pre></td></tr> 1142 1143 1144 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>>...</td></tr> 1145 <tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 1146 1147 Example match: "foo"_suffix 1148 </pre></td></tr> 1149 1150 1151 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>>...</td></tr> 1152 <tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 1153 1154 Given 1155 while (true) {} 1156 whileStmt() 1157 matches 'while (true) {}'. 1158 </pre></td></tr> 1159 1160 1161 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>>...</td></tr> 1162 <tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 1163 1164 Given 1165 template <typename T> struct C {}; 1166 C<int> c; 1167 templateArgument() 1168 matches 'int' in C<int>. 1169 </pre></td></tr> 1170 1171 1172 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>...</td></tr> 1173 <tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 1174 </pre></td></tr> 1175 1176 1177 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>...</td></tr> 1178 <tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 1179 1180 Given 1181 int a[] = { 2, 3 }; 1182 int b[4]; 1183 void f() { int c[a[0]]; } 1184 arrayType() 1185 matches "int a[]", "int b[4]" and "int c[a[0]]"; 1186 </pre></td></tr> 1187 1188 1189 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>>...</td></tr> 1190 <tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 1191 1192 Given 1193 _Atomic(int) i; 1194 atomicType() 1195 matches "_Atomic(int) i" 1196 </pre></td></tr> 1197 1198 1199 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>>...</td></tr> 1200 <tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 1201 1202 Given: 1203 auto n = 4; 1204 int v[] = { 2, 3 } 1205 for (auto i : v) { } 1206 autoType() 1207 matches "auto n" and "auto i" 1208 </pre></td></tr> 1209 1210 1211 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>...</td></tr> 1212 <tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 1213 "void (^)(int)". 1214 1215 The pointee is always required to be a FunctionType. 1216 </pre></td></tr> 1217 1218 1219 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>>...</td></tr> 1220 <tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 1221 1222 Given 1223 struct A {}; 1224 A a; 1225 int b; 1226 float c; 1227 bool d; 1228 builtinType() 1229 matches "int b", "float c" and "bool d" 1230 </pre></td></tr> 1231 1232 1233 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>>...</td></tr> 1234 <tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 1235 1236 Given 1237 _Complex float f; 1238 complexType() 1239 matches "_Complex float f" 1240 </pre></td></tr> 1241 1242 1243 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>>...</td></tr> 1244 <tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 1245 1246 Given 1247 void() { 1248 int a[2]; 1249 int b[] = { 2, 3 }; 1250 int c[b[0]]; 1251 } 1252 constantArrayType() 1253 matches "int a[2]" 1254 </pre></td></tr> 1255 1256 1257 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>>...</td></tr> 1258 <tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 1259 Example matches i[] in declaration of f. 1260 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 1261 Example matches i[1]. 1262 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 1263 void f(int i[]) { 1264 i[1] = 0; 1265 } 1266 </pre></td></tr> 1267 1268 1269 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>>...</td></tr> 1270 <tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 1271 1272 Given 1273 template<typename T, int Size> 1274 class array { 1275 T data[Size]; 1276 }; 1277 dependentSizedArrayType 1278 matches "T data[Size]" 1279 </pre></td></tr> 1280 1281 1282 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>>...</td></tr> 1283 <tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 1284 qualified name. 1285 1286 Given 1287 namespace N { 1288 namespace M { 1289 class D {}; 1290 } 1291 } 1292 class C {}; 1293 1294 class C c; 1295 N::M::D d; 1296 1297 elaboratedType() matches the type of the variable declarations of both 1298 c and d. 1299 </pre></td></tr> 1300 1301 1302 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>>...</td></tr> 1303 <tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 1304 1305 Given 1306 int (*f)(int); 1307 void g(); 1308 functionType() 1309 matches "int (*f)(int)" and the type of "g". 1310 </pre></td></tr> 1311 1312 1313 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>>...</td></tr> 1314 <tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 1315 1316 Given 1317 int a[] = { 2, 3 }; 1318 int b[42]; 1319 void f(int c[]) { int d[a[0]]; }; 1320 incompleteArrayType() 1321 matches "int a[]" and "int c[]" 1322 </pre></td></tr> 1323 1324 1325 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>...</td></tr> 1326 <tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 1327 1328 Example matches S s, but not S<T> s. 1329 (matcher = parmVarDecl(hasType(injectedClassNameType()))) 1330 template <typename T> struct S { 1331 void f(S s); 1332 void g(S<T> s); 1333 }; 1334 </pre></td></tr> 1335 1336 1337 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>>...</td></tr> 1338 <tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 1339 1340 Given: 1341 int *a; 1342 int &b = *a; 1343 int &&c = 1; 1344 auto &d = b; 1345 auto &&e = c; 1346 auto &&f = 2; 1347 int g = 5; 1348 1349 lValueReferenceType() matches the types of b, d, and e. e is 1350 matched since the type is deduced as int& by reference collapsing rules. 1351 </pre></td></tr> 1352 1353 1354 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>...</td></tr> 1355 <tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 1356 Given 1357 struct A { int i; } 1358 A::* ptr = A::i; 1359 memberPointerType() 1360 matches "A::* ptr" 1361 </pre></td></tr> 1362 1363 1364 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>>...</td></tr> 1365 <tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 1366 a pointer type, despite being syntactically similar. 1367 1368 Given 1369 int *a; 1370 1371 @interface Foo 1372 @end 1373 Foo *f; 1374 pointerType() 1375 matches "Foo *f", but does not match "int *a". 1376 </pre></td></tr> 1377 1378 1379 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>>...</td></tr> 1380 <tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 1381 1382 Given 1383 int (*ptr_to_array)[4]; 1384 int *array_of_ptrs[4]; 1385 1386 varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 1387 array_of_ptrs. 1388 </pre></td></tr> 1389 1390 1391 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>...</td></tr> 1392 <tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 1393 types. 1394 1395 Given 1396 int *a; 1397 int &b = *a; 1398 int c = 5; 1399 1400 @interface Foo 1401 @end 1402 Foo *f; 1403 pointerType() 1404 matches "int *a", but does not match "Foo *f". 1405 </pre></td></tr> 1406 1407 1408 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>>...</td></tr> 1409 <tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 1410 1411 Given: 1412 int *a; 1413 int &b = *a; 1414 int &&c = 1; 1415 auto &d = b; 1416 auto &&e = c; 1417 auto &&f = 2; 1418 int g = 5; 1419 1420 rValueReferenceType() matches the types of c and f. e is not 1421 matched as it is deduced to int& by reference collapsing rules. 1422 </pre></td></tr> 1423 1424 1425 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>...</td></tr> 1426 <tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 1427 1428 Given 1429 class C {}; 1430 struct S {}; 1431 1432 C c; 1433 S s; 1434 1435 recordType() matches the type of the variable declarations of both c 1436 and s. 1437 </pre></td></tr> 1438 1439 1440 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>...</td></tr> 1441 <tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 1442 1443 Given 1444 int *a; 1445 int &b = *a; 1446 int &&c = 1; 1447 auto &d = b; 1448 auto &&e = c; 1449 auto &&f = 2; 1450 int g = 5; 1451 1452 referenceType() matches the types of b, c, d, e, and f. 1453 </pre></td></tr> 1454 1455 1456 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>>...</td></tr> 1457 <tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 1458 template type parameter. 1459 1460 Given 1461 template <typename T> 1462 void F(T t) { 1463 int i = 1 + t; 1464 } 1465 1466 substTemplateTypeParmType() matches the type of 't' but not '1' 1467 </pre></td></tr> 1468 1469 1470 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>...</td></tr> 1471 <tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 1472 1473 Given 1474 template <typename T> 1475 class C { }; 1476 1477 template class C<int>; A 1478 C<char> var; B 1479 1480 templateSpecializationType() matches the type of the explicit 1481 instantiation in A and the type of the variable declaration in B. 1482 </pre></td></tr> 1483 1484 1485 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>...</td></tr> 1486 <tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 1487 1488 Example matches T, but not int. 1489 (matcher = templateTypeParmType()) 1490 template <typename T> void f(int i); 1491 </pre></td></tr> 1492 1493 1494 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>>...</td></tr> 1495 <tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 1496 </pre></td></tr> 1497 1498 1499 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>...</td></tr> 1500 <tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 1501 1502 Given 1503 typedef int X; 1504 typedefType() 1505 matches "typedef int X" 1506 </pre></td></tr> 1507 1508 1509 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>>...</td></tr> 1510 <tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 1511 1512 Given: 1513 typedef __underlying_type(T) type; 1514 unaryTransformType() 1515 matches "__underlying_type(T)" 1516 </pre></td></tr> 1517 1518 1519 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>>...</td></tr> 1520 <tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 1521 integer-constant-expression. 1522 1523 Given 1524 void f() { 1525 int a[] = { 2, 3 } 1526 int b[42]; 1527 int c[a[0]]; 1528 } 1529 variableArrayType() 1530 matches "int c[a[0]]" 1531 </pre></td></tr> 1532 1533 <!--END_DECL_MATCHERS --> 1534 </table> 1535 1536 <!-- ======================================================================= --> 1537 <h2 id="narrowing-matchers">Narrowing Matchers</h2> 1538 <!-- ======================================================================= --> 1539 1540 <p>Narrowing matchers match certain attributes on the current node, thus 1541 narrowing down the set of nodes of the current type to match on.</p> 1542 1543 <p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 1544 which allow users to create more powerful match expressions.</p> 1545 1546 <table> 1547 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 1548 <!-- START_NARROWING_MATCHERS --> 1549 1550 <tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 1551 <tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 1552 1553 Usable as: Any Matcher 1554 </pre></td></tr> 1555 1556 1557 <tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 1558 <tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 1559 1560 Usable as: Any Matcher 1561 </pre></td></tr> 1562 1563 1564 <tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 1565 <tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 1566 1567 Useful when another matcher requires a child matcher, but there's no 1568 additional constraint. This will often be used with an explicit conversion 1569 to an internal::Matcher<> type such as TypeMatcher. 1570 1571 Example: DeclarationMatcher(anything()) matches all declarations, e.g., 1572 "int* p" and "void f()" in 1573 int* p; 1574 void f(); 1575 1576 Usable as: Any Matcher 1577 </pre></td></tr> 1578 1579 1580 <tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 1581 <tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 1582 1583 Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 1584 class X {}; 1585 class Y {}; 1586 1587 Usable as: Any Matcher 1588 </pre></td></tr> 1589 1590 1591 <tr><td>Matcher<<a href="http://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> 1592 <tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 1593 unary). 1594 1595 Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 1596 !(a || b) 1597 </pre></td></tr> 1598 1599 1600 <tr><td>Matcher<CXXBoolLiteral></td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT Value</td></tr> 1601 <tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value. 1602 1603 Example matches true (matcher = cxxBoolLiteral(equals(true))) 1604 true 1605 1606 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 1607 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 1608 </pre></td></tr> 1609 1610 1611 <tr><td>Matcher<<a href="http://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> 1612 <tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 1613 1614 Given 1615 try { 1616 ... 1617 } catch (int) { 1618 ... 1619 } catch (...) { 1620 ... 1621 } 1622 endcode 1623 cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 1624 </pre></td></tr> 1625 1626 1627 <tr><td>Matcher<<a href="http://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> 1628 <tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 1629 a specific number of arguments (including absent default arguments). 1630 1631 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 1632 void f(int x, int y); 1633 f(0, 0); 1634 </pre></td></tr> 1635 1636 1637 <tr><td>Matcher<<a href="http://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> 1638 <tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 1639 </pre></td></tr> 1640 1641 1642 <tr><td>Matcher<<a href="http://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> 1643 <tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 1644 1645 Given 1646 struct S { 1647 S(); #1 1648 S(const S &); #2 1649 S(S &&); #3 1650 }; 1651 cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 1652 </pre></td></tr> 1653 1654 1655 <tr><td>Matcher<<a href="http://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> 1656 <tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 1657 1658 Given 1659 struct S { 1660 S(); #1 1661 S(const S &); #2 1662 S(S &&); #3 1663 }; 1664 cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 1665 </pre></td></tr> 1666 1667 1668 <tr><td>Matcher<<a href="http://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> 1669 <tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with 1670 the explicit keyword. 1671 1672 Given 1673 struct S { 1674 S(int); #1 1675 explicit S(double); #2 1676 operator int(); #3 1677 explicit operator bool(); #4 1678 }; 1679 cxxConstructorDecl(isExplicit()) will match #2, but not #1. 1680 cxxConversionDecl(isExplicit()) will match #4, but not #3. 1681 </pre></td></tr> 1682 1683 1684 <tr><td>Matcher<<a href="http://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> 1685 <tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 1686 1687 Given 1688 struct S { 1689 S(); #1 1690 S(const S &); #2 1691 S(S &&); #3 1692 }; 1693 cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 1694 </pre></td></tr> 1695 1696 1697 <tr><td>Matcher<<a href="http://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> 1698 <tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with 1699 the explicit keyword. 1700 1701 Given 1702 struct S { 1703 S(int); #1 1704 explicit S(double); #2 1705 operator int(); #3 1706 explicit operator bool(); #4 1707 }; 1708 cxxConstructorDecl(isExplicit()) will match #2, but not #1. 1709 cxxConversionDecl(isExplicit()) will match #4, but not #3. 1710 </pre></td></tr> 1711 1712 1713 <tr><td>Matcher<<a href="http://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> 1714 <tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 1715 opposed to a member. 1716 1717 Given 1718 struct B {}; 1719 struct D : B { 1720 int I; 1721 D(int i) : I(i) {} 1722 }; 1723 struct E : B { 1724 E() : B() {} 1725 }; 1726 cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 1727 will match E(), but not match D(int). 1728 </pre></td></tr> 1729 1730 1731 <tr><td>Matcher<<a href="http://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> 1732 <tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 1733 opposed to a base. 1734 1735 Given 1736 struct B {}; 1737 struct D : B { 1738 int I; 1739 D(int i) : I(i) {} 1740 }; 1741 struct E : B { 1742 E() : B() {} 1743 }; 1744 cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 1745 will match D(int), but not match E(). 1746 </pre></td></tr> 1747 1748 1749 <tr><td>Matcher<<a href="http://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> 1750 <tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 1751 code (as opposed to implicitly added by the compiler). 1752 1753 Given 1754 struct Foo { 1755 Foo() { } 1756 Foo(int) : foo_("A") { } 1757 string foo_; 1758 }; 1759 cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 1760 will match Foo(int), but not Foo() 1761 </pre></td></tr> 1762 1763 1764 <tr><td>Matcher<<a href="http://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> 1765 <tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 1766 1767 Given 1768 struct A { 1769 void foo() const; 1770 void bar(); 1771 }; 1772 1773 cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 1774 </pre></td></tr> 1775 1776 1777 <tr><td>Matcher<<a href="http://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> 1778 <tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 1779 operator. 1780 1781 Given 1782 struct A { 1783 A &operator=(const A &); 1784 A &operator=(A &&); 1785 }; 1786 1787 cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 1788 the second one. 1789 </pre></td></tr> 1790 1791 1792 <tr><td>Matcher<<a href="http://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> 1793 <tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 1794 1795 Given: 1796 class A final {}; 1797 1798 struct B { 1799 virtual void f(); 1800 }; 1801 1802 struct C : B { 1803 void f() final; 1804 }; 1805 matches A and C::f, but not B, C, or B::f 1806 </pre></td></tr> 1807 1808 1809 <tr><td>Matcher<<a href="http://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> 1810 <tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 1811 1812 Given 1813 class A { 1814 public: 1815 virtual void x(); 1816 }; 1817 class B : public A { 1818 public: 1819 virtual void x(); 1820 }; 1821 matches B::x 1822 </pre></td></tr> 1823 1824 1825 <tr><td>Matcher<<a href="http://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> 1826 <tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 1827 1828 Given 1829 class A { 1830 public: 1831 virtual void x() = 0; 1832 }; 1833 matches A::x 1834 </pre></td></tr> 1835 1836 1837 <tr><td>Matcher<<a href="http://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> 1838 <tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual. 1839 1840 Given 1841 class A { 1842 public: 1843 virtual void x(); 1844 }; 1845 matches A::x 1846 </pre></td></tr> 1847 1848 1849 <tr><td>Matcher<<a href="http://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> 1850 <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 1851 1852 Matches overloaded operator names specified in strings without the 1853 "operator" prefix: e.g. "<<". 1854 1855 Given: 1856 class A { int operator*(); }; 1857 const A &operator<<(const A &a, const A &b); 1858 A a; 1859 a << a; <-- This matches 1860 1861 cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 1862 specified line and 1863 cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 1864 matches the declaration of A. 1865 1866 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 1867 </pre></td></tr> 1868 1869 1870 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr> 1871 <tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 1872 </pre></td></tr> 1873 1874 1875 <tr><td>Matcher<<a href="http://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> 1876 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 1877 static member variable template instantiations. 1878 1879 Given 1880 template<typename T> void A(T t) { } 1881 template<> void A(int N) { } 1882 functionDecl(isExplicitTemplateSpecialization()) 1883 matches the specialization A<int>(). 1884 1885 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 1886 </pre></td></tr> 1887 1888 1889 <tr><td>Matcher<<a href="http://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> 1890 <tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 1891 1892 Given: 1893 class A final {}; 1894 1895 struct B { 1896 virtual void f(); 1897 }; 1898 1899 struct C : B { 1900 void f() final; 1901 }; 1902 matches A and C::f, but not B, C, or B::f 1903 </pre></td></tr> 1904 1905 1906 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr> 1907 <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for 1908 isSameOrDerivedFrom(hasName(...)). 1909 </pre></td></tr> 1910 1911 1912 <tr><td>Matcher<<a href="http://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> 1913 <tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 1914 member variable template instantiations. 1915 1916 Given 1917 template <typename T> class X {}; class A {}; X<A> x; 1918 or 1919 template <typename T> class X {}; class A {}; template class X<A>; 1920 cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 1921 matches the template instantiation of X<A>. 1922 1923 But given 1924 template <typename T> class X {}; class A {}; 1925 template <> class X<A> {}; X<A> x; 1926 cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 1927 does not match, as X<A> is an explicit template specialization. 1928 1929 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 1930 </pre></td></tr> 1931 1932 1933 <tr><td>Matcher<<a href="http://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> 1934 <tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 1935 a specific number of arguments (including absent default arguments). 1936 1937 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 1938 void f(int x, int y); 1939 f(0, 0); 1940 </pre></td></tr> 1941 1942 1943 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>ValueT Value</td></tr> 1944 <tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value. 1945 1946 Example matches true (matcher = cxxBoolLiteral(equals(true))) 1947 true 1948 1949 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 1950 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 1951 </pre></td></tr> 1952 1953 1954 <tr><td>Matcher<<a href="http://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> 1955 <tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 1956 1957 Given 1958 template<typename T> struct C {}; 1959 C<int> c; 1960 classTemplateSpecializationDecl(templateArgumentCountIs(1)) 1961 matches C<int>. 1962 </pre></td></tr> 1963 1964 1965 <tr><td>Matcher<<a href="http://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> 1966 <tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 1967 child statements. 1968 1969 Example: Given 1970 { for (;;) {} } 1971 compoundStmt(statementCountIs(0))) 1972 matches '{}' 1973 but does not match the outer compound statement. 1974 </pre></td></tr> 1975 1976 1977 <tr><td>Matcher<<a href="http://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> 1978 <tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size. 1979 1980 Given 1981 int a[42]; 1982 int b[2 * 21]; 1983 int c[41], d[43]; 1984 constantArrayType(hasSize(42)) 1985 matches "int a[42]" and "int b[2 * 21]" 1986 </pre></td></tr> 1987 1988 1989 <tr><td>Matcher<<a href="http://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> 1990 <tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 1991 declarations. 1992 1993 Example: Given 1994 int a, b; 1995 int c; 1996 int d = 2, e; 1997 declCountIs(2) 1998 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 1999 </pre></td></tr> 2000 2001 2002 <tr><td>Matcher<<a href="http://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> 2003 <tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 2004 2005 Matches a node if it equals the node previously bound to ID. 2006 2007 Given 2008 class X { int a; int b; }; 2009 cxxRecordDecl( 2010 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 2011 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 2012 matches the class X, as a and b have the same type. 2013 2014 Note that when multiple matches are involved via forEach* matchers, 2015 equalsBoundNodes acts as a filter. 2016 For example: 2017 compoundStmt( 2018 forEachDescendant(varDecl().bind("d")), 2019 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 2020 will trigger a match for each combination of variable declaration 2021 and reference to that variable declaration within a compound statement. 2022 </pre></td></tr> 2023 2024 2025 <tr><td>Matcher<<a href="http://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> 2026 <tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 2027 2028 Given 2029 __attribute__((device)) void f() { ... } 2030 decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 2031 f. If the matcher is use from clang-query, attr::Kind parameter should be 2032 passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 2033 </pre></td></tr> 2034 2035 2036 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr> 2037 <tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 2038 partially matching a given regex. 2039 2040 Example matches Y but not X 2041 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 2042 #include "ASTMatcher.h" 2043 class X {}; 2044 ASTMatcher.h: 2045 class Y {}; 2046 2047 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 2048 </pre></td></tr> 2049 2050 2051 <tr><td>Matcher<<a href="http://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> 2052 <tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 2053 2054 Example matches X but not Y 2055 (matcher = cxxRecordDecl(isExpansionInMainFile()) 2056 #include <Y.h> 2057 class X {}; 2058 Y.h: 2059 class Y {}; 2060 2061 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 2062 </pre></td></tr> 2063 2064 2065 <tr><td>Matcher<<a href="http://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> 2066 <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 2067 2068 Example matches Y but not X 2069 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 2070 #include <SystemHeader.h> 2071 class X {}; 2072 SystemHeader.h: 2073 class Y {}; 2074 2075 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 2076 </pre></td></tr> 2077 2078 2079 <tr><td>Matcher<<a href="http://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> 2080 <tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added 2081 by the compiler (eg. implicit defaultcopy constructors). 2082 </pre></td></tr> 2083 2084 2085 <tr><td>Matcher<<a href="http://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> 2086 <tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations. 2087 2088 Given 2089 class C { 2090 public: int a; 2091 protected: int b; 2092 private: int c; 2093 }; 2094 fieldDecl(isPrivate()) 2095 matches 'int c;' 2096 </pre></td></tr> 2097 2098 2099 <tr><td>Matcher<<a href="http://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> 2100 <tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations. 2101 2102 Given 2103 class C { 2104 public: int a; 2105 protected: int b; 2106 private: int c; 2107 }; 2108 fieldDecl(isProtected()) 2109 matches 'int b;' 2110 </pre></td></tr> 2111 2112 2113 <tr><td>Matcher<<a href="http://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> 2114 <tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations. 2115 2116 Given 2117 class C { 2118 public: int a; 2119 protected: int b; 2120 private: int c; 2121 }; 2122 fieldDecl(isPublic()) 2123 matches 'int a;' 2124 </pre></td></tr> 2125 2126 2127 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>ValueT Value</td></tr> 2128 <tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value. 2129 2130 Example matches true (matcher = cxxBoolLiteral(equals(true))) 2131 true 2132 2133 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 2134 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 2135 </pre></td></tr> 2136 2137 2138 <tr><td>Matcher<<a href="http://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> 2139 <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 2140 2141 Matches overloaded operator names specified in strings without the 2142 "operator" prefix: e.g. "<<". 2143 2144 Given: 2145 class A { int operator*(); }; 2146 const A &operator<<(const A &a, const A &b); 2147 A a; 2148 a << a; <-- This matches 2149 2150 cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 2151 specified line and 2152 cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 2153 matches the declaration of A. 2154 2155 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 2156 </pre></td></tr> 2157 2158 2159 <tr><td>Matcher<<a href="http://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> 2160 <tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations. 2161 2162 Given: 2163 constexpr int foo = 42; 2164 constexpr int bar(); 2165 varDecl(isConstexpr()) 2166 matches the declaration of foo. 2167 functionDecl(isConstexpr()) 2168 matches the declaration of bar. 2169 </pre></td></tr> 2170 2171 2172 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr> 2173 <tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 2174 2175 Example matches A, va, fa 2176 class A {}; 2177 class B; Doesn't match, as it has no body. 2178 int va; 2179 extern int vb; Doesn't match, as it doesn't define the variable. 2180 void fa() {} 2181 void fb(); Doesn't match, as it has no body. 2182 2183 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 2184 </pre></td></tr> 2185 2186 2187 <tr><td>Matcher<<a href="http://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> 2188 <tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 2189 2190 Given: 2191 void Func(); 2192 void DeletedFunc() = delete; 2193 functionDecl(isDeleted()) 2194 matches the declaration of DeletedFunc, but not Func. 2195 </pre></td></tr> 2196 2197 2198 <tr><td>Matcher<<a href="http://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> 2199 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 2200 static member variable template instantiations. 2201 2202 Given 2203 template<typename T> void A(T t) { } 2204 template<> void A(int N) { } 2205 functionDecl(isExplicitTemplateSpecialization()) 2206 matches the specialization A<int>(). 2207 2208 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 2209 </pre></td></tr> 2210 2211 2212 <tr><td>Matcher<<a href="http://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> 2213 <tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations. 2214 2215 Given: 2216 extern "C" void f() {} 2217 extern "C" { void g() {} } 2218 void h() {} 2219 functionDecl(isExternC()) 2220 matches the declaration of f and g, but not the declaration h 2221 </pre></td></tr> 2222 2223 2224 <tr><td>Matcher<<a href="http://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> 2225 <tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 2226 the inline keyword. 2227 2228 Given 2229 inline void f(); 2230 void g(); 2231 namespace n { 2232 inline namespace m {} 2233 } 2234 functionDecl(isInline()) will match ::f(). 2235 namespaceDecl(isInline()) will match n::m. 2236 </pre></td></tr> 2237 2238 2239 <tr><td>Matcher<<a href="http://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> 2240 <tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 2241 2242 Given: 2243 void f(); 2244 void g() noexcept; 2245 void h() throw(); 2246 void i() throw(int); 2247 void j() noexcept(false); 2248 functionDecl(isNoThrow()) 2249 matches the declarations of g, and h, but not f, i or j. 2250 </pre></td></tr> 2251 2252 2253 <tr><td>Matcher<<a href="http://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> 2254 <tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 2255 member variable template instantiations. 2256 2257 Given 2258 template <typename T> class X {}; class A {}; X<A> x; 2259 or 2260 template <typename T> class X {}; class A {}; template class X<A>; 2261 cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2262 matches the template instantiation of X<A>. 2263 2264 But given 2265 template <typename T> class X {}; class A {}; 2266 template <> class X<A> {}; X<A> x; 2267 cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2268 does not match, as X<A> is an explicit template specialization. 2269 2270 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 2271 </pre></td></tr> 2272 2273 2274 <tr><td>Matcher<<a href="http://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> 2275 <tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 2276 2277 Example matches f, but not g or h. The function i will not match, even when 2278 compiled in C mode. 2279 void f(...); 2280 void g(int); 2281 template <typename... Ts> void h(Ts...); 2282 void i(); 2283 </pre></td></tr> 2284 2285 2286 <tr><td>Matcher<<a href="http://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> 2287 <tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls that have a specific parameter count. 2288 2289 Given 2290 void f(int i) {} 2291 void g(int i, int j) {} 2292 functionDecl(parameterCountIs(2)) 2293 matches g(int i, int j) {} 2294 </pre></td></tr> 2295 2296 2297 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>ValueT Value</td></tr> 2298 <tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value. 2299 2300 Example matches true (matcher = cxxBoolLiteral(equals(true))) 2301 true 2302 2303 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 2304 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 2305 </pre></td></tr> 2306 2307 2308 <tr><td>Matcher<<a href="http://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> 2309 <tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 2310 to '.'. 2311 2312 Member calls on the implicit this pointer match as called with '->'. 2313 2314 Given 2315 class Y { 2316 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 2317 int a; 2318 static int b; 2319 }; 2320 memberExpr(isArrow()) 2321 matches this->x, x, y.x, a, this->b 2322 </pre></td></tr> 2323 2324 2325 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>std::string Name</td></tr> 2326 <tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 2327 2328 Supports specifying enclosing namespaces or classes by prefixing the name 2329 with '<enclosing>::'. 2330 Does not match typedefs of an underlying type with the given name. 2331 2332 Example matches X (Name == "X") 2333 class X; 2334 2335 Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 2336 namespace a { namespace b { class X; } } 2337 </pre></td></tr> 2338 2339 2340 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>std::string RegExp</td></tr> 2341 <tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 2342 a substring matched by the given RegExp. 2343 2344 Supports specifying enclosing namespaces or classes by 2345 prefixing the name with '<enclosing>::'. Does not match typedefs 2346 of an underlying type with the given name. 2347 2348 Example matches X (regexp == "::X") 2349 class X; 2350 2351 Example matches X (regexp is one of "::X", "^foo::.*X", among others) 2352 namespace foo { namespace bar { class X; } } 2353 </pre></td></tr> 2354 2355 2356 <tr><td>Matcher<<a href="http://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> 2357 <tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 2358 2359 Given 2360 namespace n { 2361 namespace {} #1 2362 } 2363 namespaceDecl(isAnonymous()) will match #1 but not ::n. 2364 </pre></td></tr> 2365 2366 2367 <tr><td>Matcher<<a href="http://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> 2368 <tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 2369 the inline keyword. 2370 2371 Given 2372 inline void f(); 2373 void g(); 2374 namespace n { 2375 inline namespace m {} 2376 } 2377 functionDecl(isInline()) will match ::f(). 2378 namespaceDecl(isInline()) will match n::m. 2379 </pre></td></tr> 2380 2381 2382 <tr><td>Matcher<<a href="http://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> 2383 <tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 2384 a specific number of arguments (including absent default arguments). 2385 2386 Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2387 void f(int x, int y); 2388 f(0, 0); 2389 </pre></td></tr> 2390 2391 2392 <tr><td>Matcher<<a href="http://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> 2393 <tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 2394 2395 objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 2396 message expression in 2397 2398 UIWebView *webView = ...; 2399 CGRect bodyFrame = webView.frame; 2400 bodyFrame.size.height = self.bodyContentHeight; 2401 webView.frame = bodyFrame; 2402 ^---- matches here 2403 </pre></td></tr> 2404 2405 2406 <tr><td>Matcher<<a href="http://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> 2407 <tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 2408 2409 Matches only when the selector of the objCMessageExpr is NULL. This may 2410 represent an error condition in the tree! 2411 </pre></td></tr> 2412 2413 2414 <tr><td>Matcher<<a href="http://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> 2415 <tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 2416 2417 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 2418 matches the outer message expr in the code below, but NOT the message 2419 invocation for self.bodyView. 2420 [self.bodyView loadHTMLString:html baseURL:NULL]; 2421 </pre></td></tr> 2422 2423 2424 <tr><td>Matcher<<a href="http://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> 2425 <tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 2426 2427 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 2428 matches self.bodyView in the code below, but NOT the outer message 2429 invocation of "loadHTMLString:baseURL:". 2430 [self.bodyView loadHTMLString:html baseURL:NULL]; 2431 </pre></td></tr> 2432 2433 2434 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>std::string RegExp</td></tr> 2435 <tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 2436 a substring matched by the given RegExp. 2437 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 2438 invocation for self.bodyView. 2439 [self.bodyView loadHTMLString:html baseURL:NULL]; 2440 </pre></td></tr> 2441 2442 2443 <tr><td>Matcher<<a href="http://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> 2444 <tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 2445 2446 matcher = objCMessageExpr(numSelectorArgs(0)); 2447 matches self.bodyView in the code below 2448 2449 matcher = objCMessageExpr(numSelectorArgs(2)); 2450 matches the invocation of "loadHTMLString:baseURL:" but not that 2451 of self.bodyView 2452 [self.bodyView loadHTMLString:html baseURL:NULL]; 2453 </pre></td></tr> 2454 2455 2456 <tr><td>Matcher<<a href="http://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> 2457 <tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 2458 2459 Given 2460 class Y { public: void x(); }; 2461 void z() { Y* y; y->x(); } 2462 cxxMemberCallExpr(on(hasType(asString("class Y *")))) 2463 matches y->x() 2464 </pre></td></tr> 2465 2466 2467 <tr><td>Matcher<<a href="http://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> 2468 <tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 2469 2470 Matches a node if it equals the node previously bound to ID. 2471 2472 Given 2473 class X { int a; int b; }; 2474 cxxRecordDecl( 2475 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 2476 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 2477 matches the class X, as a and b have the same type. 2478 2479 Note that when multiple matches are involved via forEach* matchers, 2480 equalsBoundNodes acts as a filter. 2481 For example: 2482 compoundStmt( 2483 forEachDescendant(varDecl().bind("d")), 2484 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 2485 will trigger a match for each combination of variable declaration 2486 and reference to that variable declaration within a compound statement. 2487 </pre></td></tr> 2488 2489 2490 <tr><td>Matcher<<a href="http://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> 2491 <tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 2492 the node, not hidden within a typedef. 2493 2494 Given 2495 typedef const int const_int; 2496 const_int i; 2497 int *const j; 2498 int *volatile k; 2499 int m; 2500 varDecl(hasType(hasLocalQualifiers())) matches only j and k. 2501 i is const-qualified but the qualifier is not local. 2502 </pre></td></tr> 2503 2504 2505 <tr><td>Matcher<<a href="http://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> 2506 <tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 2507 include "top-level" const. 2508 2509 Given 2510 void a(int); 2511 void b(int const); 2512 void c(const int); 2513 void d(const int*); 2514 void e(int const) {}; 2515 functionDecl(hasAnyParameter(hasType(isConstQualified()))) 2516 matches "void b(int const)", "void c(const int)" and 2517 "void e(int const) {}". It does not match d as there 2518 is no top-level const on the parameter type "const int *". 2519 </pre></td></tr> 2520 2521 2522 <tr><td>Matcher<<a href="http://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> 2523 <tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 2524 2525 Given 2526 void a(int); 2527 void b(long); 2528 void c(double); 2529 functionDecl(hasAnyParameter(hasType(isInteger()))) 2530 matches "a(int)", "b(long)", but not "c(double)". 2531 </pre></td></tr> 2532 2533 2534 <tr><td>Matcher<<a href="http://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> 2535 <tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 2536 include "top-level" volatile. 2537 2538 Given 2539 void a(int); 2540 void b(int volatile); 2541 void c(volatile int); 2542 void d(volatile int*); 2543 void e(int volatile) {}; 2544 functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 2545 matches "void b(int volatile)", "void c(volatile int)" and 2546 "void e(int volatile) {}". It does not match d as there 2547 is no top-level volatile on the parameter type "volatile int *". 2548 </pre></td></tr> 2549 2550 2551 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>></td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr> 2552 <tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class." 2553 2554 Example matches C, but not S or U. 2555 struct S {}; 2556 class C {}; 2557 union U {}; 2558 </pre></td></tr> 2559 2560 2561 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>></td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr> 2562 <tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct." 2563 2564 Example matches S, but not C or U. 2565 struct S {}; 2566 class C {}; 2567 union U {}; 2568 </pre></td></tr> 2569 2570 2571 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>></td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr> 2572 <tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union." 2573 2574 Example matches U, but not C or S. 2575 struct S {}; 2576 class C {}; 2577 union U {}; 2578 </pre></td></tr> 2579 2580 2581 <tr><td>Matcher<<a href="http://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> 2582 <tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 2583 2584 Matches a node if it equals the node previously bound to ID. 2585 2586 Given 2587 class X { int a; int b; }; 2588 cxxRecordDecl( 2589 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 2590 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 2591 matches the class X, as a and b have the same type. 2592 2593 Note that when multiple matches are involved via forEach* matchers, 2594 equalsBoundNodes acts as a filter. 2595 For example: 2596 compoundStmt( 2597 forEachDescendant(varDecl().bind("d")), 2598 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 2599 will trigger a match for each combination of variable declaration 2600 and reference to that variable declaration within a compound statement. 2601 </pre></td></tr> 2602 2603 2604 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr> 2605 <tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 2606 partially matching a given regex. 2607 2608 Example matches Y but not X 2609 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 2610 #include "ASTMatcher.h" 2611 class X {}; 2612 ASTMatcher.h: 2613 class Y {}; 2614 2615 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 2616 </pre></td></tr> 2617 2618 2619 <tr><td>Matcher<<a href="http://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> 2620 <tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 2621 2622 Example matches X but not Y 2623 (matcher = cxxRecordDecl(isExpansionInMainFile()) 2624 #include <Y.h> 2625 class X {}; 2626 Y.h: 2627 class Y {}; 2628 2629 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 2630 </pre></td></tr> 2631 2632 2633 <tr><td>Matcher<<a href="http://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> 2634 <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 2635 2636 Example matches Y but not X 2637 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 2638 #include <SystemHeader.h> 2639 class X {}; 2640 SystemHeader.h: 2641 class Y {}; 2642 2643 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 2644 </pre></td></tr> 2645 2646 2647 <tr><td>Matcher<<a href="http://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> 2648 <tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 2649 2650 Example matches A, va, fa 2651 class A {}; 2652 class B; Doesn't match, as it has no body. 2653 int va; 2654 extern int vb; Doesn't match, as it doesn't define the variable. 2655 void fa() {} 2656 void fb(); Doesn't match, as it has no body. 2657 2658 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 2659 </pre></td></tr> 2660 2661 2662 <tr><td>Matcher<<a href="http://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> 2663 <tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 2664 2665 Note that 'Value' is a string as the template argument's value is 2666 an arbitrary precision integer. 'Value' must be euqal to the canonical 2667 representation of that integral value in base 10. 2668 2669 Given 2670 template<int T> struct A {}; 2671 C<42> c; 2672 classTemplateSpecializationDecl( 2673 hasAnyTemplateArgument(equalsIntegralValue("42"))) 2674 matches the implicit instantiation of C in C<42>. 2675 </pre></td></tr> 2676 2677 2678 <tr><td>Matcher<<a href="http://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> 2679 <tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 2680 2681 Given 2682 template<int T> struct A {}; 2683 C<42> c; 2684 classTemplateSpecializationDecl( 2685 hasAnyTemplateArgument(isIntegral())) 2686 matches the implicit instantiation of C in C<42> 2687 with isIntegral() matching 42. 2688 </pre></td></tr> 2689 2690 2691 <tr><td>Matcher<<a href="http://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> 2692 <tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 2693 2694 Given 2695 template<typename T> struct C {}; 2696 C<int> c; 2697 classTemplateSpecializationDecl(templateArgumentCountIs(1)) 2698 matches C<int>. 2699 </pre></td></tr> 2700 2701 2702 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr> 2703 <tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 2704 partially matching a given regex. 2705 2706 Example matches Y but not X 2707 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 2708 #include "ASTMatcher.h" 2709 class X {}; 2710 ASTMatcher.h: 2711 class Y {}; 2712 2713 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 2714 </pre></td></tr> 2715 2716 2717 <tr><td>Matcher<<a href="http://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> 2718 <tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 2719 2720 Example matches X but not Y 2721 (matcher = cxxRecordDecl(isExpansionInMainFile()) 2722 #include <Y.h> 2723 class X {}; 2724 Y.h: 2725 class Y {}; 2726 2727 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 2728 </pre></td></tr> 2729 2730 2731 <tr><td>Matcher<<a href="http://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> 2732 <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 2733 2734 Example matches Y but not X 2735 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 2736 #include <SystemHeader.h> 2737 class X {}; 2738 SystemHeader.h: 2739 class Y {}; 2740 2741 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 2742 </pre></td></tr> 2743 2744 2745 <tr><td>Matcher<<a href="http://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> 2746 <tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 2747 2748 Matches a node if it equals the node previously bound to ID. 2749 2750 Given 2751 class X { int a; int b; }; 2752 cxxRecordDecl( 2753 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 2754 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 2755 matches the class X, as a and b have the same type. 2756 2757 Note that when multiple matches are involved via forEach* matchers, 2758 equalsBoundNodes acts as a filter. 2759 For example: 2760 compoundStmt( 2761 forEachDescendant(varDecl().bind("d")), 2762 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 2763 will trigger a match for each combination of variable declaration 2764 and reference to that variable declaration within a compound statement. 2765 </pre></td></tr> 2766 2767 2768 <tr><td>Matcher<<a href="http://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> 2769 <tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 2770 2771 Given 2772 struct S { void func(); }; 2773 functionDecl(returns(voidType())) 2774 matches "void func();" 2775 </pre></td></tr> 2776 2777 2778 <tr><td>Matcher<<a href="http://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> 2779 <tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 2780 2781 Given 2782 int x; 2783 int s = sizeof(x) + alignof(x) 2784 unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 2785 matches sizeof(x) 2786 </pre></td></tr> 2787 2788 2789 <tr><td>Matcher<<a href="http://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> 2790 <tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 2791 unary). 2792 2793 Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 2794 !(a || b) 2795 </pre></td></tr> 2796 2797 2798 <tr><td>Matcher<<a href="http://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> 2799 <tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 2800 2801 Example matches x, but not y, z, or a. 2802 (matcher = varDecl(hasAutomaticStorageDuration()) 2803 void f() { 2804 int x; 2805 static int y; 2806 thread_local int z; 2807 } 2808 int a; 2809 </pre></td></tr> 2810 2811 2812 <tr><td>Matcher<<a href="http://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> 2813 <tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 2814 2815 Example matches y and z (matcher = varDecl(hasGlobalStorage()) 2816 void f() { 2817 int x; 2818 static int y; 2819 } 2820 int z; 2821 </pre></td></tr> 2822 2823 2824 <tr><td>Matcher<<a href="http://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> 2825 <tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 2826 non-static local variable. 2827 2828 Example matches x (matcher = varDecl(hasLocalStorage()) 2829 void f() { 2830 int x; 2831 static int y; 2832 } 2833 int z; 2834 </pre></td></tr> 2835 2836 2837 <tr><td>Matcher<<a href="http://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> 2838 <tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 2839 2840 Example matches y and a, but not x or z. 2841 (matcher = varDecl(hasStaticStorageDuration()) 2842 void f() { 2843 int x; 2844 static int y; 2845 thread_local int z; 2846 } 2847 int a; 2848 </pre></td></tr> 2849 2850 2851 <tr><td>Matcher<<a href="http://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> 2852 <tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 2853 2854 Example matches z, but not x, z, or a. 2855 (matcher = varDecl(hasThreadStorageDuration()) 2856 void f() { 2857 int x; 2858 static int y; 2859 thread_local int z; 2860 } 2861 int a; 2862 </pre></td></tr> 2863 2864 2865 <tr><td>Matcher<<a href="http://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> 2866 <tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations. 2867 2868 Given: 2869 constexpr int foo = 42; 2870 constexpr int bar(); 2871 varDecl(isConstexpr()) 2872 matches the declaration of foo. 2873 functionDecl(isConstexpr()) 2874 matches the declaration of bar. 2875 </pre></td></tr> 2876 2877 2878 <tr><td>Matcher<<a href="http://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> 2879 <tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 2880 2881 Example matches A, va, fa 2882 class A {}; 2883 class B; Doesn't match, as it has no body. 2884 int va; 2885 extern int vb; Doesn't match, as it doesn't define the variable. 2886 void fa() {} 2887 void fb(); Doesn't match, as it has no body. 2888 2889 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 2890 </pre></td></tr> 2891 2892 2893 <tr><td>Matcher<<a href="http://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> 2894 <tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 2895 a C++ catch block, or an Objective-C statement. 2896 2897 Example matches x (matcher = varDecl(isExceptionVariable()) 2898 void f(int y) { 2899 try { 2900 } catch (int x) { 2901 } 2902 } 2903 </pre></td></tr> 2904 2905 2906 <tr><td>Matcher<<a href="http://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> 2907 <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 2908 static member variable template instantiations. 2909 2910 Given 2911 template<typename T> void A(T t) { } 2912 template<> void A(int N) { } 2913 functionDecl(isExplicitTemplateSpecialization()) 2914 matches the specialization A<int>(). 2915 2916 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 2917 </pre></td></tr> 2918 2919 2920 <tr><td>Matcher<<a href="http://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> 2921 <tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 2922 member variable template instantiations. 2923 2924 Given 2925 template <typename T> class X {}; class A {}; X<A> x; 2926 or 2927 template <typename T> class X {}; class A {}; template class X<A>; 2928 cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2929 matches the template instantiation of X<A>. 2930 2931 But given 2932 template <typename T> class X {}; class A {}; 2933 template <> class X<A> {}; X<A> x; 2934 cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2935 does not match, as X<A> is an explicit template specialization. 2936 2937 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 2938 </pre></td></tr> 2939 2940 2941 <tr><td>Matcher<internal::Matcher<<a href="http://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> 2942 <tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 2943 template instantiations. 2944 2945 Given 2946 template<typename T> void A(T t) { T i; } 2947 A(0); 2948 A(0U); 2949 functionDecl(isInstantiated()) 2950 matches 'A(int) {...};' and 'A(unsigned) {...}'. 2951 </pre></td></tr> 2952 2953 2954 <tr><td>Matcher<internal::Matcher<<a href="http://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> 2955 <tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 2956 2957 Given 2958 int j; 2959 template<typename T> void A(T t) { T i; j += 42;} 2960 A(0); 2961 A(0U); 2962 declStmt(isInTemplateInstantiation()) 2963 matches 'int i;' and 'unsigned i'. 2964 unless(stmt(isInTemplateInstantiation())) 2965 will NOT match j += 42; as it's shared between the template definition and 2966 instantiation. 2967 </pre></td></tr> 2968 2969 <!--END_NARROWING_MATCHERS --> 2970 </table> 2971 2972 <!-- ======================================================================= --> 2973 <h2 id="traversal-matchers">AST Traversal Matchers</h2> 2974 <!-- ======================================================================= --> 2975 2976 <p>Traversal matchers specify the relationship to other nodes that are 2977 reachable from the current node.</p> 2978 2979 <p>Note that there are special traversal matchers (has, hasDescendant, forEach and 2980 forEachDescendant) which work on all nodes and allow users to write more generic 2981 match expressions.</p> 2982 2983 <table> 2984 <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 2985 <!-- START_TRAVERSAL_MATCHERS --> 2986 2987 <tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2988 <tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 2989 2990 Unlike anyOf, eachOf will generate a match result for each 2991 matching submatcher. 2992 2993 For example, in: 2994 class A { int a; int b; }; 2995 The matcher: 2996 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 2997 has(fieldDecl(hasName("b")).bind("v")))) 2998 will generate two results binding "v", the first of which binds 2999 the field declaration of a, the second the field declaration of 3000 b. 3001 3002 Usable as: Any Matcher 3003 </pre></td></tr> 3004 3005 3006 <tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 3007 <tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 3008 provided matcher. 3009 3010 Example matches X, A, B, C 3011 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 3012 class X {}; Matches X, because X::X is a class of name X inside X. 3013 class A { class X {}; }; 3014 class B { class C { class X {}; }; }; 3015 3016 DescendantT must be an AST base type. 3017 3018 As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 3019 each result that matches instead of only on the first one. 3020 3021 Note: Recursively combined ForEachDescendant can cause many matches: 3022 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 3023 forEachDescendant(cxxRecordDecl()) 3024 ))) 3025 will match 10 times (plus injected class name matches) on: 3026 class A { class B { class C { class D { class E {}; }; }; }; }; 3027 3028 Usable as: Any Matcher 3029 </pre></td></tr> 3030 3031 3032 <tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 3033 <tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 3034 provided matcher. 3035 3036 Example matches X, Y 3037 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 3038 class X {}; Matches X, because X::X is a class of name X inside X. 3039 class Y { class X {}; }; 3040 class Z { class Y { class X {}; }; }; Does not match Z. 3041 3042 ChildT must be an AST base type. 3043 3044 As opposed to 'has', 'forEach' will cause a match for each result that 3045 matches instead of only on the first one. 3046 3047 Usable as: Any Matcher 3048 </pre></td></tr> 3049 3050 3051 <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 3052 <tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 3053 matcher. 3054 3055 Given 3056 void f() { if (true) { int x = 42; } } 3057 void g() { for (;;) { int x = 43; } } 3058 expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 3059 3060 Usable as: Any Matcher 3061 </pre></td></tr> 3062 3063 3064 <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 3065 <tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 3066 provided matcher. 3067 3068 Example matches X, Y, Z 3069 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 3070 class X {}; Matches X, because X::X is a class of name X inside X. 3071 class Y { class X {}; }; 3072 class Z { class Y { class X {}; }; }; 3073 3074 DescendantT must be an AST base type. 3075 3076 Usable as: Any Matcher 3077 </pre></td></tr> 3078 3079 3080 <tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 3081 <tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 3082 provided matcher. 3083 3084 Example matches X, Y 3085 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 3086 class X {}; Matches X, because X::X is a class of name X inside X. 3087 class Y { class X {}; }; 3088 class Z { class Y { class X {}; }; }; Does not match Z. 3089 3090 ChildT must be an AST base type. 3091 3092 Usable as: Any Matcher 3093 </pre></td></tr> 3094 3095 3096 <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 3097 <tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 3098 matcher. 3099 3100 Given 3101 void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 3102 compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 3103 3104 Usable as: Any Matcher 3105 </pre></td></tr> 3106 3107 3108 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3109 <tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 3110 3111 Given 3112 int i[5]; 3113 void f() { i[1] = 42; } 3114 arraySubscriptExpression(hasBase(implicitCastExpr( 3115 hasSourceExpression(declRefExpr())))) 3116 matches i[1] with the declRefExpr() matching i 3117 </pre></td></tr> 3118 3119 3120 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3121 <tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 3122 3123 Given 3124 int i[5]; 3125 void f() { i[1] = 42; } 3126 arraySubscriptExpression(hasIndex(integerLiteral())) 3127 matches i[1] with the integerLiteral() matching 1 3128 </pre></td></tr> 3129 3130 3131 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3132 <tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 3133 3134 Example matches a (matcher = binaryOperator(hasLHS())) 3135 a || b 3136 </pre></td></tr> 3137 3138 3139 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3140 <tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 3141 3142 Example matches b (matcher = binaryOperator(hasRHS())) 3143 a || b 3144 </pre></td></tr> 3145 3146 3147 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayTypeLoc.html">ArrayTypeLoc</a>></td><td class="name" onclick="toggle('hasElementTypeLoc0')"><a name="hasElementTypeLoc0Anchor">hasElementTypeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 3148 <tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element 3149 type. 3150 3151 Given 3152 struct A {}; 3153 A a[7]; 3154 int b[7]; 3155 arrayType(hasElementType(builtinType())) 3156 matches "int b[7]" 3157 3158 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 3159 </pre></td></tr> 3160 3161 3162 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 3163 <tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 3164 type. 3165 3166 Given 3167 struct A {}; 3168 A a[7]; 3169 int b[7]; 3170 arrayType(hasElementType(builtinType())) 3171 matches "int b[7]" 3172 3173 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 3174 </pre></td></tr> 3175 3176 3177 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicTypeLoc.html">AtomicTypeLoc</a>></td><td class="name" onclick="toggle('hasValueTypeLoc0')"><a name="hasValueTypeLoc0Anchor">hasValueTypeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 3178 <tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type. 3179 3180 Given 3181 _Atomic(int) i; 3182 _Atomic(float) f; 3183 atomicType(hasValueType(isInteger())) 3184 matches "_Atomic(int) i" 3185 3186 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 3187 </pre></td></tr> 3188 3189 3190 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 3191 <tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 3192 3193 Given 3194 _Atomic(int) i; 3195 _Atomic(float) f; 3196 atomicType(hasValueType(isInteger())) 3197 matches "_Atomic(int) i" 3198 3199 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 3200 </pre></td></tr> 3201 3202 3203 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 3204 <tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 3205 3206 Note: There is no TypeLoc for the deduced type and thus no 3207 getDeducedLoc() matcher. 3208 3209 Given 3210 auto a = 1; 3211 auto b = 2.0; 3212 autoType(hasDeducedType(isInteger())) 3213 matches "auto a" 3214 3215 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 3216 </pre></td></tr> 3217 3218 3219 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3220 <tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 3221 binary operator matches. 3222 </pre></td></tr> 3223 3224 3225 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3226 <tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 3227 3228 Example matches a (matcher = binaryOperator(hasLHS())) 3229 a || b 3230 </pre></td></tr> 3231 3232 3233 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3234 <tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 3235 3236 Example matches b (matcher = binaryOperator(hasRHS())) 3237 a || b 3238 </pre></td></tr> 3239 3240 3241 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerTypeLoc.html">BlockPointerTypeLoc</a>></td><td class="name" onclick="toggle('pointeeLoc0')"><a name="pointeeLoc0Anchor">pointeeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 3242 <tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the 3243 pointee matches a given matcher. 3244 3245 Given 3246 int *a; 3247 int const *b; 3248 float const *f; 3249 pointerType(pointee(isConstQualified(), isInteger())) 3250 matches "int const *b" 3251 3252 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 3253 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 3254 </pre></td></tr> 3255 3256 3257 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 3258 <tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 3259 pointee matches a given matcher. 3260 3261 Given 3262 int *a; 3263 int const *b; 3264 float const *f; 3265 pointerType(pointee(isConstQualified(), isInteger())) 3266 matches "int const *b" 3267 3268 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 3269 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 3270 </pre></td></tr> 3271 3272 3273 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3274 <tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 3275 expression. 3276 3277 Given 3278 void x(int, int, int) { int y; x(1, y, 42); } 3279 callExpr(hasAnyArgument(declRefExpr())) 3280 matches x(1, y, 42) 3281 with hasAnyArgument(...) 3282 matching y 3283 3284 FIXME: Currently this will ignore parentheses and implicit casts on 3285 the argument before applying the inner matcher. We'll want to remove 3286 this to allow for greater control by the user once ignoreImplicit() 3287 has been implemented. 3288 </pre></td></tr> 3289 3290 3291 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3292 <tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 3293 call expression. 3294 3295 Example matches y in x(y) 3296 (matcher = callExpr(hasArgument(0, declRefExpr()))) 3297 void x(int) { int y; x(y); } 3298 </pre></td></tr> 3299 3300 3301 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 3302 <tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 3303 matches the given matcher. 3304 3305 The associated declaration is: 3306 - for type nodes, the declaration of the underlying type 3307 - for CallExpr, the declaration of the callee 3308 - for MemberExpr, the declaration of the referenced member 3309 - for CXXConstructExpr, the declaration of the constructor 3310 3311 Also usable as Matcher<T> for any T supporting the getDecl() member 3312 function. e.g. various subtypes of clang::Type and various expressions. 3313 3314 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 3315 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 3316 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 3317 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 3318 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 3319 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 3320 </pre></td></tr> 3321 3322 3323 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>> InnerMatcher</td></tr> 3324 <tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 3325 3326 Given 3327 class A { A() : i(42), j(42) {} int i; int j; }; 3328 cxxConstructorDecl(forEachConstructorInitializer( 3329 forField(decl().bind("x")) 3330 )) 3331 will trigger two matches, binding for 'i' and 'j' respectively. 3332 </pre></td></tr> 3333 3334 3335 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>> InnerMatcher</td></tr> 3336 <tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 3337 3338 Given 3339 struct Foo { 3340 Foo() : foo_(1) { } 3341 int foo_; 3342 }; 3343 cxxRecordDecl(has(cxxConstructorDecl( 3344 hasAnyConstructorInitializer(anything()) 3345 ))) 3346 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 3347 </pre></td></tr> 3348 3349 3350 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>> InnerMatcher</td></tr> 3351 <tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 3352 3353 Given 3354 struct Foo { 3355 Foo() : foo_(1) { } 3356 int foo_; 3357 }; 3358 cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 3359 forField(hasName("foo_")))))) 3360 matches Foo 3361 with forField matching foo_ 3362 </pre></td></tr> 3363 3364 3365 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3366 <tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 3367 3368 Given 3369 struct Foo { 3370 Foo() : foo_(1) { } 3371 int foo_; 3372 }; 3373 cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 3374 withInitializer(integerLiteral(equals(1))))))) 3375 matches Foo 3376 with withInitializer matching (1) 3377 </pre></td></tr> 3378 3379 3380 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 3381 <tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', or 'do while' statement that has 3382 a given body. 3383 3384 Given 3385 for (;;) {} 3386 hasBody(compoundStmt()) 3387 matches 'for (;;) {}' 3388 with compoundStmt() 3389 matching '{}' 3390 </pre></td></tr> 3391 3392 3393 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>> InnerMatcher</td></tr> 3394 <tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 3395 3396 Example: 3397 forStmt(hasLoopVariable(anything())) 3398 matches 'int x' in 3399 for (int x : a) { } 3400 </pre></td></tr> 3401 3402 3403 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3404 <tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 3405 3406 Example: 3407 forStmt(hasRangeInit(anything())) 3408 matches 'a' in 3409 for (int x : a) { } 3410 </pre></td></tr> 3411 3412 3413 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3414 <tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr> 3415 3416 3417 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3418 <tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression. 3419 3420 Example matches y.x() 3421 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))) 3422 class Y { public: void x(); }; 3423 void z() { Y y; y.x(); }", 3424 3425 FIXME: Overload to allow directly matching types? 3426 </pre></td></tr> 3427 3428 3429 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 3430 <tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 3431 </pre></td></tr> 3432 3433 3434 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 3435 <tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified 3436 matcher, or is a pointer to a type that matches the InnerMatcher. 3437 </pre></td></tr> 3438 3439 3440 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> InnerMatcher</td></tr> 3441 <tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 3442 belongs to. 3443 3444 FIXME: Generalize this for other kinds of declarations. 3445 FIXME: What other kind of declarations would we need to generalize 3446 this to? 3447 3448 Example matches A() in the last line 3449 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 3450 ofClass(hasName("A")))))) 3451 class A { 3452 public: 3453 A(); 3454 }; 3455 A a = A(); 3456 </pre></td></tr> 3457 3458 3459 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>> InnerMatcher</td></tr> 3460 <tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 3461 3462 Given: 3463 class A { void func(); }; 3464 class B { void member(); }; 3465 3466 cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 3467 A but not B. 3468 </pre></td></tr> 3469 3470 3471 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 3472 <tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from 3473 a class matching Base. 3474 3475 Note that a class is not considered to be derived from itself. 3476 3477 Example matches Y, Z, C (Base == hasName("X")) 3478 class X; 3479 class Y : public X {}; directly derived 3480 class Z : public Y {}; indirectly derived 3481 typedef X A; 3482 typedef A B; 3483 class C : public B {}; derived from a typedef of X 3484 3485 In the following example, Bar matches isDerivedFrom(hasName("X")): 3486 class Foo; 3487 typedef Foo X; 3488 class Bar : public Foo {}; derived from a type that X is a typedef of 3489 </pre></td></tr> 3490 3491 3492 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 3493 <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 3494 match Base. 3495 </pre></td></tr> 3496 3497 3498 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 3499 <tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 3500 given matcher. 3501 3502 Example matches y.x() (matcher = callExpr(callee( 3503 cxxMethodDecl(hasName("x"))))) 3504 class Y { public: void x(); }; 3505 void z() { Y y; y.x(); } 3506 </pre></td></tr> 3507 3508 3509 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 3510 <tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 3511 3512 Given 3513 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 3514 void f() { f(); } 3515 callExpr(callee(expr())) 3516 matches this->x(), x(), y.x(), f() 3517 with callee(...) 3518 matching this->x, x, y.x, f respectively 3519 3520 Note: Callee cannot take the more general internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 3521 because this introduces ambiguous overloads with calls to Callee taking a 3522 internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 3523 implemented in terms of implicit casts. 3524 </pre></td></tr> 3525 3526 3527 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3528 <tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 3529 expression. 3530 3531 Given 3532 void x(int, int, int) { int y; x(1, y, 42); } 3533 callExpr(hasAnyArgument(declRefExpr())) 3534 matches x(1, y, 42) 3535 with hasAnyArgument(...) 3536 matching y 3537 3538 FIXME: Currently this will ignore parentheses and implicit casts on 3539 the argument before applying the inner matcher. We'll want to remove 3540 this to allow for greater control by the user once ignoreImplicit() 3541 has been implemented. 3542 </pre></td></tr> 3543 3544 3545 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3546 <tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 3547 call expression. 3548 3549 Example matches y in x(y) 3550 (matcher = callExpr(hasArgument(0, declRefExpr()))) 3551 void x(int) { int y; x(y); } 3552 </pre></td></tr> 3553 3554 3555 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 3556 <tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 3557 matches the given matcher. 3558 3559 The associated declaration is: 3560 - for type nodes, the declaration of the underlying type 3561 - for CallExpr, the declaration of the callee 3562 - for MemberExpr, the declaration of the referenced member 3563 - for CXXConstructExpr, the declaration of the constructor 3564 3565 Also usable as Matcher<T> for any T supporting the getDecl() member 3566 function. e.g. various subtypes of clang::Type and various expressions. 3567 3568 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 3569 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 3570 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 3571 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 3572 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 3573 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 3574 </pre></td></tr> 3575 3576 3577 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3578 <tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 3579 extension, matches the constant given in the statement. 3580 3581 Given 3582 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 3583 caseStmt(hasCaseConstant(integerLiteral())) 3584 matches "case 1:" 3585 </pre></td></tr> 3586 3587 3588 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3589 <tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher. 3590 3591 Example: matches "a string" (matcher = 3592 hasSourceExpression(cxxConstructExpr())) 3593 class URL { URL(string); }; 3594 URL url = "a string"; 3595 </pre></td></tr> 3596 3597 3598 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 3599 <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one 3600 TemplateArgument matching the given InnerMatcher. 3601 3602 Given 3603 template<typename T> class A {}; 3604 template<> class A<double> {}; 3605 A<int> a; 3606 classTemplateSpecializationDecl(hasAnyTemplateArgument( 3607 refersToType(asString("int")))) 3608 matches the specialization A<int> 3609 </pre></td></tr> 3610 3611 3612 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 3613 <tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument 3614 matches the given InnerMatcher. 3615 3616 Given 3617 template<typename T, typename U> class A {}; 3618 A<bool, int> b; 3619 A<int, bool> c; 3620 classTemplateSpecializationDecl(hasTemplateArgument( 3621 1, refersToType(asString("int")))) 3622 matches the specialization A<bool, int> 3623 </pre></td></tr> 3624 3625 3626 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexTypeLoc.html">ComplexTypeLoc</a>></td><td class="name" onclick="toggle('hasElementTypeLoc1')"><a name="hasElementTypeLoc1Anchor">hasElementTypeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 3627 <tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element 3628 type. 3629 3630 Given 3631 struct A {}; 3632 A a[7]; 3633 int b[7]; 3634 arrayType(hasElementType(builtinType())) 3635 matches "int b[7]" 3636 3637 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 3638 </pre></td></tr> 3639 3640 3641 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 3642 <tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 3643 type. 3644 3645 Given 3646 struct A {}; 3647 A a[7]; 3648 int b[7]; 3649 arrayType(hasElementType(builtinType())) 3650 matches "int b[7]" 3651 3652 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 3653 </pre></td></tr> 3654 3655 3656 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 3657 <tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 3658 a given matcher. 3659 3660 Given 3661 { {}; 1+2; } 3662 hasAnySubstatement(compoundStmt()) 3663 matches '{ {}; 1+2; }' 3664 with compoundStmt() 3665 matching '{}' 3666 </pre></td></tr> 3667 3668 3669 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>></td><td class="name" onclick="toggle('hasCondition4')"><a name="hasCondition4Anchor">hasCondition</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3670 <tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 3671 or conditional operator. 3672 3673 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 3674 if (true) {} 3675 </pre></td></tr> 3676 3677 3678 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>></td><td class="name" onclick="toggle('hasFalseExpression0')"><a name="hasFalseExpression0Anchor">hasFalseExpression</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3679 <tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator. 3680 3681 Example matches b 3682 condition ? a : b 3683 </pre></td></tr> 3684 3685 3686 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>></td><td class="name" onclick="toggle('hasTrueExpression0')"><a name="hasTrueExpression0Anchor">hasTrueExpression</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3687 <tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 3688 3689 Example matches a 3690 condition ? a : b 3691 </pre></td></tr> 3692 3693 3694 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerType</td></tr> 3695 <tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher 3696 </pre></td></tr> 3697 3698 3699 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 3700 <tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 3701 matches the given matcher. 3702 3703 The associated declaration is: 3704 - for type nodes, the declaration of the underlying type 3705 - for CallExpr, the declaration of the callee 3706 - for MemberExpr, the declaration of the referenced member 3707 - for CXXConstructExpr, the declaration of the constructor 3708 3709 Also usable as Matcher<T> for any T supporting the getDecl() member 3710 function. e.g. various subtypes of clang::Type and various expressions. 3711 3712 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 3713 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 3714 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 3715 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 3716 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 3717 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 3718 </pre></td></tr> 3719 3720 3721 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr> 3722 <tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 3723 specific using shadow declaration. 3724 3725 Given 3726 namespace a { void f() {} } 3727 using a::f; 3728 void g() { 3729 f(); Matches this .. 3730 a::f(); .. but not this. 3731 } 3732 declRefExpr(throughUsingDecl(anything())) 3733 matches f() 3734 </pre></td></tr> 3735 3736 3737 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 3738 <tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 3739 specified matcher. 3740 3741 Example matches x in if(x) 3742 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 3743 bool x; 3744 if (x) {} 3745 </pre></td></tr> 3746 3747 3748 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 3749 <tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 3750 3751 Note that this does not work for global declarations because the AST 3752 breaks up multiple-declaration DeclStmt's into multiple single-declaration 3753 DeclStmt's. 3754 Example: Given non-global declarations 3755 int a, b = 0; 3756 int c; 3757 int d = 2, e; 3758 declStmt(containsDeclaration( 3759 0, varDecl(hasInitializer(anything())))) 3760 matches only 'int d = 2, e;', and 3761 declStmt(containsDeclaration(1, varDecl())) 3762 matches 'int a, b = 0' as well as 'int d = 2, e;' 3763 but 'int c;' is not matched. 3764 </pre></td></tr> 3765 3766 3767 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 3768 <tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 3769 3770 Given 3771 int a, b; 3772 int c; 3773 declStmt(hasSingleDecl(anything())) 3774 matches 'int c;' but not 'int a, b;'. 3775 </pre></td></tr> 3776 3777 3778 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 3779 <tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 3780 the inner matcher. 3781 3782 Given 3783 int x; 3784 declaratorDecl(hasTypeLoc(loc(asString("int")))) 3785 matches int x 3786 </pre></td></tr> 3787 3788 3789 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 3790 <tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 3791 Decl, matches InnerMatcher. 3792 3793 Given 3794 namespace N { 3795 namespace M { 3796 class D {}; 3797 } 3798 } 3799 3800 cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 3801 declaration of class D. 3802 </pre></td></tr> 3803 3804 3805 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 3806 <tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has 3807 a given body. 3808 3809 Given 3810 for (;;) {} 3811 hasBody(compoundStmt()) 3812 matches 'for (;;) {}' 3813 with compoundStmt() 3814 matching '{}' 3815 </pre></td></tr> 3816 3817 3818 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3819 <tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 3820 or conditional operator. 3821 3822 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 3823 if (true) {} 3824 </pre></td></tr> 3825 3826 3827 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr> 3828 <tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 3829 matches InnerMatcher if the qualifier exists. 3830 3831 Given 3832 namespace N { 3833 namespace M { 3834 class D {}; 3835 } 3836 } 3837 N::M::D d; 3838 3839 elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 3840 matches the type of the variable declaration of d. 3841 </pre></td></tr> 3842 3843 3844 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 3845 <tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 3846 3847 Given 3848 namespace N { 3849 namespace M { 3850 class D {}; 3851 } 3852 } 3853 N::M::D d; 3854 3855 elaboratedType(namesType(recordType( 3856 hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 3857 declaration of d. 3858 </pre></td></tr> 3859 3860 3861 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 3862 <tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 3863 matches the given matcher. 3864 3865 The associated declaration is: 3866 - for type nodes, the declaration of the underlying type 3867 - for CallExpr, the declaration of the callee 3868 - for MemberExpr, the declaration of the referenced member 3869 - for CXXConstructExpr, the declaration of the constructor 3870 3871 Also usable as Matcher<T> for any T supporting the getDecl() member 3872 function. e.g. various subtypes of clang::Type and various expressions. 3873 3874 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 3875 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 3876 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 3877 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 3878 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 3879 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 3880 </pre></td></tr> 3881 3882 3883 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 3884 <tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 3885 3886 (Note: Clang's AST refers to other conversions as "casts" too, and calls 3887 actual casts "explicit" casts.) 3888 </pre></td></tr> 3889 3890 3891 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 3892 <tr><td colspan="4" class="doc" id="hasType2"><pre>Overloaded to match the declaration of the expression's or value 3893 declaration's type. 3894 3895 In case of a value declaration (for example a variable declaration), 3896 this resolves one layer of indirection. For example, in the value 3897 declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 3898 X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 3899 declaration of x. 3900 3901 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 3902 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 3903 class X {}; 3904 void y(X &x) { x; X z; } 3905 3906 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> 3907 </pre></td></tr> 3908 3909 3910 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 3911 <tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 3912 matcher. 3913 3914 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 3915 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 3916 class X {}; 3917 void y(X &x) { x; X z; } 3918 </pre></td></tr> 3919 3920 3921 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3922 <tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 3923 are stripped off. 3924 3925 Parentheses and explicit casts are not discarded. 3926 Given 3927 int arr[5]; 3928 int a = 0; 3929 char b = 0; 3930 const int c = a; 3931 int *d = arr; 3932 long e = (long) 0l; 3933 The matchers 3934 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 3935 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 3936 would match the declarations for a, b, c, and d, but not e. 3937 While 3938 varDecl(hasInitializer(integerLiteral())) 3939 varDecl(hasInitializer(declRefExpr())) 3940 only match the declarations for b, c, and d. 3941 </pre></td></tr> 3942 3943 3944 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3945 <tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 3946 casts are stripped off. 3947 3948 Implicit and non-C Style casts are also discarded. 3949 Given 3950 int a = 0; 3951 char b = (0); 3952 void* c = reinterpret_cast<char*>(0); 3953 char d = char(0); 3954 The matcher 3955 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 3956 would match the declarations for a, b, c, and d. 3957 while 3958 varDecl(hasInitializer(integerLiteral())) 3959 only match the declaration for a. 3960 </pre></td></tr> 3961 3962 3963 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3964 <tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 3965 parentheses are stripped off. 3966 3967 Explicit casts are not discarded. 3968 Given 3969 int arr[5]; 3970 int a = 0; 3971 char b = (0); 3972 const int c = a; 3973 int *d = (arr); 3974 long e = ((long) 0l); 3975 The matchers 3976 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 3977 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 3978 would match the declarations for a, b, c, and d, but not e. 3979 while 3980 varDecl(hasInitializer(integerLiteral())) 3981 varDecl(hasInitializer(declRefExpr())) 3982 would only match the declaration for a. 3983 </pre></td></tr> 3984 3985 3986 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 3987 <tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has 3988 a given body. 3989 3990 Given 3991 for (;;) {} 3992 hasBody(compoundStmt()) 3993 matches 'for (;;) {}' 3994 with compoundStmt() 3995 matching '{}' 3996 </pre></td></tr> 3997 3998 3999 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4000 <tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 4001 or conditional operator. 4002 4003 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4004 if (true) {} 4005 </pre></td></tr> 4006 4007 4008 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4009 <tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 4010 4011 Example: 4012 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 4013 matches '++x' in 4014 for (x; x < N; ++x) { } 4015 </pre></td></tr> 4016 4017 4018 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4019 <tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 4020 4021 Example: 4022 forStmt(hasLoopInit(declStmt())) 4023 matches 'int x = 0' in 4024 for (int x = 0; x < N; ++x) { } 4025 </pre></td></tr> 4026 4027 4028 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 4029 <tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration. 4030 4031 Does not match the 'this' parameter of a method. 4032 4033 Given 4034 class X { void f(int x, int y, int z) {} }; 4035 cxxMethodDecl(hasAnyParameter(hasName("y"))) 4036 matches f(int x, int y, int z) {} 4037 with hasAnyParameter(...) 4038 matching int y 4039 </pre></td></tr> 4040 4041 4042 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 4043 <tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration. 4044 4045 Given 4046 class X { void f(int x) {} }; 4047 cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 4048 matches f(int x) {} 4049 with hasParameter(...) 4050 matching int x 4051 </pre></td></tr> 4052 4053 4054 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4055 <tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 4056 4057 Given: 4058 class X { int f() { return 1; } }; 4059 cxxMethodDecl(returns(asString("int"))) 4060 matches int f() { return 1; } 4061 </pre></td></tr> 4062 4063 4064 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4065 <tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 4066 or conditional operator. 4067 4068 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4069 if (true) {} 4070 </pre></td></tr> 4071 4072 4073 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>> InnerMatcher</td></tr> 4074 <tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 4075 4076 Given 4077 if (A* a = GetAPointer()) {} 4078 hasConditionVariableStatement(...) 4079 matches 'A* a = GetAPointer()'. 4080 </pre></td></tr> 4081 4082 4083 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4084 <tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 4085 4086 Examples matches the if statement 4087 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 4088 if (false) false; else true; 4089 </pre></td></tr> 4090 4091 4092 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4093 <tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 4094 4095 Examples matches the if statement 4096 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 4097 if (false) true; else false; 4098 </pre></td></tr> 4099 4100 4101 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4102 <tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 4103 matcher. 4104 4105 FIXME: Unit test this matcher 4106 </pre></td></tr> 4107 4108 4109 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4110 <tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 4111 matches the given matcher. 4112 4113 The associated declaration is: 4114 - for type nodes, the declaration of the underlying type 4115 - for CallExpr, the declaration of the callee 4116 - for MemberExpr, the declaration of the referenced member 4117 - for CXXConstructExpr, the declaration of the constructor 4118 4119 Also usable as Matcher<T> for any T supporting the getDecl() member 4120 function. e.g. various subtypes of clang::Type and various expressions. 4121 4122 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4123 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4124 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 4125 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4126 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4127 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4128 </pre></td></tr> 4129 4130 4131 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4132 <tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 4133 matches the given matcher. 4134 4135 The associated declaration is: 4136 - for type nodes, the declaration of the underlying type 4137 - for CallExpr, the declaration of the callee 4138 - for MemberExpr, the declaration of the referenced member 4139 - for CXXConstructExpr, the declaration of the constructor 4140 4141 Also usable as Matcher<T> for any T supporting the getDecl() member 4142 function. e.g. various subtypes of clang::Type and various expressions. 4143 4144 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4145 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4146 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 4147 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4148 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4149 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4150 </pre></td></tr> 4151 4152 4153 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4154 <tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 4155 matches the given matcher. 4156 4157 The associated declaration is: 4158 - for type nodes, the declaration of the underlying type 4159 - for CallExpr, the declaration of the callee 4160 - for MemberExpr, the declaration of the referenced member 4161 - for CXXConstructExpr, the declaration of the constructor 4162 4163 Also usable as Matcher<T> for any T supporting the getDecl() member 4164 function. e.g. various subtypes of clang::Type and various expressions. 4165 4166 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4167 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4168 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 4169 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4170 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4171 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4172 </pre></td></tr> 4173 4174 4175 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4176 <tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is 4177 matched by a given matcher. 4178 4179 Given 4180 struct X { int m; }; 4181 void f(X x) { x.m; m; } 4182 memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))))) 4183 matches "x.m" and "m" 4184 with hasObjectExpression(...) 4185 matching "x" and the implicit object expression of "m" which has type X*. 4186 </pre></td></tr> 4187 4188 4189 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> InnerMatcher</td></tr> 4190 <tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 4191 given matcher. 4192 4193 Given 4194 struct { int first, second; } first, second; 4195 int i(second.first); 4196 int j(first.second); 4197 memberExpr(member(hasName("first"))) 4198 matches second.first 4199 but not first.second (because the member name there is "second"). 4200 </pre></td></tr> 4201 4202 4203 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerTypeLoc.html">MemberPointerTypeLoc</a>></td><td class="name" onclick="toggle('pointeeLoc1')"><a name="pointeeLoc1Anchor">pointeeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 4204 <tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the 4205 pointee matches a given matcher. 4206 4207 Given 4208 int *a; 4209 int const *b; 4210 float const *f; 4211 pointerType(pointee(isConstQualified(), isInteger())) 4212 matches "int const *b" 4213 4214 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 4215 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 4216 </pre></td></tr> 4217 4218 4219 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 4220 <tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 4221 pointee matches a given matcher. 4222 4223 Given 4224 int *a; 4225 int const *b; 4226 float const *f; 4227 pointerType(pointee(isConstQualified(), isInteger())) 4228 matches "int const *b" 4229 4230 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 4231 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 4232 </pre></td></tr> 4233 4234 4235 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>> InnerMatcher</td></tr> 4236 <tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 4237 4238 Given 4239 struct A { struct B { struct C {}; }; }; 4240 A::B::C c; 4241 nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 4242 matches "A::" 4243 </pre></td></tr> 4244 4245 4246 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> InnerMatcher</td></tr> 4247 <tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 4248 given TypeLoc. 4249 4250 Given 4251 struct A { struct B { struct C {}; }; }; 4252 A::B::C c; 4253 nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 4254 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 4255 matches "A::" 4256 </pre></td></tr> 4257 4258 4259 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr> 4260 <tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 4261 4262 Given 4263 struct A { struct B { struct C {}; }; }; 4264 A::B::C c; 4265 nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 4266 matches "A::" 4267 </pre></td></tr> 4268 4269 4270 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>> InnerMatcher</td></tr> 4271 <tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 4272 given namespace matcher. 4273 4274 Given 4275 namespace ns { struct A {}; } 4276 ns::A a; 4277 nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 4278 matches "ns::" 4279 </pre></td></tr> 4280 4281 4282 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4283 <tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 4284 given QualType matcher without qualifiers. 4285 4286 Given 4287 struct A { struct B { struct C {}; }; }; 4288 A::B::C c; 4289 nestedNameSpecifier(specifiesType( 4290 hasDeclaration(cxxRecordDecl(hasName("A"))) 4291 )) 4292 matches "A::" 4293 </pre></td></tr> 4294 4295 4296 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4297 <tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 4298 call expression. 4299 4300 Example matches y in x(y) 4301 (matcher = callExpr(hasArgument(0, declRefExpr()))) 4302 void x(int) { int y; x(y); } 4303 </pre></td></tr> 4304 4305 4306 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4307 <tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 4308 4309 Example 4310 matcher = objCMessageExpr(hasRecieverType(asString("UIWebView *"))); 4311 matches the [webView ...] message invocation. 4312 NSString *webViewJavaScript = ... 4313 UIWebView *webView = ... 4314 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 4315 </pre></td></tr> 4316 4317 4318 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 4319 <tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 4320 4321 Given 4322 int (*ptr_to_array)[4]; 4323 int (*ptr_to_func)(int); 4324 4325 varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 4326 ptr_to_func but not ptr_to_array. 4327 4328 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 4329 </pre></td></tr> 4330 4331 4332 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>></td><td class="name" onclick="toggle('pointeeLoc2')"><a name="pointeeLoc2Anchor">pointeeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 4333 <tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the 4334 pointee matches a given matcher. 4335 4336 Given 4337 int *a; 4338 int const *b; 4339 float const *f; 4340 pointerType(pointee(isConstQualified(), isInteger())) 4341 matches "int const *b" 4342 4343 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 4344 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 4345 </pre></td></tr> 4346 4347 4348 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 4349 <tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 4350 pointee matches a given matcher. 4351 4352 Given 4353 int *a; 4354 int const *b; 4355 float const *f; 4356 pointerType(pointee(isConstQualified(), isInteger())) 4357 matches "int const *b" 4358 4359 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 4360 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 4361 </pre></td></tr> 4362 4363 4364 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4365 <tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 4366 4367 Given: 4368 typedef int &int_ref; 4369 int a; 4370 int_ref b = a; 4371 4372 varDecl(hasType(qualType(referenceType()))))) will not match the 4373 declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 4374 </pre></td></tr> 4375 4376 4377 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4378 <tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 4379 matches the given matcher. 4380 4381 The associated declaration is: 4382 - for type nodes, the declaration of the underlying type 4383 - for CallExpr, the declaration of the callee 4384 - for MemberExpr, the declaration of the referenced member 4385 - for CXXConstructExpr, the declaration of the constructor 4386 4387 Also usable as Matcher<T> for any T supporting the getDecl() member 4388 function. e.g. various subtypes of clang::Type and various expressions. 4389 4390 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4391 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4392 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 4393 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4394 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4395 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4396 </pre></td></tr> 4397 4398 4399 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4400 <tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 4401 </pre></td></tr> 4402 4403 4404 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4405 <tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 4406 matches the specified matcher. 4407 4408 Example matches y->x() 4409 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 4410 cxxRecordDecl(hasName("Y"))))))) 4411 class Y { public: void x(); }; 4412 void z() { Y *y; y->x(); } 4413 </pre></td></tr> 4414 4415 4416 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4417 <tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 4418 </pre></td></tr> 4419 4420 4421 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4422 <tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 4423 type matches the specified matcher. 4424 4425 Example matches X &x and const X &y 4426 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 4427 class X { 4428 void a(X b) { 4429 X &x = b; 4430 const X &y = b; 4431 } 4432 }; 4433 </pre></td></tr> 4434 4435 4436 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4437 <tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 4438 matches the given matcher. 4439 4440 The associated declaration is: 4441 - for type nodes, the declaration of the underlying type 4442 - for CallExpr, the declaration of the callee 4443 - for MemberExpr, the declaration of the referenced member 4444 - for CXXConstructExpr, the declaration of the constructor 4445 4446 Also usable as Matcher<T> for any T supporting the getDecl() member 4447 function. e.g. various subtypes of clang::Type and various expressions. 4448 4449 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4450 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4451 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 4452 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4453 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4454 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4455 </pre></td></tr> 4456 4457 4458 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>></td><td class="name" onclick="toggle('pointeeLoc3')"><a name="pointeeLoc3Anchor">pointeeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 4459 <tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the 4460 pointee matches a given matcher. 4461 4462 Given 4463 int *a; 4464 int const *b; 4465 float const *f; 4466 pointerType(pointee(isConstQualified(), isInteger())) 4467 matches "int const *b" 4468 4469 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 4470 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 4471 </pre></td></tr> 4472 4473 4474 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 4475 <tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 4476 pointee matches a given matcher. 4477 4478 Given 4479 int *a; 4480 int const *b; 4481 float const *f; 4482 pointerType(pointee(isConstQualified(), isInteger())) 4483 matches "int const *b" 4484 4485 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 4486 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 4487 </pre></td></tr> 4488 4489 4490 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr> 4491 <tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 4492 alignof. 4493 </pre></td></tr> 4494 4495 4496 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr> 4497 <tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 4498 sizeof. 4499 </pre></td></tr> 4500 4501 4502 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>> InnerMatcher</td></tr> 4503 <tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 4504 statement. This matcher may produce multiple matches. 4505 4506 Given 4507 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 4508 switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 4509 matches four times, with "c" binding each of "case 1:", "case 2:", 4510 "case 3:" and "case 4:", and "s" respectively binding "switch (1)", 4511 "switch (1)", "switch (2)" and "switch (2)". 4512 </pre></td></tr> 4513 4514 4515 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4516 <tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 4517 matches the given matcher. 4518 4519 The associated declaration is: 4520 - for type nodes, the declaration of the underlying type 4521 - for CallExpr, the declaration of the callee 4522 - for MemberExpr, the declaration of the referenced member 4523 - for CXXConstructExpr, the declaration of the constructor 4524 4525 Also usable as Matcher<T> for any T supporting the getDecl() member 4526 function. e.g. various subtypes of clang::Type and various expressions. 4527 4528 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4529 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4530 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 4531 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4532 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4533 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4534 </pre></td></tr> 4535 4536 4537 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4538 <tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 4539 4540 Given 4541 template<typename T> struct A {}; 4542 struct B { B* next; }; 4543 A<&B::next> a; 4544 templateSpecializationType(hasAnyTemplateArgument( 4545 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 4546 matches the specialization A<&B::next> with fieldDecl(...) matching 4547 B::next 4548 </pre></td></tr> 4549 4550 4551 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4552 <tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 4553 declaration. 4554 4555 Given 4556 template<typename T> struct A {}; 4557 struct B { B* next; }; 4558 A<&B::next> a; 4559 classTemplateSpecializationDecl(hasAnyTemplateArgument( 4560 refersToDeclaration(fieldDecl(hasName("next")))) 4561 matches the specialization A<&B::next> with fieldDecl(...) matching 4562 B::next 4563 </pre></td></tr> 4564 4565 4566 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4567 <tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type. 4568 4569 Given 4570 template<int T> struct A {}; 4571 C<42> c; 4572 classTemplateSpecializationDecl( 4573 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 4574 matches the implicit instantiation of C in C<42>. 4575 </pre></td></tr> 4576 4577 4578 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4579 <tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 4580 4581 Given 4582 struct X {}; 4583 template<typename T> struct A {}; 4584 A<X> a; 4585 classTemplateSpecializationDecl(hasAnyTemplateArgument( 4586 refersToType(class(hasName("X"))))) 4587 matches the specialization A<X> 4588 </pre></td></tr> 4589 4590 4591 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 4592 <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations that have at least one 4593 TemplateArgument matching the given InnerMatcher. 4594 4595 Given 4596 template<typename T> class A {}; 4597 template<> class A<double> {}; 4598 A<int> a; 4599 classTemplateSpecializationDecl(hasAnyTemplateArgument( 4600 refersToType(asString("int")))) 4601 matches the specialization A<int> 4602 </pre></td></tr> 4603 4604 4605 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4606 <tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 4607 matches the given matcher. 4608 4609 The associated declaration is: 4610 - for type nodes, the declaration of the underlying type 4611 - for CallExpr, the declaration of the callee 4612 - for MemberExpr, the declaration of the referenced member 4613 - for CXXConstructExpr, the declaration of the constructor 4614 4615 Also usable as Matcher<T> for any T supporting the getDecl() member 4616 function. e.g. various subtypes of clang::Type and various expressions. 4617 4618 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4619 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4620 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 4621 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4622 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4623 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4624 </pre></td></tr> 4625 4626 4627 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 4628 <tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument 4629 matches the given InnerMatcher. 4630 4631 Given 4632 template<typename T, typename U> class A {}; 4633 A<bool, int> b; 4634 A<int, bool> c; 4635 classTemplateSpecializationDecl(hasTemplateArgument( 4636 1, refersToType(asString("int")))) 4637 matches the specialization A<bool, int> 4638 </pre></td></tr> 4639 4640 4641 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4642 <tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 4643 matches the given matcher. 4644 4645 The associated declaration is: 4646 - for type nodes, the declaration of the underlying type 4647 - for CallExpr, the declaration of the callee 4648 - for MemberExpr, the declaration of the referenced member 4649 - for CXXConstructExpr, the declaration of the constructor 4650 4651 Also usable as Matcher<T> for any T supporting the getDecl() member 4652 function. e.g. various subtypes of clang::Type and various expressions. 4653 4654 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4655 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4656 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 4657 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4658 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4659 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4660 </pre></td></tr> 4661 4662 4663 <tr><td>Matcher<T></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<T> Matcher</td></tr> 4664 <tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 4665 4666 Generates results for each match. 4667 4668 For example, in: 4669 class A { class B {}; class C {}; }; 4670 The matcher: 4671 cxxRecordDecl(hasName("::A"), 4672 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 4673 will generate results for A, B and C. 4674 4675 Usable as: Any Matcher 4676 </pre></td></tr> 4677 4678 4679 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4680 <tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 4681 matches the given matcher. 4682 4683 The associated declaration is: 4684 - for type nodes, the declaration of the underlying type 4685 - for CallExpr, the declaration of the callee 4686 - for MemberExpr, the declaration of the referenced member 4687 - for CXXConstructExpr, the declaration of the constructor 4688 4689 Also usable as Matcher<T> for any T supporting the getDecl() member 4690 function. e.g. various subtypes of clang::Type and various expressions. 4691 4692 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4693 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4694 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 4695 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4696 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4697 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4698 </pre></td></tr> 4699 4700 4701 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4702 <tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 4703 4704 Given 4705 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 4706 unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 4707 matches sizeof(a) and alignof(c) 4708 </pre></td></tr> 4709 4710 4711 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4712 <tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 4713 4714 Example matches true (matcher = hasUnaryOperand( 4715 cxxBoolLiteral(equals(true)))) 4716 !true 4717 </pre></td></tr> 4718 4719 4720 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4721 <tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 4722 matches the given matcher. 4723 4724 The associated declaration is: 4725 - for type nodes, the declaration of the underlying type 4726 - for CallExpr, the declaration of the callee 4727 - for MemberExpr, the declaration of the referenced member 4728 - for CXXConstructExpr, the declaration of the constructor 4729 4730 Also usable as Matcher<T> for any T supporting the getDecl() member 4731 function. e.g. various subtypes of clang::Type and various expressions. 4732 4733 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4734 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4735 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, 4736 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4737 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4738 Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4739 </pre></td></tr> 4740 4741 4742 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr> 4743 <tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 4744 4745 Given 4746 namespace X { void b(); } 4747 using X::b; 4748 usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 4749 matches using X::b </pre></td></tr> 4750 4751 4752 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> InnerMatcher</td></tr> 4753 <tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 4754 matched by the given matcher. 4755 4756 Given 4757 namespace X { int a; void b(); } 4758 using X::a; 4759 using X::b; 4760 usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 4761 matches using X::b but not using X::a </pre></td></tr> 4762 4763 4764 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4765 <tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value 4766 declaration's type. 4767 4768 In case of a value declaration (for example a variable declaration), 4769 this resolves one layer of indirection. For example, in the value 4770 declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 4771 X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 4772 declaration of x. 4773 4774 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 4775 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 4776 class X {}; 4777 void y(X &x) { x; X z; } 4778 4779 Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> 4780 </pre></td></tr> 4781 4782 4783 <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>></td><td class="name" onclick="toggle('hasType1')"><a name="hasType1Anchor">hasType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4784 <tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 4785 matcher. 4786 4787 Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 4788 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 4789 class X {}; 4790 void y(X &x) { x; X z; } 4791 </pre></td></tr> 4792 4793 4794 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4795 <tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 4796 that matches the given matcher. 4797 4798 Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 4799 bool y() { return true; } 4800 bool x = y(); 4801 </pre></td></tr> 4802 4803 4804 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4805 <tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 4806 expression. 4807 4808 Given 4809 void f(int b) { 4810 int a[b]; 4811 } 4812 variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 4813 varDecl(hasName("b"))))))) 4814 matches "int a[b]" 4815 </pre></td></tr> 4816 4817 4818 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4819 <tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has 4820 a given body. 4821 4822 Given 4823 for (;;) {} 4824 hasBody(compoundStmt()) 4825 matches 'for (;;) {}' 4826 with compoundStmt() 4827 matching '{}' 4828 </pre></td></tr> 4829 4830 4831 <tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4832 <tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 4833 or conditional operator. 4834 4835 Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4836 if (true) {} 4837 </pre></td></tr> 4838 4839 4840 <tr><td>Matcher<internal::BindableMatcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr> 4841 <tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 4842 NestedNameSpecifier-matcher matches. 4843 </pre></td></tr> 4844 4845 4846 <tr><td>Matcher<internal::BindableMatcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4847 <tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 4848 QualType-matcher matches. 4849 </pre></td></tr> 4850 4851 <!--END_TRAVERSAL_MATCHERS --> 4852 </table> 4853 4854 </div> 4855 </body> 4856 </html> 4857 4858 4859