1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 2 "http://www.w3.org/TR/html4/strict.dtd"> 3<html> 4<head> 5<title>AST Matcher Reference</title> 6<link type="text/css" rel="stylesheet" href="../menu.css" /> 7<link type="text/css" rel="stylesheet" href="../content.css" /> 8<style type="text/css"> 9td { 10 padding: .33em; 11} 12td.doc { 13 display: none; 14 border-bottom: 1px solid black; 15} 16td.name:hover { 17 color: blue; 18 cursor: pointer; 19} 20span.mono { font-family: monospace; } 21 22.traverse_compare, .traverse_compare td, .traverse_compare th { 23 border: 1px solid black; 24 border-collapse: collapse; 25} 26</style> 27<script type="text/javascript"> 28function toggle(id) { 29 if (!id) return; 30 row = document.getElementById(id); 31 if (row.style.display != 'table-cell') 32 row.style.display = 'table-cell'; 33 else 34 row.style.display = 'none'; 35} 36</script> 37</head> 38<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))"> 39 40<!--#include virtual="../menu.html.incl"--> 41 42<div id="content"> 43 44<h1>AST Matcher Reference</h1> 45 46<p>This document shows all currently implemented matchers. The matchers are grouped 47by category and node type they match. You can click on matcher names to show the 48matcher's source documentation.</p> 49 50<p>There are three different basic categories of matchers: 51<ul> 52<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li> 53<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li> 54<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li> 55</ul> 56</p> 57 58<p>Within each category the matchers are ordered by node type they match on. 59Note that if a matcher can match multiple node types, it will appear 60multiple times. This means that by searching for Matcher<Stmt> you can 61find all matchers that can be used to match on Stmt nodes.</p> 62 63<p>The exception to that rule are matchers that can match on any node. Those 64are marked with a * and are listed in the beginning of each category.</p> 65 66<p>Note that the categorization of matchers is a great help when you combine 67them into matcher expressions. You will usually want to form matcher expressions 68that read like english sentences by alternating between node matchers and 69narrowing or traversal matchers, like this: 70<pre> 71recordDecl(hasDescendant( 72 ifStmt(hasTrueExpression( 73 expr(hasDescendant( 74 ifStmt())))))) 75</pre> 76</p> 77 78<!-- ======================================================================= --> 79<h2 id="traverse-mode">Traverse Mode</h2> 80<!-- ======================================================================= --> 81 82<p>The default mode of operation of AST Matchers visits all nodes in the AST, 83even if they are not spelled in the source. This is 84<span class="mono">AsIs</span> mode. This mode requires writing AST matchers 85that explicitly traverse or ignore implicit nodes, such as parentheses 86surrounding an expression or expressions with cleanups. These implicit 87nodes are not always obvious from the syntax of the source code, and so this 88mode requires careful consideration and testing to get the desired behavior 89from an AST matcher. 90</p> 91 92<p>In addition, because template instantiations are matched in the default mode, 93transformations can be accidentally made to template declarations. Finally, 94because implicit nodes are matched by default, transformations can be made on 95entirely incorrect places in the code.</p> 96 97<p>For these reasons, it is possible to ignore AST nodes which are not spelled 98in the source using the <span class="mono">IgnoreUnlessSpelledInSource</span> 99mode. This is likely to be far less error-prone for users who are not already 100very familiar with where implicit nodes appear in the AST. It is also likely 101to be less error-prone for experienced AST users, as difficult cases do not 102need to be encountered and matcher expressions adjusted for these cases.</p> 103 104<p>In clang-query, the mode can be changed with 105<pre> 106set traversal IgnoreUnlessSpelledInSource 107</pre> 108</p> 109This affects both matchers and AST dump output in results. 110 111<p>When using the C++ API such as in clang-tidy checks, the 112<span class="mono">traverse()</span> matcher is used to set the mode: 113<pre> 114Finder->addMatcher(traverse(TK_IgnoreUnlessSpelledInSource, 115 returnStmt(hasReturnArgument(integerLiteral(equals(0)))) 116 ), this); 117</pre> 118</p> 119<p>The following table compares the <span class="mono">AsIs</span> mode with 120the <span class="mono">IgnoreUnlessSpelledInSource</span> mode:</p> 121 122<table class="traverse_compare"> 123<tr> 124<th></th> 125<th><span class="mono">AsIs</span></th> 126<th><span class="mono">IgnoreUnlessSpelledInSource</span></th> 127</tr> 128<tr> 129 <td>AST dump of <span class="mono">func1</span>: 130<pre> 131struct B { 132 B(int); 133}; 134 135B func1() { return 42; } 136</pre> 137 138 </td> 139 <td> 140C++98 dialect: 141<pre> 142FunctionDecl 143`-CompoundStmt 144 `-ReturnStmt 145 `-ExprWithCleanups 146 `-CXXConstructExpr 147 `-MaterializeTemporaryExpr 148 `-ImplicitCastExpr 149 `-ImplicitCastExpr 150 `-CXXConstructExpr 151 `-IntegerLiteral 'int' 42 152</pre> 153C++11, C++14 dialect: 154<pre> 155FunctionDecl 156`-CompoundStmt 157 `-ReturnStmt 158 `-ExprWithCleanups 159 `-CXXConstructExpr 160 `-MaterializeTemporaryExpr 161 `-ImplicitCastExpr 162 `-CXXConstructExpr 163 `-IntegerLiteral 'int' 42 164</pre> 165C++17, C++20 dialect: 166<pre> 167FunctionDecl 168`-CompoundStmt 169 `-ReturnStmt 170 `-ImplicitCastExpr 171 `-CXXConstructExpr 172 `-IntegerLiteral 'int' 42 173</pre> 174</td> 175 <td> 176All dialects: 177 <pre> 178FunctionDecl 179`-CompoundStmt 180 `-ReturnStmt 181 `-IntegerLiteral 'int' 42 182</pre></td> 183</tr> 184 185<tr> 186<td>Matcher for returned <span class="mono">42</span>: 187<pre> 188struct B { 189 B(int); 190}; 191 192B func1() { return 42; } 193</pre> 194 195 </td> 196 <td> 197All dialects: 198<pre> 199returnStmt(hasReturnValue( 200 ignoringImplicit( 201 ignoringElidableConstructorCall( 202 ignoringImplicit( 203 cxxConstructExpr(hasArgument(0, 204 ignoringImplicit( 205 integerLiteral().bind("returnVal") 206 ) 207 )) 208 ) 209 ) 210 ) 211 )) 212</pre></td> 213 <td> 214All dialects: 215<pre> 216returnStmt(hasReturnValue( 217 integerLiteral().bind("returnVal") 218)) 219</pre></td> 220</tr> 221<tr> 222<td>Match result for 223<pre>implicitCastExpr()</pre> 224given: 225<pre> 226struct B { 227 B(int); 228}; 229 230B func1() { return 42; } 231</pre> 232 233</td> 234<td> 235Match found.</td> 236 <td> 237No match.</td> 238</tr> 239<tr> 240 <td>Match result for: 241<pre> 242cxxConstructorDecl( 243 isCopyConstructor() 244 ).bind("prepend_explicit") 245</pre> 246given: 247<pre> 248struct Other {}; 249struct Copyable { 250 Other m_o; 251 Copyable(); 252}; 253</pre> 254</td> 255<td> 256Match found. Insertion produces incorrect output: 257<pre> 258struct Other {}; 259struct explicit Copyable { 260 Other m_o; 261 Copyable(); 262}; 263</pre> 264</td> 265<td> 266No match found. Incorrect replacement not possible. 267</td> 268</tr> 269<tr> 270 <td>Replacement of <span class="mono">begin()</span> 271 with <span class="mono">cbegin()</span>: 272<pre> 273cxxMemberCallExpr( 274 on(ConstContainerExpr), 275 callee(cxxMethodDecl(hasName("begin"))) 276 ).bind("replace_with_cbegin") 277</pre> 278given: 279<pre> 280void foo() { 281 const Container c; 282 c.begin(); 283 284 for (auto i : c) { 285 } 286} 287</pre> 288</td> 289<td> 2902 matches found. Replacement produces incorrect output: 291<pre> 292void foo() { 293 const Container c; 294 c.cbegin(); 295 296 for (auto i :.cbegin() c) { 297 } 298} 299</pre> 300</td> 301<td> 3021 match found. Replacement produces correct output: 303<pre> 304void foo() { 305 const Container c; 306 c.cbegin(); 307 308 for (auto i : c) { 309 } 310} 311</pre> 312</td> 313</tr> 314<tr> 315 <td>Replacement of <span class="mono">int</span> member 316 with <span class="mono">safe_int</span>: 317<pre> 318fieldDecl( 319 hasType(asString("int")) 320 ).bind("use_safe_int") 321</pre> 322given: 323<pre> 324struct S { 325 int m_i; 326}; 327 328template <typename T> struct TemplStruct { 329 TemplStruct() {} 330 ~TemplStruct() {} 331 332private: 333 T m_t; 334}; 335 336void instantiate() { TemplStruct<int> ti; } 337</pre> 338</td> 339<td> 3402 matches found. Replacement produces incorrect output: 341<pre> 342struct S { 343 safe_int m_i; 344}; 345 346template <typename T> struct TemplStruct { 347 TemplStruct() {} 348 ~TemplStruct() {} 349 350private: 351 safe_int m_t; 352}; 353 354void instantiate() { TemplStruct<int> ti; } 355</pre> 356</td> 357<td> 3581 match found. Replacement produces correct output: 359<pre> 360struct S { 361 safe_int m_i; 362}; 363 364template <typename T> struct TemplStruct { 365 TemplStruct() {} 366 ~TemplStruct() {} 367 368private: 369 T m_t; 370}; 371 372void instantiate() { TemplStruct<int> ti; } 373</pre> 374</td> 375</tr> 376<tr> 377 <td>Add prefix to member initializer 378<pre> 379cxxCtorInitializer( 380 forField(fieldDecl()) 381 ).bind("add_prefix") 382</pre> 383given: 384<pre> 385struct Simple {}; 386 387struct Record { 388 Record() : i(42) {} 389private: 390 int i; 391 Simple s; 392}; 393</pre> 394</td> 395<td> 3962 matches found. Replacement produces incorrect output: 397<pre> 398struct Simple {}; 399 400struct Record { 401 m_Record() : m_i(42) {} 402private: 403 int i; 404 Simple s; 405}; 406</pre> 407</td> 408<td> 4091 match found. Replacement produces correct output: 410<pre> 411struct Simple {}; 412 413struct Record { 414 Record() : m_i(42) {} 415private: 416 int i; 417 Simple s; 418}; 419</pre> 420</td> 421</tr> 422<tr> 423 <td>Ignored default arguments 424<pre> 425callExpr( 426 callee(functionDecl( 427 hasName("hasDefaultArg") 428 )), 429 argumentCountIs(1) 430 ).bind("add_prefix") 431</pre> 432given: 433<pre> 434void hasDefaultArg(int i, int j = 0) {} 435void callDefaultArg() { hasDefaultArg(42); } 436</pre> 437</td> 438<td> 439No match. 440</td> 441<td> 4421 match found. 443</td> 444</tr> 445<tr> 446 <td>Lambda fields 447<pre> 448fieldDecl( 449 hasType(asString("int")) 450 ).bind("make_safe") 451</pre> 452given: 453<pre> 454struct S { 455 int m_i; 456}; 457 458void func() { 459 int a = 0; 460 int c = 0; 461 462 auto l = [a, b = c](int d) { int e = d; }; 463 l(43); 464} 465</pre> 466</td> 467<td> 4682 matches found. Replacement produces incorrect output: 469<pre> 470struct S { 471 safe_int m_i; 472}; 473 474void func() { 475 int a = 0; 476 int c = 0; 477 478 auto l = [safe_a, safe_b = c](int d) { int e = d; }; 479 l(43); 480} 481</pre> 482</td> 483<td> 4841 match found. Replacement produces correct output: 485<pre> 486struct S { 487 safe_int m_i; 488}; 489 490void func() { 491 int a = 0; 492 int c = 0; 493 494 auto l = [a, b = c](int d) { int e = d; }; 495 l(43); 496} 497</pre> 498</td> 499 500</tr> 501</table> 502 503<!-- ======================================================================= --> 504<h2 id="decl-matchers">Node Matchers</h2> 505<!-- ======================================================================= --> 506 507<p>Node matchers are at the core of matcher expressions - they specify the type 508of node that is expected. Every match expression starts with a node matcher, 509which can then be further refined with a narrowing or traversal matcher. All 510traversal matchers take node matchers as their arguments.</p> 511 512<p>For convenience, all node matchers take an arbitrary number of arguments 513and implicitly act as allOf matchers.</p> 514 515<p>Node matchers are the only matchers that support the bind("id") call to 516bind the matched node to the given string, to be later retrieved from the 517match callback.</p> 518 519<p>It is important to remember that the arguments to node matchers are 520predicates on the same node, just with additional information about the type. 521This is often useful to make matcher expression more readable by inlining bind 522calls into redundant node matchers inside another node matcher: 523<pre> 524// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on 525// the same node. 526recordDecl(decl().bind("id"), hasName("::MyClass")) 527</pre> 528</p> 529 530<table> 531<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 532<!-- START_DECL_MATCHERS --> 533 534<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>...</td></tr> 535<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers. 536 537Examples matches i(42). 538 class C { 539 C() : i(42) {} 540 int i; 541 }; 542</pre></td></tr> 543 544 545<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>>...</td></tr> 546<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations. 547 548Given 549 class C { 550 public: 551 int a; 552 }; 553accessSpecDecl() 554 matches 'public:' 555</pre></td></tr> 556 557 558<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>...</td></tr> 559<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations. 560 561Example matches the declaration of the nameless block printing an input 562integer. 563 564 myFunc(^(int p) { 565 printf("%d", p); 566 }) 567</pre></td></tr> 568 569 570<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>>...</td></tr> 571<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations. 572 573Example matches Z 574 template<class T> class Z {}; 575</pre></td></tr> 576 577 578<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>>...</td></tr> 579<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations. 580 581Given 582 template<class T1, class T2, int I> 583 class A {}; 584 585 template<class T, int I> 586 class A<T, T*, I> {}; 587 588 template<> 589 class A<int, int, 1> {}; 590classTemplatePartialSpecializationDecl() 591 matches the specialization A<T,T*,I> but not A<int,int,1> 592</pre></td></tr> 593 594 595<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>...</td></tr> 596<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations. 597 598Given 599 template<typename T> class A {}; 600 template<> class A<double> {}; 601 A<int> a; 602classTemplateSpecializationDecl() 603 matches the specializations A<int> and A<double> 604</pre></td></tr> 605 606 607<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>>...</td></tr> 608<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. 609 610Example matches Foo::Foo() and Foo::Foo(int) 611 class Foo { 612 public: 613 Foo(); 614 Foo(int); 615 int DoSomething(); 616 }; 617</pre></td></tr> 618 619 620<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>>...</td></tr> 621<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations. 622 623Example matches the operator. 624 class X { operator int() const; }; 625</pre></td></tr> 626 627 628<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>>...</td></tr> 629<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide. 630 631Example matches the deduction guide. 632 template<typename T> 633 class X { X(int) }; 634 X(int) -> X<int>; 635</pre></td></tr> 636 637 638<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>>...</td></tr> 639<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations. 640 641Example matches Foo::~Foo() 642 class Foo { 643 public: 644 virtual ~Foo(); 645 }; 646</pre></td></tr> 647 648 649<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>...</td></tr> 650<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations. 651 652Example matches y 653 class X { void y(); }; 654</pre></td></tr> 655 656 657<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>...</td></tr> 658<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations. 659 660Example matches X, Z 661 class X; 662 template<class T> class Z {}; 663</pre></td></tr> 664 665 666<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>...</td></tr> 667<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 668 669Examples matches X, C, and the friend declaration inside C; 670 void X(); 671 class C { 672 friend X; 673 }; 674</pre></td></tr> 675 676 677<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>...</td></tr> 678<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 679and non-type template parameter declarations). 680 681Given 682 class X { int y; }; 683declaratorDecl() 684 matches int y. 685</pre></td></tr> 686 687 688<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>>...</td></tr> 689<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 690 691Example matches A, B, C 692 enum X { 693 A, B, C 694 }; 695</pre></td></tr> 696 697 698<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>>...</td></tr> 699<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 700 701Example matches X 702 enum X { 703 A, B, C 704 }; 705</pre></td></tr> 706 707 708<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>>...</td></tr> 709<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 710 711Given 712 class X { int m; }; 713fieldDecl() 714 matches 'm'. 715</pre></td></tr> 716 717 718<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>...</td></tr> 719<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 720 721Given 722 class X { friend void foo(); }; 723friendDecl() 724 matches 'friend void foo()'. 725</pre></td></tr> 726 727 728<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>...</td></tr> 729<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 730 731Example matches f 732 void f(); 733</pre></td></tr> 734 735 736<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>>...</td></tr> 737<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 738 739Example matches f 740 template<class T> void f(T t) {} 741</pre></td></tr> 742 743 744<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>>...</td></tr> 745<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations. 746 747Given 748 struct X { struct { int a; }; }; 749indirectFieldDecl() 750 matches 'a'. 751</pre></td></tr> 752 753 754<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>>...</td></tr> 755<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label. 756 757Given 758 goto FOO; 759 FOO: bar(); 760labelDecl() 761 matches 'FOO:' 762</pre></td></tr> 763 764 765<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>>...</td></tr> 766<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification. 767 768Given 769 extern "C" {} 770linkageSpecDecl() 771 matches "extern "C" {}" 772</pre></td></tr> 773 774 775<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>>...</td></tr> 776<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 777 778Example matches X, S, the anonymous union type, i, and U; 779 typedef int X; 780 struct S { 781 union { 782 int i; 783 } U; 784 }; 785</pre></td></tr> 786 787 788<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>>...</td></tr> 789<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias. 790 791Given 792 namespace test {} 793 namespace alias = ::test; 794namespaceAliasDecl() 795 matches "namespace alias" but not "namespace test" 796</pre></td></tr> 797 798 799<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>>...</td></tr> 800<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 801 802Given 803 namespace {} 804 namespace test {} 805namespaceDecl() 806 matches "namespace {}" and "namespace test {}" 807</pre></td></tr> 808 809 810<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>>...</td></tr> 811<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations. 812 813Given 814 template <typename T, int N> struct C {}; 815nonTypeTemplateParmDecl() 816 matches 'N', but not 'T'. 817</pre></td></tr> 818 819 820<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>>...</td></tr> 821<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations. 822 823Example matches Foo (Additions) 824 @interface Foo (Additions) 825 @end 826</pre></td></tr> 827 828 829<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>>...</td></tr> 830<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions. 831 832Example matches Foo (Additions) 833 @implementation Foo (Additions) 834 @end 835</pre></td></tr> 836 837 838<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>>...</td></tr> 839<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations. 840 841Example matches Foo 842 @implementation Foo 843 @end 844</pre></td></tr> 845 846 847<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>...</td></tr> 848<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 849 850Example matches Foo 851 @interface Foo 852 @end 853</pre></td></tr> 854 855 856<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>>...</td></tr> 857<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations. 858 859Example matches _enabled 860 @implementation Foo { 861 BOOL _enabled; 862 } 863 @end 864</pre></td></tr> 865 866 867<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>...</td></tr> 868<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations. 869 870Example matches both declaration and definition of -[Foo method] 871 @interface Foo 872 - (void)method; 873 @end 874 875 @implementation Foo 876 - (void)method {} 877 @end 878</pre></td></tr> 879 880 881<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>...</td></tr> 882<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations. 883 884Example matches enabled 885 @interface Foo 886 @property BOOL enabled; 887 @end 888</pre></td></tr> 889 890 891<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>>...</td></tr> 892<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations. 893 894Example matches FooDelegate 895 @protocol FooDelegate 896 @end 897</pre></td></tr> 898 899 900<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>>...</td></tr> 901<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 902 903Given 904 void f(int x); 905parmVarDecl() 906 matches int x. 907</pre></td></tr> 908 909 910<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>>...</td></tr> 911<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 912 913Example matches X, Z, U, and S 914 class X; 915 template<class T> class Z {}; 916 struct S {}; 917 union U {}; 918</pre></td></tr> 919 920 921<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>>...</td></tr> 922<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 923 924Example: 925 staticAssertExpr() 926matches 927 static_assert(sizeof(S) == sizeof(int)) 928in 929 struct S { 930 int x; 931 }; 932 static_assert(sizeof(S) == sizeof(int)); 933</pre></td></tr> 934 935 936<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>...</td></tr> 937<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations. 938 939Example matches X, Z, U, S, E 940 class X; 941 template<class T> class Z {}; 942 struct S {}; 943 union U {}; 944 enum E { 945 A, B, C 946 }; 947</pre></td></tr> 948 949 950<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTemplateParmDecl0')"><a name="templateTemplateParmDecl0Anchor">templateTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl</a>>...</td></tr> 951<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations. 952 953Given 954 template <template <typename> class Z, int N> struct C {}; 955templateTypeParmDecl() 956 matches 'Z', but not 'N'. 957</pre></td></tr> 958 959 960<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>>...</td></tr> 961<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 962 963Given 964 template <typename T, int N> struct C {}; 965templateTypeParmDecl() 966 matches 'T', but not 'N'. 967</pre></td></tr> 968 969 970<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>>...</td></tr> 971<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 972 973Given 974 int X; 975 namespace NS { 976 int Y; 977 } // namespace NS 978decl(hasDeclContext(translationUnitDecl())) 979 matches "int X", but not "int Y". 980</pre></td></tr> 981 982 983<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>>...</td></tr> 984<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations. 985 986Given 987 typedef int X; 988 using Y = int; 989typeAliasDecl() 990 matches "using Y = int", but not "typedef int X" 991</pre></td></tr> 992 993 994<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>>...</td></tr> 995<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations. 996 997typeAliasTemplateDecl() matches 998 template <typename T> 999 using Y = X<T>; 1000</pre></td></tr> 1001 1002 1003<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>>...</td></tr> 1004<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 1005 1006Given 1007 typedef int X; 1008 using Y = int; 1009typedefDecl() 1010 matches "typedef int X", but not "using Y = int" 1011</pre></td></tr> 1012 1013 1014<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>...</td></tr> 1015<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations. 1016 1017Given 1018 typedef int X; 1019 using Y = int; 1020typedefNameDecl() 1021 matches "typedef int X" and "using Y = int" 1022</pre></td></tr> 1023 1024 1025<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>>...</td></tr> 1026<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 1027typename. 1028 1029Given 1030 template <typename T> 1031 struct Base { typedef T Foo; }; 1032 1033 template<typename T> 1034 struct S : private Base<T> { 1035 using typename Base<T>::Foo; 1036 }; 1037unresolvedUsingTypenameDecl() 1038 matches using Base<T>::Foo </pre></td></tr> 1039 1040 1041<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>>...</td></tr> 1042<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 1043 1044Given 1045 template<typename X> 1046 class C : private X { 1047 using X::x; 1048 }; 1049unresolvedUsingValueDecl() 1050 matches using X::x </pre></td></tr> 1051 1052 1053<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>>...</td></tr> 1054<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 1055 1056Given 1057 namespace X { int x; } 1058 using X::x; 1059usingDecl() 1060 matches using X::x </pre></td></tr> 1061 1062 1063<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>>...</td></tr> 1064<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 1065 1066Given 1067 namespace X { int x; } 1068 using namespace X; 1069usingDirectiveDecl() 1070 matches using namespace X </pre></td></tr> 1071 1072 1073<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>...</td></tr> 1074<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 1075 1076Example matches A, B, C and F 1077 enum X { A, B, C }; 1078 void F(); 1079</pre></td></tr> 1080 1081 1082<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>...</td></tr> 1083<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 1084 1085Note: this does not match declarations of member variables, which are 1086"field" declarations in Clang parlance. 1087 1088Example matches a 1089 int a; 1090</pre></td></tr> 1091 1092 1093<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>></td><td class="name" onclick="toggle('decompositionDecl0')"><a name="decompositionDecl0Anchor">decompositionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>>...</td></tr> 1094<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations. 1095 1096Examples matches the declaration node with foo and bar, but not 1097number. 1098(matcher = declStmt(has(decompositionDecl()))) 1099 1100 int number = 42; 1101 auto [foo, bar] = std::make_pair{42, 42}; 1102</pre></td></tr> 1103 1104 1105<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>>...</td></tr> 1106<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 1107</pre></td></tr> 1108 1109 1110<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>>...</td></tr> 1111<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 1112 1113Given 1114 namespace ns { 1115 struct A { static void f(); }; 1116 void A::f() {} 1117 void g() { A::f(); } 1118 } 1119 ns::A a; 1120nestedNameSpecifier() 1121 matches "ns::" and both "A::" 1122</pre></td></tr> 1123 1124 1125<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>></td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>>...</td></tr> 1126<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause. 1127 1128Given 1129 1130 #pragma omp parallel default(none) 1131 #pragma omp parallel default(shared) 1132 #pragma omp parallel default(firstprivate) 1133 #pragma omp parallel 1134 1135``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and 1136``default(firstprivate)`` 1137</pre></td></tr> 1138 1139 1140<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>...</td></tr> 1141<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 1142</pre></td></tr> 1143 1144 1145<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>...</td></tr> 1146<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension). 1147 1148Given 1149 FOO: bar(); 1150 void *ptr = &&FOO; 1151 goto *bar; 1152addrLabelExpr() 1153 matches '&&FOO' 1154</pre></td></tr> 1155 1156 1157<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>>...</td></tr> 1158<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 1159 1160Given 1161 int i = a[1]; 1162arraySubscriptExpr() 1163 matches "a[1]" 1164</pre></td></tr> 1165 1166 1167<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>>...</td></tr> 1168<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 1169 1170 int i = 100; 1171 __asm("mov al, 2"); 1172asmStmt() 1173 matches '__asm("mov al, 2")' 1174</pre></td></tr> 1175 1176 1177<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>>...</td></tr> 1178<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins. 1179Example matches __atomic_load_n(ptr, 1) 1180 void foo() { int *ptr; __atomic_load_n(ptr, 1); } 1181</pre></td></tr> 1182 1183 1184<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>>...</td></tr> 1185<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement. 1186 1187Given 1188 @autoreleasepool { 1189 int x = 0; 1190 } 1191autoreleasePoolStmt(stmt()) matches the declaration of "x" 1192inside the autorelease pool. 1193</pre></td></tr> 1194 1195 1196<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>>...</td></tr> 1197<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension). 1198 1199Example matches a ?: b 1200 (a ?: b) + 42; 1201</pre></td></tr> 1202 1203 1204<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>>...</td></tr> 1205<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 1206 1207Example matches a || b 1208 !(a || b) 1209</pre></td></tr> 1210 1211 1212<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>>...</td></tr> 1213<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block. 1214 1215Example: matches "^{}": 1216 void f() { ^{}(); } 1217</pre></td></tr> 1218 1219 1220<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>>...</td></tr> 1221<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 1222 1223Given 1224 while (true) { break; } 1225breakStmt() 1226 matches 'break' 1227</pre></td></tr> 1228 1229 1230<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>>...</td></tr> 1231<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 1232 1233Example: Matches (int) 2.2f in 1234 int i = (int) 2.2f; 1235</pre></td></tr> 1236 1237 1238<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>...</td></tr> 1239<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 1240 1241Example matches x.y() and y() 1242 X x; 1243 x.y(); 1244 y(); 1245</pre></td></tr> 1246 1247 1248<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>>...</td></tr> 1249<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 1250 1251Given 1252 switch(a) { case 42: break; default: break; } 1253caseStmt() 1254 matches 'case 42:'. 1255</pre></td></tr> 1256 1257 1258<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>>...</td></tr> 1259<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 1260 1261Example: castExpr() matches each of the following: 1262 (int) 3; 1263 const_cast<Expr *>(SubExpr); 1264 char c = 0; 1265but does not match 1266 int i = (0); 1267 int k = 0; 1268</pre></td></tr> 1269 1270 1271<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>...</td></tr> 1272<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 1273 1274Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 1275though. 1276 1277Example matches 'a', L'a' 1278 char ch = 'a'; 1279 wchar_t chw = L'a'; 1280</pre></td></tr> 1281 1282 1283<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>>...</td></tr> 1284<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr. 1285</pre></td></tr> 1286 1287 1288<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>...</td></tr> 1289<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 1290 1291Example match: {1}, (1, 2) 1292 int array[4] = {1}; 1293 vector int myvec = (vector int)(1, 2); 1294</pre></td></tr> 1295 1296 1297<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>>...</td></tr> 1298<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 1299 1300Example matches '{}' and '{{}}' in 'for (;;) {{}}' 1301 for (;;) {{}} 1302</pre></td></tr> 1303 1304 1305<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>>...</td></tr> 1306<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 1307 1308Example matches a ? b : c 1309 (a ? b : c) + 42 1310</pre></td></tr> 1311 1312 1313<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>>...</td></tr> 1314<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper. 1315 1316Example matches the constant in the case statement: 1317 (matcher = constantExpr()) 1318 switch (a) { 1319 case 37: break; 1320 } 1321</pre></td></tr> 1322 1323 1324<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>>...</td></tr> 1325<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 1326 1327Given 1328 while (true) { continue; } 1329continueStmt() 1330 matches 'continue' 1331</pre></td></tr> 1332 1333 1334<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>>...</td></tr> 1335<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 1336 1337Example matches, 1338 kernel<<<i,j>>>(); 1339</pre></td></tr> 1340 1341 1342<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>>...</td></tr> 1343<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 1344 1345Example matches FunctionTakesString(GetStringByValue()) 1346 (matcher = cxxBindTemporaryExpr()) 1347 FunctionTakesString(GetStringByValue()); 1348 FunctionTakesStringByPointer(GetStringPointer()); 1349</pre></td></tr> 1350 1351 1352<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>...</td></tr> 1353<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 1354 1355Example matches true 1356 true 1357</pre></td></tr> 1358 1359 1360<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>>...</td></tr> 1361<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 1362 1363 try {} catch(int i) {} 1364cxxCatchStmt() 1365 matches 'catch(int i)' 1366</pre></td></tr> 1367 1368 1369<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>>...</td></tr> 1370<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 1371 1372Example: Matches const_cast<int*>(&r) in 1373 int n = 42; 1374 const int &r(n); 1375 int* p = const_cast<int*>(&r); 1376</pre></td></tr> 1377 1378 1379<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>...</td></tr> 1380<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 1381 1382Example matches string(ptr, n) and ptr within arguments of f 1383 (matcher = cxxConstructExpr()) 1384 void f(const string &a, const string &b); 1385 char *ptr; 1386 int n; 1387 f(string(ptr, n), ptr); 1388</pre></td></tr> 1389 1390 1391<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>>...</td></tr> 1392<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 1393 1394Example matches the CXXDefaultArgExpr placeholder inserted for the 1395 default value of the second parameter in the call expression f(42) 1396 (matcher = cxxDefaultArgExpr()) 1397 void f(int x, int y = 0); 1398 f(42); 1399</pre></td></tr> 1400 1401 1402<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>>...</td></tr> 1403<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 1404 1405Given 1406 delete X; 1407cxxDeleteExpr() 1408 matches 'delete X'. 1409</pre></td></tr> 1410 1411 1412<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>>...</td></tr> 1413<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be 1414resolved because the base expression or the member name was dependent. 1415 1416Given 1417 template <class T> void f() { T t; t.g(); } 1418cxxDependentScopeMemberExpr() 1419 matches t.g 1420</pre></td></tr> 1421 1422 1423<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>>...</td></tr> 1424<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 1425 1426Example: 1427 cxxDynamicCastExpr() 1428matches 1429 dynamic_cast<D*>(&b); 1430in 1431 struct B { virtual ~B() {} }; struct D : B {}; 1432 B b; 1433 D* p = dynamic_cast<D*>(&b); 1434</pre></td></tr> 1435 1436 1437<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>>...</td></tr> 1438<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 1439 1440cxxForRangeStmt() matches 'for (auto a : i)' 1441 int i[] = {1, 2, 3}; for (auto a : i); 1442 for(int j = 0; j < 5; ++j); 1443</pre></td></tr> 1444 1445 1446<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>...</td></tr> 1447<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 1448 1449Example: Matches Foo(bar); 1450 Foo f = bar; 1451 Foo g = (Foo) bar; 1452 Foo h = Foo(bar); 1453</pre></td></tr> 1454 1455 1456<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr> 1457<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 1458 1459Example matches x.y() 1460 X x; 1461 x.y(); 1462</pre></td></tr> 1463 1464 1465<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>...</td></tr> 1466<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 1467 1468Given 1469 new X; 1470cxxNewExpr() 1471 matches 'new X'. 1472</pre></td></tr> 1473 1474 1475<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>>...</td></tr> 1476<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions. 1477 1478Given 1479 bool a() noexcept; 1480 bool b() noexcept(true); 1481 bool c() noexcept(false); 1482 bool d() noexcept(noexcept(a())); 1483 bool e = noexcept(b()) || noexcept(c()); 1484cxxNoexceptExpr() 1485 matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`. 1486 doesn't match the noexcept specifier in the declarations a, b, c or d. 1487</pre></td></tr> 1488 1489 1490<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>>...</td></tr> 1491<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 1492</pre></td></tr> 1493 1494 1495<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr> 1496<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 1497 1498Note that if an operator isn't overloaded, it won't match. Instead, use 1499binaryOperator matcher. 1500Currently it does not match operators such as new delete. 1501FIXME: figure out why these do not match? 1502 1503Example matches both operator<<((o << b), c) and operator<<(o, b) 1504 (matcher = cxxOperatorCallExpr()) 1505 ostream &operator<< (ostream &out, int i) { }; 1506 ostream &o; int b = 1, c = 1; 1507 o << b << c; 1508</pre></td></tr> 1509 1510 1511<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>>...</td></tr> 1512<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 1513 1514Either the source expression or the destination type can be matched 1515using has(), but hasDestinationType() is more specific and can be 1516more readable. 1517 1518Example matches reinterpret_cast<char*>(&p) in 1519 void* p = reinterpret_cast<char*>(&p); 1520</pre></td></tr> 1521 1522 1523<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>>...</td></tr> 1524<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 1525 1526See also: hasDestinationType 1527See also: reinterpretCast 1528 1529Example: 1530 cxxStaticCastExpr() 1531matches 1532 static_cast<long>(8) 1533in 1534 long eight(static_cast<long>(8)); 1535</pre></td></tr> 1536 1537 1538<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>>...</td></tr> 1539<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions. 1540 1541Given 1542 std::vector<int> a({ 1, 2, 3 }); 1543 std::vector<int> b = { 4, 5 }; 1544 int c[] = { 6, 7 }; 1545 std::pair<int, int> d = { 8, 9 }; 1546cxxStdInitializerListExpr() 1547 matches "{ 1, 2, 3 }" and "{ 4, 5 }" 1548</pre></td></tr> 1549 1550 1551<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>...</td></tr> 1552<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 1553 1554Example: Matches Foo(bar, bar) 1555 Foo h = Foo(bar, bar); 1556</pre></td></tr> 1557 1558 1559<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>>...</td></tr> 1560<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 1561 1562Example matches the implicit this expression in "return i". 1563 (matcher = cxxThisExpr()) 1564struct foo { 1565 int i; 1566 int f() { return i; } 1567}; 1568</pre></td></tr> 1569 1570 1571<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>>...</td></tr> 1572<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 1573 1574 try { throw 5; } catch(int i) {} 1575cxxThrowExpr() 1576 matches 'throw 5' 1577</pre></td></tr> 1578 1579 1580<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>>...</td></tr> 1581<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 1582 1583 try {} catch(int i) {} 1584cxxTryStmt() 1585 matches 'try {}' 1586</pre></td></tr> 1587 1588 1589<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>...</td></tr> 1590<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 1591 1592Example matches T(t) in return statement of f 1593 (matcher = cxxUnresolvedConstructExpr()) 1594 template <typename T> 1595 void f(const T& t) { return T(t); } 1596</pre></td></tr> 1597 1598 1599<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>...</td></tr> 1600<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 1601 1602Example matches x in if (x) 1603 bool x; 1604 if (x) {} 1605</pre></td></tr> 1606 1607 1608<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>>...</td></tr> 1609<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 1610 1611Given 1612 int a; 1613declStmt() 1614 matches 'int a'. 1615</pre></td></tr> 1616 1617 1618<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>>...</td></tr> 1619<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 1620 1621Given 1622 switch(a) { case 42: break; default: break; } 1623defaultStmt() 1624 matches 'default:'. 1625</pre></td></tr> 1626 1627 1628<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>>...</td></tr> 1629<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8]. 1630 1631Example: Matches { [2].y = 1.0, [0].x = 1.0 } 1632 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 1633</pre></td></tr> 1634 1635 1636<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>>...</td></tr> 1637<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 1638 1639Given 1640 do {} while (true); 1641doStmt() 1642 matches 'do {} while(true)' 1643</pre></td></tr> 1644 1645 1646<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>...</td></tr> 1647<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 1648 1649Matches any cast expression written in user code, whether it be a 1650C-style cast, a functional-style cast, or a keyword cast. 1651 1652Does not match implicit conversions. 1653 1654Note: the name "explicitCast" is chosen to match Clang's terminology, as 1655Clang uses the term "cast" to apply to implicit conversions as well as to 1656actual cast expressions. 1657 1658See also: hasDestinationType. 1659 1660Example: matches all five of the casts in 1661 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 1662but does not match the implicit conversion in 1663 long ell = 42; 1664</pre></td></tr> 1665 1666 1667<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>...</td></tr> 1668<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 1669 1670Example matches x() 1671 void f() { x(); } 1672</pre></td></tr> 1673 1674 1675<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>>...</td></tr> 1676<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 1677of the sub-expression's evaluation. 1678 1679Example matches std::string() 1680 const std::string str = std::string(); 1681</pre></td></tr> 1682 1683 1684<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('fixedPointLiteral0')"><a name="fixedPointLiteral0Anchor">fixedPointLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FixedPointLiteral.html">FixedPointLiteral</a>>...</td></tr> 1685<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals 1686</pre></td></tr> 1687 1688 1689<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>...</td></tr> 1690<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g. 16911.0, 1.0f, 1.0L and 1e10. 1692 1693Does not match implicit conversions such as 1694 float a = 10; 1695</pre></td></tr> 1696 1697 1698<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>>...</td></tr> 1699<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 1700 1701Example matches 'for (;;) {}' 1702 for (;;) {} 1703 int i[] = {1, 2, 3}; for (auto a : i); 1704</pre></td></tr> 1705 1706 1707<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('genericSelectionExpr0')"><a name="genericSelectionExpr0Anchor">genericSelectionExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GenericSelectionExpr.html">GenericSelectionExpr</a>>...</td></tr> 1708<tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression. 1709</pre></td></tr> 1710 1711 1712<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>>...</td></tr> 1713<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 1714</pre></td></tr> 1715 1716 1717<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>>...</td></tr> 1718<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 1719 1720Given 1721 goto FOO; 1722 FOO: bar(); 1723gotoStmt() 1724 matches 'goto FOO' 1725</pre></td></tr> 1726 1727 1728<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>>...</td></tr> 1729<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 1730 1731Example matches 'if (x) {}' 1732 if (x) {} 1733</pre></td></tr> 1734 1735 1736<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>>...</td></tr> 1737<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating 1738point literals e.g.: 1i, 1.0i 1739</pre></td></tr> 1740 1741 1742<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>>...</td></tr> 1743<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 1744 1745This matches many different places, including function call return value 1746eliding, as well as any type conversions. 1747</pre></td></tr> 1748 1749 1750<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>>...</td></tr> 1751<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions. 1752 1753Given 1754 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 1755implicitValueInitExpr() 1756 matches "[0].y" (implicitly) 1757</pre></td></tr> 1758 1759 1760<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>>...</td></tr> 1761<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 1762 1763Given 1764 int a[] = { 1, 2 }; 1765 struct B { int x, y; }; 1766 B b = { 5, 6 }; 1767initListExpr() 1768 matches "{ 1, 2 }" and "{ 5, 6 }" 1769</pre></td></tr> 1770 1771 1772<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>...</td></tr> 1773<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g. 17741, 1L, 0x1 and 1U. 1775 1776Does not match character-encoded integers such as L'a'. 1777</pre></td></tr> 1778 1779 1780<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>...</td></tr> 1781<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 1782 1783Given 1784 goto FOO; 1785 FOO: bar(); 1786labelStmt() 1787 matches 'FOO:' 1788</pre></td></tr> 1789 1790 1791<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>>...</td></tr> 1792<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1793 1794Example matches [&](){return 5;} 1795 [&](){return 5;} 1796</pre></td></tr> 1797 1798 1799<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>>...</td></tr> 1800<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1801 1802Example: Given 1803 struct T {void func();}; 1804 T f(); 1805 void g(T); 1806materializeTemporaryExpr() matches 'f()' in these statements 1807 T u(f()); 1808 g(f()); 1809 f().func(); 1810but does not match 1811 f(); 1812</pre></td></tr> 1813 1814 1815<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>...</td></tr> 1816<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1817 1818Given 1819 class Y { 1820 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1821 int a; static int b; 1822 }; 1823memberExpr() 1824 matches this->x, x, y.x, a, this->b 1825</pre></td></tr> 1826 1827 1828<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>>...</td></tr> 1829<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1830 1831 foo();; 1832nullStmt() 1833 matches the second ';' 1834</pre></td></tr> 1835 1836 1837<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>>...</td></tr> 1838<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements. 1839 1840Example matches @catch 1841 @try {} 1842 @catch (...) {} 1843</pre></td></tr> 1844 1845 1846<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>>...</td></tr> 1847<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements. 1848 1849Example matches @finally 1850 @try {} 1851 @finally {} 1852</pre></td></tr> 1853 1854 1855<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>>...</td></tr> 1856<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar. 1857 1858Example: matches "a" in "init" method: 1859@implementation A { 1860 NSString *a; 1861} 1862- (void) init { 1863 a = @"hello"; 1864} 1865</pre></td></tr> 1866 1867 1868<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>>...</td></tr> 1869<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 1870 1871The innermost message send invokes the "alloc" class method on the 1872NSString class, while the outermost message send invokes the 1873"initWithString" instance method on the object returned from 1874NSString's "alloc". This matcher should match both message sends. 1875 [[NSString alloc] initWithString:@"Hello"] 1876</pre></td></tr> 1877 1878 1879<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>>...</td></tr> 1880<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements. 1881 1882Example matches @throw obj; 1883</pre></td></tr> 1884 1885 1886<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>>...</td></tr> 1887<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements. 1888 1889Example matches @try 1890 @try {} 1891 @catch (...) {} 1892</pre></td></tr> 1893 1894 1895<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>>...</td></tr> 1896<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive. 1897 1898Given 1899 1900 #pragma omp parallel 1901 #pragma omp parallel default(none) 1902 #pragma omp taskyield 1903 1904``ompExecutableDirective()`` matches ``omp parallel``, 1905``omp parallel default(none)`` and ``omp taskyield``. 1906</pre></td></tr> 1907 1908 1909<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>>...</td></tr> 1910<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers 1911to reference another expressions and can be met 1912in BinaryConditionalOperators, for example. 1913 1914Example matches 'a' 1915 (a ?: c) + 42; 1916</pre></td></tr> 1917 1918 1919<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>>...</td></tr> 1920<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions. 1921 1922Example matches (foo() + 1) 1923 int foo() { return 1; } 1924 int a = (foo() + 1); 1925</pre></td></tr> 1926 1927 1928<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>>...</td></tr> 1929<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions. 1930ParenListExprs don't have a predefined type and are used for late parsing. 1931In the final AST, they can be met in template declarations. 1932 1933Given 1934 template<typename T> class X { 1935 void f() { 1936 X x(*this); 1937 int a = 0, b = 1; int i = (a, b); 1938 } 1939 }; 1940parenListExpr() matches "*this" but NOT matches (a, b) because (a, b) 1941has a predefined type and is a ParenExpr, not a ParenListExpr. 1942</pre></td></tr> 1943 1944 1945<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>>...</td></tr> 1946<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2]. 1947 1948Example: Matches __func__ 1949 printf("%s", __func__); 1950</pre></td></tr> 1951 1952 1953<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>>...</td></tr> 1954<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 1955 1956Given 1957 return 1; 1958returnStmt() 1959 matches 'return 1' 1960</pre></td></tr> 1961 1962 1963<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>...</td></tr> 1964<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 1965 1966Given 1967 { ++a; } 1968stmt() 1969 matches both the compound statement '{ ++a; }' and '++a'. 1970</pre></td></tr> 1971 1972 1973<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>>...</td></tr> 1974<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension). 1975 1976Example match: ({ int X = 4; X; }) 1977 int C = ({ int X = 4; X; }); 1978</pre></td></tr> 1979 1980 1981<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>>...</td></tr> 1982<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 1983 1984Example matches "abcd", L"abcd" 1985 char *s = "abcd"; 1986 wchar_t *ws = L"abcd"; 1987</pre></td></tr> 1988 1989 1990<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>>...</td></tr> 1991<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 1992 1993Given 1994 template <int N> 1995 struct A { static const int n = N; }; 1996 struct B : public A<42> {}; 1997substNonTypeTemplateParmExpr() 1998 matches "N" in the right-hand side of "static const int n = N;" 1999</pre></td></tr> 2000 2001 2002<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>>...</td></tr> 2003<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 2004 2005Given 2006 switch(a) { case 42: break; default: break; } 2007switchCase() 2008 matches 'case 42:' and 'default:'. 2009</pre></td></tr> 2010 2011 2012<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>>...</td></tr> 2013<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 2014 2015Given 2016 switch(a) { case 42: break; default: break; } 2017switchStmt() 2018 matches 'switch(a)'. 2019</pre></td></tr> 2020 2021 2022<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>>...</td></tr> 2023<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 2024 2025Given 2026 Foo x = bar; 2027 int y = sizeof(x) + alignof(x); 2028unaryExprOrTypeTraitExpr() 2029 matches sizeof(x) and alignof(x) 2030</pre></td></tr> 2031 2032 2033<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>>...</td></tr> 2034<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 2035 2036Example matches !a 2037 !a || b 2038</pre></td></tr> 2039 2040 2041<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>>...</td></tr> 2042<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing 2043but could not be resolved to a specific declaration. 2044 2045Given 2046 template<typename T> 2047 T foo() { T a; return a; } 2048 template<typename T> 2049 void bar() { 2050 foo<T>(); 2051 } 2052unresolvedLookupExpr() 2053 matches foo<T>() </pre></td></tr> 2054 2055 2056<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>>...</td></tr> 2057<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions. 2058 2059Given 2060 struct X { 2061 template <class T> void f(); 2062 void g(); 2063 }; 2064 template <class T> void h() { X x; x.f<T>(); x.g(); } 2065unresolvedMemberExpr() 2066 matches x.f<T> 2067</pre></td></tr> 2068 2069 2070<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>>...</td></tr> 2071<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 2072 2073Example match: "foo"_suffix 2074</pre></td></tr> 2075 2076 2077<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>>...</td></tr> 2078<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 2079 2080Given 2081 while (true) {} 2082whileStmt() 2083 matches 'while (true) {}'. 2084</pre></td></tr> 2085 2086 2087<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>></td><td class="name" onclick="toggle('templateArgumentLoc0')"><a name="templateArgumentLoc0Anchor">templateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>...</td></tr> 2088<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info). 2089 2090Given 2091 template <typename T> struct C {}; 2092 C<int> c; 2093templateArgumentLoc() 2094 matches 'int' in C<int>. 2095</pre></td></tr> 2096 2097 2098<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>>...</td></tr> 2099<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 2100 2101Given 2102 template <typename T> struct C {}; 2103 C<int> c; 2104templateArgument() 2105 matches 'int' in C<int>. 2106</pre></td></tr> 2107 2108 2109<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>></td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>>...</td></tr> 2110<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name. 2111 2112Given 2113 template <typename T> class X { }; 2114 X<int> xi; 2115templateName() 2116 matches 'X' in X<int>. 2117</pre></td></tr> 2118 2119 2120<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>...</td></tr> 2121<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 2122</pre></td></tr> 2123 2124 2125<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>...</td></tr> 2126<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 2127 2128Given 2129 int a[] = { 2, 3 }; 2130 int b[4]; 2131 void f() { int c[a[0]]; } 2132arrayType() 2133 matches "int a[]", "int b[4]" and "int c[a[0]]"; 2134</pre></td></tr> 2135 2136 2137<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>>...</td></tr> 2138<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 2139 2140Given 2141 _Atomic(int) i; 2142atomicType() 2143 matches "_Atomic(int) i" 2144</pre></td></tr> 2145 2146 2147<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>>...</td></tr> 2148<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 2149 2150Given: 2151 auto n = 4; 2152 int v[] = { 2, 3 } 2153 for (auto i : v) { } 2154autoType() 2155 matches "auto n" and "auto i" 2156</pre></td></tr> 2157 2158 2159<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>...</td></tr> 2160<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 2161"void (^)(int)". 2162 2163The pointee is always required to be a FunctionType. 2164</pre></td></tr> 2165 2166 2167<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>>...</td></tr> 2168<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 2169 2170Given 2171 struct A {}; 2172 A a; 2173 int b; 2174 float c; 2175 bool d; 2176builtinType() 2177 matches "int b", "float c" and "bool d" 2178</pre></td></tr> 2179 2180 2181<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>>...</td></tr> 2182<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 2183 2184Given 2185 _Complex float f; 2186complexType() 2187 matches "_Complex float f" 2188</pre></td></tr> 2189 2190 2191<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>>...</td></tr> 2192<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 2193 2194Given 2195 void() { 2196 int a[2]; 2197 int b[] = { 2, 3 }; 2198 int c[b[0]]; 2199 } 2200constantArrayType() 2201 matches "int a[2]" 2202</pre></td></tr> 2203 2204 2205<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>>...</td></tr> 2206<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 2207Example matches i[] in declaration of f. 2208 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 2209Example matches i[1]. 2210 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 2211 void f(int i[]) { 2212 i[1] = 0; 2213 } 2214</pre></td></tr> 2215 2216 2217<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>>...</td></tr> 2218<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(<expr>) types. 2219 2220Given: 2221 short i = 1; 2222 int j = 42; 2223 decltype(i + j) result = i + j; 2224decltypeType() 2225 matches "decltype(i + j)" 2226</pre></td></tr> 2227 2228 2229<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>>...</td></tr> 2230<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class 2231template types. 2232 2233Given 2234 template <typename T> 2235 class C { public: C(T); }; 2236 2237 C c(123); 2238deducedTemplateSpecializationType() matches the type in the declaration 2239of the variable c. 2240</pre></td></tr> 2241 2242 2243<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>>...</td></tr> 2244<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 2245 2246Given 2247 template<typename T, int Size> 2248 class array { 2249 T data[Size]; 2250 }; 2251dependentSizedArrayType 2252 matches "T data[Size]" 2253</pre></td></tr> 2254 2255 2256<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>>...</td></tr> 2257<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 2258qualified name. 2259 2260Given 2261 namespace N { 2262 namespace M { 2263 class D {}; 2264 } 2265 } 2266 class C {}; 2267 2268 class C c; 2269 N::M::D d; 2270 2271elaboratedType() matches the type of the variable declarations of both 2272c and d. 2273</pre></td></tr> 2274 2275 2276<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>...</td></tr> 2277<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types. 2278 2279Given 2280 enum C { Green }; 2281 enum class S { Red }; 2282 2283 C c; 2284 S s; 2285 2286enumType() matches the type of the variable declarations of both c and 2287s. 2288</pre></td></tr> 2289 2290 2291<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>>...</td></tr> 2292<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes. 2293 2294Given 2295 int (*f)(int); 2296 void g(); 2297functionProtoType() 2298 matches "int (*f)(int)" and the type of "g" in C++ mode. 2299 In C mode, "g" is not matched because it does not contain a prototype. 2300</pre></td></tr> 2301 2302 2303<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>>...</td></tr> 2304<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 2305 2306Given 2307 int (*f)(int); 2308 void g(); 2309functionType() 2310 matches "int (*f)(int)" and the type of "g". 2311</pre></td></tr> 2312 2313 2314<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>>...</td></tr> 2315<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 2316 2317Given 2318 int a[] = { 2, 3 }; 2319 int b[42]; 2320 void f(int c[]) { int d[a[0]]; }; 2321incompleteArrayType() 2322 matches "int a[]" and "int c[]" 2323</pre></td></tr> 2324 2325 2326<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>...</td></tr> 2327<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 2328 2329Example matches S s, but not S<T> s. 2330 (matcher = parmVarDecl(hasType(injectedClassNameType()))) 2331 template <typename T> struct S { 2332 void f(S s); 2333 void g(S<T> s); 2334 }; 2335</pre></td></tr> 2336 2337 2338<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>>...</td></tr> 2339<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 2340 2341Given: 2342 int *a; 2343 int &b = *a; 2344 int &&c = 1; 2345 auto &d = b; 2346 auto &&e = c; 2347 auto &&f = 2; 2348 int g = 5; 2349 2350lValueReferenceType() matches the types of b, d, and e. e is 2351matched since the type is deduced as int& by reference collapsing rules. 2352</pre></td></tr> 2353 2354 2355<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>...</td></tr> 2356<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 2357Given 2358 struct A { int i; } 2359 A::* ptr = A::i; 2360memberPointerType() 2361 matches "A::* ptr" 2362</pre></td></tr> 2363 2364 2365<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>>...</td></tr> 2366<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 2367a pointer type, despite being syntactically similar. 2368 2369Given 2370 int *a; 2371 2372 @interface Foo 2373 @end 2374 Foo *f; 2375pointerType() 2376 matches "Foo *f", but does not match "int *a". 2377</pre></td></tr> 2378 2379 2380<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>>...</td></tr> 2381<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 2382 2383Given 2384 int (*ptr_to_array)[4]; 2385 int *array_of_ptrs[4]; 2386 2387varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 2388array_of_ptrs. 2389</pre></td></tr> 2390 2391 2392<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>...</td></tr> 2393<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 2394types. 2395 2396Given 2397 int *a; 2398 int &b = *a; 2399 int c = 5; 2400 2401 @interface Foo 2402 @end 2403 Foo *f; 2404pointerType() 2405 matches "int *a", but does not match "Foo *f". 2406</pre></td></tr> 2407 2408 2409<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>>...</td></tr> 2410<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 2411 2412Given: 2413 int *a; 2414 int &b = *a; 2415 int &&c = 1; 2416 auto &d = b; 2417 auto &&e = c; 2418 auto &&f = 2; 2419 int g = 5; 2420 2421rValueReferenceType() matches the types of c and f. e is not 2422matched as it is deduced to int& by reference collapsing rules. 2423</pre></td></tr> 2424 2425 2426<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>...</td></tr> 2427<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 2428 2429Given 2430 class C {}; 2431 struct S {}; 2432 2433 C c; 2434 S s; 2435 2436recordType() matches the type of the variable declarations of both c 2437and s. 2438</pre></td></tr> 2439 2440 2441<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>...</td></tr> 2442<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 2443 2444Given 2445 int *a; 2446 int &b = *a; 2447 int &&c = 1; 2448 auto &d = b; 2449 auto &&e = c; 2450 auto &&f = 2; 2451 int g = 5; 2452 2453referenceType() matches the types of b, c, d, e, and f. 2454</pre></td></tr> 2455 2456 2457<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>>...</td></tr> 2458<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 2459template type parameter. 2460 2461Given 2462 template <typename T> 2463 void F(T t) { 2464 int i = 1 + t; 2465 } 2466 2467substTemplateTypeParmType() matches the type of 't' but not '1' 2468</pre></td></tr> 2469 2470 2471<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>...</td></tr> 2472<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types). 2473 2474Given 2475 enum E {}; 2476 class C {}; 2477 2478 E e; 2479 C c; 2480 2481tagType() matches the type of the variable declarations of both e 2482and c. 2483</pre></td></tr> 2484 2485 2486<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>...</td></tr> 2487<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 2488 2489Given 2490 template <typename T> 2491 class C { }; 2492 2493 template class C<int>; // A 2494 C<char> var; // B 2495 2496templateSpecializationType() matches the type of the explicit 2497instantiation in A and the type of the variable declaration in B. 2498</pre></td></tr> 2499 2500 2501<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>...</td></tr> 2502<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 2503 2504Example matches T, but not int. 2505 (matcher = templateTypeParmType()) 2506 template <typename T> void f(int i); 2507</pre></td></tr> 2508 2509 2510<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>>...</td></tr> 2511<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 2512</pre></td></tr> 2513 2514 2515<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>...</td></tr> 2516<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 2517 2518Given 2519 typedef int X; 2520typedefType() 2521 matches "typedef int X" 2522</pre></td></tr> 2523 2524 2525<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>>...</td></tr> 2526<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 2527 2528Given: 2529 typedef __underlying_type(T) type; 2530unaryTransformType() 2531 matches "__underlying_type(T)" 2532</pre></td></tr> 2533 2534 2535<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>>...</td></tr> 2536<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 2537integer-constant-expression. 2538 2539Given 2540 void f() { 2541 int a[] = { 2, 3 } 2542 int b[42]; 2543 int c[a[0]]; 2544 } 2545variableArrayType() 2546 matches "int c[a[0]]" 2547</pre></td></tr> 2548 2549<!--END_DECL_MATCHERS --> 2550</table> 2551 2552<!-- ======================================================================= --> 2553<h2 id="narrowing-matchers">Narrowing Matchers</h2> 2554<!-- ======================================================================= --> 2555 2556<p>Narrowing matchers match certain attributes on the current node, thus 2557narrowing down the set of nodes of the current type to match on.</p> 2558 2559<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 2560which allow users to create more powerful match expressions.</p> 2561 2562<table> 2563<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 2564<!-- START_NARROWING_MATCHERS --> 2565 2566<tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2567<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 2568 2569Usable as: Any Matcher 2570</pre></td></tr> 2571 2572 2573<tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2574<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 2575 2576Usable as: Any Matcher 2577</pre></td></tr> 2578 2579 2580<tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 2581<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 2582 2583Useful when another matcher requires a child matcher, but there's no 2584additional constraint. This will often be used with an explicit conversion 2585to an internal::Matcher<> type such as TypeMatcher. 2586 2587Example: DeclarationMatcher(anything()) matches all declarations, e.g., 2588"int* p" and "void f()" in 2589 int* p; 2590 void f(); 2591 2592Usable as: Any Matcher 2593</pre></td></tr> 2594 2595 2596<tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 2597<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 2598 2599Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 2600 class X {}; 2601 class Y {}; 2602 2603Usable as: Any Matcher 2604</pre></td></tr> 2605 2606 2607<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName0')"><a name="hasAnyOperatorName0Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 2608<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the 2609specified names. 2610 2611 hasAnyOperatorName("+", "-") 2612 Is equivalent to 2613 anyOf(hasOperatorName("+"), hasOperatorName("-")) 2614</pre></td></tr> 2615 2616 2617<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 2618<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 2619unary). 2620 2621Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 2622 !(a || b) 2623</pre></td></tr> 2624 2625 2626<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr> 2627<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators. 2628 2629Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2630 if (a == b) 2631 a += b; 2632 2633Example 2: matches s1 = s2 2634 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2635 struct S { S& operator=(const S&); }; 2636 void x() { S s1, s2; s1 = s2; } 2637</pre></td></tr> 2638 2639 2640<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('isComparisonOperator0')"><a name="isComparisonOperator0Anchor">isComparisonOperator</a></td><td></td></tr> 2641<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators. 2642 2643Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 2644 if (a == b) 2645 a += b; 2646 2647Example 2: matches s1 < s2 2648 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 2649 struct S { bool operator<(const S& other); }; 2650 void x(S s1, S s2) { bool b1 = s1 < s2; } 2651</pre></td></tr> 2652 2653 2654<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isPrivate1')"><a name="isPrivate1Anchor">isPrivate</a></td><td></td></tr> 2655<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private 2656inheritance. 2657 2658Examples: 2659 class C { 2660 public: int a; 2661 protected: int b; 2662 private: int c; // fieldDecl(isPrivate()) matches 'c' 2663 }; 2664 2665 struct Base {}; 2666 struct Derived1 : private Base {}; // matches 'Base' 2667 class Derived2 : Base {}; // matches 'Base' 2668</pre></td></tr> 2669 2670 2671<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isProtected1')"><a name="isProtected1Anchor">isProtected</a></td><td></td></tr> 2672<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify 2673protected inheritance. 2674 2675Examples: 2676 class C { 2677 public: int a; 2678 protected: int b; // fieldDecl(isProtected()) matches 'b' 2679 private: int c; 2680 }; 2681 2682 class Base {}; 2683 class Derived : protected Base {}; // matches 'Base' 2684</pre></td></tr> 2685 2686 2687<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isPublic1')"><a name="isPublic1Anchor">isPublic</a></td><td></td></tr> 2688<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public 2689inheritance. 2690 2691Examples: 2692 class C { 2693 public: int a; // fieldDecl(isPublic()) matches 'a' 2694 protected: int b; 2695 private: int c; 2696 }; 2697 2698 class Base {}; 2699 class Derived1 : public Base {}; // matches 'Base' 2700 struct Derived2 : Base {}; // matches 'Base' 2701</pre></td></tr> 2702 2703 2704<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isVirtual1')"><a name="isVirtual1Anchor">isVirtual</a></td><td></td></tr> 2705<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify 2706virtual inheritance. 2707 2708Example: 2709 class A { 2710 public: 2711 virtual void x(); // matches x 2712 }; 2713 2714Example: 2715 class Base {}; 2716 class DirectlyDerived : virtual Base {}; // matches Base 2717 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 2718 2719Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 2720</pre></td></tr> 2721 2722 2723<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr> 2724<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr> 2725 2726 2727<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT Value</td></tr> 2728<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT. 2729 2730Given 2731 f('false, 3.14, 42); 2732characterLiteral(equals(0)) 2733 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2734 match false 2735floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2736 match 3.14 2737integerLiteral(equals(42)) 2738 matches 42 2739 2740Note that you cannot directly match a negative numeric literal because the 2741minus sign is not part of the literal: It is a unary operator whose operand 2742is the positive numeric literal. Instead, you must use a unaryOperator() 2743matcher to match the minus sign: 2744 2745unaryOperator(hasOperatorName("-"), 2746 hasUnaryOperand(integerLiteral(equals(13)))) 2747 2748Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 2749 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 2750</pre></td></tr> 2751 2752 2753<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr> 2754<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr> 2755 2756 2757<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr> 2758<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr> 2759 2760 2761<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>></td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr> 2762<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 2763 2764Given 2765 try { 2766 // ... 2767 } catch (int) { 2768 // ... 2769 } catch (...) { 2770 // ... 2771 } 2772cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 2773</pre></td></tr> 2774 2775 2776<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 2777<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 2778a specific number of arguments (including absent default arguments). 2779 2780Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2781 void f(int x, int y); 2782 f(0, 0); 2783</pre></td></tr> 2784 2785 2786<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr> 2787<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 2788</pre></td></tr> 2789 2790 2791<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr> 2792<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 2793zero initialization. 2794 2795Given 2796void foo() { 2797 struct point { double x; double y; }; 2798 point pt[2] = { { 1.0, 2.0 } }; 2799} 2800initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 2801will match the implicit array filler for pt[1]. 2802</pre></td></tr> 2803 2804 2805<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr> 2806<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 2807 2808Given 2809 struct S { 2810 S(); // #1 2811 S(const S &); // #2 2812 S(S &&); // #3 2813 }; 2814cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 2815</pre></td></tr> 2816 2817 2818<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr> 2819<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 2820 2821Given 2822 struct S { 2823 S(); // #1 2824 S(const S &); // #2 2825 S(S &&); // #3 2826 }; 2827cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 2828</pre></td></tr> 2829 2830 2831<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr> 2832<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 2833 2834Given 2835 struct S { 2836 S(); // #1 2837 S(int) {} // #2 2838 S(S &&) : S() {} // #3 2839 }; 2840 S::S() : S(0) {} // #4 2841cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 2842#1 or #2. 2843</pre></td></tr> 2844 2845 2846<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr> 2847<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations 2848that have an explicit specifier if this explicit specifier is resolved to 2849true. 2850 2851Given 2852 template<bool b> 2853 struct S { 2854 S(int); // #1 2855 explicit S(double); // #2 2856 operator int(); // #3 2857 explicit operator bool(); // #4 2858 explicit(false) S(bool) // # 7 2859 explicit(true) S(char) // # 8 2860 explicit(b) S(S) // # 9 2861 }; 2862 S(int) -> S<true> // #5 2863 explicit S(double) -> S<false> // #6 2864cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2865cxxConversionDecl(isExplicit()) will match #4, but not #3. 2866cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2867</pre></td></tr> 2868 2869 2870<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr> 2871<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 2872 2873Given 2874 struct S { 2875 S(); // #1 2876 S(const S &); // #2 2877 S(S &&); // #3 2878 }; 2879cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 2880</pre></td></tr> 2881 2882 2883<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>></td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr> 2884<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations 2885that have an explicit specifier if this explicit specifier is resolved to 2886true. 2887 2888Given 2889 template<bool b> 2890 struct S { 2891 S(int); // #1 2892 explicit S(double); // #2 2893 operator int(); // #3 2894 explicit operator bool(); // #4 2895 explicit(false) S(bool) // # 7 2896 explicit(true) S(char) // # 8 2897 explicit(b) S(S) // # 9 2898 }; 2899 S(int) -> S<true> // #5 2900 explicit S(double) -> S<false> // #6 2901cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2902cxxConversionDecl(isExplicit()) will match #4, but not #3. 2903cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2904</pre></td></tr> 2905 2906 2907<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr> 2908<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 2909opposed to a member. 2910 2911Given 2912 struct B {}; 2913 struct D : B { 2914 int I; 2915 D(int i) : I(i) {} 2916 }; 2917 struct E : B { 2918 E() : B() {} 2919 }; 2920cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 2921 will match E(), but not match D(int). 2922</pre></td></tr> 2923 2924 2925<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr> 2926<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 2927opposed to a base. 2928 2929Given 2930 struct B {}; 2931 struct D : B { 2932 int I; 2933 D(int i) : I(i) {} 2934 }; 2935 struct E : B { 2936 E() : B() {} 2937 }; 2938cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 2939 will match D(int), but not match E(). 2940</pre></td></tr> 2941 2942 2943<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr> 2944<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 2945code (as opposed to implicitly added by the compiler). 2946 2947Given 2948 struct Foo { 2949 Foo() { } 2950 Foo(int) : foo_("A") { } 2951 string foo_; 2952 }; 2953cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 2954 will match Foo(int), but not Foo() 2955</pre></td></tr> 2956 2957 2958<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>></td><td class="name" onclick="toggle('isExplicit2')"><a name="isExplicit2Anchor">isExplicit</a></td><td></td></tr> 2959<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations 2960that have an explicit specifier if this explicit specifier is resolved to 2961true. 2962 2963Given 2964 template<bool b> 2965 struct S { 2966 S(int); // #1 2967 explicit S(double); // #2 2968 operator int(); // #3 2969 explicit operator bool(); // #4 2970 explicit(false) S(bool) // # 7 2971 explicit(true) S(char) // # 8 2972 explicit(b) S(S) // # 9 2973 }; 2974 S(int) -> S<true> // #5 2975 explicit S(double) -> S<false> // #6 2976cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2977cxxConversionDecl(isExplicit()) will match #4, but not #3. 2978cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2979</pre></td></tr> 2980 2981 2982<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('hasMemberName0')"><a name="hasMemberName0Anchor">hasMemberName</a></td><td>std::string N</td></tr> 2983<tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names 2984 2985In template declarations, dependent members are not resolved and so can 2986not be matched to particular named declarations. 2987 2988This matcher allows to match on the known name of members. 2989 2990Given 2991 template <typename T> 2992 struct S { 2993 void mem(); 2994 }; 2995 template <typename T> 2996 void x() { 2997 S<T> s; 2998 s.mem(); 2999 } 3000cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()` 3001</pre></td></tr> 3002 3003 3004<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr> 3005<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed 3006to '.'. 3007 3008Member calls on the implicit this pointer match as called with '->'. 3009 3010Given 3011 class Y { 3012 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3013 template <class T> void f() { this->f<T>(); f<T>(); } 3014 int a; 3015 static int b; 3016 }; 3017 template <class T> 3018 class Z { 3019 void x() { this->m; } 3020 }; 3021memberExpr(isArrow()) 3022 matches this->x, x, y.x, a, this->b 3023cxxDependentScopeMemberExpr(isArrow()) 3024 matches this->m 3025unresolvedMemberExpr(isArrow()) 3026 matches this->f<T>, f<T> 3027</pre></td></tr> 3028 3029 3030<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('memberHasSameNameAsBoundNode0')"><a name="memberHasSameNameAsBoundNode0Anchor">memberHasSameNameAsBoundNode</a></td><td>std::string BindingID</td></tr> 3031<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound 3032node 3033 3034In template declarations, dependent members are not resolved and so can 3035not be matched to particular named declarations. 3036 3037This matcher allows to match on the name of already-bound VarDecl, FieldDecl 3038and CXXMethodDecl nodes. 3039 3040Given 3041 template <typename T> 3042 struct S { 3043 void mem(); 3044 }; 3045 template <typename T> 3046 void x() { 3047 S<T> s; 3048 s.mem(); 3049 } 3050The matcher 3051@code 3052cxxDependentScopeMemberExpr( 3053 hasObjectExpression(declRefExpr(hasType(templateSpecializationType( 3054 hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has( 3055 cxxMethodDecl(hasName("mem")).bind("templMem") 3056 ))))) 3057 )))), 3058 memberHasSameNameAsBoundNode("templMem") 3059 ) 3060@endcode 3061first matches and binds the @c mem member of the @c S template, then 3062compares its name to the usage in @c s.mem() in the @c x function template 3063</pre></td></tr> 3064 3065 3066<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr> 3067<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 3068 3069Given 3070struct A { 3071 void foo() const; 3072 void bar(); 3073}; 3074 3075cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 3076</pre></td></tr> 3077 3078 3079<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr> 3080<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 3081operator. 3082 3083Given 3084struct A { 3085 A &operator=(const A &); 3086 A &operator=(A &&); 3087}; 3088 3089cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 3090the second one. 3091</pre></td></tr> 3092 3093 3094<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr> 3095<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 3096 3097Given: 3098 class A final {}; 3099 3100 struct B { 3101 virtual void f(); 3102 }; 3103 3104 struct C : B { 3105 void f() final; 3106 }; 3107matches A and C::f, but not B, C, or B::f 3108</pre></td></tr> 3109 3110 3111<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr> 3112<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 3113operator. 3114 3115Given 3116struct A { 3117 A &operator=(const A &); 3118 A &operator=(A &&); 3119}; 3120 3121cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 3122the first one. 3123</pre></td></tr> 3124 3125 3126<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr> 3127<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 3128 3129Given 3130 class A { 3131 public: 3132 virtual void x(); 3133 }; 3134 class B : public A { 3135 public: 3136 virtual void x(); 3137 }; 3138 matches B::x 3139</pre></td></tr> 3140 3141 3142<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr> 3143<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 3144 3145Given 3146 class A { 3147 public: 3148 virtual void x() = 0; 3149 }; 3150 matches A::x 3151</pre></td></tr> 3152 3153 3154<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr> 3155<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 3156 3157Given 3158 struct S { 3159 S(); // #1 3160 S(const S &) = default; // #2 3161 S(S &&) = delete; // #3 3162 }; 3163cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 3164</pre></td></tr> 3165 3166 3167<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr> 3168<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify 3169virtual inheritance. 3170 3171Example: 3172 class A { 3173 public: 3174 virtual void x(); // matches x 3175 }; 3176 3177Example: 3178 class Base {}; 3179 class DirectlyDerived : virtual Base {}; // matches Base 3180 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 3181 3182Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 3183</pre></td></tr> 3184 3185 3186<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr> 3187<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 3188 3189Given 3190 class A { 3191 public: 3192 virtual void x(); 3193 }; 3194 class B : public A { 3195 public: 3196 void x(); 3197 }; 3198 matches A::x but not B::x 3199</pre></td></tr> 3200 3201 3202<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr> 3203<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions. 3204 3205Given: 3206 MyClass *p1 = new MyClass[10]; 3207cxxNewExpr(isArray()) 3208 matches the expression 'new MyClass[10]'. 3209</pre></td></tr> 3210 3211 3212<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName0')"><a name="hasAnyOverloadedOperatorName0Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 3213<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names. 3214 3215Matches overloaded operator names specified in strings without the 3216"operator" prefix: e.g. "<<". 3217 3218 hasAnyOverloadedOperatorName("+", "-") 3219Is equivalent to 3220 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3221</pre></td></tr> 3222 3223 3224<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr> 3225<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 3226 3227Matches overloaded operator names specified in strings without the 3228"operator" prefix: e.g. "<<". 3229 3230Given: 3231 class A { int operator*(); }; 3232 const A &operator<<(const A &a, const A &b); 3233 A a; 3234 a << a; // <-- This matches 3235 3236cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3237specified line and 3238cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3239matches the declaration of A. 3240 3241Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 3242</pre></td></tr> 3243 3244 3245<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr> 3246<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators. 3247 3248Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3249 if (a == b) 3250 a += b; 3251 3252Example 2: matches s1 = s2 3253 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3254 struct S { S& operator=(const S&); }; 3255 void x() { S s1, s2; s1 = s2; } 3256</pre></td></tr> 3257 3258 3259<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('isComparisonOperator1')"><a name="isComparisonOperator1Anchor">isComparisonOperator</a></td><td></td></tr> 3260<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators. 3261 3262Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3263 if (a == b) 3264 a += b; 3265 3266Example 2: matches s1 < s2 3267 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3268 struct S { bool operator<(const S& other); }; 3269 void x(S s1, S s2) { bool b1 = s1 < s2; } 3270</pre></td></tr> 3271 3272 3273<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr> 3274<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined. 3275 3276Example matches x (matcher = cxxRecordDecl(hasDefinition())) 3277class x {}; 3278class y; 3279</pre></td></tr> 3280 3281 3282<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom2')"><a name="isDerivedFrom2Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr> 3283<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 3284</pre></td></tr> 3285 3286 3287<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom2')"><a name="isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr> 3288<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 3289</pre></td></tr> 3290 3291 3292<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr> 3293<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 3294static member variable template instantiations. 3295 3296Given 3297 template<typename T> void A(T t) { } 3298 template<> void A(int N) { } 3299functionDecl(isExplicitTemplateSpecialization()) 3300 matches the specialization A<int>(). 3301 3302Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 3303</pre></td></tr> 3304 3305 3306<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr> 3307<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 3308 3309Given: 3310 class A final {}; 3311 3312 struct B { 3313 virtual void f(); 3314 }; 3315 3316 struct C : B { 3317 void f() final; 3318 }; 3319matches A and C::f, but not B, C, or B::f 3320</pre></td></tr> 3321 3322 3323<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr> 3324<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 3325 3326Given: 3327 auto x = []{}; 3328 3329cxxRecordDecl(isLambda()) matches the implicit class declaration of 3330decltype(x) 3331</pre></td></tr> 3332 3333 3334<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom2')"><a name="isSameOrDerivedFrom2Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr> 3335<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for 3336isSameOrDerivedFrom(hasName(...)). 3337</pre></td></tr> 3338 3339 3340<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr> 3341<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 3342member variable template instantiations. 3343 3344Given 3345 template <typename T> class X {}; class A {}; X<A> x; 3346or 3347 template <typename T> class X {}; class A {}; template class X<A>; 3348or 3349 template <typename T> class X {}; class A {}; extern template class X<A>; 3350cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3351 matches the template instantiation of X<A>. 3352 3353But given 3354 template <typename T> class X {}; class A {}; 3355 template <> class X<A> {}; X<A> x; 3356cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3357 does not match, as X<A> is an explicit template specialization. 3358 3359Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 3360</pre></td></tr> 3361 3362 3363<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 3364<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3365a specific number of arguments (including absent default arguments). 3366 3367Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3368 void f(int x, int y); 3369 f(0, 0); 3370</pre></td></tr> 3371 3372 3373<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('argumentCountIs0')"><a name="argumentCountIs0Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 3374<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 3375a specific number of arguments (including absent default arguments). 3376 3377Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3378 void f(int x, int y); 3379 f(0, 0); 3380</pre></td></tr> 3381 3382 3383<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('usesADL0')"><a name="usesADL0Anchor">usesADL</a></td><td></td></tr> 3384<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL. 3385 3386Example matches y(x) but not y(42) or NS::y(x). 3387 namespace NS { 3388 struct X {}; 3389 void y(X); 3390 } 3391 3392 void y(...); 3393 3394 void test() { 3395 NS::X x; 3396 y(x); // Matches 3397 NS::y(x); // Doesn't match 3398 y(42); // Doesn't match 3399 using NS::y; 3400 y(x); // Found by both unqualified lookup and ADL, doesn't match 3401 } 3402</pre></td></tr> 3403 3404 3405<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>></td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr> 3406<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 3407 3408Example: matches the implicit cast around 0 3409(matcher = castExpr(hasCastKind(CK_NullToPointer))) 3410 int *p = 0; 3411 3412If the matcher is use from clang-query, CastKind parameter 3413should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer"). 3414</pre></td></tr> 3415 3416 3417<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr> 3418<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr> 3419 3420 3421<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT Value</td></tr> 3422<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT. 3423 3424Given 3425 f('false, 3.14, 42); 3426characterLiteral(equals(0)) 3427 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3428 match false 3429floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3430 match 3.14 3431integerLiteral(equals(42)) 3432 matches 42 3433 3434Note that you cannot directly match a negative numeric literal because the 3435minus sign is not part of the literal: It is a unary operator whose operand 3436is the positive numeric literal. Instead, you must use a unaryOperator() 3437matcher to match the minus sign: 3438 3439unaryOperator(hasOperatorName("-"), 3440 hasUnaryOperand(integerLiteral(equals(13)))) 3441 3442Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 3443 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 3444</pre></td></tr> 3445 3446 3447<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr> 3448<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr> 3449 3450 3451<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr> 3452<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr> 3453 3454 3455<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr> 3456<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 3457 3458Given 3459 template<typename T> struct C {}; 3460 C<int> c; 3461classTemplateSpecializationDecl(templateArgumentCountIs(1)) 3462 matches C<int>. 3463</pre></td></tr> 3464 3465 3466<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>></td><td class="name" onclick="toggle('statementCountIs0')"><a name="statementCountIs0Anchor">statementCountIs</a></td><td>unsigned N</td></tr> 3467<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 3468child statements. 3469 3470Example: Given 3471 { for (;;) {} } 3472compoundStmt(statementCountIs(0))) 3473 matches '{}' 3474 but does not match the outer compound statement. 3475</pre></td></tr> 3476 3477 3478<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>></td><td class="name" onclick="toggle('hasSize0')"><a name="hasSize0Anchor">hasSize</a></td><td>unsigned N</td></tr> 3479<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 3480 3481Given 3482 int a[42]; 3483 int b[2 * 21]; 3484 int c[41], d[43]; 3485 char *s = "abcd"; 3486 wchar_t *ws = L"abcd"; 3487 char *w = "a"; 3488constantArrayType(hasSize(42)) 3489 matches "int a[42]" and "int b[2 * 21]" 3490stringLiteral(hasSize(4)) 3491 matches "abcd", L"abcd" 3492</pre></td></tr> 3493 3494 3495<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>></td><td class="name" onclick="toggle('declCountIs0')"><a name="declCountIs0Anchor">declCountIs</a></td><td>unsigned N</td></tr> 3496<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 3497declarations. 3498 3499Example: Given 3500 int a, b; 3501 int c; 3502 int d = 2, e; 3503declCountIs(2) 3504 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 3505</pre></td></tr> 3506 3507 3508<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 3509<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 3510 3511Matches a node if it equals the node previously bound to ID. 3512 3513Given 3514 class X { int a; int b; }; 3515cxxRecordDecl( 3516 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3517 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3518 matches the class X, as a and b have the same type. 3519 3520Note that when multiple matches are involved via forEach* matchers, 3521equalsBoundNodes acts as a filter. 3522For example: 3523compoundStmt( 3524 forEachDescendant(varDecl().bind("d")), 3525 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3526will trigger a match for each combination of variable declaration 3527and reference to that variable declaration within a compound statement. 3528</pre></td></tr> 3529 3530 3531<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr> 3532<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 3533 3534Decl has pointer identity in the AST. 3535</pre></td></tr> 3536 3537 3538<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr> 3539<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 3540 3541Given 3542 __attribute__((device)) void f() { ... } 3543decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 3544f. If the matcher is used from clang-query, attr::Kind parameter should be 3545passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 3546</pre></td></tr> 3547 3548 3549<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpandedFromMacro0')"><a name="isExpandedFromMacro0Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr> 3550<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro. 3551Does not match if only part of the statement is expanded from that macro or 3552if different parts of the the statement are expanded from different 3553appearances of the macro. 3554</pre></td></tr> 3555 3556 3557<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 3558<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 3559partially matching a given regex. 3560 3561Example matches Y but not X 3562 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3563 #include "ASTMatcher.h" 3564 class X {}; 3565ASTMatcher.h: 3566 class Y {}; 3567 3568Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3569 3570If the matcher is used in clang-query, RegexFlags parameter 3571should be passed as a quoted string. e.g: "NoFlags". 3572Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3573</pre></td></tr> 3574 3575 3576<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr> 3577<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 3578 3579Example matches X but not Y 3580 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3581 #include <Y.h> 3582 class X {}; 3583Y.h: 3584 class Y {}; 3585 3586Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3587</pre></td></tr> 3588 3589 3590<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr> 3591<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 3592 3593Example matches Y but not X 3594 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3595 #include <SystemHeader.h> 3596 class X {}; 3597SystemHeader.h: 3598 class Y {}; 3599 3600Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3601</pre></td></tr> 3602 3603 3604<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr> 3605<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added 3606by the compiler (eg. implicit default/copy constructors). 3607</pre></td></tr> 3608 3609 3610<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isInStdNamespace0')"><a name="isInStdNamespace0Anchor">isInStdNamespace</a></td><td></td></tr> 3611<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces. 3612 3613Given 3614 class vector {}; 3615 namespace foo { 3616 class vector {}; 3617 namespace std { 3618 class vector {}; 3619 } 3620 } 3621 namespace std { 3622 inline namespace __1 { 3623 class vector {}; // #1 3624 namespace experimental { 3625 class vector {}; 3626 } 3627 } 3628 } 3629cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1. 3630</pre></td></tr> 3631 3632 3633<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr> 3634<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3635template instantiations. 3636 3637Given 3638 template<typename T> void A(T t) { T i; } 3639 A(0); 3640 A(0U); 3641functionDecl(isInstantiated()) 3642 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3643</pre></td></tr> 3644 3645 3646<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr> 3647<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private 3648inheritance. 3649 3650Examples: 3651 class C { 3652 public: int a; 3653 protected: int b; 3654 private: int c; // fieldDecl(isPrivate()) matches 'c' 3655 }; 3656 3657 struct Base {}; 3658 struct Derived1 : private Base {}; // matches 'Base' 3659 class Derived2 : Base {}; // matches 'Base' 3660</pre></td></tr> 3661 3662 3663<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr> 3664<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify 3665protected inheritance. 3666 3667Examples: 3668 class C { 3669 public: int a; 3670 protected: int b; // fieldDecl(isProtected()) matches 'b' 3671 private: int c; 3672 }; 3673 3674 class Base {}; 3675 class Derived : protected Base {}; // matches 'Base' 3676</pre></td></tr> 3677 3678 3679<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr> 3680<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public 3681inheritance. 3682 3683Examples: 3684 class C { 3685 public: int a; // fieldDecl(isPublic()) matches 'a' 3686 protected: int b; 3687 private: int c; 3688 }; 3689 3690 class Base {}; 3691 class Derived1 : public Base {}; // matches 'Base' 3692 struct Derived2 : Base {}; // matches 'Base' 3693</pre></td></tr> 3694 3695 3696<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>></td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr> 3697<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 3698a specific number of designators. 3699 3700Example: Given 3701 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 3702 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 3703designatorCountIs(2) 3704 matches '{ [2].y = 1.0, [0].x = 1.0 }', 3705 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 3706</pre></td></tr> 3707 3708 3709<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>></td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr> 3710<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration. 3711 3712Example matches Y (matcher = enumDecl(isScoped())) 3713enum X {}; 3714enum class Y {}; 3715</pre></td></tr> 3716 3717 3718<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isInstantiationDependent0')"><a name="isInstantiationDependent0Anchor">isInstantiationDependent</a></td><td></td></tr> 3719<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is 3720neither type- nor value-dependent. 3721 3722In the following example, the expression sizeof(sizeof(T() + T())) 3723is instantiation-dependent (since it involves a template parameter T), 3724but is neither type- nor value-dependent, since the type of the inner 3725sizeof is known (std::size_t) and therefore the size of the outer 3726sizeof is known. 3727 template<typename T> 3728 void f(T x, T y) { sizeof(sizeof(T() + T()); } 3729expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T()) 3730</pre></td></tr> 3731 3732 3733<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr> 3734<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type 3735is not yet instantiated. 3736 3737For example, the expressions "x" and "x + y" are type-dependent in 3738the following code, but "y" is not type-dependent: 3739 template<typename T> 3740 void add(T x, int y) { 3741 x + y; 3742 } 3743expr(isTypeDependent()) matches x + y 3744</pre></td></tr> 3745 3746 3747<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr> 3748<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a 3749non-type template parameter. 3750 3751For example, the array bound of "Chars" in the following example is 3752value-dependent. 3753 template<int Size> int f() { return Size; } 3754expr(isValueDependent()) matches return Size 3755</pre></td></tr> 3756 3757 3758<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr> 3759<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 3760GNU's __null, C++11's nullptr, or C's NULL macro. 3761 3762Given: 3763 void *v1 = NULL; 3764 void *v2 = nullptr; 3765 void *v3 = __null; // GNU extension 3766 char *cp = (char *)0; 3767 int *ip = 0; 3768 int i = 0; 3769expr(nullPointerConstant()) 3770 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 3771 initializer for i. 3772</pre></td></tr> 3773 3774 3775<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr> 3776<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 3777bit width. 3778 3779Given 3780 class C { 3781 int a : 2; 3782 int b : 4; 3783 int c : 2; 3784 }; 3785fieldDecl(hasBitWidth(2)) 3786 matches 'int a;' and 'int c;' but not 'int b;'. 3787</pre></td></tr> 3788 3789 3790<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr> 3791<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 3792 3793Given 3794 class C { 3795 int a : 2; 3796 int b; 3797 }; 3798fieldDecl(isBitField()) 3799 matches 'int a;' but not 'int b;'. 3800</pre></td></tr> 3801 3802 3803<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>const ValueT Value</td></tr> 3804<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 3805 3806Given 3807 f('false, 3.14, 42); 3808characterLiteral(equals(0)) 3809 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3810 match false 3811floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3812 match 3.14 3813integerLiteral(equals(42)) 3814 matches 42 3815 3816Note that you cannot directly match a negative numeric literal because the 3817minus sign is not part of the literal: It is a unary operator whose operand 3818is the positive numeric literal. Instead, you must use a unaryOperator() 3819matcher to match the minus sign: 3820 3821unaryOperator(hasOperatorName("-"), 3822 hasUnaryOperand(integerLiteral(equals(13)))) 3823 3824Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 3825 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 3826</pre></td></tr> 3827 3828 3829<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name" onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr> 3830<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr> 3831 3832 3833<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName1')"><a name="hasAnyOverloadedOperatorName1Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 3834<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names. 3835 3836Matches overloaded operator names specified in strings without the 3837"operator" prefix: e.g. "<<". 3838 3839 hasAnyOverloadedOperatorName("+", "-") 3840Is equivalent to 3841 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3842</pre></td></tr> 3843 3844 3845<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr> 3846<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 3847 3848Given: 3849 void f(); 3850 void g() noexcept; 3851 void h() noexcept(true); 3852 void i() noexcept(false); 3853 void j() throw(); 3854 void k() throw(int); 3855 void l() throw(...); 3856functionDecl(hasDynamicExceptionSpec()) and 3857 functionProtoType(hasDynamicExceptionSpec()) 3858 match the declarations of j, k, and l, but not f, g, h, or i. 3859</pre></td></tr> 3860 3861 3862<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr> 3863<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 3864 3865Matches overloaded operator names specified in strings without the 3866"operator" prefix: e.g. "<<". 3867 3868Given: 3869 class A { int operator*(); }; 3870 const A &operator<<(const A &a, const A &b); 3871 A a; 3872 a << a; // <-- This matches 3873 3874cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3875specified line and 3876cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3877matches the declaration of A. 3878 3879Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 3880</pre></td></tr> 3881 3882 3883<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr> 3884<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 3885 3886Example matches Y (matcher = functionDecl(hasTrailingReturn())) 3887int X() {} 3888auto Y() -> int {} 3889</pre></td></tr> 3890 3891 3892<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr> 3893<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations, 3894 and if constexpr. 3895 3896Given: 3897 constexpr int foo = 42; 3898 constexpr int bar(); 3899 void baz() { if constexpr(1 > 0) {} } 3900varDecl(isConstexpr()) 3901 matches the declaration of foo. 3902functionDecl(isConstexpr()) 3903 matches the declaration of bar. 3904ifStmt(isConstexpr()) 3905 matches the if statement in baz. 3906</pre></td></tr> 3907 3908 3909<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr> 3910<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 3911 3912Given: 3913 class A { ~A(); }; 3914 class B { ~B() = default; }; 3915functionDecl(isDefaulted()) 3916 matches the declaration of ~B, but not ~A. 3917</pre></td></tr> 3918 3919 3920<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr> 3921<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 3922 3923Example matches A, va, fa 3924 class A {}; 3925 class B; // Doesn't match, as it has no body. 3926 int va; 3927 extern int vb; // Doesn't match, as it doesn't define the variable. 3928 void fa() {} 3929 void fb(); // Doesn't match, as it has no body. 3930 @interface X 3931 - (void)ma; // Doesn't match, interface is declaration. 3932 @end 3933 @implementation X 3934 - (void)ma {} 3935 @end 3936 3937Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, 3938 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 3939</pre></td></tr> 3940 3941 3942<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr> 3943<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 3944 3945Given: 3946 void Func(); 3947 void DeletedFunc() = delete; 3948functionDecl(isDeleted()) 3949 matches the declaration of DeletedFunc, but not Func. 3950</pre></td></tr> 3951 3952 3953<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization0')"><a name="isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr> 3954<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 3955static member variable template instantiations. 3956 3957Given 3958 template<typename T> void A(T t) { } 3959 template<> void A(int N) { } 3960functionDecl(isExplicitTemplateSpecialization()) 3961 matches the specialization A<int>(). 3962 3963Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 3964</pre></td></tr> 3965 3966 3967<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr> 3968<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 3969 3970Given: 3971 extern "C" void f() {} 3972 extern "C" { void g() {} } 3973 void h() {} 3974 extern "C" int x = 1; 3975 extern "C" int y = 2; 3976 int z = 3; 3977functionDecl(isExternC()) 3978 matches the declaration of f and g, but not the declaration of h. 3979varDecl(isExternC()) 3980 matches the declaration of x and y, but not the declaration of z. 3981</pre></td></tr> 3982 3983 3984<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr> 3985<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 3986the inline keyword. 3987 3988Given 3989 inline void f(); 3990 void g(); 3991 namespace n { 3992 inline namespace m {} 3993 } 3994functionDecl(isInline()) will match ::f(). 3995namespaceDecl(isInline()) will match n::m. 3996</pre></td></tr> 3997 3998 3999<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isMain0')"><a name="isMain0Anchor">isMain</a></td><td></td></tr> 4000<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point 4001into an executable program. 4002</pre></td></tr> 4003 4004 4005<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr> 4006<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 4007 4008Given 4009 void nope(); 4010 [[noreturn]] void a(); 4011 __attribute__((noreturn)) void b(); 4012 struct c { [[noreturn]] c(); }; 4013functionDecl(isNoReturn()) 4014 matches all of those except 4015 void nope(); 4016</pre></td></tr> 4017 4018 4019<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr> 4020<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 4021 4022Given: 4023 void f(); 4024 void g() noexcept; 4025 void h() throw(); 4026 void i() throw(int); 4027 void j() noexcept(false); 4028functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4029 match the declarations of g, and h, but not f, i or j. 4030</pre></td></tr> 4031 4032 4033<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr> 4034<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage 4035class specifier ("static" keyword) written in the source. 4036 4037Given: 4038 static void f() {} 4039 static int i = 0; 4040 extern int j; 4041 int k; 4042functionDecl(isStaticStorageClass()) 4043 matches the function declaration f. 4044varDecl(isStaticStorageClass()) 4045 matches the variable declaration i. 4046</pre></td></tr> 4047 4048 4049<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr> 4050<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 4051member variable template instantiations. 4052 4053Given 4054 template <typename T> class X {}; class A {}; X<A> x; 4055or 4056 template <typename T> class X {}; class A {}; template class X<A>; 4057or 4058 template <typename T> class X {}; class A {}; extern template class X<A>; 4059cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4060 matches the template instantiation of X<A>. 4061 4062But given 4063 template <typename T> class X {}; class A {}; 4064 template <> class X<A> {}; X<A> x; 4065cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4066 does not match, as X<A> is an explicit template specialization. 4067 4068Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 4069</pre></td></tr> 4070 4071 4072<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr> 4073<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 4074 4075Example matches f, but not g or h. The function i will not match, even when 4076compiled in C mode. 4077 void f(...); 4078 void g(int); 4079 template <typename... Ts> void h(Ts...); 4080 void i(); 4081</pre></td></tr> 4082 4083 4084<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isWeak0')"><a name="isWeak0Anchor">isWeak</a></td><td></td></tr> 4085<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations. 4086 4087Given: 4088 void foo() __attribute__((__weakref__("__foo"))); 4089 void bar(); 4090functionDecl(isWeak()) 4091 matches the weak declaration "foo", but not "bar". 4092</pre></td></tr> 4093 4094 4095<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('parameterCountIs0')"><a name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned N</td></tr> 4096<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4097specific parameter count. 4098 4099Given 4100 void f(int i) {} 4101 void g(int i, int j) {} 4102 void h(int i, int j); 4103 void j(int i); 4104 void k(int x, int y, int z, ...); 4105functionDecl(parameterCountIs(2)) 4106 matches g and h 4107functionProtoType(parameterCountIs(2)) 4108 matches g and h 4109functionProtoType(parameterCountIs(3)) 4110 matches k 4111</pre></td></tr> 4112 4113 4114<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr> 4115<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 4116 4117Given: 4118 void f(); 4119 void g() noexcept; 4120 void h() noexcept(true); 4121 void i() noexcept(false); 4122 void j() throw(); 4123 void k() throw(int); 4124 void l() throw(...); 4125functionDecl(hasDynamicExceptionSpec()) and 4126 functionProtoType(hasDynamicExceptionSpec()) 4127 match the declarations of j, k, and l, but not f, g, h, or i. 4128</pre></td></tr> 4129 4130 4131<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr> 4132<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 4133 4134Given: 4135 void f(); 4136 void g() noexcept; 4137 void h() throw(); 4138 void i() throw(int); 4139 void j() noexcept(false); 4140functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4141 match the declarations of g, and h, but not f, i or j. 4142</pre></td></tr> 4143 4144 4145<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr> 4146<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4147specific parameter count. 4148 4149Given 4150 void f(int i) {} 4151 void g(int i, int j) {} 4152 void h(int i, int j); 4153 void j(int i); 4154 void k(int x, int y, int z, ...); 4155functionDecl(parameterCountIs(2)) 4156 matches g and h 4157functionProtoType(parameterCountIs(2)) 4158 matches g and h 4159functionProtoType(parameterCountIs(3)) 4160 matches k 4161</pre></td></tr> 4162 4163 4164<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('isConstexpr2')"><a name="isConstexpr2Anchor">isConstexpr</a></td><td></td></tr> 4165<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations, 4166 and if constexpr. 4167 4168Given: 4169 constexpr int foo = 42; 4170 constexpr int bar(); 4171 void baz() { if constexpr(1 > 0) {} } 4172varDecl(isConstexpr()) 4173 matches the declaration of foo. 4174functionDecl(isConstexpr()) 4175 matches the declaration of bar. 4176ifStmt(isConstexpr()) 4177 matches the if statement in baz. 4178</pre></td></tr> 4179 4180 4181<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr> 4182<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 4183 4184 4185<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>const ValueT Value</td></tr> 4186<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 4187 4188Given 4189 f('false, 3.14, 42); 4190characterLiteral(equals(0)) 4191 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4192 match false 4193floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4194 match 3.14 4195integerLiteral(equals(42)) 4196 matches 42 4197 4198Note that you cannot directly match a negative numeric literal because the 4199minus sign is not part of the literal: It is a unary operator whose operand 4200is the positive numeric literal. Instead, you must use a unaryOperator() 4201matcher to match the minus sign: 4202 4203unaryOperator(hasOperatorName("-"), 4204 hasUnaryOperand(integerLiteral(equals(13)))) 4205 4206Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 4207 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 4208</pre></td></tr> 4209 4210 4211<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr> 4212<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 4213 4214 4215<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned Value</td></tr> 4216<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 4217 4218 4219<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('isArrow0')"><a name="isArrow0Anchor">isArrow</a></td><td></td></tr> 4220<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 4221to '.'. 4222 4223Member calls on the implicit this pointer match as called with '->'. 4224 4225Given 4226 class Y { 4227 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 4228 template <class T> void f() { this->f<T>(); f<T>(); } 4229 int a; 4230 static int b; 4231 }; 4232 template <class T> 4233 class Z { 4234 void x() { this->m; } 4235 }; 4236memberExpr(isArrow()) 4237 matches this->x, x, y.x, a, this->b 4238cxxDependentScopeMemberExpr(isArrow()) 4239 matches this->m 4240unresolvedMemberExpr(isArrow()) 4241 matches this->f<T>, f<T> 4242</pre></td></tr> 4243 4244 4245<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr> 4246<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 4247 4248This matcher is only provided as a performance optimization of hasName. 4249 hasAnyName(a, b, c) 4250 is equivalent to, but faster than 4251 anyOf(hasName(a), hasName(b), hasName(c)) 4252</pre></td></tr> 4253 4254 4255<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasExternalFormalLinkage0')"><a name="hasExternalFormalLinkage0Anchor">hasExternalFormalLinkage</a></td><td></td></tr> 4256<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 4257 4258Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 4259void f() { 4260 int x; 4261 static int y; 4262} 4263int z; 4264 4265Example matches f() because it has external formal linkage despite being 4266unique to the translation unit as though it has internal likage 4267(matcher = functionDecl(hasExternalFormalLinkage())) 4268 4269namespace { 4270void f() {} 4271} 4272</pre></td></tr> 4273 4274 4275<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>StringRef Name</td></tr> 4276<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 4277 4278Supports specifying enclosing namespaces or classes by prefixing the name 4279with '<enclosing>::'. 4280Does not match typedefs of an underlying type with the given name. 4281 4282Example matches X (Name == "X") 4283 class X; 4284 4285Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 4286 namespace a { namespace b { class X; } } 4287</pre></td></tr> 4288 4289 4290<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 4291<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 4292a substring matched by the given RegExp. 4293 4294Supports specifying enclosing namespaces or classes by 4295prefixing the name with '<enclosing>::'. Does not match typedefs 4296of an underlying type with the given name. 4297 4298Example matches X (regexp == "::X") 4299 class X; 4300 4301Example matches X (regexp is one of "::X", "^foo::.*X", among others) 4302 namespace foo { namespace bar { class X; } } 4303 4304If the matcher is used in clang-query, RegexFlags parameter 4305should be passed as a quoted string. e.g: "NoFlags". 4306Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4307</pre></td></tr> 4308 4309 4310<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>></td><td class="name" onclick="toggle('isAnonymous0')"><a name="isAnonymous0Anchor">isAnonymous</a></td><td></td></tr> 4311<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 4312 4313Given 4314 namespace n { 4315 namespace {} // #1 4316 } 4317namespaceDecl(isAnonymous()) will match #1 but not ::n. 4318</pre></td></tr> 4319 4320 4321<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>></td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr> 4322<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 4323the inline keyword. 4324 4325Given 4326 inline void f(); 4327 void g(); 4328 namespace n { 4329 inline namespace m {} 4330 } 4331functionDecl(isInline()) will match ::f(). 4332namespaceDecl(isInline()) will match n::m. 4333</pre></td></tr> 4334 4335 4336<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>></td><td class="name" onclick="toggle('isFirstPrivateKind0')"><a name="isFirstPrivateKind0Anchor">isFirstPrivateKind</a></td><td></td></tr> 4337<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind 4338specified. 4339 4340Given 4341 4342 #pragma omp parallel 4343 #pragma omp parallel default(none) 4344 #pragma omp parallel default(shared) 4345 #pragma omp parallel default(firstprivate) 4346 4347``ompDefaultClause(isFirstPrivateKind())`` matches only 4348``default(firstprivate)``. 4349</pre></td></tr> 4350 4351 4352<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>></td><td class="name" onclick="toggle('isNoneKind0')"><a name="isNoneKind0Anchor">isNoneKind</a></td><td></td></tr> 4353<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified. 4354 4355Given 4356 4357 #pragma omp parallel 4358 #pragma omp parallel default(none) 4359 #pragma omp parallel default(shared) 4360 #pragma omp parallel default(firstprivate) 4361 4362``ompDefaultClause(isNoneKind())`` matches only ``default(none)``. 4363</pre></td></tr> 4364 4365 4366<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>></td><td class="name" onclick="toggle('isSharedKind0')"><a name="isSharedKind0Anchor">isSharedKind</a></td><td></td></tr> 4367<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified. 4368 4369Given 4370 4371 #pragma omp parallel 4372 #pragma omp parallel default(none) 4373 #pragma omp parallel default(shared) 4374 #pragma omp parallel default(firstprivate) 4375 4376``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``. 4377</pre></td></tr> 4378 4379 4380<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('isAllowedToContainClauseKind0')"><a name="isAllowedToContainClauseKind0Anchor">isAllowedToContainClauseKind</a></td><td>OpenMPClauseKind CKind</td></tr> 4381<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP 4382clause kind. 4383 4384Given 4385 4386 #pragma omp parallel 4387 #pragma omp parallel for 4388 #pragma omp for 4389 4390`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches 4391``omp parallel`` and ``omp parallel for``. 4392 4393If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter 4394should be passed as a quoted string. e.g., 4395``isAllowedToContainClauseKind("OMPC_default").`` 4396</pre></td></tr> 4397 4398 4399<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('isStandaloneDirective0')"><a name="isStandaloneDirective0Anchor">isStandaloneDirective</a></td><td></td></tr> 4400<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives, 4401i.e., directives that can't have a structured block. 4402 4403Given 4404 4405 #pragma omp parallel 4406 {} 4407 #pragma omp taskyield 4408 4409``ompExecutableDirective(isStandaloneDirective()))`` matches 4410``omp taskyield``. 4411</pre></td></tr> 4412 4413 4414<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom3')"><a name="isDerivedFrom3Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr> 4415<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 4416</pre></td></tr> 4417 4418 4419<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom3')"><a name="isDirectlyDerivedFrom3Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr> 4420<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 4421</pre></td></tr> 4422 4423 4424<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom3')"><a name="isSameOrDerivedFrom3Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr> 4425<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for 4426isSameOrDerivedFrom(hasName(...)). 4427</pre></td></tr> 4428 4429 4430<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('argumentCountIs3')"><a name="argumentCountIs3Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 4431<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has 4432a specific number of arguments (including absent default arguments). 4433 4434Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 4435 void f(int x, int y); 4436 f(0, 0); 4437</pre></td></tr> 4438 4439 4440<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasAnySelector0')"><a name="hasAnySelector0Anchor">hasAnySelector</a></td><td>StringRef, ..., StringRef</td></tr> 4441<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 4442Selector.getAsString() 4443 4444 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 4445 matches both of the expressions below: 4446 [myObj methodA:argA]; 4447 [myObj methodB:argB]; 4448</pre></td></tr> 4449 4450 4451<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr> 4452<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 4453 4454objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 4455message expression in 4456 4457 UIWebView *webView = ...; 4458 CGRect bodyFrame = webView.frame; 4459 bodyFrame.size.height = self.bodyContentHeight; 4460 webView.frame = bodyFrame; 4461 // ^---- matches here 4462</pre></td></tr> 4463 4464 4465<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr> 4466<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 4467 4468Matches only when the selector of the objCMessageExpr is NULL. This may 4469represent an error condition in the tree! 4470</pre></td></tr> 4471 4472 4473<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasSelector0')"><a name="hasSelector0Anchor">hasSelector</a></td><td>std::string BaseName</td></tr> 4474<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 4475 4476 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 4477 matches the outer message expr in the code below, but NOT the message 4478 invocation for self.bodyView. 4479 [self.bodyView loadHTMLString:html baseURL:NULL]; 4480</pre></td></tr> 4481 4482 4483<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasUnarySelector0')"><a name="hasUnarySelector0Anchor">hasUnarySelector</a></td><td></td></tr> 4484<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 4485 4486 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 4487 matches self.bodyView in the code below, but NOT the outer message 4488 invocation of "loadHTMLString:baseURL:". 4489 [self.bodyView loadHTMLString:html baseURL:NULL]; 4490</pre></td></tr> 4491 4492 4493<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('isClassMessage0')"><a name="isClassMessage0Anchor">isClassMessage</a></td><td></td></tr> 4494<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class. 4495 4496Example 4497matcher = objcMessageExpr(isClassMessage()) 4498matches 4499 [NSString stringWithFormat:@"format"]; 4500but not 4501 NSString *x = @"hello"; 4502 [x containsString:@"h"]; 4503</pre></td></tr> 4504 4505 4506<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('isInstanceMessage0')"><a name="isInstanceMessage0Anchor">isInstanceMessage</a></td><td></td></tr> 4507<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance. 4508 4509Example 4510matcher = objcMessageExpr(isInstanceMessage()) 4511matches 4512 NSString *x = @"hello"; 4513 [x containsString:@"h"]; 4514but not 4515 [NSString stringWithFormat:@"format"]; 4516</pre></td></tr> 4517 4518 4519<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 4520<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 4521a substring matched by the given RegExp. 4522 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 4523 invocation for self.bodyView. 4524 [self.bodyView loadHTMLString:html baseURL:NULL]; 4525 4526If the matcher is used in clang-query, RegexFlags parameter 4527should be passed as a quoted string. e.g: "NoFlags". 4528Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4529</pre></td></tr> 4530 4531 4532<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr> 4533<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 4534 4535 matcher = objCMessageExpr(numSelectorArgs(0)); 4536 matches self.bodyView in the code below 4537 4538 matcher = objCMessageExpr(numSelectorArgs(2)); 4539 matches the invocation of "loadHTMLString:baseURL:" but not that 4540 of self.bodyView 4541 [self.bodyView loadHTMLString:html baseURL:NULL]; 4542</pre></td></tr> 4543 4544 4545<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isClassMethod0')"><a name="isClassMethod0Anchor">isClassMethod</a></td><td></td></tr> 4546<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method. 4547 4548Example 4549matcher = objcMethodDecl(isClassMethod()) 4550matches 4551@interface I + (void)foo; @end 4552but not 4553@interface I - (void)bar; @end 4554</pre></td></tr> 4555 4556 4557<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr> 4558<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 4559 4560Example matches A, va, fa 4561 class A {}; 4562 class B; // Doesn't match, as it has no body. 4563 int va; 4564 extern int vb; // Doesn't match, as it doesn't define the variable. 4565 void fa() {} 4566 void fb(); // Doesn't match, as it has no body. 4567 @interface X 4568 - (void)ma; // Doesn't match, interface is declaration. 4569 @end 4570 @implementation X 4571 - (void)ma {} 4572 @end 4573 4574Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, 4575 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4576</pre></td></tr> 4577 4578 4579<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isInstanceMethod0')"><a name="isInstanceMethod0Anchor">isInstanceMethod</a></td><td></td></tr> 4580<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method. 4581 4582Example 4583matcher = objcMethodDecl(isInstanceMethod()) 4584matches 4585@interface I - (void)bar; @end 4586but not 4587@interface I + (void)foo; @end 4588</pre></td></tr> 4589 4590 4591<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>></td><td class="name" onclick="toggle('hasDefaultArgument0')"><a name="hasDefaultArgument0Anchor">hasDefaultArgument</a></td><td></td></tr> 4592<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 4593 4594Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 4595void x(int val) {} 4596void y(int val = 0) {} 4597 4598Deprecated. Use hasInitializer() instead to be able to 4599match on the contents of the default argument. For example: 4600 4601void x(int val = 7) {} 4602void y(int val = 42) {} 4603parmVarDecl(hasInitializer(integerLiteral(equals(42)))) 4604 matches the parameter of y 4605 4606A matcher such as 4607 parmVarDecl(hasInitializer(anything())) 4608is equivalent to parmVarDecl(hasDefaultArgument()). 4609</pre></td></tr> 4610 4611 4612<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>></td><td class="name" onclick="toggle('isAtPosition0')"><a name="isAtPosition0Anchor">isAtPosition</a></td><td>unsigned N</td></tr> 4613<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter 4614list. The parameter list could be that of either a block, function, or 4615objc-method. 4616 4617 4618Given 4619 4620void f(int a, int b, int c) { 4621} 4622 4623``parmVarDecl(isAtPosition(0))`` matches ``int a``. 4624 4625``parmVarDecl(isAtPosition(1))`` matches ``int b``. 4626</pre></td></tr> 4627 4628 4629<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('asString0')"><a name="asString0Anchor">asString</a></td><td>std::string Name</td></tr> 4630<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 4631 4632Given 4633 class Y { public: void x(); }; 4634 void z() { Y* y; y->x(); } 4635cxxMemberCallExpr(on(hasType(asString("class Y *")))) 4636 matches y->x() 4637</pre></td></tr> 4638 4639 4640<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 4641<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 4642 4643Matches a node if it equals the node previously bound to ID. 4644 4645Given 4646 class X { int a; int b; }; 4647cxxRecordDecl( 4648 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4649 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4650 matches the class X, as a and b have the same type. 4651 4652Note that when multiple matches are involved via forEach* matchers, 4653equalsBoundNodes acts as a filter. 4654For example: 4655compoundStmt( 4656 forEachDescendant(varDecl().bind("d")), 4657 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4658will trigger a match for each combination of variable declaration 4659and reference to that variable declaration within a compound statement. 4660</pre></td></tr> 4661 4662 4663<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('hasLocalQualifiers0')"><a name="hasLocalQualifiers0Anchor">hasLocalQualifiers</a></td><td></td></tr> 4664<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 4665the node, not hidden within a typedef. 4666 4667Given 4668 typedef const int const_int; 4669 const_int i; 4670 int *const j; 4671 int *volatile k; 4672 int m; 4673varDecl(hasType(hasLocalQualifiers())) matches only j and k. 4674i is const-qualified but the qualifier is not local. 4675</pre></td></tr> 4676 4677 4678<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr> 4679<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 4680 4681Given 4682 void a(char); 4683 void b(wchar_t); 4684 void c(double); 4685functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 4686matches "a(char)", "b(wchar_t)", but not "c(double)". 4687</pre></td></tr> 4688 4689 4690<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr> 4691<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 4692the Objective-C object pointer type, which is different despite being 4693syntactically similar. 4694 4695Given 4696 int *i = nullptr; 4697 4698 @interface Foo 4699 @end 4700 Foo *f; 4701 4702 int j; 4703varDecl(hasType(isAnyPointer())) 4704 matches "int *i" and "Foo *f", but not "int j". 4705</pre></td></tr> 4706 4707 4708<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isConstQualified0')"><a name="isConstQualified0Anchor">isConstQualified</a></td><td></td></tr> 4709<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 4710include "top-level" const. 4711 4712Given 4713 void a(int); 4714 void b(int const); 4715 void c(const int); 4716 void d(const int*); 4717 void e(int const) {}; 4718functionDecl(hasAnyParameter(hasType(isConstQualified()))) 4719 matches "void b(int const)", "void c(const int)" and 4720 "void e(int const) {}". It does not match d as there 4721 is no top-level const on the parameter type "const int *". 4722</pre></td></tr> 4723 4724 4725<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isInteger0')"><a name="isInteger0Anchor">isInteger</a></td><td></td></tr> 4726<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 4727 4728Given 4729 void a(int); 4730 void b(long); 4731 void c(double); 4732functionDecl(hasAnyParameter(hasType(isInteger()))) 4733matches "a(int)", "b(long)", but not "c(double)". 4734</pre></td></tr> 4735 4736 4737<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr> 4738<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 4739 4740Given 4741 void a(int); 4742 void b(unsigned long); 4743 void c(double); 4744functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 4745matches "a(int)", but not "b(unsigned long)" and "c(double)". 4746</pre></td></tr> 4747 4748 4749<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr> 4750<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 4751 4752Given 4753 void a(int); 4754 void b(unsigned long); 4755 void c(double); 4756functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 4757matches "b(unsigned long)", but not "a(int)" and "c(double)". 4758</pre></td></tr> 4759 4760 4761<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr> 4762<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 4763include "top-level" volatile. 4764 4765Given 4766 void a(int); 4767 void b(int volatile); 4768 void c(volatile int); 4769 void d(volatile int*); 4770 void e(int volatile) {}; 4771functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 4772 matches "void b(int volatile)", "void c(volatile int)" and 4773 "void e(int volatile) {}". It does not match d as there 4774 is no top-level volatile on the parameter type "volatile int *". 4775</pre></td></tr> 4776 4777 4778<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 4779<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 4780 4781Matches a node if it equals the node previously bound to ID. 4782 4783Given 4784 class X { int a; int b; }; 4785cxxRecordDecl( 4786 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4787 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4788 matches the class X, as a and b have the same type. 4789 4790Note that when multiple matches are involved via forEach* matchers, 4791equalsBoundNodes acts as a filter. 4792For example: 4793compoundStmt( 4794 forEachDescendant(varDecl().bind("d")), 4795 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4796will trigger a match for each combination of variable declaration 4797and reference to that variable declaration within a compound statement. 4798</pre></td></tr> 4799 4800 4801<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>const Stmt* Other</td></tr> 4802<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 4803 4804Stmt has pointer identity in the AST. 4805</pre></td></tr> 4806 4807 4808<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpandedFromMacro1')"><a name="isExpandedFromMacro1Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr> 4809<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro. 4810Does not match if only part of the statement is expanded from that macro or 4811if different parts of the the statement are expanded from different 4812appearances of the macro. 4813</pre></td></tr> 4814 4815 4816<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 4817<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 4818partially matching a given regex. 4819 4820Example matches Y but not X 4821 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 4822 #include "ASTMatcher.h" 4823 class X {}; 4824ASTMatcher.h: 4825 class Y {}; 4826 4827Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 4828 4829If the matcher is used in clang-query, RegexFlags parameter 4830should be passed as a quoted string. e.g: "NoFlags". 4831Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4832</pre></td></tr> 4833 4834 4835<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr> 4836<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 4837 4838Example matches X but not Y 4839 (matcher = cxxRecordDecl(isExpansionInMainFile()) 4840 #include <Y.h> 4841 class X {}; 4842Y.h: 4843 class Y {}; 4844 4845Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 4846</pre></td></tr> 4847 4848 4849<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr> 4850<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 4851 4852Example matches Y but not X 4853 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 4854 #include <SystemHeader.h> 4855 class X {}; 4856SystemHeader.h: 4857 class Y {}; 4858 4859Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 4860</pre></td></tr> 4861 4862 4863<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr> 4864<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 4865 4866Given 4867 int j; 4868 template<typename T> void A(T t) { T i; j += 42;} 4869 A(0); 4870 A(0U); 4871declStmt(isInTemplateInstantiation()) 4872 matches 'int i;' and 'unsigned i'. 4873unless(stmt(isInTemplateInstantiation())) 4874 will NOT match j += 42; as it's shared between the template definition and 4875 instantiation. 4876</pre></td></tr> 4877 4878 4879<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>></td><td class="name" onclick="toggle('hasSize1')"><a name="hasSize1Anchor">hasSize</a></td><td>unsigned N</td></tr> 4880<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 4881 4882Given 4883 int a[42]; 4884 int b[2 * 21]; 4885 int c[41], d[43]; 4886 char *s = "abcd"; 4887 wchar_t *ws = L"abcd"; 4888 char *w = "a"; 4889constantArrayType(hasSize(42)) 4890 matches "int a[42]" and "int b[2 * 21]" 4891stringLiteral(hasSize(4)) 4892 matches "abcd", L"abcd" 4893</pre></td></tr> 4894 4895 4896<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr> 4897<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class." 4898 4899Example matches C, but not S, U or E. 4900 struct S {}; 4901 class C {}; 4902 union U {}; 4903 enum E {}; 4904</pre></td></tr> 4905 4906 4907<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isDefinition0')"><a name="isDefinition0Anchor">isDefinition</a></td><td></td></tr> 4908<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 4909 4910Example matches A, va, fa 4911 class A {}; 4912 class B; // Doesn't match, as it has no body. 4913 int va; 4914 extern int vb; // Doesn't match, as it doesn't define the variable. 4915 void fa() {} 4916 void fb(); // Doesn't match, as it has no body. 4917 @interface X 4918 - (void)ma; // Doesn't match, interface is declaration. 4919 @end 4920 @implementation X 4921 - (void)ma {} 4922 @end 4923 4924Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, 4925 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4926</pre></td></tr> 4927 4928 4929<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isEnum0')"><a name="isEnum0Anchor">isEnum</a></td><td></td></tr> 4930<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum." 4931 4932Example matches E, but not C, S or U. 4933 struct S {}; 4934 class C {}; 4935 union U {}; 4936 enum E {}; 4937</pre></td></tr> 4938 4939 4940<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr> 4941<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct." 4942 4943Example matches S, but not C, U or E. 4944 struct S {}; 4945 class C {}; 4946 union U {}; 4947 enum E {}; 4948</pre></td></tr> 4949 4950 4951<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr> 4952<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union." 4953 4954Example matches U, but not C, S or E. 4955 struct S {}; 4956 class C {}; 4957 union U {}; 4958 enum E {}; 4959</pre></td></tr> 4960 4961 4962<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr> 4963<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 4964 4965Note that 'Value' is a string as the template argument's value is 4966an arbitrary precision integer. 'Value' must be euqal to the canonical 4967representation of that integral value in base 10. 4968 4969Given 4970 template<int T> struct C {}; 4971 C<42> c; 4972classTemplateSpecializationDecl( 4973 hasAnyTemplateArgument(equalsIntegralValue("42"))) 4974 matches the implicit instantiation of C in C<42>. 4975</pre></td></tr> 4976 4977 4978<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr> 4979<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 4980 4981Given 4982 template<int T> struct C {}; 4983 C<42> c; 4984classTemplateSpecializationDecl( 4985 hasAnyTemplateArgument(isIntegral())) 4986 matches the implicit instantiation of C in C<42> 4987 with isIntegral() matching 42. 4988</pre></td></tr> 4989 4990 4991<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('templateArgumentCountIs1')"><a name="templateArgumentCountIs1Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr> 4992<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 4993 4994Given 4995 template<typename T> struct C {}; 4996 C<int> c; 4997classTemplateSpecializationDecl(templateArgumentCountIs(1)) 4998 matches C<int>. 4999</pre></td></tr> 5000 5001 5002<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpandedFromMacro2')"><a name="isExpandedFromMacro2Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr> 5003<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro. 5004Does not match if only part of the statement is expanded from that macro or 5005if different parts of the the statement are expanded from different 5006appearances of the macro. 5007</pre></td></tr> 5008 5009 5010<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 5011<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 5012partially matching a given regex. 5013 5014Example matches Y but not X 5015 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5016 #include "ASTMatcher.h" 5017 class X {}; 5018ASTMatcher.h: 5019 class Y {}; 5020 5021Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5022 5023If the matcher is used in clang-query, RegexFlags parameter 5024should be passed as a quoted string. e.g: "NoFlags". 5025Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5026</pre></td></tr> 5027 5028 5029<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr> 5030<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 5031 5032Example matches X but not Y 5033 (matcher = cxxRecordDecl(isExpansionInMainFile()) 5034 #include <Y.h> 5035 class X {}; 5036Y.h: 5037 class Y {}; 5038 5039Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5040</pre></td></tr> 5041 5042 5043<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader2')"><a name="isExpansionInSystemHeader2Anchor">isExpansionInSystemHeader</a></td><td></td></tr> 5044<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 5045 5046Example matches Y but not X 5047 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5048 #include <SystemHeader.h> 5049 class X {}; 5050SystemHeader.h: 5051 class Y {}; 5052 5053Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5054</pre></td></tr> 5055 5056 5057<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr> 5058<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 5059 5060Given 5061 struct S { bool func(); }; 5062functionDecl(returns(booleanType())) 5063 matches "bool func();" 5064</pre></td></tr> 5065 5066 5067<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('equalsBoundNode2')"><a name="equalsBoundNode2Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 5068<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 5069 5070Matches a node if it equals the node previously bound to ID. 5071 5072Given 5073 class X { int a; int b; }; 5074cxxRecordDecl( 5075 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5076 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5077 matches the class X, as a and b have the same type. 5078 5079Note that when multiple matches are involved via forEach* matchers, 5080equalsBoundNodes acts as a filter. 5081For example: 5082compoundStmt( 5083 forEachDescendant(varDecl().bind("d")), 5084 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5085will trigger a match for each combination of variable declaration 5086and reference to that variable declaration within a compound statement. 5087</pre></td></tr> 5088 5089 5090<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('equalsNode2')"><a name="equalsNode2Anchor">equalsNode</a></td><td>const Type* Other</td></tr> 5091<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 5092 5093Type has pointer identity in the AST. 5094</pre></td></tr> 5095 5096 5097<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr> 5098<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 5099 5100Given 5101 int i; 5102 float f; 5103realFloatingPointType() 5104 matches "float f" but not "int i" 5105</pre></td></tr> 5106 5107 5108<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr> 5109<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 5110 5111Given 5112 struct S { void func(); }; 5113functionDecl(returns(voidType())) 5114 matches "void func();" 5115</pre></td></tr> 5116 5117 5118<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>></td><td class="name" onclick="toggle('ofKind0')"><a name="ofKind0Anchor">ofKind</a></td><td>UnaryExprOrTypeTrait Kind</td></tr> 5119<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 5120 5121Given 5122 int x; 5123 int s = sizeof(x) + alignof(x) 5124unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 5125 matches sizeof(x) 5126 5127If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter 5128should be passed as a quoted string. e.g., ofKind("UETT_SizeOf"). 5129</pre></td></tr> 5130 5131 5132<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName1')"><a name="hasAnyOperatorName1Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 5133<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the 5134specified names. 5135 5136 hasAnyOperatorName("+", "-") 5137 Is equivalent to 5138 anyOf(hasOperatorName("+"), hasOperatorName("-")) 5139</pre></td></tr> 5140 5141 5142<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 5143<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 5144unary). 5145 5146Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 5147 !(a || b) 5148</pre></td></tr> 5149 5150 5151<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>></td><td class="name" onclick="toggle('isArrow1')"><a name="isArrow1Anchor">isArrow</a></td><td></td></tr> 5152<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed 5153to '.'. 5154 5155Member calls on the implicit this pointer match as called with '->'. 5156 5157Given 5158 class Y { 5159 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 5160 template <class T> void f() { this->f<T>(); f<T>(); } 5161 int a; 5162 static int b; 5163 }; 5164 template <class T> 5165 class Z { 5166 void x() { this->m; } 5167 }; 5168memberExpr(isArrow()) 5169 matches this->x, x, y.x, a, this->b 5170cxxDependentScopeMemberExpr(isArrow()) 5171 matches this->m 5172unresolvedMemberExpr(isArrow()) 5173 matches this->f<T>, f<T> 5174</pre></td></tr> 5175 5176 5177<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr> 5178<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 5179 5180Example matches x, but not y, z, or a. 5181(matcher = varDecl(hasAutomaticStorageDuration()) 5182void f() { 5183 int x; 5184 static int y; 5185 thread_local int z; 5186} 5187int a; 5188</pre></td></tr> 5189 5190 5191<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr> 5192<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 5193 5194Example matches y and z (matcher = varDecl(hasGlobalStorage()) 5195void f() { 5196 int x; 5197 static int y; 5198} 5199int z; 5200</pre></td></tr> 5201 5202 5203<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr> 5204<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 5205non-static local variable. 5206 5207Example matches x (matcher = varDecl(hasLocalStorage()) 5208void f() { 5209 int x; 5210 static int y; 5211} 5212int z; 5213</pre></td></tr> 5214 5215 5216<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr> 5217<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 5218It includes the variable declared at namespace scope and those declared 5219with "static" and "extern" storage class specifiers. 5220 5221void f() { 5222 int x; 5223 static int y; 5224 thread_local int z; 5225} 5226int a; 5227static int b; 5228extern int c; 5229varDecl(hasStaticStorageDuration()) 5230 matches the function declaration y, a, b and c. 5231</pre></td></tr> 5232 5233 5234<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr> 5235<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 5236 5237Example matches z, but not x, z, or a. 5238(matcher = varDecl(hasThreadStorageDuration()) 5239void f() { 5240 int x; 5241 static int y; 5242 thread_local int z; 5243} 5244int a; 5245</pre></td></tr> 5246 5247 5248<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr> 5249<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations, 5250 and if constexpr. 5251 5252Given: 5253 constexpr int foo = 42; 5254 constexpr int bar(); 5255 void baz() { if constexpr(1 > 0) {} } 5256varDecl(isConstexpr()) 5257 matches the declaration of foo. 5258functionDecl(isConstexpr()) 5259 matches the declaration of bar. 5260ifStmt(isConstexpr()) 5261 matches the if statement in baz. 5262</pre></td></tr> 5263 5264 5265<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isDefinition1')"><a name="isDefinition1Anchor">isDefinition</a></td><td></td></tr> 5266<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 5267 5268Example matches A, va, fa 5269 class A {}; 5270 class B; // Doesn't match, as it has no body. 5271 int va; 5272 extern int vb; // Doesn't match, as it doesn't define the variable. 5273 void fa() {} 5274 void fb(); // Doesn't match, as it has no body. 5275 @interface X 5276 - (void)ma; // Doesn't match, interface is declaration. 5277 @end 5278 @implementation X 5279 - (void)ma {} 5280 @end 5281 5282Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, 5283 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5284</pre></td></tr> 5285 5286 5287<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr> 5288<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 5289a C++ catch block, or an Objective-C statement. 5290 5291Example matches x (matcher = varDecl(isExceptionVariable()) 5292void f(int y) { 5293 try { 5294 } catch (int x) { 5295 } 5296} 5297</pre></td></tr> 5298 5299 5300<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization1')"><a name="isExplicitTemplateSpecialization1Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr> 5301<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 5302static member variable template instantiations. 5303 5304Given 5305 template<typename T> void A(T t) { } 5306 template<> void A(int N) { } 5307functionDecl(isExplicitTemplateSpecialization()) 5308 matches the specialization A<int>(). 5309 5310Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 5311</pre></td></tr> 5312 5313 5314<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr> 5315<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 5316 5317Given: 5318 extern "C" void f() {} 5319 extern "C" { void g() {} } 5320 void h() {} 5321 extern "C" int x = 1; 5322 extern "C" int y = 2; 5323 int z = 3; 5324functionDecl(isExternC()) 5325 matches the declaration of f and g, but not the declaration of h. 5326varDecl(isExternC()) 5327 matches the declaration of x and y, but not the declaration of z. 5328</pre></td></tr> 5329 5330 5331<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isStaticLocal0')"><a name="isStaticLocal0Anchor">isStaticLocal</a></td><td></td></tr> 5332<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope. 5333 5334Example matches y (matcher = varDecl(isStaticLocal())) 5335void f() { 5336 int x; 5337 static int y; 5338} 5339static int z; 5340</pre></td></tr> 5341 5342 5343<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr> 5344<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage 5345class specifier ("static" keyword) written in the source. 5346 5347Given: 5348 static void f() {} 5349 static int i = 0; 5350 extern int j; 5351 int k; 5352functionDecl(isStaticStorageClass()) 5353 matches the function declaration f. 5354varDecl(isStaticStorageClass()) 5355 matches the variable declaration i. 5356</pre></td></tr> 5357 5358 5359<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation1')"><a name="isTemplateInstantiation1Anchor">isTemplateInstantiation</a></td><td></td></tr> 5360<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 5361member variable template instantiations. 5362 5363Given 5364 template <typename T> class X {}; class A {}; X<A> x; 5365or 5366 template <typename T> class X {}; class A {}; template class X<A>; 5367or 5368 template <typename T> class X {}; class A {}; extern template class X<A>; 5369cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5370 matches the template instantiation of X<A>. 5371 5372But given 5373 template <typename T> class X {}; class A {}; 5374 template <> class X<A> {}; X<A> x; 5375cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5376 does not match, as X<A> is an explicit template specialization. 5377 5378Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 5379</pre></td></tr> 5380 5381<!--END_NARROWING_MATCHERS --> 5382</table> 5383 5384<!-- ======================================================================= --> 5385<h2 id="traversal-matchers">AST Traversal Matchers</h2> 5386<!-- ======================================================================= --> 5387 5388<p>Traversal matchers specify the relationship to other nodes that are 5389reachable from the current node.</p> 5390 5391<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 5392forEachDescendant) which work on all nodes and allow users to write more generic 5393match expressions.</p> 5394 5395<table> 5396<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 5397<!-- START_TRAVERSAL_MATCHERS --> 5398 5399<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 5400<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 5401 5402Unlike anyOf, eachOf will generate a match result for each 5403matching submatcher. 5404 5405For example, in: 5406 class A { int a; int b; }; 5407The matcher: 5408 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 5409 has(fieldDecl(hasName("b")).bind("v")))) 5410will generate two results binding "v", the first of which binds 5411the field declaration of a, the second the field declaration of 5412b. 5413 5414Usable as: Any Matcher 5415</pre></td></tr> 5416 5417 5418<tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr> 5419<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 5420 5421Generates results for each match. 5422 5423For example, in: 5424 class A { class B {}; class C {}; }; 5425The matcher: 5426 cxxRecordDecl(hasName("::A"), 5427 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 5428will generate results for A, B and C. 5429 5430Usable as: Any Matcher 5431</pre></td></tr> 5432 5433 5434<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 5435<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5436provided matcher. 5437 5438Example matches X, A, A::X, B, B::C, B::C::X 5439 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 5440 class X {}; 5441 class A { class X {}; }; // Matches A, because A::X is a class of name 5442 // X inside A. 5443 class B { class C { class X {}; }; }; 5444 5445DescendantT must be an AST base type. 5446 5447As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 5448each result that matches instead of only on the first one. 5449 5450Note: Recursively combined ForEachDescendant can cause many matches: 5451 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 5452 forEachDescendant(cxxRecordDecl()) 5453 ))) 5454will match 10 times (plus injected class name matches) on: 5455 class A { class B { class C { class D { class E {}; }; }; }; }; 5456 5457Usable as: Any Matcher 5458</pre></td></tr> 5459 5460 5461<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 5462<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 5463provided matcher. 5464 5465Example matches X, Y, Y::X, Z::Y, Z::Y::X 5466 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 5467 class X {}; 5468 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X 5469 // inside Y. 5470 class Z { class Y { class X {}; }; }; // Does not match Z. 5471 5472ChildT must be an AST base type. 5473 5474As opposed to 'has', 'forEach' will cause a match for each result that 5475matches instead of only on the first one. 5476 5477Usable as: Any Matcher 5478</pre></td></tr> 5479 5480 5481<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 5482<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 5483matcher. 5484 5485Given 5486void f() { if (true) { int x = 42; } } 5487void g() { for (;;) { int x = 43; } } 5488expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 5489 5490Usable as: Any Matcher 5491</pre></td></tr> 5492 5493 5494<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 5495<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5496provided matcher. 5497 5498Example matches X, Y, Z 5499 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 5500 class X {}; // Matches X, because X::X is a class of name X inside X. 5501 class Y { class X {}; }; 5502 class Z { class Y { class X {}; }; }; 5503 5504DescendantT must be an AST base type. 5505 5506Usable as: Any Matcher 5507</pre></td></tr> 5508 5509 5510<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 5511<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 5512provided matcher. 5513 5514Example matches X, Y 5515 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 5516 class X {}; // Matches X, because X::X is a class of name X inside X. 5517 class Y { class X {}; }; 5518 class Z { class Y { class X {}; }; }; // Does not match Z. 5519 5520ChildT must be an AST base type. 5521 5522Usable as: Any Matcher 5523Note that has is direct matcher, so it also matches things like implicit 5524casts and paren casts. If you are matching with expr then you should 5525probably consider using ignoringParenImpCasts like: 5526has(ignoringParenImpCasts(expr())). 5527</pre></td></tr> 5528 5529 5530<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 5531<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 5532matcher. 5533 5534Given 5535void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 5536compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 5537 5538Usable as: Any Matcher 5539</pre></td></tr> 5540 5541 5542<tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr> 5543<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher. 5544 5545However, optionally will retain any bindings generated by the submatcher. 5546Useful when additional information which may or may not present about a main 5547matching node is desired. 5548 5549For example, in: 5550 class Foo { 5551 int bar; 5552 } 5553The matcher: 5554 cxxRecordDecl( 5555 optionally(has( 5556 fieldDecl(hasName("bar")).bind("var") 5557 ))).bind("record") 5558will produce a result binding for both "record" and "var". 5559The matcher will produce a "record" binding for even if there is no data 5560member named "bar" in that class. 5561 5562Usable as: Any Matcher 5563</pre></td></tr> 5564 5565 5566<tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr> 5567<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind. 5568 5569Given 5570 void foo() 5571 { 5572 int i = 3.0; 5573 } 5574The matcher 5575 traverse(TK_IgnoreUnlessSpelledInSource, 5576 varDecl(hasInitializer(floatLiteral().bind("init"))) 5577 ) 5578matches the variable declaration with "init" bound to the "3.0". 5579</pre></td></tr> 5580 5581 5582<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasCondition5')"><a name="hasCondition5Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5583<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 5584switch statement or conditional operator. 5585 5586Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5587 if (true) {} 5588</pre></td></tr> 5589 5590 5591<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasFalseExpression0')"><a name="hasFalseExpression0Anchor">hasFalseExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5592<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 5593(binary or ternary). 5594 5595Example matches b 5596 condition ? a : b 5597 condition ?: b 5598</pre></td></tr> 5599 5600 5601<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasTrueExpression0')"><a name="hasTrueExpression0Anchor">hasTrueExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5602<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 5603 5604Example 1 (conditional ternary operator): matches a 5605 condition ? a : b 5606 5607Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 5608 condition ?: b 5609</pre></td></tr> 5610 5611 5612<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>></td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5613<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 5614matches the given matcher. 5615 5616The associated declaration is: 5617- for type nodes, the declaration of the underlying type 5618- for CallExpr, the declaration of the callee 5619- for MemberExpr, the declaration of the referenced member 5620- for CXXConstructExpr, the declaration of the constructor 5621- for CXXNewExpr, the declaration of the operator new 5622- for ObjCIvarExpr, the declaration of the ivar 5623 5624For type nodes, hasDeclaration will generally match the declaration of the 5625sugared type. Given 5626 class X {}; 5627 typedef X Y; 5628 Y y; 5629in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5630typedefDecl. A common use case is to match the underlying, desugared type. 5631This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5632 varDecl(hasType(hasUnqualifiedDesugaredType( 5633 recordType(hasDeclaration(decl()))))) 5634In this matcher, the decl will match the CXXRecordDecl of class X. 5635 5636Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 5637 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 5638 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 5639 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 5640 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 5641 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 5642 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5643</pre></td></tr> 5644 5645 5646<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasBase0')"><a name="hasBase0Anchor">hasBase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5647<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 5648 5649Given 5650 int i[5]; 5651 void f() { i[1] = 42; } 5652arraySubscriptExpression(hasBase(implicitCastExpr( 5653 hasSourceExpression(declRefExpr())))) 5654 matches i[1] with the declRefExpr() matching i 5655</pre></td></tr> 5656 5657 5658<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasIndex0')"><a name="hasIndex0Anchor">hasIndex</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5659<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 5660 5661Given 5662 int i[5]; 5663 void f() { i[1] = 42; } 5664arraySubscriptExpression(hasIndex(integerLiteral())) 5665 matches i[1] with the integerLiteral() matching 1 5666</pre></td></tr> 5667 5668 5669<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasLHS1')"><a name="hasLHS1Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5670<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 5671 5672Example matches a (matcher = binaryOperator(hasLHS())) 5673 a || b 5674</pre></td></tr> 5675 5676 5677<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasRHS1')"><a name="hasRHS1Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5678<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 5679 5680Example matches b (matcher = binaryOperator(hasRHS())) 5681 a || b 5682</pre></td></tr> 5683 5684 5685<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>></td><td class="name" onclick="toggle('hasElementType0')"><a name="hasElementType0Anchor">hasElementType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 5686<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 5687type. 5688 5689Given 5690 struct A {}; 5691 A a[7]; 5692 int b[7]; 5693arrayType(hasElementType(builtinType())) 5694 matches "int b[7]" 5695 5696Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 5697</pre></td></tr> 5698 5699 5700<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>></td><td class="name" onclick="toggle('hasValueType0')"><a name="hasValueType0Anchor">hasValueType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 5701<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 5702 5703Given 5704 _Atomic(int) i; 5705 _Atomic(float) f; 5706atomicType(hasValueType(isInteger())) 5707 matches "_Atomic(int) i" 5708 5709Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 5710</pre></td></tr> 5711 5712 5713<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>></td><td class="name" onclick="toggle('hasDeducedType0')"><a name="hasDeducedType0Anchor">hasDeducedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 5714<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 5715 5716Note: There is no TypeLoc for the deduced type and thus no 5717getDeducedLoc() matcher. 5718 5719Given 5720 auto a = 1; 5721 auto b = 2.0; 5722autoType(hasDeducedType(isInteger())) 5723 matches "auto a" 5724 5725Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 5726</pre></td></tr> 5727 5728 5729<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5730<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 5731binary operator matches. 5732</pre></td></tr> 5733 5734 5735<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasLHS0')"><a name="hasLHS0Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5736<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 5737 5738Example matches a (matcher = binaryOperator(hasLHS())) 5739 a || b 5740</pre></td></tr> 5741 5742 5743<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasOperands0')"><a name="hasOperands0Anchor">hasOperands</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher1, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher2</td></tr> 5744<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator. 5745 5746Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 5747 integerLiteral(equals(2))) 5748 1 + 2 // Match 5749 2 + 1 // Match 5750 1 + 1 // No match 5751 2 + 2 // No match 5752</pre></td></tr> 5753 5754 5755<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasRHS0')"><a name="hasRHS0Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5756<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 5757 5758Example matches b (matcher = binaryOperator(hasRHS())) 5759 a || b 5760</pre></td></tr> 5761 5762 5763<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>></td><td class="name" onclick="toggle('hasAnyParameter2')"><a name="hasAnyParameter2Anchor">hasAnyParameter</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 5764<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 5765block. 5766 5767Does not match the 'this' parameter of a method. 5768 5769Given 5770 class X { void f(int x, int y, int z) {} }; 5771cxxMethodDecl(hasAnyParameter(hasName("y"))) 5772 matches f(int x, int y, int z) {} 5773with hasAnyParameter(...) 5774 matching int y 5775 5776For ObjectiveC, given 5777 @interface I - (void) f:(int) y; @end 5778 5779the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 5780matches the declaration of method f with hasParameter 5781matching y. 5782 5783For blocks, given 5784 b = ^(int y) { printf("%d", y) }; 5785 5786the matcher blockDecl(hasAnyParameter(hasName("y"))) 5787matches the declaration of the block b with hasParameter 5788matching y. 5789</pre></td></tr> 5790 5791 5792<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>></td><td class="name" onclick="toggle('hasParameter2')"><a name="hasParameter2Anchor">hasParameter</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 5793<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 5794declaration or a block. 5795 5796Given 5797 class X { void f(int x) {} }; 5798cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 5799 matches f(int x) {} 5800with hasParameter(...) 5801 matching int x 5802 5803For ObjectiveC, given 5804 @interface I - (void) f:(int) y; @end 5805 5806the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 5807matches the declaration of method f with hasParameter 5808matching y. 5809</pre></td></tr> 5810 5811 5812<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>></td><td class="name" onclick="toggle('pointee0')"><a name="pointee0Anchor">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 5813<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 5814pointee matches a given matcher. 5815 5816Given 5817 int *a; 5818 int const *b; 5819 float const *f; 5820pointerType(pointee(isConstQualified(), isInteger())) 5821 matches "int const *b" 5822 5823Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 5824 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 5825</pre></td></tr> 5826 5827 5828<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasType7')"><a name="hasType7Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5829<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value 5830declaration's type. 5831 5832In case of a value declaration (for example a variable declaration), 5833this resolves one layer of indirection. For example, in the value 5834declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 5835X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 5836declaration of x. 5837 5838Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5839 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5840 and friend class X (matcher = friendDecl(hasType("X")) 5841 class X {}; 5842 void y(X &x) { x; X z; } 5843 class Y { friend class X; }; 5844 5845Example matches class Derived 5846(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 5847class Base {}; 5848class Derived : Base {}; 5849 5850Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>, 5851Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 5852</pre></td></tr> 5853 5854 5855<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParam1')"><a name="forEachArgumentWithParam1Anchor">forEachArgumentWithParam</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> ParamMatcher</td></tr> 5856<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 5857 5858Given 5859 void f(int i); 5860 int y; 5861 f(y); 5862callExpr( 5863 forEachArgumentWithParam( 5864 declRefExpr(to(varDecl(hasName("y")))), 5865 parmVarDecl(hasType(isInteger())) 5866)) 5867 matches f(y); 5868with declRefExpr(...) 5869 matching int y 5870and parmVarDecl(...) 5871 matching int i 5872</pre></td></tr> 5873 5874 5875<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParamType1')"><a name="forEachArgumentWithParamType1Anchor">forEachArgumentWithParamType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> ParamMatcher</td></tr> 5876<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or 5877CXXConstructExpr. It is very similar to forEachArgumentWithParam but 5878it works on calls through function pointers as well. 5879 5880The difference is, that function pointers do not provide access to a 5881ParmVarDecl, but only the QualType for each argument. 5882 5883Given 5884 void f(int i); 5885 int y; 5886 f(y); 5887 void (*f_ptr)(int) = f; 5888 f_ptr(y); 5889callExpr( 5890 forEachArgumentWithParamType( 5891 declRefExpr(to(varDecl(hasName("y")))), 5892 qualType(isInteger()).bind("type) 5893)) 5894 matches f(y) and f_ptr(y) 5895with declRefExpr(...) 5896 matching int y 5897and qualType(...) 5898 matching int 5899</pre></td></tr> 5900 5901 5902<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument1')"><a name="hasAnyArgument1Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5903<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 5904expression, or an ObjC-message-send expression. 5905 5906Given 5907 void x(int, int, int) { int y; x(1, y, 42); } 5908callExpr(hasAnyArgument(declRefExpr())) 5909 matches x(1, y, 42) 5910with hasAnyArgument(...) 5911 matching y 5912 5913For ObjectiveC, given 5914 @interface I - (void) f:(int) y; @end 5915 void foo(I *i) { [i f:12]; } 5916objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 5917 matches [i f:12] 5918</pre></td></tr> 5919 5920 5921<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasArgument1')"><a name="hasArgument1Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5922<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 5923call expression. 5924 5925Example matches y in x(y) 5926 (matcher = callExpr(hasArgument(0, declRefExpr()))) 5927 void x(int) { int y; x(y); } 5928</pre></td></tr> 5929 5930 5931<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5932<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 5933matches the given matcher. 5934 5935The associated declaration is: 5936- for type nodes, the declaration of the underlying type 5937- for CallExpr, the declaration of the callee 5938- for MemberExpr, the declaration of the referenced member 5939- for CXXConstructExpr, the declaration of the constructor 5940- for CXXNewExpr, the declaration of the operator new 5941- for ObjCIvarExpr, the declaration of the ivar 5942 5943For type nodes, hasDeclaration will generally match the declaration of the 5944sugared type. Given 5945 class X {}; 5946 typedef X Y; 5947 Y y; 5948in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5949typedefDecl. A common use case is to match the underlying, desugared type. 5950This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5951 varDecl(hasType(hasUnqualifiedDesugaredType( 5952 recordType(hasDeclaration(decl()))))) 5953In this matcher, the decl will match the CXXRecordDecl of class X. 5954 5955Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 5956 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 5957 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 5958 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 5959 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 5960 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 5961 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5962</pre></td></tr> 5963 5964 5965<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('forEachConstructorInitializer0')"><a name="forEachConstructorInitializer0Anchor">forEachConstructorInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>> InnerMatcher</td></tr> 5966<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 5967 5968Given 5969 class A { A() : i(42), j(42) {} int i; int j; }; 5970cxxConstructorDecl(forEachConstructorInitializer( 5971 forField(decl().bind("x")) 5972)) 5973 will trigger two matches, binding for 'i' and 'j' respectively. 5974</pre></td></tr> 5975 5976 5977<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('hasAnyConstructorInitializer0')"><a name="hasAnyConstructorInitializer0Anchor">hasAnyConstructorInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>> InnerMatcher</td></tr> 5978<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 5979 5980Given 5981 struct Foo { 5982 Foo() : foo_(1) { } 5983 int foo_; 5984 }; 5985cxxRecordDecl(has(cxxConstructorDecl( 5986 hasAnyConstructorInitializer(anything()) 5987))) 5988 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 5989</pre></td></tr> 5990 5991 5992<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('forField0')"><a name="forField0Anchor">forField</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>> InnerMatcher</td></tr> 5993<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 5994 5995Given 5996 struct Foo { 5997 Foo() : foo_(1) { } 5998 int foo_; 5999 }; 6000cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6001 forField(hasName("foo_")))))) 6002 matches Foo 6003with forField matching foo_ 6004</pre></td></tr> 6005 6006 6007<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('withInitializer0')"><a name="withInitializer0Anchor">withInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6008<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 6009 6010Given 6011 struct Foo { 6012 Foo() : foo_(1) { } 6013 int foo_; 6014 }; 6015cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6016 withInitializer(integerLiteral(equals(1))))))) 6017 matches Foo 6018with withInitializer matching (1) 6019</pre></td></tr> 6020 6021 6022<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('hasObjectExpression2')"><a name="hasObjectExpression2Anchor">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6023<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 6024given matcher. Implicit object expressions are included; that is, it matches 6025use of implicit `this`. 6026 6027Given 6028 struct X { 6029 int m; 6030 int f(X x) { x.m; return m; } 6031 }; 6032memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6033 matches `x.m`, but not `m`; however, 6034memberExpr(hasObjectExpression(hasType(pointsTo( 6035 cxxRecordDecl(hasName("X")))))) 6036 matches `m` (aka. `this->m`), but not `x.m`. 6037</pre></td></tr> 6038 6039 6040<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasBody3')"><a name="hasBody3Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 6041<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr> 6042 6043 6044<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasInitStatement2')"><a name="hasInitStatement2Anchor">hasInitStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 6045<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer. 6046 6047Given: 6048 void foo() { 6049 if (int i = foobar(); i > 0) {} 6050 switch (int i = foobar(); i) {} 6051 for (auto& a = get_range(); auto& x : a) {} 6052 } 6053 void bar() { 6054 if (foobar() > 0) {} 6055 switch (foobar()) {} 6056 for (auto& x : get_range()) {} 6057 } 6058ifStmt(hasInitStatement(anything())) 6059 matches the if statement in foo but not in bar. 6060switchStmt(hasInitStatement(anything())) 6061 matches the switch statement in foo but not in bar. 6062cxxForRangeStmt(hasInitStatement(anything())) 6063 matches the range for statement in foo but not in bar. 6064</pre></td></tr> 6065 6066 6067<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasLoopVariable0')"><a name="hasLoopVariable0Anchor">hasLoopVariable</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>> InnerMatcher</td></tr> 6068<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 6069 6070Example: 6071 forStmt(hasLoopVariable(anything())) 6072matches 'int x' in 6073 for (int x : a) { } 6074</pre></td></tr> 6075 6076 6077<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasRangeInit0')"><a name="hasRangeInit0Anchor">hasRangeInit</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6078<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 6079 6080Example: 6081 forStmt(hasRangeInit(anything())) 6082matches 'a' in 6083 for (int x : a) { } 6084</pre></td></tr> 6085 6086 6087<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('onImplicitObjectArgument0')"><a name="onImplicitObjectArgument0Anchor">onImplicitObjectArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6088<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 6089`on`, matches the argument directly without stripping away anything. 6090 6091Given 6092 class Y { public: void m(); }; 6093 Y g(); 6094 class X : public Y { void g(); }; 6095 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 6096cxxMemberCallExpr(onImplicitObjectArgument(hasType( 6097 cxxRecordDecl(hasName("Y"))))) 6098 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 6099cxxMemberCallExpr(on(callExpr())) 6100 does not match `(g()).m()`, because the parens are not ignored. 6101 6102FIXME: Overload to allow directly matching types? 6103</pre></td></tr> 6104 6105 6106<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('on0')"><a name="on0Anchor">on</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6107<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 6108stripping off any parentheses or implicit casts. 6109 6110Given 6111 class Y { public: void m(); }; 6112 Y g(); 6113 class X : public Y {}; 6114 void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 6115cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 6116 matches `y.m()` and `(g()).m()`. 6117cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 6118 matches `x.m()`. 6119cxxMemberCallExpr(on(callExpr())) 6120 matches `(g()).m()`. 6121 6122FIXME: Overload to allow directly matching types? 6123</pre></td></tr> 6124 6125 6126<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('thisPointerType1')"><a name="thisPointerType1Anchor">thisPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6127<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 6128</pre></td></tr> 6129 6130 6131<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('thisPointerType0')"><a name="thisPointerType0Anchor">thisPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 6132<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 6133matches the InnerMatcher, or is a pointer to a type that matches the 6134InnerMatcher. 6135 6136Given 6137 class Y { public: void m(); }; 6138 class X : public Y { void g(); }; 6139 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 6140cxxMemberCallExpr(thisPointerType(hasDeclaration( 6141 cxxRecordDecl(hasName("Y"))))) 6142 matches `y.m()`, `p->m()` and `x.m()`. 6143cxxMemberCallExpr(thisPointerType(hasDeclaration( 6144 cxxRecordDecl(hasName("X"))))) 6145 matches `x.g()`. 6146</pre></td></tr> 6147 6148 6149<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('forEachOverridden0')"><a name="forEachOverridden0Anchor">forEachOverridden</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>> InnerMatcher</td></tr> 6150<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 6151produce multiple matches. 6152 6153Given 6154 class A { virtual void f(); }; 6155 class B : public A { void f(); }; 6156 class C : public B { void f(); }; 6157cxxMethodDecl(ofClass(hasName("C")), 6158 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6159 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 6160 that B::f is not overridden by C::f). 6161 6162The check can produce multiple matches in case of multiple inheritance, e.g. 6163 class A1 { virtual void f(); }; 6164 class A2 { virtual void f(); }; 6165 class C : public A1, public A2 { void f(); }; 6166cxxMethodDecl(ofClass(hasName("C")), 6167 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6168 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 6169 once with "b" binding "A2::f" and "d" binding "C::f". 6170</pre></td></tr> 6171 6172 6173<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('ofClass0')"><a name="ofClass0Anchor">ofClass</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> InnerMatcher</td></tr> 6174<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 6175belongs to. 6176 6177FIXME: Generalize this for other kinds of declarations. 6178FIXME: What other kind of declarations would we need to generalize 6179this to? 6180 6181Example matches A() in the last line 6182 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 6183 ofClass(hasName("A")))))) 6184 class A { 6185 public: 6186 A(); 6187 }; 6188 A a = A(); 6189</pre></td></tr> 6190 6191 6192<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasAnyPlacementArg0')"><a name="hasAnyPlacementArg0Anchor">hasAnyPlacementArg</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6193<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments. 6194 6195Given: 6196 MyClass *p1 = new (Storage) MyClass(); 6197cxxNewExpr(hasAnyPlacementArg(anything())) 6198 matches the expression 'new (Storage, 16) MyClass()'. 6199</pre></td></tr> 6200 6201 6202<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasArraySize0')"><a name="hasArraySize0Anchor">hasArraySize</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6203<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 6204 6205Given: 6206 MyClass *p1 = new MyClass[10]; 6207cxxNewExpr(hasArraySize(integerLiteral(equals(10)))) 6208 matches the expression 'new MyClass[10]'. 6209</pre></td></tr> 6210 6211 6212<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6213<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 6214matches the given matcher. 6215 6216The associated declaration is: 6217- for type nodes, the declaration of the underlying type 6218- for CallExpr, the declaration of the callee 6219- for MemberExpr, the declaration of the referenced member 6220- for CXXConstructExpr, the declaration of the constructor 6221- for CXXNewExpr, the declaration of the operator new 6222- for ObjCIvarExpr, the declaration of the ivar 6223 6224For type nodes, hasDeclaration will generally match the declaration of the 6225sugared type. Given 6226 class X {}; 6227 typedef X Y; 6228 Y y; 6229in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6230typedefDecl. A common use case is to match the underlying, desugared type. 6231This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6232 varDecl(hasType(hasUnqualifiedDesugaredType( 6233 recordType(hasDeclaration(decl()))))) 6234In this matcher, the decl will match the CXXRecordDecl of class X. 6235 6236Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 6237 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 6238 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 6239 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 6240 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 6241 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 6242 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6243</pre></td></tr> 6244 6245 6246<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasPlacementArg0')"><a name="hasPlacementArg0Anchor">hasPlacementArg</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6247<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments. 6248 6249Given: 6250 MyClass *p1 = new (Storage, 16) MyClass(); 6251cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16)))) 6252 matches the expression 'new (Storage, 16) MyClass()'. 6253</pre></td></tr> 6254 6255 6256<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasAnyBase0')"><a name="hasAnyBase0Anchor">hasAnyBase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> BaseSpecMatcher</td></tr> 6257<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher. 6258 6259Example: 6260matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6261 class Foo; 6262 class Bar : Foo {}; 6263 class Baz : Bar {}; 6264 class SpecialBase; 6265 class Proxy : SpecialBase {}; // matches Proxy 6266 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived 6267 6268FIXME: Refactor this and isDerivedFrom to reuse implementation. 6269</pre></td></tr> 6270 6271 6272<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasDirectBase0')"><a name="hasDirectBase0Anchor">hasDirectBase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> BaseSpecMatcher</td></tr> 6273<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher. 6274 6275Example: 6276matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6277 class Foo; 6278 class Bar : Foo {}; 6279 class Baz : Bar {}; 6280 class SpecialBase; 6281 class Proxy : SpecialBase {}; // matches Proxy 6282 class IndirectlyDerived : Proxy {}; // doesn't match 6283</pre></td></tr> 6284 6285 6286<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasMethod0')"><a name="hasMethod0Anchor">hasMethod</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>> InnerMatcher</td></tr> 6287<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 6288 6289Given: 6290 class A { void func(); }; 6291 class B { void member(); }; 6292 6293cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 6294A but not B. 6295</pre></td></tr> 6296 6297 6298<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom0')"><a name="isDerivedFrom0Anchor">isDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 6299<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class 6300matching Base, or Objective-C classes that directly or indirectly 6301subclass a class matching Base. 6302 6303Note that a class is not considered to be derived from itself. 6304 6305Example matches Y, Z, C (Base == hasName("X")) 6306 class X; 6307 class Y : public X {}; // directly derived 6308 class Z : public Y {}; // indirectly derived 6309 typedef X A; 6310 typedef A B; 6311 class C : public B {}; // derived from a typedef of X 6312 6313In the following example, Bar matches isDerivedFrom(hasName("X")): 6314 class Foo; 6315 typedef Foo X; 6316 class Bar : public Foo {}; // derived from a type that X is a typedef of 6317 6318In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 6319 @interface NSObject @end 6320 @interface Bar : NSObject @end 6321 6322Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>> 6323</pre></td></tr> 6324 6325 6326<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom0')"><a name="isDirectlyDerivedFrom0Anchor">isDirectlyDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 6327<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class 6328matching Base. 6329 6330Note that a class is not considered to be derived from itself. 6331 6332Example matches Y, C (Base == hasName("X")) 6333 class X; 6334 class Y : public X {}; // directly derived 6335 class Z : public Y {}; // indirectly derived 6336 typedef X A; 6337 typedef A B; 6338 class C : public B {}; // derived from a typedef of X 6339 6340In the following example, Bar matches isDerivedFrom(hasName("X")): 6341 class Foo; 6342 typedef Foo X; 6343 class Bar : public Foo {}; // derived from a type that X is a typedef of 6344</pre></td></tr> 6345 6346 6347<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom0')"><a name="isSameOrDerivedFrom0Anchor">isSameOrDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 6348<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 6349match Base. 6350</pre></td></tr> 6351 6352 6353<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument2')"><a name="hasAnyArgument2Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6354<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 6355expression, or an ObjC-message-send expression. 6356 6357Given 6358 void x(int, int, int) { int y; x(1, y, 42); } 6359callExpr(hasAnyArgument(declRefExpr())) 6360 matches x(1, y, 42) 6361with hasAnyArgument(...) 6362 matching y 6363 6364For ObjectiveC, given 6365 @interface I - (void) f:(int) y; @end 6366 void foo(I *i) { [i f:12]; } 6367objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6368 matches [i f:12] 6369</pre></td></tr> 6370 6371 6372<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('hasArgument2')"><a name="hasArgument2Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6373<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 6374call expression. 6375 6376Example matches y in x(y) 6377 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6378 void x(int) { int y; x(y); } 6379</pre></td></tr> 6380 6381 6382<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('callee1')"><a name="callee1Anchor">callee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6383<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 6384given matcher. 6385 6386Example matches y.x() (matcher = callExpr(callee( 6387 cxxMethodDecl(hasName("x"))))) 6388 class Y { public: void x(); }; 6389 void z() { Y y; y.x(); } 6390</pre></td></tr> 6391 6392 6393<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('callee0')"><a name="callee0Anchor">callee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 6394<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 6395 6396Given 6397 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 6398 void f() { f(); } 6399callExpr(callee(expr())) 6400 matches this->x(), x(), y.x(), f() 6401with callee(...) 6402 matching this->x, x, y.x, f respectively 6403 6404Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 6405because this introduces ambiguous overloads with calls to Callee taking a 6406internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 6407implemented in terms of implicit casts. 6408</pre></td></tr> 6409 6410 6411<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParam0')"><a name="forEachArgumentWithParam0Anchor">forEachArgumentWithParam</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> ParamMatcher</td></tr> 6412<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 6413 6414Given 6415 void f(int i); 6416 int y; 6417 f(y); 6418callExpr( 6419 forEachArgumentWithParam( 6420 declRefExpr(to(varDecl(hasName("y")))), 6421 parmVarDecl(hasType(isInteger())) 6422)) 6423 matches f(y); 6424with declRefExpr(...) 6425 matching int y 6426and parmVarDecl(...) 6427 matching int i 6428</pre></td></tr> 6429 6430 6431<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParamType0')"><a name="forEachArgumentWithParamType0Anchor">forEachArgumentWithParamType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> ParamMatcher</td></tr> 6432<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or 6433CXXConstructExpr. It is very similar to forEachArgumentWithParam but 6434it works on calls through function pointers as well. 6435 6436The difference is, that function pointers do not provide access to a 6437ParmVarDecl, but only the QualType for each argument. 6438 6439Given 6440 void f(int i); 6441 int y; 6442 f(y); 6443 void (*f_ptr)(int) = f; 6444 f_ptr(y); 6445callExpr( 6446 forEachArgumentWithParamType( 6447 declRefExpr(to(varDecl(hasName("y")))), 6448 qualType(isInteger()).bind("type) 6449)) 6450 matches f(y) and f_ptr(y) 6451with declRefExpr(...) 6452 matching int y 6453and qualType(...) 6454 matching int 6455</pre></td></tr> 6456 6457 6458<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument0')"><a name="hasAnyArgument0Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6459<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 6460expression, or an ObjC-message-send expression. 6461 6462Given 6463 void x(int, int, int) { int y; x(1, y, 42); } 6464callExpr(hasAnyArgument(declRefExpr())) 6465 matches x(1, y, 42) 6466with hasAnyArgument(...) 6467 matching y 6468 6469For ObjectiveC, given 6470 @interface I - (void) f:(int) y; @end 6471 void foo(I *i) { [i f:12]; } 6472objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6473 matches [i f:12] 6474</pre></td></tr> 6475 6476 6477<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasArgument0')"><a name="hasArgument0Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6478<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 6479call expression. 6480 6481Example matches y in x(y) 6482 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6483 void x(int) { int y; x(y); } 6484</pre></td></tr> 6485 6486 6487<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6488<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 6489matches the given matcher. 6490 6491The associated declaration is: 6492- for type nodes, the declaration of the underlying type 6493- for CallExpr, the declaration of the callee 6494- for MemberExpr, the declaration of the referenced member 6495- for CXXConstructExpr, the declaration of the constructor 6496- for CXXNewExpr, the declaration of the operator new 6497- for ObjCIvarExpr, the declaration of the ivar 6498 6499For type nodes, hasDeclaration will generally match the declaration of the 6500sugared type. Given 6501 class X {}; 6502 typedef X Y; 6503 Y y; 6504in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6505typedefDecl. A common use case is to match the underlying, desugared type. 6506This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6507 varDecl(hasType(hasUnqualifiedDesugaredType( 6508 recordType(hasDeclaration(decl()))))) 6509In this matcher, the decl will match the CXXRecordDecl of class X. 6510 6511Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 6512 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 6513 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 6514 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 6515 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 6516 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 6517 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6518</pre></td></tr> 6519 6520 6521<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>></td><td class="name" onclick="toggle('hasCaseConstant0')"><a name="hasCaseConstant0Anchor">hasCaseConstant</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6522<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 6523extension, matches the constant given in the statement. 6524 6525Given 6526 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 6527caseStmt(hasCaseConstant(integerLiteral())) 6528 matches "case 1:" 6529</pre></td></tr> 6530 6531 6532<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>></td><td class="name" onclick="toggle('hasSourceExpression0')"><a name="hasSourceExpression0Anchor">hasSourceExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6533<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 6534or opaque value's source expression matches the given matcher. 6535 6536Example 1: matches "a string" 6537(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 6538class URL { URL(string); }; 6539URL url = "a string"; 6540 6541Example 2: matches 'b' (matcher = 6542opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 6543int a = b ?: 1; 6544</pre></td></tr> 6545 6546 6547<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument0')"><a name="hasAnyTemplateArgument0Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 6548<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6549functionDecl that have at least one TemplateArgument matching the given 6550InnerMatcher. 6551 6552Given 6553 template<typename T> class A {}; 6554 template<> class A<double> {}; 6555 A<int> a; 6556 6557 template<typename T> f() {}; 6558 void func() { f<int>(); }; 6559 6560classTemplateSpecializationDecl(hasAnyTemplateArgument( 6561 refersToType(asString("int")))) 6562 matches the specialization A<int> 6563 6564functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 6565 matches the specialization f<int> 6566</pre></td></tr> 6567 6568 6569<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasSpecializedTemplate0')"><a name="hasSpecializedTemplate0Anchor">hasSpecializedTemplate</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>> InnerMatcher</td></tr> 6570<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 6571 6572Given 6573 template<typename T> class A {}; #1 6574 template<> class A<int> {}; #2 6575classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 6576 matches '#2' with classTemplateDecl() matching the class template 6577 declaration of 'A' at #1. 6578</pre></td></tr> 6579 6580 6581<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasTemplateArgument0')"><a name="hasTemplateArgument0Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 6582<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6583functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 6584 6585Given 6586 template<typename T, typename U> class A {}; 6587 A<bool, int> b; 6588 A<int, bool> c; 6589 6590 template<typename T> void f() {} 6591 void func() { f<int>(); }; 6592classTemplateSpecializationDecl(hasTemplateArgument( 6593 1, refersToType(asString("int")))) 6594 matches the specialization A<bool, int> 6595 6596functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 6597 matches the specialization f<int> 6598</pre></td></tr> 6599 6600 6601<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>></td><td class="name" onclick="toggle('hasElementType1')"><a name="hasElementType1Anchor">hasElementType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 6602<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 6603type. 6604 6605Given 6606 struct A {}; 6607 A a[7]; 6608 int b[7]; 6609arrayType(hasElementType(builtinType())) 6610 matches "int b[7]" 6611 6612Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 6613</pre></td></tr> 6614 6615 6616<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>></td><td class="name" onclick="toggle('hasAnySubstatement0')"><a name="hasAnySubstatement0Anchor">hasAnySubstatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 6617<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 6618a given matcher. Also matches StmtExprs that have CompoundStmt as children. 6619 6620Given 6621 { {}; 1+2; } 6622hasAnySubstatement(compoundStmt()) 6623 matches '{ {}; 1+2; }' 6624with compoundStmt() 6625 matching '{}' 6626</pre></td></tr> 6627 6628 6629<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>></td><td class="name" onclick="toggle('hasDecayedType0')"><a name="hasDecayedType0Anchor">hasDecayedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerType</td></tr> 6630<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher 6631</pre></td></tr> 6632 6633 6634<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6635<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 6636matches the given matcher. 6637 6638The associated declaration is: 6639- for type nodes, the declaration of the underlying type 6640- for CallExpr, the declaration of the callee 6641- for MemberExpr, the declaration of the referenced member 6642- for CXXConstructExpr, the declaration of the constructor 6643- for CXXNewExpr, the declaration of the operator new 6644- for ObjCIvarExpr, the declaration of the ivar 6645 6646For type nodes, hasDeclaration will generally match the declaration of the 6647sugared type. Given 6648 class X {}; 6649 typedef X Y; 6650 Y y; 6651in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6652typedefDecl. A common use case is to match the underlying, desugared type. 6653This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6654 varDecl(hasType(hasUnqualifiedDesugaredType( 6655 recordType(hasDeclaration(decl()))))) 6656In this matcher, the decl will match the CXXRecordDecl of class X. 6657 6658Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 6659 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 6660 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 6661 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 6662 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 6663 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 6664 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6665</pre></td></tr> 6666 6667 6668<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('throughUsingDecl0')"><a name="throughUsingDecl0Anchor">throughUsingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr> 6669<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 6670specific using shadow declaration. 6671 6672Given 6673 namespace a { void f() {} } 6674 using a::f; 6675 void g() { 6676 f(); // Matches this .. 6677 a::f(); // .. but not this. 6678 } 6679declRefExpr(throughUsingDecl(anything())) 6680 matches f() 6681</pre></td></tr> 6682 6683 6684<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('to0')"><a name="to0Anchor">to</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6685<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 6686specified matcher. 6687 6688Example matches x in if(x) 6689 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 6690 bool x; 6691 if (x) {} 6692</pre></td></tr> 6693 6694 6695<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>></td><td class="name" onclick="toggle('containsDeclaration0')"><a name="containsDeclaration0Anchor">containsDeclaration</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6696<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 6697 6698Note that this does not work for global declarations because the AST 6699breaks up multiple-declaration DeclStmt's into multiple single-declaration 6700DeclStmt's. 6701Example: Given non-global declarations 6702 int a, b = 0; 6703 int c; 6704 int d = 2, e; 6705declStmt(containsDeclaration( 6706 0, varDecl(hasInitializer(anything())))) 6707 matches only 'int d = 2, e;', and 6708declStmt(containsDeclaration(1, varDecl())) 6709 matches 'int a, b = 0' as well as 'int d = 2, e;' 6710 but 'int c;' is not matched. 6711</pre></td></tr> 6712 6713 6714<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>></td><td class="name" onclick="toggle('hasSingleDecl0')"><a name="hasSingleDecl0Anchor">hasSingleDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6715<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 6716 6717Given 6718 int a, b; 6719 int c; 6720declStmt(hasSingleDecl(anything())) 6721 matches 'int c;' but not 'int a, b;'. 6722</pre></td></tr> 6723 6724 6725<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc0')"><a name="hasTypeLoc0Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6726<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 6727the inner matcher. 6728 6729Given 6730 int x; 6731declaratorDecl(hasTypeLoc(loc(asString("int")))) 6732 matches int x 6733</pre></td></tr> 6734 6735 6736<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('hasDeclContext0')"><a name="hasDeclContext0Anchor">hasDeclContext</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6737<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 6738Decl, matches InnerMatcher. 6739 6740Given 6741 namespace N { 6742 namespace M { 6743 class D {}; 6744 } 6745 } 6746 6747cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 6748declaration of class D. 6749</pre></td></tr> 6750 6751 6752<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>></td><td class="name" onclick="toggle('hasUnderlyingType0')"><a name="hasUnderlyingType0Anchor">hasUnderlyingType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 6753<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type. 6754 6755Given 6756 decltype(1) a = 1; 6757 decltype(2.0) b = 2.0; 6758decltypeType(hasUnderlyingType(isInteger())) 6759 matches the type of "a" 6760 6761Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>> 6762</pre></td></tr> 6763 6764 6765<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>></td><td class="name" onclick="toggle('hasBody0')"><a name="hasBody0Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 6766<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr> 6767 6768 6769<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>></td><td class="name" onclick="toggle('hasCondition3')"><a name="hasCondition3Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6770<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 6771switch statement or conditional operator. 6772 6773Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6774 if (true) {} 6775</pre></td></tr> 6776 6777 6778<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>></td><td class="name" onclick="toggle('hasQualifier0')"><a name="hasQualifier0Anchor">hasQualifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr> 6779<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 6780matches InnerMatcher if the qualifier exists. 6781 6782Given 6783 namespace N { 6784 namespace M { 6785 class D {}; 6786 } 6787 } 6788 N::M::D d; 6789 6790elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 6791matches the type of the variable declaration of d. 6792</pre></td></tr> 6793 6794 6795<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>></td><td class="name" onclick="toggle('namesType0')"><a name="namesType0Anchor">namesType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 6796<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 6797 6798Given 6799 namespace N { 6800 namespace M { 6801 class D {}; 6802 } 6803 } 6804 N::M::D d; 6805 6806elaboratedType(namesType(recordType( 6807hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 6808declaration of d. 6809</pre></td></tr> 6810 6811 6812<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>></td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6813<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 6814matches the given matcher. 6815 6816The associated declaration is: 6817- for type nodes, the declaration of the underlying type 6818- for CallExpr, the declaration of the callee 6819- for MemberExpr, the declaration of the referenced member 6820- for CXXConstructExpr, the declaration of the constructor 6821- for CXXNewExpr, the declaration of the operator new 6822- for ObjCIvarExpr, the declaration of the ivar 6823 6824For type nodes, hasDeclaration will generally match the declaration of the 6825sugared type. Given 6826 class X {}; 6827 typedef X Y; 6828 Y y; 6829in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6830typedefDecl. A common use case is to match the underlying, desugared type. 6831This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6832 varDecl(hasType(hasUnqualifiedDesugaredType( 6833 recordType(hasDeclaration(decl()))))) 6834In this matcher, the decl will match the CXXRecordDecl of class X. 6835 6836Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 6837 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 6838 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 6839 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 6840 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 6841 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 6842 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6843</pre></td></tr> 6844 6845 6846<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>></td><td class="name" onclick="toggle('hasDestinationType0')"><a name="hasDestinationType0Anchor">hasDestinationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 6847<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 6848 6849(Note: Clang's AST refers to other conversions as "casts" too, and calls 6850actual casts "explicit" casts.) 6851</pre></td></tr> 6852 6853 6854<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6855<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value 6856declaration's type. 6857 6858In case of a value declaration (for example a variable declaration), 6859this resolves one layer of indirection. For example, in the value 6860declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6861X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6862declaration of x. 6863 6864Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6865 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6866 and friend class X (matcher = friendDecl(hasType("X")) 6867 class X {}; 6868 void y(X &x) { x; X z; } 6869 class Y { friend class X; }; 6870 6871Example matches class Derived 6872(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6873class Base {}; 6874class Derived : Base {}; 6875 6876Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>, 6877Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6878</pre></td></tr> 6879 6880 6881<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('hasType0')"><a name="hasType0Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 6882<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 6883matcher. 6884 6885Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6886 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6887 and U (matcher = typedefDecl(hasType(asString("int"))) 6888 and friend class X (matcher = friendDecl(hasType("X")) 6889 class X {}; 6890 void y(X &x) { x; X z; } 6891 typedef int U; 6892 class Y { friend class X; }; 6893</pre></td></tr> 6894 6895 6896<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringElidableConstructorCall0')"><a name="ignoringElidableConstructorCall0Anchor">ignoringElidableConstructorCall</a></td><td>ast_matchers::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6897<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 6898elidable constructor and other corresponding bookkeeping nodes. 6899 6900In C++17, elidable copy constructors are no longer being generated in the 6901AST as it is not permitted by the standard. They are, however, part of the 6902AST in C++14 and earlier. So, a matcher must abstract over these differences 6903to work in all language modes. This matcher skips elidable constructor-call 6904AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 6905various implicit nodes inside the constructor calls, all of which will not 6906appear in the C++17 AST. 6907 6908Given 6909 6910struct H {}; 6911H G(); 6912void f() { 6913 H D = G(); 6914} 6915 6916``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 6917matches ``H D = G()`` in C++11 through C++17 (and beyond). 6918</pre></td></tr> 6919 6920 6921<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringImpCasts0')"><a name="ignoringImpCasts0Anchor">ignoringImpCasts</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6922<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 6923are stripped off. 6924 6925Parentheses and explicit casts are not discarded. 6926Given 6927 int arr[5]; 6928 int a = 0; 6929 char b = 0; 6930 const int c = a; 6931 int *d = arr; 6932 long e = (long) 0l; 6933The matchers 6934 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 6935 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 6936would match the declarations for a, b, c, and d, but not e. 6937While 6938 varDecl(hasInitializer(integerLiteral())) 6939 varDecl(hasInitializer(declRefExpr())) 6940only match the declarations for b, c, and d. 6941</pre></td></tr> 6942 6943 6944<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringImplicit0')"><a name="ignoringImplicit0Anchor">ignoringImplicit</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6945<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 6946nodes are stripped off. 6947 6948Parentheses and explicit casts are not discarded. 6949Given 6950 class C {}; 6951 C a = C(); 6952 C b; 6953 C c = b; 6954The matchers 6955 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 6956would match the declarations for a, b, and c. 6957While 6958 varDecl(hasInitializer(cxxConstructExpr())) 6959only match the declarations for b and c. 6960</pre></td></tr> 6961 6962 6963<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringParenCasts0')"><a name="ignoringParenCasts0Anchor">ignoringParenCasts</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6964<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 6965casts are stripped off. 6966 6967Implicit and non-C Style casts are also discarded. 6968Given 6969 int a = 0; 6970 char b = (0); 6971 void* c = reinterpret_cast<char*>(0); 6972 char d = char(0); 6973The matcher 6974 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 6975would match the declarations for a, b, c, and d. 6976while 6977 varDecl(hasInitializer(integerLiteral())) 6978only match the declaration for a. 6979</pre></td></tr> 6980 6981 6982<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringParenImpCasts0')"><a name="ignoringParenImpCasts0Anchor">ignoringParenImpCasts</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6983<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 6984parentheses are stripped off. 6985 6986Explicit casts are not discarded. 6987Given 6988 int arr[5]; 6989 int a = 0; 6990 char b = (0); 6991 const int c = a; 6992 int *d = (arr); 6993 long e = ((long) 0l); 6994The matchers 6995 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 6996 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 6997would match the declarations for a, b, c, and d, but not e. 6998while 6999 varDecl(hasInitializer(integerLiteral())) 7000 varDecl(hasInitializer(declRefExpr())) 7001would only match the declaration for a. 7002</pre></td></tr> 7003 7004 7005<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringParens1')"><a name="ignoringParens1Anchor">ignoringParens</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7006<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 7007 7008Given 7009 const char* str = ("my-string"); 7010The matcher 7011 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 7012would match the implicit cast resulting from the assignment. 7013</pre></td></tr> 7014 7015 7016<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasInClassInitializer0')"><a name="hasInClassInitializer0Anchor">hasInClassInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7017<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 7018 7019Given 7020 class C { 7021 int a = 2; 7022 int b = 3; 7023 int c; 7024 }; 7025fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 7026 matches 'int a;' but not 'int b;'. 7027fieldDecl(hasInClassInitializer(anything())) 7028 matches 'int a;' and 'int b;' but not 'int c;'. 7029</pre></td></tr> 7030 7031 7032<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasBody1')"><a name="hasBody1Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7033<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr> 7034 7035 7036<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasCondition1')"><a name="hasCondition1Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7037<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 7038switch statement or conditional operator. 7039 7040Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7041 if (true) {} 7042</pre></td></tr> 7043 7044 7045<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasIncrement0')"><a name="hasIncrement0Anchor">hasIncrement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7046<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 7047 7048Example: 7049 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 7050matches '++x' in 7051 for (x; x < N; ++x) { } 7052</pre></td></tr> 7053 7054 7055<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasLoopInit0')"><a name="hasLoopInit0Anchor">hasLoopInit</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7056<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 7057 7058Example: 7059 forStmt(hasLoopInit(declStmt())) 7060matches 'int x = 0' in 7061 for (int x = 0; x < N; ++x) { } 7062</pre></td></tr> 7063 7064 7065<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>></td><td class="name" onclick="toggle('hasType5')"><a name="hasType5Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7066<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 7067declaration's type. 7068 7069In case of a value declaration (for example a variable declaration), 7070this resolves one layer of indirection. For example, in the value 7071declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7072X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7073declaration of x. 7074 7075Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7076 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7077 and friend class X (matcher = friendDecl(hasType("X")) 7078 class X {}; 7079 void y(X &x) { x; X z; } 7080 class Y { friend class X; }; 7081 7082Example matches class Derived 7083(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7084class Base {}; 7085class Derived : Base {}; 7086 7087Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>, 7088Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7089</pre></td></tr> 7090 7091 7092<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>></td><td class="name" onclick="toggle('hasType1')"><a name="hasType1Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7093<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 7094matcher. 7095 7096Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7097 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7098 and U (matcher = typedefDecl(hasType(asString("int"))) 7099 and friend class X (matcher = friendDecl(hasType("X")) 7100 class X {}; 7101 void y(X &x) { x; X z; } 7102 typedef int U; 7103 class Y { friend class X; }; 7104</pre></td></tr> 7105 7106 7107<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyBody0')"><a name="hasAnyBody0Anchor">hasAnyBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7108<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST. 7109Note that this matcher matches all the declarations of a function whose 7110body is present in the AST. 7111 7112Given 7113 void f(); 7114 void f() {} 7115 void g(); 7116hasAnyBody(functionDecl()) 7117 matches both 'void f();' 7118 and 'void f() {}' 7119with compoundStmt() 7120 matching '{}' 7121 but does not match 'void g();' 7122</pre></td></tr> 7123 7124 7125<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyParameter0')"><a name="hasAnyParameter0Anchor">hasAnyParameter</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 7126<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 7127block. 7128 7129Does not match the 'this' parameter of a method. 7130 7131Given 7132 class X { void f(int x, int y, int z) {} }; 7133cxxMethodDecl(hasAnyParameter(hasName("y"))) 7134 matches f(int x, int y, int z) {} 7135with hasAnyParameter(...) 7136 matching int y 7137 7138For ObjectiveC, given 7139 @interface I - (void) f:(int) y; @end 7140 7141the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 7142matches the declaration of method f with hasParameter 7143matching y. 7144 7145For blocks, given 7146 b = ^(int y) { printf("%d", y) }; 7147 7148the matcher blockDecl(hasAnyParameter(hasName("y"))) 7149matches the declaration of the block b with hasParameter 7150matching y. 7151</pre></td></tr> 7152 7153 7154<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument2')"><a name="hasAnyTemplateArgument2Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 7155<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7156functionDecl that have at least one TemplateArgument matching the given 7157InnerMatcher. 7158 7159Given 7160 template<typename T> class A {}; 7161 template<> class A<double> {}; 7162 A<int> a; 7163 7164 template<typename T> f() {}; 7165 void func() { f<int>(); }; 7166 7167classTemplateSpecializationDecl(hasAnyTemplateArgument( 7168 refersToType(asString("int")))) 7169 matches the specialization A<int> 7170 7171functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7172 matches the specialization f<int> 7173</pre></td></tr> 7174 7175 7176<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasBody4')"><a name="hasBody4Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7177<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr> 7178 7179 7180<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasExplicitSpecifier0')"><a name="hasExplicitSpecifier0Anchor">hasExplicitSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7181<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 7182declaration. 7183 7184Given 7185 template<bool b> 7186 struct S { 7187 S(int); // #1 7188 explicit S(double); // #2 7189 operator int(); // #3 7190 explicit operator bool(); // #4 7191 explicit(false) S(bool) // # 7 7192 explicit(true) S(char) // # 8 7193 explicit(b) S(S) // # 9 7194 }; 7195 S(int) -> S<true> // #5 7196 explicit S(double) -> S<false> // #6 7197cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 7198cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 7199cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 7200</pre></td></tr> 7201 7202 7203<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasParameter0')"><a name="hasParameter0Anchor">hasParameter</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 7204<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 7205declaration or a block. 7206 7207Given 7208 class X { void f(int x) {} }; 7209cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 7210 matches f(int x) {} 7211with hasParameter(...) 7212 matching int x 7213 7214For ObjectiveC, given 7215 @interface I - (void) f:(int) y; @end 7216 7217the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 7218matches the declaration of method f with hasParameter 7219matching y. 7220</pre></td></tr> 7221 7222 7223<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasTemplateArgument2')"><a name="hasTemplateArgument2Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 7224<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7225functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7226 7227Given 7228 template<typename T, typename U> class A {}; 7229 A<bool, int> b; 7230 A<int, bool> c; 7231 7232 template<typename T> void f() {} 7233 void func() { f<int>(); }; 7234classTemplateSpecializationDecl(hasTemplateArgument( 7235 1, refersToType(asString("int")))) 7236 matches the specialization A<bool, int> 7237 7238functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7239 matches the specialization f<int> 7240</pre></td></tr> 7241 7242 7243<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('returns0')"><a name="returns0Anchor">returns</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7244<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 7245 7246Given: 7247 class X { int f() { return 1; } }; 7248cxxMethodDecl(returns(asString("int"))) 7249 matches int f() { return 1; } 7250</pre></td></tr> 7251 7252 7253<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasCondition0')"><a name="hasCondition0Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7254<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 7255switch statement or conditional operator. 7256 7257Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7258 if (true) {} 7259</pre></td></tr> 7260 7261 7262<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasConditionVariableStatement0')"><a name="hasConditionVariableStatement0Anchor">hasConditionVariableStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>> InnerMatcher</td></tr> 7263<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 7264 7265Given 7266 if (A* a = GetAPointer()) {} 7267hasConditionVariableStatement(...) 7268 matches 'A* a = GetAPointer()'. 7269</pre></td></tr> 7270 7271 7272<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasElse0')"><a name="hasElse0Anchor">hasElse</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7273<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 7274 7275Examples matches the if statement 7276 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 7277 if (false) false; else true; 7278</pre></td></tr> 7279 7280 7281<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasInitStatement0')"><a name="hasInitStatement0Anchor">hasInitStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7282<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 7283 7284Given: 7285 void foo() { 7286 if (int i = foobar(); i > 0) {} 7287 switch (int i = foobar(); i) {} 7288 for (auto& a = get_range(); auto& x : a) {} 7289 } 7290 void bar() { 7291 if (foobar() > 0) {} 7292 switch (foobar()) {} 7293 for (auto& x : get_range()) {} 7294 } 7295ifStmt(hasInitStatement(anything())) 7296 matches the if statement in foo but not in bar. 7297switchStmt(hasInitStatement(anything())) 7298 matches the switch statement in foo but not in bar. 7299cxxForRangeStmt(hasInitStatement(anything())) 7300 matches the range for statement in foo but not in bar. 7301</pre></td></tr> 7302 7303 7304<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasThen0')"><a name="hasThen0Anchor">hasThen</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7305<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 7306 7307Examples matches the if statement 7308 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 7309 if (false) true; else false; 7310</pre></td></tr> 7311 7312 7313<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>></td><td class="name" onclick="toggle('hasImplicitDestinationType0')"><a name="hasImplicitDestinationType0Anchor">hasImplicitDestinationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7314<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 7315matcher. 7316 7317FIXME: Unit test this matcher 7318</pre></td></tr> 7319 7320 7321<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>></td><td class="name" onclick="toggle('hasInit0')"><a name="hasInit0Anchor">hasInit</a></td><td>unsigned N, ast_matchers::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7322<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 7323 7324Example matches y. 7325 (matcher = initListExpr(hasInit(0, expr()))) 7326 int x{y}. 7327</pre></td></tr> 7328 7329 7330<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>></td><td class="name" onclick="toggle('hasSyntacticForm0')"><a name="hasSyntacticForm0Anchor">hasSyntacticForm</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7331<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 7332(if expression have it). 7333</pre></td></tr> 7334 7335 7336<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>></td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7337<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 7338matches the given matcher. 7339 7340The associated declaration is: 7341- for type nodes, the declaration of the underlying type 7342- for CallExpr, the declaration of the callee 7343- for MemberExpr, the declaration of the referenced member 7344- for CXXConstructExpr, the declaration of the constructor 7345- for CXXNewExpr, the declaration of the operator new 7346- for ObjCIvarExpr, the declaration of the ivar 7347 7348For type nodes, hasDeclaration will generally match the declaration of the 7349sugared type. Given 7350 class X {}; 7351 typedef X Y; 7352 Y y; 7353in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7354typedefDecl. A common use case is to match the underlying, desugared type. 7355This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7356 varDecl(hasType(hasUnqualifiedDesugaredType( 7357 recordType(hasDeclaration(decl()))))) 7358In this matcher, the decl will match the CXXRecordDecl of class X. 7359 7360Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 7361 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 7362 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 7363 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 7364 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 7365 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 7366 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7367</pre></td></tr> 7368 7369 7370<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>></td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7371<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 7372matches the given matcher. 7373 7374The associated declaration is: 7375- for type nodes, the declaration of the underlying type 7376- for CallExpr, the declaration of the callee 7377- for MemberExpr, the declaration of the referenced member 7378- for CXXConstructExpr, the declaration of the constructor 7379- for CXXNewExpr, the declaration of the operator new 7380- for ObjCIvarExpr, the declaration of the ivar 7381 7382For type nodes, hasDeclaration will generally match the declaration of the 7383sugared type. Given 7384 class X {}; 7385 typedef X Y; 7386 Y y; 7387in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7388typedefDecl. A common use case is to match the underlying, desugared type. 7389This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7390 varDecl(hasType(hasUnqualifiedDesugaredType( 7391 recordType(hasDeclaration(decl()))))) 7392In this matcher, the decl will match the CXXRecordDecl of class X. 7393 7394Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 7395 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 7396 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 7397 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 7398 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 7399 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 7400 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7401</pre></td></tr> 7402 7403 7404<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>></td><td class="name" onclick="toggle('hasAnyCapture1')"><a name="hasAnyCapture1Anchor">hasAnyCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>> InnerMatcher</td></tr> 7405<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression. 7406 7407Given 7408 struct foo { 7409 void bar() { 7410 auto f = [this](){}; 7411 } 7412 } 7413lambdaExpr(hasAnyCapture(cxxThisExpr())) 7414 matches [this](){}; 7415</pre></td></tr> 7416 7417 7418<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>></td><td class="name" onclick="toggle('hasAnyCapture0')"><a name="hasAnyCapture0Anchor">hasAnyCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>> InnerMatcher</td></tr> 7419<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression. 7420 7421Given 7422 void foo() { 7423 int x; 7424 auto f = [x](){}; 7425 } 7426lambdaExpr(hasAnyCapture(anything())) 7427 matches [x](){}; 7428</pre></td></tr> 7429 7430 7431<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7432<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 7433matches the given matcher. 7434 7435The associated declaration is: 7436- for type nodes, the declaration of the underlying type 7437- for CallExpr, the declaration of the callee 7438- for MemberExpr, the declaration of the referenced member 7439- for CXXConstructExpr, the declaration of the constructor 7440- for CXXNewExpr, the declaration of the operator new 7441- for ObjCIvarExpr, the declaration of the ivar 7442 7443For type nodes, hasDeclaration will generally match the declaration of the 7444sugared type. Given 7445 class X {}; 7446 typedef X Y; 7447 Y y; 7448in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7449typedefDecl. A common use case is to match the underlying, desugared type. 7450This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7451 varDecl(hasType(hasUnqualifiedDesugaredType( 7452 recordType(hasDeclaration(decl()))))) 7453In this matcher, the decl will match the CXXRecordDecl of class X. 7454 7455Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 7456 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 7457 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 7458 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 7459 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 7460 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 7461 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7462</pre></td></tr> 7463 7464 7465<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('hasObjectExpression0')"><a name="hasObjectExpression0Anchor">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7466<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 7467given matcher. Implicit object expressions are included; that is, it matches 7468use of implicit `this`. 7469 7470Given 7471 struct X { 7472 int m; 7473 int f(X x) { x.m; return m; } 7474 }; 7475memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 7476 matches `x.m`, but not `m`; however, 7477memberExpr(hasObjectExpression(hasType(pointsTo( 7478 cxxRecordDecl(hasName("X")))))) 7479 matches `m` (aka. `this->m`), but not `x.m`. 7480</pre></td></tr> 7481 7482 7483<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('member0')"><a name="member0Anchor">member</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> InnerMatcher</td></tr> 7484<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 7485given matcher. 7486 7487Given 7488 struct { int first, second; } first, second; 7489 int i(second.first); 7490 int j(first.second); 7491memberExpr(member(hasName("first"))) 7492 matches second.first 7493 but not first.second (because the member name there is "second"). 7494</pre></td></tr> 7495 7496 7497<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>></td><td class="name" onclick="toggle('pointee1')"><a name="pointee1Anchor">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 7498<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 7499pointee matches a given matcher. 7500 7501Given 7502 int *a; 7503 int const *b; 7504 float const *f; 7505pointerType(pointee(isConstQualified(), isInteger())) 7506 matches "int const *b" 7507 7508Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 7509 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 7510</pre></td></tr> 7511 7512 7513<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasUnderlyingDecl0')"><a name="hasUnderlyingDecl0Anchor">hasUnderlyingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> InnerMatcher</td></tr> 7514<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 7515matcher. 7516 7517Given 7518 namespace N { template<class T> void f(T t); } 7519 template <class T> void g() { using N::f; f(T()); } 7520unresolvedLookupExpr(hasAnyDeclaration( 7521 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 7522 matches the use of f in g() . 7523</pre></td></tr> 7524 7525 7526<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('hasPrefix1')"><a name="hasPrefix1Anchor">hasPrefix</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>> InnerMatcher</td></tr> 7527<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 7528 7529Given 7530 struct A { struct B { struct C {}; }; }; 7531 A::B::C c; 7532nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 7533 matches "A::" 7534</pre></td></tr> 7535 7536 7537<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('loc1')"><a name="loc1Anchor">loc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr> 7538<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 7539NestedNameSpecifier-matcher matches. 7540</pre></td></tr> 7541 7542 7543<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('specifiesTypeLoc0')"><a name="specifiesTypeLoc0Anchor">specifiesTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> InnerMatcher</td></tr> 7544<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 7545given TypeLoc. 7546 7547Given 7548 struct A { struct B { struct C {}; }; }; 7549 A::B::C c; 7550nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 7551 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 7552 matches "A::" 7553</pre></td></tr> 7554 7555 7556<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('hasPrefix0')"><a name="hasPrefix0Anchor">hasPrefix</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr> 7557<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 7558 7559Given 7560 struct A { struct B { struct C {}; }; }; 7561 A::B::C c; 7562nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 7563 matches "A::" 7564</pre></td></tr> 7565 7566 7567<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('specifiesNamespace0')"><a name="specifiesNamespace0Anchor">specifiesNamespace</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>> InnerMatcher</td></tr> 7568<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 7569given namespace matcher. 7570 7571Given 7572 namespace ns { struct A {}; } 7573 ns::A a; 7574nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 7575 matches "ns::" 7576</pre></td></tr> 7577 7578 7579<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('specifiesType0')"><a name="specifiesType0Anchor">specifiesType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7580<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 7581given QualType matcher without qualifiers. 7582 7583Given 7584 struct A { struct B { struct C {}; }; }; 7585 A::B::C c; 7586nestedNameSpecifier(specifiesType( 7587 hasDeclaration(cxxRecordDecl(hasName("A"))) 7588)) 7589 matches "A::" 7590</pre></td></tr> 7591 7592 7593<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('hasAnyClause0')"><a name="hasAnyClause0Anchor">hasAnyClause</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>> InnerMatcher</td></tr> 7594<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 7595 7596Given 7597 7598 #pragma omp parallel 7599 #pragma omp parallel default(none) 7600 7601``ompExecutableDirective(hasAnyClause(anything()))`` matches 7602``omp parallel default(none)``. 7603</pre></td></tr> 7604 7605 7606<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('hasStructuredBlock0')"><a name="hasStructuredBlock0Anchor">hasStructuredBlock</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7607<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 7608 7609Prerequisite: the executable directive must not be standalone directive. 7610If it is, it will never match. 7611 7612Given 7613 7614 #pragma omp parallel 7615 ; 7616 #pragma omp parallel 7617 {} 7618 7619``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 7620</pre></td></tr> 7621 7622 7623<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 7624<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 7625matching Base, or Objective-C classes that directly or indirectly 7626subclass a class matching Base. 7627 7628Note that a class is not considered to be derived from itself. 7629 7630Example matches Y, Z, C (Base == hasName("X")) 7631 class X; 7632 class Y : public X {}; // directly derived 7633 class Z : public Y {}; // indirectly derived 7634 typedef X A; 7635 typedef A B; 7636 class C : public B {}; // derived from a typedef of X 7637 7638In the following example, Bar matches isDerivedFrom(hasName("X")): 7639 class Foo; 7640 typedef Foo X; 7641 class Bar : public Foo {}; // derived from a type that X is a typedef of 7642 7643In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 7644 @interface NSObject @end 7645 @interface Bar : NSObject @end 7646 7647Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>> 7648</pre></td></tr> 7649 7650 7651<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom1')"><a name="isDirectlyDerivedFrom1Anchor">isDirectlyDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 7652<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 7653matching Base. 7654 7655Note that a class is not considered to be derived from itself. 7656 7657Example matches Y, C (Base == hasName("X")) 7658 class X; 7659 class Y : public X {}; // directly derived 7660 class Z : public Y {}; // indirectly derived 7661 typedef X A; 7662 typedef A B; 7663 class C : public B {}; // derived from a typedef of X 7664 7665In the following example, Bar matches isDerivedFrom(hasName("X")): 7666 class Foo; 7667 typedef Foo X; 7668 class Bar : public Foo {}; // derived from a type that X is a typedef of 7669</pre></td></tr> 7670 7671 7672<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 7673<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 7674match Base. 7675</pre></td></tr> 7676 7677 7678<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument3')"><a name="hasAnyArgument3Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7679<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 7680expression, or an ObjC-message-send expression. 7681 7682Given 7683 void x(int, int, int) { int y; x(1, y, 42); } 7684callExpr(hasAnyArgument(declRefExpr())) 7685 matches x(1, y, 42) 7686with hasAnyArgument(...) 7687 matching y 7688 7689For ObjectiveC, given 7690 @interface I - (void) f:(int) y; @end 7691 void foo(I *i) { [i f:12]; } 7692objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 7693 matches [i f:12] 7694</pre></td></tr> 7695 7696 7697<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasArgument3')"><a name="hasArgument3Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7698<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor 7699call expression. 7700 7701Example matches y in x(y) 7702 (matcher = callExpr(hasArgument(0, declRefExpr()))) 7703 void x(int) { int y; x(y); } 7704</pre></td></tr> 7705 7706 7707<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasReceiver0')"><a name="hasReceiver0Anchor">hasReceiver</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7708<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 7709and the inner matcher matches on that instance. 7710 7711For example the method call in 7712 NSString *x = @"hello"; 7713 [x containsString:@"h"]; 7714is matched by 7715objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 7716</pre></td></tr> 7717 7718 7719<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasReceiverType0')"><a name="hasReceiverType0Anchor">hasReceiverType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7720<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 7721 7722Example 7723matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 7724matches the [webView ...] message invocation. 7725 NSString *webViewJavaScript = ... 7726 UIWebView *webView = ... 7727 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 7728</pre></td></tr> 7729 7730 7731<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('hasAnyParameter1')"><a name="hasAnyParameter1Anchor">hasAnyParameter</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 7732<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 7733block. 7734 7735Does not match the 'this' parameter of a method. 7736 7737Given 7738 class X { void f(int x, int y, int z) {} }; 7739cxxMethodDecl(hasAnyParameter(hasName("y"))) 7740 matches f(int x, int y, int z) {} 7741with hasAnyParameter(...) 7742 matching int y 7743 7744For ObjectiveC, given 7745 @interface I - (void) f:(int) y; @end 7746 7747the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 7748matches the declaration of method f with hasParameter 7749matching y. 7750 7751For blocks, given 7752 b = ^(int y) { printf("%d", y) }; 7753 7754the matcher blockDecl(hasAnyParameter(hasName("y"))) 7755matches the declaration of the block b with hasParameter 7756matching y. 7757</pre></td></tr> 7758 7759 7760<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('hasParameter1')"><a name="hasParameter1Anchor">hasParameter</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 7761<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 7762declaration or a block. 7763 7764Given 7765 class X { void f(int x) {} }; 7766cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 7767 matches f(int x) {} 7768with hasParameter(...) 7769 matching int x 7770 7771For ObjectiveC, given 7772 @interface I - (void) f:(int) y; @end 7773 7774the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 7775matches the declaration of method f with hasParameter 7776matching y. 7777</pre></td></tr> 7778 7779 7780<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>></td><td class="name" onclick="toggle('hasSourceExpression1')"><a name="hasSourceExpression1Anchor">hasSourceExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7781<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 7782or opaque value's source expression matches the given matcher. 7783 7784Example 1: matches "a string" 7785(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 7786class URL { URL(string); }; 7787URL url = "a string"; 7788 7789Example 2: matches 'b' (matcher = 7790opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 7791int a = b ?: 1; 7792</pre></td></tr> 7793 7794 7795<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OverloadExpr.html">OverloadExpr</a>></td><td class="name" onclick="toggle('hasAnyDeclaration0')"><a name="hasAnyDeclaration0Anchor">hasAnyDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7796<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 7797overloads matches the given matcher. 7798 7799Given 7800 template <typename T> void foo(T); 7801 template <typename T> void bar(T); 7802 template <typename T> void baz(T t) { 7803 foo(t); 7804 bar(t); 7805 } 7806unresolvedLookupExpr(hasAnyDeclaration( 7807 functionTemplateDecl(hasName("foo")))) 7808 matches foo in foo(t); but not bar in bar(t); 7809</pre></td></tr> 7810 7811 7812<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>></td><td class="name" onclick="toggle('innerType0')"><a name="innerType0Anchor">innerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 7813<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 7814 7815Given 7816 int (*ptr_to_array)[4]; 7817 int (*ptr_to_func)(int); 7818 7819varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 7820ptr_to_func but not ptr_to_array. 7821 7822Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 7823</pre></td></tr> 7824 7825 7826<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>></td><td class="name" onclick="toggle('pointee2')"><a name="pointee2Anchor">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 7827<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 7828pointee matches a given matcher. 7829 7830Given 7831 int *a; 7832 int const *b; 7833 float const *f; 7834pointerType(pointee(isConstQualified(), isInteger())) 7835 matches "int const *b" 7836 7837Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 7838 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 7839</pre></td></tr> 7840 7841 7842<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('hasCanonicalType0')"><a name="hasCanonicalType0Anchor">hasCanonicalType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7843<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 7844 7845Given: 7846 typedef int &int_ref; 7847 int a; 7848 int_ref b = a; 7849 7850varDecl(hasType(qualType(referenceType()))))) will not match the 7851declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 7852</pre></td></tr> 7853 7854 7855<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7856<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 7857matches the given matcher. 7858 7859The associated declaration is: 7860- for type nodes, the declaration of the underlying type 7861- for CallExpr, the declaration of the callee 7862- for MemberExpr, the declaration of the referenced member 7863- for CXXConstructExpr, the declaration of the constructor 7864- for CXXNewExpr, the declaration of the operator new 7865- for ObjCIvarExpr, the declaration of the ivar 7866 7867For type nodes, hasDeclaration will generally match the declaration of the 7868sugared type. Given 7869 class X {}; 7870 typedef X Y; 7871 Y y; 7872in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7873typedefDecl. A common use case is to match the underlying, desugared type. 7874This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7875 varDecl(hasType(hasUnqualifiedDesugaredType( 7876 recordType(hasDeclaration(decl()))))) 7877In this matcher, the decl will match the CXXRecordDecl of class X. 7878 7879Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 7880 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 7881 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 7882 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 7883 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 7884 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 7885 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7886</pre></td></tr> 7887 7888 7889<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('ignoringParens0')"><a name="ignoringParens0Anchor">ignoringParens</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7890<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 7891 7892Given 7893 void (*fp)(void); 7894The matcher 7895 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 7896would match the declaration for fp. 7897</pre></td></tr> 7898 7899 7900<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('pointsTo1')"><a name="pointsTo1Anchor">pointsTo</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7901<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 7902</pre></td></tr> 7903 7904 7905<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('pointsTo0')"><a name="pointsTo0Anchor">pointsTo</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7906<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 7907matches the specified matcher. 7908 7909Example matches y->x() 7910 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 7911 cxxRecordDecl(hasName("Y"))))))) 7912 class Y { public: void x(); }; 7913 void z() { Y *y; y->x(); } 7914</pre></td></tr> 7915 7916 7917<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('references1')"><a name="references1Anchor">references</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7918<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 7919</pre></td></tr> 7920 7921 7922<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('references0')"><a name="references0Anchor">references</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7923<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 7924type matches the specified matcher. 7925 7926Example matches X &x and const X &y 7927 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 7928 class X { 7929 void a(X b) { 7930 X &x = b; 7931 const X &y = b; 7932 } 7933 }; 7934</pre></td></tr> 7935 7936 7937<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>></td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7938<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 7939matches the given matcher. 7940 7941The associated declaration is: 7942- for type nodes, the declaration of the underlying type 7943- for CallExpr, the declaration of the callee 7944- for MemberExpr, the declaration of the referenced member 7945- for CXXConstructExpr, the declaration of the constructor 7946- for CXXNewExpr, the declaration of the operator new 7947- for ObjCIvarExpr, the declaration of the ivar 7948 7949For type nodes, hasDeclaration will generally match the declaration of the 7950sugared type. Given 7951 class X {}; 7952 typedef X Y; 7953 Y y; 7954in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7955typedefDecl. A common use case is to match the underlying, desugared type. 7956This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7957 varDecl(hasType(hasUnqualifiedDesugaredType( 7958 recordType(hasDeclaration(decl()))))) 7959In this matcher, the decl will match the CXXRecordDecl of class X. 7960 7961Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 7962 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 7963 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 7964 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 7965 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 7966 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 7967 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7968</pre></td></tr> 7969 7970 7971<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>></td><td class="name" onclick="toggle('pointee3')"><a name="pointee3Anchor">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 7972<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 7973pointee matches a given matcher. 7974 7975Given 7976 int *a; 7977 int const *b; 7978 float const *f; 7979pointerType(pointee(isConstQualified(), isInteger())) 7980 matches "int const *b" 7981 7982Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 7983 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 7984</pre></td></tr> 7985 7986 7987<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>></td><td class="name" onclick="toggle('hasReturnValue0')"><a name="hasReturnValue0Anchor">hasReturnValue</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7988<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 7989 7990Given 7991 return a + b; 7992hasReturnValue(binaryOperator()) 7993 matches 'return a + b' 7994with binaryOperator() 7995 matching 'a + b' 7996</pre></td></tr> 7997 7998 7999<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>></td><td class="name" onclick="toggle('hasAnySubstatement1')"><a name="hasAnySubstatement1Anchor">hasAnySubstatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 8000<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 8001a given matcher. Also matches StmtExprs that have CompoundStmt as children. 8002 8003Given 8004 { {}; 1+2; } 8005hasAnySubstatement(compoundStmt()) 8006 matches '{ {}; 1+2; }' 8007with compoundStmt() 8008 matching '{}' 8009</pre></td></tr> 8010 8011 8012<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('alignOfExpr0')"><a name="alignOfExpr0Anchor">alignOfExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr> 8013<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8014alignof. 8015</pre></td></tr> 8016 8017 8018<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forFunction0')"><a name="forFunction0Anchor">forFunction</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> InnerMatcher</td></tr> 8019<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to 8020 8021Given: 8022F& operator=(const F& o) { 8023 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 8024 return *this; 8025} 8026returnStmt(forFunction(hasName("operator="))) 8027 matches 'return *this' 8028 but does not match 'return v > 0' 8029</pre></td></tr> 8030 8031 8032<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('sizeOfExpr0')"><a name="sizeOfExpr0Anchor">sizeOfExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr> 8033<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8034sizeof. 8035</pre></td></tr> 8036 8037 8038<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>></td><td class="name" onclick="toggle('hasReplacementType0')"><a name="hasReplacementType0Anchor">hasReplacementType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 8039<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 8040type that matches the provided matcher. 8041 8042Given 8043 template <typename T> 8044 double F(T t); 8045 int i; 8046 double j = F(i); 8047 8048substTemplateTypeParmType(hasReplacementType(type())) matches int 8049</pre></td></tr> 8050 8051 8052<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>></td><td class="name" onclick="toggle('forEachSwitchCase0')"><a name="forEachSwitchCase0Anchor">forEachSwitchCase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>> InnerMatcher</td></tr> 8053<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 8054statement. This matcher may produce multiple matches. 8055 8056Given 8057 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 8058switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 8059 matches four times, with "c" binding each of "case 1:", "case 2:", 8060"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 8061"switch (1)", "switch (2)" and "switch (2)". 8062</pre></td></tr> 8063 8064 8065<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>></td><td class="name" onclick="toggle('hasCondition4')"><a name="hasCondition4Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8066<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 8067switch statement or conditional operator. 8068 8069Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8070 if (true) {} 8071</pre></td></tr> 8072 8073 8074<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>></td><td class="name" onclick="toggle('hasInitStatement1')"><a name="hasInitStatement1Anchor">hasInitStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 8075<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 8076 8077Given: 8078 void foo() { 8079 if (int i = foobar(); i > 0) {} 8080 switch (int i = foobar(); i) {} 8081 for (auto& a = get_range(); auto& x : a) {} 8082 } 8083 void bar() { 8084 if (foobar() > 0) {} 8085 switch (foobar()) {} 8086 for (auto& x : get_range()) {} 8087 } 8088ifStmt(hasInitStatement(anything())) 8089 matches the if statement in foo but not in bar. 8090switchStmt(hasInitStatement(anything())) 8091 matches the switch statement in foo but not in bar. 8092cxxForRangeStmt(hasInitStatement(anything())) 8093 matches the range for statement in foo but not in bar. 8094</pre></td></tr> 8095 8096 8097<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>></td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8098<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 8099matches the given matcher. 8100 8101The associated declaration is: 8102- for type nodes, the declaration of the underlying type 8103- for CallExpr, the declaration of the callee 8104- for MemberExpr, the declaration of the referenced member 8105- for CXXConstructExpr, the declaration of the constructor 8106- for CXXNewExpr, the declaration of the operator new 8107- for ObjCIvarExpr, the declaration of the ivar 8108 8109For type nodes, hasDeclaration will generally match the declaration of the 8110sugared type. Given 8111 class X {}; 8112 typedef X Y; 8113 Y y; 8114in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8115typedefDecl. A common use case is to match the underlying, desugared type. 8116This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8117 varDecl(hasType(hasUnqualifiedDesugaredType( 8118 recordType(hasDeclaration(decl()))))) 8119In this matcher, the decl will match the CXXRecordDecl of class X. 8120 8121Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 8122 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 8123 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 8124 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 8125 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 8126 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 8127 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8128</pre></td></tr> 8129 8130 8131<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('isExpr0')"><a name="isExpr0Anchor">isExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8132<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 8133 8134Given 8135 struct B { int next; }; 8136 template<int(B::*next_ptr)> struct A {}; 8137 A<&B::next> a; 8138templateSpecializationType(hasAnyTemplateArgument( 8139 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 8140 matches the specialization A<&B::next> with fieldDecl(...) matching 8141 B::next 8142</pre></td></tr> 8143 8144 8145<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToDeclaration0')"><a name="refersToDeclaration0Anchor">refersToDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8146<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 8147declaration. 8148 8149Given 8150 struct B { int next; }; 8151 template<int(B::*next_ptr)> struct A {}; 8152 A<&B::next> a; 8153classTemplateSpecializationDecl(hasAnyTemplateArgument( 8154 refersToDeclaration(fieldDecl(hasName("next"))))) 8155 matches the specialization A<&B::next> with fieldDecl(...) matching 8156 B::next 8157</pre></td></tr> 8158 8159 8160<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToIntegralType0')"><a name="refersToIntegralType0Anchor">refersToIntegralType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8161<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type. 8162 8163Given 8164 template<int T> struct C {}; 8165 C<42> c; 8166classTemplateSpecializationDecl( 8167 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 8168 matches the implicit instantiation of C in C<42>. 8169</pre></td></tr> 8170 8171 8172<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToTemplate0')"><a name="refersToTemplate0Anchor">refersToTemplate</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>> InnerMatcher</td></tr> 8173<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 8174 8175Given 8176 template<template <typename> class S> class X {}; 8177 template<typename T> class Y {}; 8178 X<Y> xi; 8179classTemplateSpecializationDecl(hasAnyTemplateArgument( 8180 refersToTemplate(templateName()))) 8181 matches the specialization X<Y> 8182</pre></td></tr> 8183 8184 8185<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToType0')"><a name="refersToType0Anchor">refersToType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8186<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 8187 8188Given 8189 struct X {}; 8190 template<typename T> struct A {}; 8191 A<X> a; 8192classTemplateSpecializationDecl(hasAnyTemplateArgument( 8193 refersToType(class(hasName("X"))))) 8194 matches the specialization A<X> 8195</pre></td></tr> 8196 8197 8198<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument1')"><a name="hasAnyTemplateArgument1Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 8199<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8200functionDecl that have at least one TemplateArgument matching the given 8201InnerMatcher. 8202 8203Given 8204 template<typename T> class A {}; 8205 template<> class A<double> {}; 8206 A<int> a; 8207 8208 template<typename T> f() {}; 8209 void func() { f<int>(); }; 8210 8211classTemplateSpecializationDecl(hasAnyTemplateArgument( 8212 refersToType(asString("int")))) 8213 matches the specialization A<int> 8214 8215functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 8216 matches the specialization f<int> 8217</pre></td></tr> 8218 8219 8220<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8221<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 8222matches the given matcher. 8223 8224The associated declaration is: 8225- for type nodes, the declaration of the underlying type 8226- for CallExpr, the declaration of the callee 8227- for MemberExpr, the declaration of the referenced member 8228- for CXXConstructExpr, the declaration of the constructor 8229- for CXXNewExpr, the declaration of the operator new 8230- for ObjCIvarExpr, the declaration of the ivar 8231 8232For type nodes, hasDeclaration will generally match the declaration of the 8233sugared type. Given 8234 class X {}; 8235 typedef X Y; 8236 Y y; 8237in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8238typedefDecl. A common use case is to match the underlying, desugared type. 8239This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8240 varDecl(hasType(hasUnqualifiedDesugaredType( 8241 recordType(hasDeclaration(decl()))))) 8242In this matcher, the decl will match the CXXRecordDecl of class X. 8243 8244Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 8245 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 8246 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 8247 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 8248 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 8249 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 8250 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8251</pre></td></tr> 8252 8253 8254<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('hasTemplateArgument1')"><a name="hasTemplateArgument1Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 8255<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8256functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 8257 8258Given 8259 template<typename T, typename U> class A {}; 8260 A<bool, int> b; 8261 A<int, bool> c; 8262 8263 template<typename T> void f() {} 8264 void func() { f<int>(); }; 8265classTemplateSpecializationDecl(hasTemplateArgument( 8266 1, refersToType(asString("int")))) 8267 matches the specialization A<bool, int> 8268 8269functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 8270 matches the specialization f<int> 8271</pre></td></tr> 8272 8273 8274<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>></td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8275<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 8276matches the given matcher. 8277 8278The associated declaration is: 8279- for type nodes, the declaration of the underlying type 8280- for CallExpr, the declaration of the callee 8281- for MemberExpr, the declaration of the referenced member 8282- for CXXConstructExpr, the declaration of the constructor 8283- for CXXNewExpr, the declaration of the operator new 8284- for ObjCIvarExpr, the declaration of the ivar 8285 8286For type nodes, hasDeclaration will generally match the declaration of the 8287sugared type. Given 8288 class X {}; 8289 typedef X Y; 8290 Y y; 8291in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8292typedefDecl. A common use case is to match the underlying, desugared type. 8293This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8294 varDecl(hasType(hasUnqualifiedDesugaredType( 8295 recordType(hasDeclaration(decl()))))) 8296In this matcher, the decl will match the CXXRecordDecl of class X. 8297 8298Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 8299 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 8300 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 8301 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 8302 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 8303 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 8304 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8305</pre></td></tr> 8306 8307 8308<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('loc0')"><a name="loc0Anchor">loc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8309<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 8310QualType-matcher matches. 8311</pre></td></tr> 8312 8313 8314<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>></td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8315<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 8316matcher. 8317 8318Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8319 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8320 and U (matcher = typedefDecl(hasType(asString("int"))) 8321 and friend class X (matcher = friendDecl(hasType("X")) 8322 class X {}; 8323 void y(X &x) { x; X z; } 8324 typedef int U; 8325 class Y { friend class X; }; 8326</pre></td></tr> 8327 8328 8329<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>></td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8330<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 8331matches the given matcher. 8332 8333The associated declaration is: 8334- for type nodes, the declaration of the underlying type 8335- for CallExpr, the declaration of the callee 8336- for MemberExpr, the declaration of the referenced member 8337- for CXXConstructExpr, the declaration of the constructor 8338- for CXXNewExpr, the declaration of the operator new 8339- for ObjCIvarExpr, the declaration of the ivar 8340 8341For type nodes, hasDeclaration will generally match the declaration of the 8342sugared type. Given 8343 class X {}; 8344 typedef X Y; 8345 Y y; 8346in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8347typedefDecl. A common use case is to match the underlying, desugared type. 8348This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8349 varDecl(hasType(hasUnqualifiedDesugaredType( 8350 recordType(hasDeclaration(decl()))))) 8351In this matcher, the decl will match the CXXRecordDecl of class X. 8352 8353Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 8354 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 8355 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 8356 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 8357 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 8358 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 8359 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8360</pre></td></tr> 8361 8362 8363<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('hasUnqualifiedDesugaredType0')"><a name="hasUnqualifiedDesugaredType0Anchor">hasUnqualifiedDesugaredType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>> InnerMatcher</td></tr> 8364<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 8365type of the matched node. 8366 8367For example, in: 8368 class A {}; 8369 using B = A; 8370The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 8371both B and A. 8372</pre></td></tr> 8373 8374 8375<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>></td><td class="name" onclick="toggle('hasArgumentOfType0')"><a name="hasArgumentOfType0Anchor">hasArgumentOfType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8376<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 8377 8378Given 8379 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 8380unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 8381 matches sizeof(a) and alignof(c) 8382</pre></td></tr> 8383 8384 8385<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasUnaryOperand0')"><a name="hasUnaryOperand0Anchor">hasUnaryOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8386<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 8387 8388Example matches true (matcher = hasUnaryOperand( 8389 cxxBoolLiteral(equals(true)))) 8390 !true 8391</pre></td></tr> 8392 8393 8394<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>></td><td class="name" onclick="toggle('hasObjectExpression1')"><a name="hasObjectExpression1Anchor">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8395<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 8396given matcher. Implicit object expressions are included; that is, it matches 8397use of implicit `this`. 8398 8399Given 8400 struct X { 8401 int m; 8402 int f(X x) { x.m; return m; } 8403 }; 8404memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 8405 matches `x.m`, but not `m`; however, 8406memberExpr(hasObjectExpression(hasType(pointsTo( 8407 cxxRecordDecl(hasName("X")))))) 8408 matches `m` (aka. `this->m`), but not `x.m`. 8409</pre></td></tr> 8410 8411 8412<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>></td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8413<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 8414matches the given matcher. 8415 8416The associated declaration is: 8417- for type nodes, the declaration of the underlying type 8418- for CallExpr, the declaration of the callee 8419- for MemberExpr, the declaration of the referenced member 8420- for CXXConstructExpr, the declaration of the constructor 8421- for CXXNewExpr, the declaration of the operator new 8422- for ObjCIvarExpr, the declaration of the ivar 8423 8424For type nodes, hasDeclaration will generally match the declaration of the 8425sugared type. Given 8426 class X {}; 8427 typedef X Y; 8428 Y y; 8429in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8430typedefDecl. A common use case is to match the underlying, desugared type. 8431This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8432 varDecl(hasType(hasUnqualifiedDesugaredType( 8433 recordType(hasDeclaration(decl()))))) 8434In this matcher, the decl will match the CXXRecordDecl of class X. 8435 8436Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 8437 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 8438 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 8439 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 8440 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 8441 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 8442 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8443</pre></td></tr> 8444 8445 8446<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>></td><td class="name" onclick="toggle('hasAnyUsingShadowDecl0')"><a name="hasAnyUsingShadowDecl0Anchor">hasAnyUsingShadowDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr> 8447<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 8448 8449Given 8450 namespace X { void b(); } 8451 using X::b; 8452usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 8453 matches using X::b </pre></td></tr> 8454 8455 8456<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>></td><td class="name" onclick="toggle('hasTargetDecl0')"><a name="hasTargetDecl0Anchor">hasTargetDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> InnerMatcher</td></tr> 8457<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 8458matched by the given matcher. 8459 8460Given 8461 namespace X { int a; void b(); } 8462 using X::a; 8463 using X::b; 8464usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 8465 matches using X::b but not using X::a </pre></td></tr> 8466 8467 8468<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>></td><td class="name" onclick="toggle('hasType6')"><a name="hasType6Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8469<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 8470declaration's type. 8471 8472In case of a value declaration (for example a variable declaration), 8473this resolves one layer of indirection. For example, in the value 8474declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 8475X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 8476declaration of x. 8477 8478Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8479 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8480 and friend class X (matcher = friendDecl(hasType("X")) 8481 class X {}; 8482 void y(X &x) { x; X z; } 8483 class Y { friend class X; }; 8484 8485Example matches class Derived 8486(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 8487class Base {}; 8488class Derived : Base {}; 8489 8490Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>, 8491Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 8492</pre></td></tr> 8493 8494 8495<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>></td><td class="name" onclick="toggle('hasType3')"><a name="hasType3Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8496<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 8497matcher. 8498 8499Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8500 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8501 and U (matcher = typedefDecl(hasType(asString("int"))) 8502 and friend class X (matcher = friendDecl(hasType("X")) 8503 class X {}; 8504 void y(X &x) { x; X z; } 8505 typedef int U; 8506 class Y { friend class X; }; 8507</pre></td></tr> 8508 8509 8510<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasInitializer0')"><a name="hasInitializer0Anchor">hasInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8511<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 8512that matches the given matcher. 8513 8514Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 8515 bool y() { return true; } 8516 bool x = y(); 8517</pre></td></tr> 8518 8519 8520<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>></td><td class="name" onclick="toggle('hasSizeExpr0')"><a name="hasSizeExpr0Anchor">hasSizeExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8521<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 8522expression. 8523 8524Given 8525 void f(int b) { 8526 int a[b]; 8527 } 8528variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 8529 varDecl(hasName("b"))))))) 8530 matches "int a[b]" 8531</pre></td></tr> 8532 8533 8534<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>></td><td class="name" onclick="toggle('hasBody2')"><a name="hasBody2Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 8535<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr> 8536 8537 8538<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>></td><td class="name" onclick="toggle('hasCondition2')"><a name="hasCondition2Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8539<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 8540switch statement or conditional operator. 8541 8542Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8543 if (true) {} 8544</pre></td></tr> 8545 8546<!--END_TRAVERSAL_MATCHERS --> 8547</table> 8548 8549</div> 8550</body> 8551</html> 8552 8553 8554