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 502 503 504 505 506<tr> 507 <td>Rewritten binary operators 508<pre> 509binaryOperator( 510 hasOperatorName("<"), 511 hasRHS(hasDescendant(integerLiteral(equals(0)))) 512 ) 513</pre> 514given: 515<pre> 516#include <compare> 517 518class HasSpaceship { 519public: 520 int x; 521 bool operator==(const HasSpaceship&) const = default; 522 std::strong_ordering operator<=>(const HasSpaceship&) const = default; 523}; 524 525bool isLess(const HasSpaceship& a, const HasSpaceship& b) { 526 return a < b; 527} 528</pre> 529</td> 530<td> 5311 match found. 532 533<pre> 534 return a < b; 535 ^~~~~ 536</pre> 537 538</td> 539<td> 540No match found. 541</td> 542</tr> 543</table> 544 545<!-- ======================================================================= --> 546<h2 id="decl-matchers">Node Matchers</h2> 547<!-- ======================================================================= --> 548 549<p>Node matchers are at the core of matcher expressions - they specify the type 550of node that is expected. Every match expression starts with a node matcher, 551which can then be further refined with a narrowing or traversal matcher. All 552traversal matchers take node matchers as their arguments.</p> 553 554<p>For convenience, all node matchers take an arbitrary number of arguments 555and implicitly act as allOf matchers.</p> 556 557<p>Node matchers are the only matchers that support the bind("id") call to 558bind the matched node to the given string, to be later retrieved from the 559match callback.</p> 560 561<p>It is important to remember that the arguments to node matchers are 562predicates on the same node, just with additional information about the type. 563This is often useful to make matcher expression more readable by inlining bind 564calls into redundant node matchers inside another node matcher: 565<pre> 566// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on 567// the same node. 568recordDecl(decl().bind("id"), hasName("::MyClass")) 569</pre> 570</p> 571 572<table> 573<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 574<!-- START_DECL_MATCHERS --> 575 576<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('cxxBaseSpecifier0')"><a name="cxxBaseSpecifier0Anchor">cxxBaseSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>...</td></tr> 577<tr><td colspan="4" class="doc" id="cxxBaseSpecifier0"><pre>Matches class bases. 578 579Examples matches public virtual B. 580 class B {}; 581 class C : public virtual B {}; 582</pre></td></tr> 583 584 585<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> 586<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers. 587 588Examples matches i(42). 589 class C { 590 C() : i(42) {} 591 int i; 592 }; 593</pre></td></tr> 594 595 596<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> 597<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations. 598 599Given 600 class C { 601 public: 602 int a; 603 }; 604accessSpecDecl() 605 matches 'public:' 606</pre></td></tr> 607 608 609<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('bindingDecl0')"><a name="bindingDecl0Anchor">bindingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>>...</td></tr> 610<tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations 611Example matches foo and bar 612(matcher = bindingDecl() 613 614 auto [foo, bar] = std::make_pair{42, 42}; 615</pre></td></tr> 616 617 618<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> 619<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations. 620 621Example matches the declaration of the nameless block printing an input 622integer. 623 624 myFunc(^(int p) { 625 printf("%d", p); 626 }) 627</pre></td></tr> 628 629 630<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> 631<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations. 632 633Example matches Z 634 template<class T> class Z {}; 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('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>>...</td></tr> 639<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations. 640 641Given 642 template<class T1, class T2, int I> 643 class A {}; 644 645 template<class T, int I> 646 class A<T, T*, I> {}; 647 648 template<> 649 class A<int, int, 1> {}; 650classTemplatePartialSpecializationDecl() 651 matches the specialization A<T,T*,I> but not A<int,int,1> 652</pre></td></tr> 653 654 655<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> 656<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations. 657 658Given 659 template<typename T> class A {}; 660 template<> class A<double> {}; 661 A<int> a; 662classTemplateSpecializationDecl() 663 matches the specializations A<int> and A<double> 664</pre></td></tr> 665 666 667<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> 668<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. 669 670Example matches Foo::Foo() and Foo::Foo(int) 671 class Foo { 672 public: 673 Foo(); 674 Foo(int); 675 int DoSomething(); 676 }; 677</pre></td></tr> 678 679 680<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> 681<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations. 682 683Example matches the operator. 684 class X { operator int() const; }; 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('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>>...</td></tr> 689<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide. 690 691Example matches the deduction guide. 692 template<typename T> 693 class X { X(int) }; 694 X(int) -> X<int>; 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('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>>...</td></tr> 699<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations. 700 701Example matches Foo::~Foo() 702 class Foo { 703 public: 704 virtual ~Foo(); 705 }; 706</pre></td></tr> 707 708 709<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> 710<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations. 711 712Example matches y 713 class X { void y(); }; 714</pre></td></tr> 715 716 717<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> 718<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations. 719 720Example matches X, Z 721 class X; 722 template<class T> class Z {}; 723</pre></td></tr> 724 725 726<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> 727<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 728 729Examples matches X, C, and the friend declaration inside C; 730 void X(); 731 class C { 732 friend X; 733 }; 734</pre></td></tr> 735 736 737<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> 738<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 739and non-type template parameter declarations). 740 741Given 742 class X { int y; }; 743declaratorDecl() 744 matches int y. 745</pre></td></tr> 746 747 748<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</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> 749<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations. 750 751Examples matches the declaration node with foo and bar, but not 752number. 753(matcher = declStmt(has(decompositionDecl()))) 754 755 int number = 42; 756 auto [foo, bar] = std::make_pair{42, 42}; 757</pre></td></tr> 758 759 760<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> 761<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 762 763Example matches A, B, C 764 enum X { 765 A, B, C 766 }; 767</pre></td></tr> 768 769 770<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> 771<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 772 773Example matches X 774 enum X { 775 A, B, C 776 }; 777</pre></td></tr> 778 779 780<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> 781<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 782 783Given 784 class X { int m; }; 785fieldDecl() 786 matches 'm'. 787</pre></td></tr> 788 789 790<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> 791<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 792 793Given 794 class X { friend void foo(); }; 795friendDecl() 796 matches 'friend void foo()'. 797</pre></td></tr> 798 799 800<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> 801<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 802 803Example matches f 804 void f(); 805</pre></td></tr> 806 807 808<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> 809<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 810 811Example matches f 812 template<class T> void f(T t) {} 813</pre></td></tr> 814 815 816<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> 817<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations. 818 819Given 820 struct X { struct { int a; }; }; 821indirectFieldDecl() 822 matches 'a'. 823</pre></td></tr> 824 825 826<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> 827<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label. 828 829Given 830 goto FOO; 831 FOO: bar(); 832labelDecl() 833 matches 'FOO:' 834</pre></td></tr> 835 836 837<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> 838<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification. 839 840Given 841 extern "C" {} 842linkageSpecDecl() 843 matches "extern "C" {}" 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('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>>...</td></tr> 848<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 849 850Example matches X, S, the anonymous union type, i, and U; 851 typedef int X; 852 struct S { 853 union { 854 int i; 855 } U; 856 }; 857</pre></td></tr> 858 859 860<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> 861<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias. 862 863Given 864 namespace test {} 865 namespace alias = ::test; 866namespaceAliasDecl() 867 matches "namespace alias" but not "namespace test" 868</pre></td></tr> 869 870 871<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> 872<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 873 874Given 875 namespace {} 876 namespace test {} 877namespaceDecl() 878 matches "namespace {}" and "namespace test {}" 879</pre></td></tr> 880 881 882<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> 883<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations. 884 885Given 886 template <typename T, int N> struct C {}; 887nonTypeTemplateParmDecl() 888 matches 'N', but not 'T'. 889</pre></td></tr> 890 891 892<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> 893<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations. 894 895Example matches Foo (Additions) 896 @interface Foo (Additions) 897 @end 898</pre></td></tr> 899 900 901<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> 902<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions. 903 904Example matches Foo (Additions) 905 @implementation Foo (Additions) 906 @end 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('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>>...</td></tr> 911<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations. 912 913Example matches Foo 914 @implementation Foo 915 @end 916</pre></td></tr> 917 918 919<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> 920<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 921 922Example matches Foo 923 @interface Foo 924 @end 925</pre></td></tr> 926 927 928<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> 929<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations. 930 931Example matches _enabled 932 @implementation Foo { 933 BOOL _enabled; 934 } 935 @end 936</pre></td></tr> 937 938 939<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> 940<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations. 941 942Example matches both declaration and definition of -[Foo method] 943 @interface Foo 944 - (void)method; 945 @end 946 947 @implementation Foo 948 - (void)method {} 949 @end 950</pre></td></tr> 951 952 953<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> 954<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations. 955 956Example matches enabled 957 @interface Foo 958 @property BOOL enabled; 959 @end 960</pre></td></tr> 961 962 963<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> 964<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations. 965 966Example matches FooDelegate 967 @protocol FooDelegate 968 @end 969</pre></td></tr> 970 971 972<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> 973<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 974 975Given 976 void f(int x); 977parmVarDecl() 978 matches int x. 979</pre></td></tr> 980 981 982<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> 983<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 984 985Example matches X, Z, U, and S 986 class X; 987 template<class T> class Z {}; 988 struct S {}; 989 union U {}; 990</pre></td></tr> 991 992 993<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> 994<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 995 996Example: 997 staticAssertExpr() 998matches 999 static_assert(sizeof(S) == sizeof(int)) 1000in 1001 struct S { 1002 int x; 1003 }; 1004 static_assert(sizeof(S) == sizeof(int)); 1005</pre></td></tr> 1006 1007 1008<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> 1009<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations. 1010 1011Example matches X, Z, U, S, E 1012 class X; 1013 template<class T> class Z {}; 1014 struct S {}; 1015 union U {}; 1016 enum E { 1017 A, B, C 1018 }; 1019</pre></td></tr> 1020 1021 1022<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> 1023<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations. 1024 1025Given 1026 template <template <typename> class Z, int N> struct C {}; 1027templateTypeParmDecl() 1028 matches 'Z', but not 'N'. 1029</pre></td></tr> 1030 1031 1032<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> 1033<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 1034 1035Given 1036 template <typename T, int N> struct C {}; 1037templateTypeParmDecl() 1038 matches 'T', but not 'N'. 1039</pre></td></tr> 1040 1041 1042<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> 1043<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 1044 1045Given 1046 int X; 1047 namespace NS { 1048 int Y; 1049 } // namespace NS 1050decl(hasDeclContext(translationUnitDecl())) 1051 matches "int X", but not "int Y". 1052</pre></td></tr> 1053 1054 1055<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> 1056<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations. 1057 1058Given 1059 typedef int X; 1060 using Y = int; 1061typeAliasDecl() 1062 matches "using Y = int", but not "typedef int X" 1063</pre></td></tr> 1064 1065 1066<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> 1067<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations. 1068 1069typeAliasTemplateDecl() matches 1070 template <typename T> 1071 using Y = X<T>; 1072</pre></td></tr> 1073 1074 1075<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> 1076<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 1077 1078Given 1079 typedef int X; 1080 using Y = int; 1081typedefDecl() 1082 matches "typedef int X", but not "using Y = int" 1083</pre></td></tr> 1084 1085 1086<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> 1087<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations. 1088 1089Given 1090 typedef int X; 1091 using Y = int; 1092typedefNameDecl() 1093 matches "typedef int X" and "using Y = int" 1094</pre></td></tr> 1095 1096 1097<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> 1098<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 1099typename. 1100 1101Given 1102 template <typename T> 1103 struct Base { typedef T Foo; }; 1104 1105 template<typename T> 1106 struct S : private Base<T> { 1107 using typename Base<T>::Foo; 1108 }; 1109unresolvedUsingTypenameDecl() 1110 matches using Base<T>::Foo </pre></td></tr> 1111 1112 1113<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> 1114<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 1115 1116Given 1117 template<typename X> 1118 class C : private X { 1119 using X::x; 1120 }; 1121unresolvedUsingValueDecl() 1122 matches using X::x </pre></td></tr> 1123 1124 1125<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> 1126<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 1127 1128Given 1129 namespace X { int x; } 1130 using X::x; 1131usingDecl() 1132 matches using X::x </pre></td></tr> 1133 1134 1135<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> 1136<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 1137 1138Given 1139 namespace X { int x; } 1140 using namespace X; 1141usingDirectiveDecl() 1142 matches using namespace X </pre></td></tr> 1143 1144 1145<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> 1146<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 1147 1148Example matches A, B, C and F 1149 enum X { A, B, C }; 1150 void F(); 1151</pre></td></tr> 1152 1153 1154<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> 1155<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 1156 1157Note: this does not match declarations of member variables, which are 1158"field" declarations in Clang parlance. 1159 1160Example matches a 1161 int a; 1162</pre></td></tr> 1163 1164 1165<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> 1166<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 1167</pre></td></tr> 1168 1169 1170<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> 1171<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 1172 1173Given 1174 namespace ns { 1175 struct A { static void f(); }; 1176 void A::f() {} 1177 void g() { A::f(); } 1178 } 1179 ns::A a; 1180nestedNameSpecifier() 1181 matches "ns::" and both "A::" 1182</pre></td></tr> 1183 1184 1185<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> 1186<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause. 1187 1188Given 1189 1190 #pragma omp parallel default(none) 1191 #pragma omp parallel default(shared) 1192 #pragma omp parallel default(firstprivate) 1193 #pragma omp parallel 1194 1195``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and 1196``default(firstprivate)`` 1197</pre></td></tr> 1198 1199 1200<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> 1201<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 1202</pre></td></tr> 1203 1204 1205<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>...</td></tr> 1206<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension). 1207 1208Given 1209 FOO: bar(); 1210 void *ptr = &&FOO; 1211 goto *bar; 1212addrLabelExpr() 1213 matches '&&FOO' 1214</pre></td></tr> 1215 1216 1217<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>>...</td></tr> 1218<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 1219 1220Given 1221 int i = a[1]; 1222arraySubscriptExpr() 1223 matches "a[1]" 1224</pre></td></tr> 1225 1226 1227<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> 1228<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 1229 1230 int i = 100; 1231 __asm("mov al, 2"); 1232asmStmt() 1233 matches '__asm("mov al, 2")' 1234</pre></td></tr> 1235 1236 1237<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> 1238<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins. 1239Example matches __atomic_load_n(ptr, 1) 1240 void foo() { int *ptr; __atomic_load_n(ptr, 1); } 1241</pre></td></tr> 1242 1243 1244<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>>...</td></tr> 1245<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement. 1246 1247Given 1248 @autoreleasepool { 1249 int x = 0; 1250 } 1251autoreleasePoolStmt(stmt()) matches the declaration of "x" 1252inside the autorelease pool. 1253</pre></td></tr> 1254 1255 1256<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> 1257<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension). 1258 1259Example matches a ?: b 1260 (a ?: b) + 42; 1261</pre></td></tr> 1262 1263 1264<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> 1265<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 1266 1267Example matches a || b 1268 !(a || b) 1269See also the binaryOperation() matcher for more-general matching. 1270</pre></td></tr> 1271 1272 1273<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> 1274<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block. 1275 1276Example: matches "^{}": 1277 void f() { ^{}(); } 1278</pre></td></tr> 1279 1280 1281<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>>...</td></tr> 1282<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 1283 1284Given 1285 while (true) { break; } 1286breakStmt() 1287 matches 'break' 1288</pre></td></tr> 1289 1290 1291<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> 1292<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 1293 1294Example: Matches (int) 2.2f in 1295 int i = (int) 2.2f; 1296</pre></td></tr> 1297 1298 1299<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> 1300<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 1301 1302Example matches x.y() and y() 1303 X x; 1304 x.y(); 1305 y(); 1306</pre></td></tr> 1307 1308 1309<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> 1310<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 1311 1312Given 1313 switch(a) { case 42: break; default: break; } 1314caseStmt() 1315 matches 'case 42:'. 1316</pre></td></tr> 1317 1318 1319<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> 1320<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 1321 1322Example: castExpr() matches each of the following: 1323 (int) 3; 1324 const_cast<Expr *>(SubExpr); 1325 char c = 0; 1326but does not match 1327 int i = (0); 1328 int k = 0; 1329</pre></td></tr> 1330 1331 1332<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> 1333<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 1334 1335Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 1336though. 1337 1338Example matches 'a', L'a' 1339 char ch = 'a'; 1340 wchar_t chw = L'a'; 1341</pre></td></tr> 1342 1343 1344<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>>...</td></tr> 1345<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr. 1346</pre></td></tr> 1347 1348 1349<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('coawaitExpr0')"><a name="coawaitExpr0Anchor">coawaitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoawaitExpr.html">CoawaitExpr</a>>...</td></tr> 1350<tr><td colspan="4" class="doc" id="coawaitExpr0"><pre>Matches co_await expressions. 1351 1352Given 1353 co_await 1; 1354coawaitExpr() 1355 matches 'co_await 1' 1356</pre></td></tr> 1357 1358 1359<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> 1360<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 1361 1362Example match: {1}, (1, 2) 1363 int array[4] = {1}; 1364 vector int myvec = (vector int)(1, 2); 1365</pre></td></tr> 1366 1367 1368<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> 1369<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 1370 1371Example matches '{}' and '{{}}' in 'for (;;) {{}}' 1372 for (;;) {{}} 1373</pre></td></tr> 1374 1375 1376<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> 1377<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 1378 1379Example matches a ? b : c 1380 (a ? b : c) + 42 1381</pre></td></tr> 1382 1383 1384<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> 1385<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper. 1386 1387Example matches the constant in the case statement: 1388 (matcher = constantExpr()) 1389 switch (a) { 1390 case 37: break; 1391 } 1392</pre></td></tr> 1393 1394 1395<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> 1396<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 1397 1398Given 1399 while (true) { continue; } 1400continueStmt() 1401 matches 'continue' 1402</pre></td></tr> 1403 1404 1405<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('coreturnStmt0')"><a name="coreturnStmt0Anchor">coreturnStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoreturnStmt.html">CoreturnStmt</a>>...</td></tr> 1406<tr><td colspan="4" class="doc" id="coreturnStmt0"><pre>Matches co_return statements. 1407 1408Given 1409 while (true) { co_return; } 1410coreturnStmt() 1411 matches 'co_return' 1412</pre></td></tr> 1413 1414 1415<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('coyieldExpr0')"><a name="coyieldExpr0Anchor">coyieldExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoyieldExpr.html">CoyieldExpr</a>>...</td></tr> 1416<tr><td colspan="4" class="doc" id="coyieldExpr0"><pre>Matches co_yield expressions. 1417 1418Given 1419 co_yield 1; 1420coyieldExpr() 1421 matches 'co_yield 1' 1422</pre></td></tr> 1423 1424 1425<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> 1426<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 1427 1428Example matches, 1429 kernel<<<i,j>>>(); 1430</pre></td></tr> 1431 1432 1433<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> 1434<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 1435 1436Example matches FunctionTakesString(GetStringByValue()) 1437 (matcher = cxxBindTemporaryExpr()) 1438 FunctionTakesString(GetStringByValue()); 1439 FunctionTakesStringByPointer(GetStringPointer()); 1440</pre></td></tr> 1441 1442 1443<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>...</td></tr> 1444<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 1445 1446Example matches true 1447 true 1448</pre></td></tr> 1449 1450 1451<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> 1452<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 1453 1454 try {} catch(int i) {} 1455cxxCatchStmt() 1456 matches 'catch(int i)' 1457</pre></td></tr> 1458 1459 1460<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> 1461<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 1462 1463Example: Matches const_cast<int*>(&r) in 1464 int n = 42; 1465 const int &r(n); 1466 int* p = const_cast<int*>(&r); 1467</pre></td></tr> 1468 1469 1470<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> 1471<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 1472 1473Example matches string(ptr, n) and ptr within arguments of f 1474 (matcher = cxxConstructExpr()) 1475 void f(const string &a, const string &b); 1476 char *ptr; 1477 int n; 1478 f(string(ptr, n), ptr); 1479</pre></td></tr> 1480 1481 1482<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> 1483<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 1484 1485Example matches the CXXDefaultArgExpr placeholder inserted for the 1486 default value of the second parameter in the call expression f(42) 1487 (matcher = cxxDefaultArgExpr()) 1488 void f(int x, int y = 0); 1489 f(42); 1490</pre></td></tr> 1491 1492 1493<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> 1494<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 1495 1496Given 1497 delete X; 1498cxxDeleteExpr() 1499 matches 'delete X'. 1500</pre></td></tr> 1501 1502 1503<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> 1504<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be 1505resolved because the base expression or the member name was dependent. 1506 1507Given 1508 template <class T> void f() { T t; t.g(); } 1509cxxDependentScopeMemberExpr() 1510 matches t.g 1511</pre></td></tr> 1512 1513 1514<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> 1515<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 1516 1517Example: 1518 cxxDynamicCastExpr() 1519matches 1520 dynamic_cast<D*>(&b); 1521in 1522 struct B { virtual ~B() {} }; struct D : B {}; 1523 B b; 1524 D* p = dynamic_cast<D*>(&b); 1525</pre></td></tr> 1526 1527 1528<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> 1529<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 1530 1531cxxForRangeStmt() matches 'for (auto a : i)' 1532 int i[] = {1, 2, 3}; for (auto a : i); 1533 for(int j = 0; j < 5; ++j); 1534</pre></td></tr> 1535 1536 1537<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>...</td></tr> 1538<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 1539 1540Example: Matches Foo(bar); 1541 Foo f = bar; 1542 Foo g = (Foo) bar; 1543 Foo h = Foo(bar); 1544</pre></td></tr> 1545 1546 1547<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr> 1548<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 1549 1550Example matches x.y() 1551 X x; 1552 x.y(); 1553</pre></td></tr> 1554 1555 1556<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>...</td></tr> 1557<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 1558 1559Given 1560 new X; 1561cxxNewExpr() 1562 matches 'new X'. 1563</pre></td></tr> 1564 1565 1566<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>>...</td></tr> 1567<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions. 1568 1569Given 1570 bool a() noexcept; 1571 bool b() noexcept(true); 1572 bool c() noexcept(false); 1573 bool d() noexcept(noexcept(a())); 1574 bool e = noexcept(b()) || noexcept(c()); 1575cxxNoexceptExpr() 1576 matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`. 1577 doesn't match the noexcept specifier in the declarations a, b, c or d. 1578</pre></td></tr> 1579 1580 1581<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> 1582<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 1583</pre></td></tr> 1584 1585 1586<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr> 1587<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 1588 1589Note that if an operator isn't overloaded, it won't match. Instead, use 1590binaryOperator matcher. 1591Currently it does not match operators such as new delete. 1592FIXME: figure out why these do not match? 1593 1594Example matches both operator<<((o << b), c) and operator<<(o, b) 1595 (matcher = cxxOperatorCallExpr()) 1596 ostream &operator<< (ostream &out, int i) { }; 1597 ostream &o; int b = 1, c = 1; 1598 o << b << c; 1599See also the binaryOperation() matcher for more-general matching of binary 1600uses of this AST node. 1601</pre></td></tr> 1602 1603 1604<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> 1605<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 1606 1607Either the source expression or the destination type can be matched 1608using has(), but hasDestinationType() is more specific and can be 1609more readable. 1610 1611Example matches reinterpret_cast<char*>(&p) in 1612 void* p = reinterpret_cast<char*>(&p); 1613</pre></td></tr> 1614 1615 1616<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxRewrittenBinaryOperator0')"><a name="cxxRewrittenBinaryOperator0Anchor">cxxRewrittenBinaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>>...</td></tr> 1617<tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators 1618 1619Example matches use of "<": 1620 #include <compare> 1621 struct HasSpaceshipMem { 1622 int a; 1623 constexpr auto operator<=>(const HasSpaceshipMem&) const = default; 1624 }; 1625 void compare() { 1626 HasSpaceshipMem hs1, hs2; 1627 if (hs1 < hs2) 1628 return; 1629 } 1630See also the binaryOperation() matcher for more-general matching 1631of this AST node. 1632</pre></td></tr> 1633 1634 1635<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> 1636<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 1637 1638See also: hasDestinationType 1639See also: reinterpretCast 1640 1641Example: 1642 cxxStaticCastExpr() 1643matches 1644 static_cast<long>(8) 1645in 1646 long eight(static_cast<long>(8)); 1647</pre></td></tr> 1648 1649 1650<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> 1651<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions. 1652 1653Given 1654 std::vector<int> a({ 1, 2, 3 }); 1655 std::vector<int> b = { 4, 5 }; 1656 int c[] = { 6, 7 }; 1657 std::pair<int, int> d = { 8, 9 }; 1658cxxStdInitializerListExpr() 1659 matches "{ 1, 2, 3 }" and "{ 4, 5 }" 1660</pre></td></tr> 1661 1662 1663<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> 1664<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 1665 1666Example: Matches Foo(bar, bar) 1667 Foo h = Foo(bar, bar); 1668</pre></td></tr> 1669 1670 1671<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> 1672<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 1673 1674Example matches the implicit this expression in "return i". 1675 (matcher = cxxThisExpr()) 1676struct foo { 1677 int i; 1678 int f() { return i; } 1679}; 1680</pre></td></tr> 1681 1682 1683<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> 1684<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 1685 1686 try { throw 5; } catch(int i) {} 1687cxxThrowExpr() 1688 matches 'throw 5' 1689</pre></td></tr> 1690 1691 1692<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> 1693<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 1694 1695 try {} catch(int i) {} 1696cxxTryStmt() 1697 matches 'try {}' 1698</pre></td></tr> 1699 1700 1701<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> 1702<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 1703 1704Example matches T(t) in return statement of f 1705 (matcher = cxxUnresolvedConstructExpr()) 1706 template <typename T> 1707 void f(const T& t) { return T(t); } 1708</pre></td></tr> 1709 1710 1711<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> 1712<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 1713 1714Example matches x in if (x) 1715 bool x; 1716 if (x) {} 1717</pre></td></tr> 1718 1719 1720<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> 1721<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 1722 1723Given 1724 int a; 1725declStmt() 1726 matches 'int a'. 1727</pre></td></tr> 1728 1729 1730<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> 1731<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 1732 1733Given 1734 switch(a) { case 42: break; default: break; } 1735defaultStmt() 1736 matches 'default:'. 1737</pre></td></tr> 1738 1739 1740<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('dependentCoawaitExpr0')"><a name="dependentCoawaitExpr0Anchor">dependentCoawaitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentCoawaitExpr.html">DependentCoawaitExpr</a>>...</td></tr> 1741<tr><td colspan="4" class="doc" id="dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent 1742</pre></td></tr> 1743 1744 1745<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> 1746<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8]. 1747 1748Example: Matches { [2].y = 1.0, [0].x = 1.0 } 1749 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 1750</pre></td></tr> 1751 1752 1753<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> 1754<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 1755 1756Given 1757 do {} while (true); 1758doStmt() 1759 matches 'do {} while(true)' 1760</pre></td></tr> 1761 1762 1763<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> 1764<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 1765 1766Matches any cast expression written in user code, whether it be a 1767C-style cast, a functional-style cast, or a keyword cast. 1768 1769Does not match implicit conversions. 1770 1771Note: the name "explicitCast" is chosen to match Clang's terminology, as 1772Clang uses the term "cast" to apply to implicit conversions as well as to 1773actual cast expressions. 1774 1775See also: hasDestinationType. 1776 1777Example: matches all five of the casts in 1778 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 1779but does not match the implicit conversion in 1780 long ell = 42; 1781</pre></td></tr> 1782 1783 1784<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> 1785<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 1786 1787Example matches x() 1788 void f() { x(); } 1789</pre></td></tr> 1790 1791 1792<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> 1793<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 1794of the sub-expression's evaluation. 1795 1796Example matches std::string() 1797 const std::string str = std::string(); 1798</pre></td></tr> 1799 1800 1801<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> 1802<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals 1803</pre></td></tr> 1804 1805 1806<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> 1807<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g. 18081.0, 1.0f, 1.0L and 1e10. 1809 1810Does not match implicit conversions such as 1811 float a = 10; 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('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>>...</td></tr> 1816<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 1817 1818Example matches 'for (;;) {}' 1819 for (;;) {} 1820 int i[] = {1, 2, 3}; for (auto a : i); 1821</pre></td></tr> 1822 1823 1824<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> 1825<tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression. 1826</pre></td></tr> 1827 1828 1829<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> 1830<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 1831</pre></td></tr> 1832 1833 1834<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> 1835<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 1836 1837Given 1838 goto FOO; 1839 FOO: bar(); 1840gotoStmt() 1841 matches 'goto FOO' 1842</pre></td></tr> 1843 1844 1845<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> 1846<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 1847 1848Example matches 'if (x) {}' 1849 if (x) {} 1850</pre></td></tr> 1851 1852 1853<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> 1854<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating 1855point literals e.g.: 1i, 1.0i 1856</pre></td></tr> 1857 1858 1859<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> 1860<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 1861 1862This matches many different places, including function call return value 1863eliding, as well as any type conversions. 1864</pre></td></tr> 1865 1866 1867<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> 1868<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions. 1869 1870Given 1871 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 1872implicitValueInitExpr() 1873 matches "[0].y" (implicitly) 1874</pre></td></tr> 1875 1876 1877<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> 1878<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 1879 1880Given 1881 int a[] = { 1, 2 }; 1882 struct B { int x, y; }; 1883 B b = { 5, 6 }; 1884initListExpr() 1885 matches "{ 1, 2 }" and "{ 5, 6 }" 1886</pre></td></tr> 1887 1888 1889<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> 1890<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g. 18911, 1L, 0x1 and 1U. 1892 1893Does not match character-encoded integers such as L'a'. 1894</pre></td></tr> 1895 1896 1897<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> 1898<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 1899 1900Given 1901 goto FOO; 1902 FOO: bar(); 1903labelStmt() 1904 matches 'FOO:' 1905</pre></td></tr> 1906 1907 1908<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> 1909<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1910 1911Example matches [&](){return 5;} 1912 [&](){return 5;} 1913</pre></td></tr> 1914 1915 1916<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> 1917<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1918 1919Example: Given 1920 struct T {void func();}; 1921 T f(); 1922 void g(T); 1923materializeTemporaryExpr() matches 'f()' in these statements 1924 T u(f()); 1925 g(f()); 1926 f().func(); 1927but does not match 1928 f(); 1929</pre></td></tr> 1930 1931 1932<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> 1933<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1934 1935Given 1936 class Y { 1937 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1938 int a; static int b; 1939 }; 1940memberExpr() 1941 matches this->x, x, y.x, a, this->b 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('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>>...</td></tr> 1946<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1947 1948 foo();; 1949nullStmt() 1950 matches the second ';' 1951</pre></td></tr> 1952 1953 1954<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> 1955<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements. 1956 1957Example matches @catch 1958 @try {} 1959 @catch (...) {} 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('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>>...</td></tr> 1964<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements. 1965 1966Example matches @finally 1967 @try {} 1968 @finally {} 1969</pre></td></tr> 1970 1971 1972<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> 1973<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar. 1974 1975Example: matches "a" in "init" method: 1976@implementation A { 1977 NSString *a; 1978} 1979- (void) init { 1980 a = @"hello"; 1981} 1982</pre></td></tr> 1983 1984 1985<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> 1986<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 1987 1988The innermost message send invokes the "alloc" class method on the 1989NSString class, while the outermost message send invokes the 1990"initWithString" instance method on the object returned from 1991NSString's "alloc". This matcher should match both message sends. 1992 [[NSString alloc] initWithString:@"Hello"] 1993</pre></td></tr> 1994 1995 1996<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> 1997<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements. 1998 1999Example matches @throw obj; 2000</pre></td></tr> 2001 2002 2003<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> 2004<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements. 2005 2006Example matches @try 2007 @try {} 2008 @catch (...) {} 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('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>>...</td></tr> 2013<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive. 2014 2015Given 2016 2017 #pragma omp parallel 2018 #pragma omp parallel default(none) 2019 #pragma omp taskyield 2020 2021``ompExecutableDirective()`` matches ``omp parallel``, 2022``omp parallel default(none)`` and ``omp taskyield``. 2023</pre></td></tr> 2024 2025 2026<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> 2027<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers 2028to reference another expressions and can be met 2029in BinaryConditionalOperators, for example. 2030 2031Example matches 'a' 2032 (a ?: c) + 42; 2033</pre></td></tr> 2034 2035 2036<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> 2037<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions. 2038 2039Example matches (foo() + 1) 2040 int foo() { return 1; } 2041 int a = (foo() + 1); 2042</pre></td></tr> 2043 2044 2045<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> 2046<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions. 2047ParenListExprs don't have a predefined type and are used for late parsing. 2048In the final AST, they can be met in template declarations. 2049 2050Given 2051 template<typename T> class X { 2052 void f() { 2053 X x(*this); 2054 int a = 0, b = 1; int i = (a, b); 2055 } 2056 }; 2057parenListExpr() matches "*this" but NOT matches (a, b) because (a, b) 2058has a predefined type and is a ParenExpr, not a ParenListExpr. 2059</pre></td></tr> 2060 2061 2062<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> 2063<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2]. 2064 2065Example: Matches __func__ 2066 printf("%s", __func__); 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('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>>...</td></tr> 2071<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 2072 2073Given 2074 return 1; 2075returnStmt() 2076 matches 'return 1' 2077</pre></td></tr> 2078 2079 2080<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> 2081<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 2082 2083Given 2084 { ++a; } 2085stmt() 2086 matches both the compound statement '{ ++a; }' and '++a'. 2087</pre></td></tr> 2088 2089 2090<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> 2091<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension). 2092 2093Example match: ({ int X = 4; X; }) 2094 int C = ({ int X = 4; X; }); 2095</pre></td></tr> 2096 2097 2098<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> 2099<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 2100 2101Example matches "abcd", L"abcd" 2102 char *s = "abcd"; 2103 wchar_t *ws = L"abcd"; 2104</pre></td></tr> 2105 2106 2107<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> 2108<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 2109 2110Given 2111 template <int N> 2112 struct A { static const int n = N; }; 2113 struct B : public A<42> {}; 2114substNonTypeTemplateParmExpr() 2115 matches "N" in the right-hand side of "static const int n = N;" 2116</pre></td></tr> 2117 2118 2119<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> 2120<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 2121 2122Given 2123 switch(a) { case 42: break; default: break; } 2124switchCase() 2125 matches 'case 42:' and 'default:'. 2126</pre></td></tr> 2127 2128 2129<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> 2130<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 2131 2132Given 2133 switch(a) { case 42: break; default: break; } 2134switchStmt() 2135 matches 'switch(a)'. 2136</pre></td></tr> 2137 2138 2139<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> 2140<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 2141 2142Given 2143 Foo x = bar; 2144 int y = sizeof(x) + alignof(x); 2145unaryExprOrTypeTraitExpr() 2146 matches sizeof(x) and alignof(x) 2147</pre></td></tr> 2148 2149 2150<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> 2151<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 2152 2153Example matches !a 2154 !a || b 2155</pre></td></tr> 2156 2157 2158<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> 2159<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing 2160but could not be resolved to a specific declaration. 2161 2162Given 2163 template<typename T> 2164 T foo() { T a; return a; } 2165 template<typename T> 2166 void bar() { 2167 foo<T>(); 2168 } 2169unresolvedLookupExpr() 2170 matches foo<T>() </pre></td></tr> 2171 2172 2173<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> 2174<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions. 2175 2176Given 2177 struct X { 2178 template <class T> void f(); 2179 void g(); 2180 }; 2181 template <class T> void h() { X x; x.f<T>(); x.g(); } 2182unresolvedMemberExpr() 2183 matches x.f<T> 2184</pre></td></tr> 2185 2186 2187<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> 2188<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 2189 2190Example match: "foo"_suffix 2191</pre></td></tr> 2192 2193 2194<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> 2195<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 2196 2197Given 2198 while (true) {} 2199whileStmt() 2200 matches 'while (true) {}'. 2201</pre></td></tr> 2202 2203 2204<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> 2205<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info). 2206 2207Given 2208 template <typename T> struct C {}; 2209 C<int> c; 2210templateArgumentLoc() 2211 matches 'int' in C<int>. 2212</pre></td></tr> 2213 2214 2215<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> 2216<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 2217 2218Given 2219 template <typename T> struct C {}; 2220 C<int> c; 2221templateArgument() 2222 matches 'int' in C<int>. 2223</pre></td></tr> 2224 2225 2226<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> 2227<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name. 2228 2229Given 2230 template <typename T> class X { }; 2231 X<int> xi; 2232templateName() 2233 matches 'X' in X<int>. 2234</pre></td></tr> 2235 2236 2237<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> 2238<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 2239</pre></td></tr> 2240 2241 2242<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> 2243<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 2244 2245Given 2246 int a[] = { 2, 3 }; 2247 int b[4]; 2248 void f() { int c[a[0]]; } 2249arrayType() 2250 matches "int a[]", "int b[4]" and "int c[a[0]]"; 2251</pre></td></tr> 2252 2253 2254<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> 2255<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 2256 2257Given 2258 _Atomic(int) i; 2259atomicType() 2260 matches "_Atomic(int) i" 2261</pre></td></tr> 2262 2263 2264<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> 2265<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 2266 2267Given: 2268 auto n = 4; 2269 int v[] = { 2, 3 } 2270 for (auto i : v) { } 2271autoType() 2272 matches "auto n" and "auto i" 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('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>...</td></tr> 2277<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 2278"void (^)(int)". 2279 2280The pointee is always required to be a FunctionType. 2281</pre></td></tr> 2282 2283 2284<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> 2285<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 2286 2287Given 2288 struct A {}; 2289 A a; 2290 int b; 2291 float c; 2292 bool d; 2293builtinType() 2294 matches "int b", "float c" and "bool d" 2295</pre></td></tr> 2296 2297 2298<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> 2299<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 2300 2301Given 2302 _Complex float f; 2303complexType() 2304 matches "_Complex float f" 2305</pre></td></tr> 2306 2307 2308<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> 2309<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 2310 2311Given 2312 void() { 2313 int a[2]; 2314 int b[] = { 2, 3 }; 2315 int c[b[0]]; 2316 } 2317constantArrayType() 2318 matches "int a[2]" 2319</pre></td></tr> 2320 2321 2322<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> 2323<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 2324Example matches i[] in declaration of f. 2325 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 2326Example matches i[1]. 2327 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 2328 void f(int i[]) { 2329 i[1] = 0; 2330 } 2331</pre></td></tr> 2332 2333 2334<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> 2335<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(<expr>) types. 2336 2337Given: 2338 short i = 1; 2339 int j = 42; 2340 decltype(i + j) result = i + j; 2341decltypeType() 2342 matches "decltype(i + j)" 2343</pre></td></tr> 2344 2345 2346<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> 2347<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class 2348template types. 2349 2350Given 2351 template <typename T> 2352 class C { public: C(T); }; 2353 2354 C c(123); 2355deducedTemplateSpecializationType() matches the type in the declaration 2356of the variable c. 2357</pre></td></tr> 2358 2359 2360<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> 2361<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 2362 2363Given 2364 template<typename T, int Size> 2365 class array { 2366 T data[Size]; 2367 }; 2368dependentSizedArrayType 2369 matches "T data[Size]" 2370</pre></td></tr> 2371 2372 2373<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> 2374<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 2375qualified name. 2376 2377Given 2378 namespace N { 2379 namespace M { 2380 class D {}; 2381 } 2382 } 2383 class C {}; 2384 2385 class C c; 2386 N::M::D d; 2387 2388elaboratedType() matches the type of the variable declarations of both 2389c and d. 2390</pre></td></tr> 2391 2392 2393<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> 2394<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types. 2395 2396Given 2397 enum C { Green }; 2398 enum class S { Red }; 2399 2400 C c; 2401 S s; 2402 2403enumType() matches the type of the variable declarations of both c and 2404s. 2405</pre></td></tr> 2406 2407 2408<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> 2409<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes. 2410 2411Given 2412 int (*f)(int); 2413 void g(); 2414functionProtoType() 2415 matches "int (*f)(int)" and the type of "g" in C++ mode. 2416 In C mode, "g" is not matched because it does not contain a prototype. 2417</pre></td></tr> 2418 2419 2420<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> 2421<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 2422 2423Given 2424 int (*f)(int); 2425 void g(); 2426functionType() 2427 matches "int (*f)(int)" and the type of "g". 2428</pre></td></tr> 2429 2430 2431<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> 2432<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 2433 2434Given 2435 int a[] = { 2, 3 }; 2436 int b[42]; 2437 void f(int c[]) { int d[a[0]]; }; 2438incompleteArrayType() 2439 matches "int a[]" and "int c[]" 2440</pre></td></tr> 2441 2442 2443<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> 2444<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 2445 2446Example matches S s, but not S<T> s. 2447 (matcher = parmVarDecl(hasType(injectedClassNameType()))) 2448 template <typename T> struct S { 2449 void f(S s); 2450 void g(S<T> s); 2451 }; 2452</pre></td></tr> 2453 2454 2455<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> 2456<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 2457 2458Given: 2459 int *a; 2460 int &b = *a; 2461 int &&c = 1; 2462 auto &d = b; 2463 auto &&e = c; 2464 auto &&f = 2; 2465 int g = 5; 2466 2467lValueReferenceType() matches the types of b, d, and e. e is 2468matched since the type is deduced as int& by reference collapsing rules. 2469</pre></td></tr> 2470 2471 2472<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> 2473<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 2474Given 2475 struct A { int i; } 2476 A::* ptr = A::i; 2477memberPointerType() 2478 matches "A::* ptr" 2479</pre></td></tr> 2480 2481 2482<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> 2483<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 2484a pointer type, despite being syntactically similar. 2485 2486Given 2487 int *a; 2488 2489 @interface Foo 2490 @end 2491 Foo *f; 2492pointerType() 2493 matches "Foo *f", but does not match "int *a". 2494</pre></td></tr> 2495 2496 2497<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> 2498<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 2499 2500Given 2501 int (*ptr_to_array)[4]; 2502 int *array_of_ptrs[4]; 2503 2504varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 2505array_of_ptrs. 2506</pre></td></tr> 2507 2508 2509<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> 2510<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 2511types. 2512 2513Given 2514 int *a; 2515 int &b = *a; 2516 int c = 5; 2517 2518 @interface Foo 2519 @end 2520 Foo *f; 2521pointerType() 2522 matches "int *a", but does not match "Foo *f". 2523</pre></td></tr> 2524 2525 2526<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> 2527<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 2528 2529Given: 2530 int *a; 2531 int &b = *a; 2532 int &&c = 1; 2533 auto &d = b; 2534 auto &&e = c; 2535 auto &&f = 2; 2536 int g = 5; 2537 2538rValueReferenceType() matches the types of c and f. e is not 2539matched as it is deduced to int& by reference collapsing rules. 2540</pre></td></tr> 2541 2542 2543<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> 2544<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 2545 2546Given 2547 class C {}; 2548 struct S {}; 2549 2550 C c; 2551 S s; 2552 2553recordType() matches the type of the variable declarations of both c 2554and s. 2555</pre></td></tr> 2556 2557 2558<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> 2559<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 2560 2561Given 2562 int *a; 2563 int &b = *a; 2564 int &&c = 1; 2565 auto &d = b; 2566 auto &&e = c; 2567 auto &&f = 2; 2568 int g = 5; 2569 2570referenceType() matches the types of b, c, d, e, and f. 2571</pre></td></tr> 2572 2573 2574<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> 2575<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 2576template type parameter. 2577 2578Given 2579 template <typename T> 2580 void F(T t) { 2581 int i = 1 + t; 2582 } 2583 2584substTemplateTypeParmType() matches the type of 't' but not '1' 2585</pre></td></tr> 2586 2587 2588<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> 2589<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types). 2590 2591Given 2592 enum E {}; 2593 class C {}; 2594 2595 E e; 2596 C c; 2597 2598tagType() matches the type of the variable declarations of both e 2599and c. 2600</pre></td></tr> 2601 2602 2603<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> 2604<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 2605 2606Given 2607 template <typename T> 2608 class C { }; 2609 2610 template class C<int>; // A 2611 C<char> var; // B 2612 2613templateSpecializationType() matches the type of the explicit 2614instantiation in A and the type of the variable declaration in B. 2615</pre></td></tr> 2616 2617 2618<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> 2619<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 2620 2621Example matches T, but not int. 2622 (matcher = templateTypeParmType()) 2623 template <typename T> void f(int i); 2624</pre></td></tr> 2625 2626 2627<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> 2628<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 2629</pre></td></tr> 2630 2631 2632<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> 2633<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 2634 2635Given 2636 typedef int X; 2637typedefType() 2638 matches "typedef int X" 2639</pre></td></tr> 2640 2641 2642<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> 2643<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 2644 2645Given: 2646 typedef __underlying_type(T) type; 2647unaryTransformType() 2648 matches "__underlying_type(T)" 2649</pre></td></tr> 2650 2651 2652<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> 2653<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 2654integer-constant-expression. 2655 2656Given 2657 void f() { 2658 int a[] = { 2, 3 } 2659 int b[42]; 2660 int c[a[0]]; 2661 } 2662variableArrayType() 2663 matches "int c[a[0]]" 2664</pre></td></tr> 2665 2666<!--END_DECL_MATCHERS --> 2667</table> 2668 2669<!-- ======================================================================= --> 2670<h2 id="narrowing-matchers">Narrowing Matchers</h2> 2671<!-- ======================================================================= --> 2672 2673<p>Narrowing matchers match certain attributes on the current node, thus 2674narrowing down the set of nodes of the current type to match on.</p> 2675 2676<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 2677which allow users to create more powerful match expressions.</p> 2678 2679<table> 2680<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 2681<!-- START_NARROWING_MATCHERS --> 2682 2683<tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2684<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 2685 2686Usable as: Any Matcher 2687</pre></td></tr> 2688 2689 2690<tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2691<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 2692 2693Usable as: Any Matcher 2694</pre></td></tr> 2695 2696 2697<tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 2698<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 2699 2700Useful when another matcher requires a child matcher, but there's no 2701additional constraint. This will often be used with an explicit conversion 2702to an internal::Matcher<> type such as TypeMatcher. 2703 2704Example: DeclarationMatcher(anything()) matches all declarations, e.g., 2705"int* p" and "void f()" in 2706 int* p; 2707 void f(); 2708 2709Usable as: Any Matcher 2710</pre></td></tr> 2711 2712 2713<tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr> 2714<tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within 2715 2716Given 2717 if (true); 2718 for (; true; ); 2719with the matcher 2720 mapAnyOf(ifStmt, forStmt).with( 2721 hasCondition(cxxBoolLiteralExpr(equals(true))) 2722 ).bind("trueCond") 2723matches the if and the for. It is equivalent to: 2724 auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true))); 2725 anyOf( 2726 ifStmt(trueCond).bind("trueCond"), 2727 forStmt(trueCond).bind("trueCond") 2728 ); 2729 2730The with() chain-call accepts zero or more matchers which are combined 2731as-if with allOf() in each of the node matchers. 2732Usable as: Any Matcher 2733</pre></td></tr> 2734 2735 2736<tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 2737<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 2738 2739Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 2740 class X {}; 2741 class Y {}; 2742 2743Usable as: Any Matcher 2744</pre></td></tr> 2745 2746 2747<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> 2748<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the 2749specified names. 2750 2751 hasAnyOperatorName("+", "-") 2752 Is equivalent to 2753 anyOf(hasOperatorName("+"), hasOperatorName("-")) 2754</pre></td></tr> 2755 2756 2757<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> 2758<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 2759unary). 2760 2761Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 2762 !(a || b) 2763</pre></td></tr> 2764 2765 2766<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> 2767<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators. 2768 2769Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2770 if (a == b) 2771 a += b; 2772 2773Example 2: matches s1 = s2 2774 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2775 struct S { S& operator=(const S&); }; 2776 void x() { S s1, s2; s1 = s2; } 2777</pre></td></tr> 2778 2779 2780<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> 2781<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators. 2782 2783Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 2784 if (a == b) 2785 a += b; 2786 2787Example 2: matches s1 < s2 2788 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 2789 struct S { bool operator<(const S& other); }; 2790 void x(S s1, S s2) { bool b1 = s1 < s2; } 2791</pre></td></tr> 2792 2793 2794<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> 2795<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private 2796inheritance. 2797 2798Examples: 2799 class C { 2800 public: int a; 2801 protected: int b; 2802 private: int c; // fieldDecl(isPrivate()) matches 'c' 2803 }; 2804 2805 struct Base {}; 2806 struct Derived1 : private Base {}; // matches 'Base' 2807 class Derived2 : Base {}; // matches 'Base' 2808</pre></td></tr> 2809 2810 2811<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> 2812<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify 2813protected inheritance. 2814 2815Examples: 2816 class C { 2817 public: int a; 2818 protected: int b; // fieldDecl(isProtected()) matches 'b' 2819 private: int c; 2820 }; 2821 2822 class Base {}; 2823 class Derived : protected Base {}; // matches 'Base' 2824</pre></td></tr> 2825 2826 2827<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> 2828<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public 2829inheritance. 2830 2831Examples: 2832 class C { 2833 public: int a; // fieldDecl(isPublic()) matches 'a' 2834 protected: int b; 2835 private: int c; 2836 }; 2837 2838 class Base {}; 2839 class Derived1 : public Base {}; // matches 'Base' 2840 struct Derived2 : Base {}; // matches 'Base' 2841</pre></td></tr> 2842 2843 2844<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> 2845<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify 2846virtual inheritance. 2847 2848Example: 2849 class A { 2850 public: 2851 virtual void x(); // matches x 2852 }; 2853 2854Example: 2855 class Base {}; 2856 class DirectlyDerived : virtual Base {}; // matches Base 2857 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 2858 2859Usable 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>> 2860</pre></td></tr> 2861 2862 2863<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> 2864<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr> 2865 2866 2867<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> 2868<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT. 2869 2870Given 2871 f('false, 3.14, 42); 2872characterLiteral(equals(0)) 2873 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2874 match false 2875floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2876 match 3.14 2877integerLiteral(equals(42)) 2878 matches 42 2879 2880Note that you cannot directly match a negative numeric literal because the 2881minus sign is not part of the literal: It is a unary operator whose operand 2882is the positive numeric literal. Instead, you must use a unaryOperator() 2883matcher to match the minus sign: 2884 2885unaryOperator(hasOperatorName("-"), 2886 hasUnaryOperand(integerLiteral(equals(13)))) 2887 2888Usable 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>>, 2889 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>> 2890</pre></td></tr> 2891 2892 2893<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> 2894<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr> 2895 2896 2897<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> 2898<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr> 2899 2900 2901<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> 2902<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 2903 2904Given 2905 try { 2906 // ... 2907 } catch (int) { 2908 // ... 2909 } catch (...) { 2910 // ... 2911 } 2912cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 2913</pre></td></tr> 2914 2915 2916<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> 2917<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 2918a specific number of arguments (including absent default arguments). 2919 2920Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2921 void f(int x, int y); 2922 f(0, 0); 2923</pre></td></tr> 2924 2925 2926<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> 2927<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 2928</pre></td></tr> 2929 2930 2931<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> 2932<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 2933zero initialization. 2934 2935Given 2936void foo() { 2937 struct point { double x; double y; }; 2938 point pt[2] = { { 1.0, 2.0 } }; 2939} 2940initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 2941will match the implicit array filler for pt[1]. 2942</pre></td></tr> 2943 2944 2945<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> 2946<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 2947 2948Given 2949 struct S { 2950 S(); // #1 2951 S(const S &); // #2 2952 S(S &&); // #3 2953 }; 2954cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 2955</pre></td></tr> 2956 2957 2958<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> 2959<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 2960 2961Given 2962 struct S { 2963 S(); // #1 2964 S(const S &); // #2 2965 S(S &&); // #3 2966 }; 2967cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 2968</pre></td></tr> 2969 2970 2971<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> 2972<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 2973 2974Given 2975 struct S { 2976 S(); // #1 2977 S(int) {} // #2 2978 S(S &&) : S() {} // #3 2979 }; 2980 S::S() : S(0) {} // #4 2981cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 2982#1 or #2. 2983</pre></td></tr> 2984 2985 2986<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> 2987<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations 2988that have an explicit specifier if this explicit specifier is resolved to 2989true. 2990 2991Given 2992 template<bool b> 2993 struct S { 2994 S(int); // #1 2995 explicit S(double); // #2 2996 operator int(); // #3 2997 explicit operator bool(); // #4 2998 explicit(false) S(bool) // # 7 2999 explicit(true) S(char) // # 8 3000 explicit(b) S(S) // # 9 3001 }; 3002 S(int) -> S<true> // #5 3003 explicit S(double) -> S<false> // #6 3004cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3005cxxConversionDecl(isExplicit()) will match #4, but not #3. 3006cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3007</pre></td></tr> 3008 3009 3010<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> 3011<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 3012 3013Given 3014 struct S { 3015 S(); // #1 3016 S(const S &); // #2 3017 S(S &&); // #3 3018 }; 3019cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 3020</pre></td></tr> 3021 3022 3023<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> 3024<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations 3025that have an explicit specifier if this explicit specifier is resolved to 3026true. 3027 3028Given 3029 template<bool b> 3030 struct S { 3031 S(int); // #1 3032 explicit S(double); // #2 3033 operator int(); // #3 3034 explicit operator bool(); // #4 3035 explicit(false) S(bool) // # 7 3036 explicit(true) S(char) // # 8 3037 explicit(b) S(S) // # 9 3038 }; 3039 S(int) -> S<true> // #5 3040 explicit S(double) -> S<false> // #6 3041cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3042cxxConversionDecl(isExplicit()) will match #4, but not #3. 3043cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3044</pre></td></tr> 3045 3046 3047<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> 3048<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 3049opposed to a member. 3050 3051Given 3052 struct B {}; 3053 struct D : B { 3054 int I; 3055 D(int i) : I(i) {} 3056 }; 3057 struct E : B { 3058 E() : B() {} 3059 }; 3060cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 3061 will match E(), but not match D(int). 3062</pre></td></tr> 3063 3064 3065<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> 3066<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 3067opposed to a base. 3068 3069Given 3070 struct B {}; 3071 struct D : B { 3072 int I; 3073 D(int i) : I(i) {} 3074 }; 3075 struct E : B { 3076 E() : B() {} 3077 }; 3078cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 3079 will match D(int), but not match E(). 3080</pre></td></tr> 3081 3082 3083<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> 3084<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 3085code (as opposed to implicitly added by the compiler). 3086 3087Given 3088 struct Foo { 3089 Foo() { } 3090 Foo(int) : foo_("A") { } 3091 string foo_; 3092 }; 3093cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 3094 will match Foo(int), but not Foo() 3095</pre></td></tr> 3096 3097 3098<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> 3099<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations 3100that have an explicit specifier if this explicit specifier is resolved to 3101true. 3102 3103Given 3104 template<bool b> 3105 struct S { 3106 S(int); // #1 3107 explicit S(double); // #2 3108 operator int(); // #3 3109 explicit operator bool(); // #4 3110 explicit(false) S(bool) // # 7 3111 explicit(true) S(char) // # 8 3112 explicit(b) S(S) // # 9 3113 }; 3114 S(int) -> S<true> // #5 3115 explicit S(double) -> S<false> // #6 3116cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3117cxxConversionDecl(isExplicit()) will match #4, but not #3. 3118cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3119</pre></td></tr> 3120 3121 3122<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> 3123<tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names. 3124 3125In template declarations, dependent members are not resolved and so can 3126not be matched to particular named declarations. 3127 3128This matcher allows to match on the known name of members. 3129 3130Given 3131 template <typename T> 3132 struct S { 3133 void mem(); 3134 }; 3135 template <typename T> 3136 void x() { 3137 S<T> s; 3138 s.mem(); 3139 } 3140cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()` 3141</pre></td></tr> 3142 3143 3144<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> 3145<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed 3146to '.'. 3147 3148Member calls on the implicit this pointer match as called with '->'. 3149 3150Given 3151 class Y { 3152 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3153 template <class T> void f() { this->f<T>(); f<T>(); } 3154 int a; 3155 static int b; 3156 }; 3157 template <class T> 3158 class Z { 3159 void x() { this->m; } 3160 }; 3161memberExpr(isArrow()) 3162 matches this->x, x, y.x, a, this->b 3163cxxDependentScopeMemberExpr(isArrow()) 3164 matches this->m 3165unresolvedMemberExpr(isArrow()) 3166 matches this->f<T>, f<T> 3167</pre></td></tr> 3168 3169 3170<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> 3171<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound 3172node 3173 3174In template declarations, dependent members are not resolved and so can 3175not be matched to particular named declarations. 3176 3177This matcher allows to match on the name of already-bound VarDecl, FieldDecl 3178and CXXMethodDecl nodes. 3179 3180Given 3181 template <typename T> 3182 struct S { 3183 void mem(); 3184 }; 3185 template <typename T> 3186 void x() { 3187 S<T> s; 3188 s.mem(); 3189 } 3190The matcher 3191@code 3192cxxDependentScopeMemberExpr( 3193 hasObjectExpression(declRefExpr(hasType(templateSpecializationType( 3194 hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has( 3195 cxxMethodDecl(hasName("mem")).bind("templMem") 3196 ))))) 3197 )))), 3198 memberHasSameNameAsBoundNode("templMem") 3199 ) 3200@endcode 3201first matches and binds the @c mem member of the @c S template, then 3202compares its name to the usage in @c s.mem() in the @c x function template 3203</pre></td></tr> 3204 3205 3206<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> 3207<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 3208 3209Given 3210struct A { 3211 void foo() const; 3212 void bar(); 3213}; 3214 3215cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 3216</pre></td></tr> 3217 3218 3219<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> 3220<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 3221operator. 3222 3223Given 3224struct A { 3225 A &operator=(const A &); 3226 A &operator=(A &&); 3227}; 3228 3229cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 3230the second one. 3231</pre></td></tr> 3232 3233 3234<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> 3235<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 3236 3237Given: 3238 class A final {}; 3239 3240 struct B { 3241 virtual void f(); 3242 }; 3243 3244 struct C : B { 3245 void f() final; 3246 }; 3247matches A and C::f, but not B, C, or B::f 3248</pre></td></tr> 3249 3250 3251<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> 3252<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 3253operator. 3254 3255Given 3256struct A { 3257 A &operator=(const A &); 3258 A &operator=(A &&); 3259}; 3260 3261cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 3262the first one. 3263</pre></td></tr> 3264 3265 3266<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> 3267<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 3268 3269Given 3270 class A { 3271 public: 3272 virtual void x(); 3273 }; 3274 class B : public A { 3275 public: 3276 virtual void x(); 3277 }; 3278 matches B::x 3279</pre></td></tr> 3280 3281 3282<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> 3283<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 3284 3285Given 3286 class A { 3287 public: 3288 virtual void x() = 0; 3289 }; 3290 matches A::x 3291</pre></td></tr> 3292 3293 3294<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> 3295<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 3296 3297Given 3298 struct S { 3299 S(); // #1 3300 S(const S &) = default; // #2 3301 S(S &&) = delete; // #3 3302 }; 3303cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 3304</pre></td></tr> 3305 3306 3307<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> 3308<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify 3309virtual inheritance. 3310 3311Example: 3312 class A { 3313 public: 3314 virtual void x(); // matches x 3315 }; 3316 3317Example: 3318 class Base {}; 3319 class DirectlyDerived : virtual Base {}; // matches Base 3320 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 3321 3322Usable 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>> 3323</pre></td></tr> 3324 3325 3326<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> 3327<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 3328 3329Given 3330 class A { 3331 public: 3332 virtual void x(); 3333 }; 3334 class B : public A { 3335 public: 3336 void x(); 3337 }; 3338 matches A::x but not B::x 3339</pre></td></tr> 3340 3341 3342<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> 3343<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions. 3344 3345Given: 3346 MyClass *p1 = new MyClass[10]; 3347cxxNewExpr(isArray()) 3348 matches the expression 'new MyClass[10]'. 3349</pre></td></tr> 3350 3351 3352<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasAnyOperatorName1')"><a name="hasAnyOperatorName1Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 3353<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the 3354specified names. 3355 3356 hasAnyOperatorName("+", "-") 3357 Is equivalent to 3358 anyOf(hasOperatorName("+"), hasOperatorName("-")) 3359</pre></td></tr> 3360 3361 3362<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> 3363<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names. 3364 3365Matches overloaded operator names specified in strings without the 3366"operator" prefix: e.g. "<<". 3367 3368 hasAnyOverloadedOperatorName("+", "-") 3369Is equivalent to 3370 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3371</pre></td></tr> 3372 3373 3374<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 3375<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 3376unary). 3377 3378Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3379 !(a || b) 3380</pre></td></tr> 3381 3382 3383<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> 3384<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 3385 3386Matches overloaded operator names specified in strings without the 3387"operator" prefix: e.g. "<<". 3388 3389Given: 3390 class A { int operator*(); }; 3391 const A &operator<<(const A &a, const A &b); 3392 A a; 3393 a << a; // <-- This matches 3394 3395cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3396specified line and 3397cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3398matches the declaration of A. 3399 3400Usable 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>> 3401</pre></td></tr> 3402 3403 3404<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> 3405<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators. 3406 3407Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3408 if (a == b) 3409 a += b; 3410 3411Example 2: matches s1 = s2 3412 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3413 struct S { S& operator=(const S&); }; 3414 void x() { S s1, s2; s1 = s2; } 3415</pre></td></tr> 3416 3417 3418<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> 3419<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators. 3420 3421Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3422 if (a == b) 3423 a += b; 3424 3425Example 2: matches s1 < s2 3426 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3427 struct S { bool operator<(const S& other); }; 3428 void x(S s1, S s2) { bool b1 = s1 < s2; } 3429</pre></td></tr> 3430 3431 3432<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> 3433<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined. 3434 3435Example matches x (matcher = cxxRecordDecl(hasDefinition())) 3436class x {}; 3437class y; 3438</pre></td></tr> 3439 3440 3441<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> 3442<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 3443</pre></td></tr> 3444 3445 3446<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> 3447<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 3448</pre></td></tr> 3449 3450 3451<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> 3452<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 3453static member variable template instantiations. 3454 3455Given 3456 template<typename T> void A(T t) { } 3457 template<> void A(int N) { } 3458functionDecl(isExplicitTemplateSpecialization()) 3459 matches the specialization A<int>(). 3460 3461Usable 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>> 3462</pre></td></tr> 3463 3464 3465<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> 3466<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 3467 3468Given: 3469 class A final {}; 3470 3471 struct B { 3472 virtual void f(); 3473 }; 3474 3475 struct C : B { 3476 void f() final; 3477 }; 3478matches A and C::f, but not B, C, or B::f 3479</pre></td></tr> 3480 3481 3482<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> 3483<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 3484 3485Given: 3486 auto x = []{}; 3487 3488cxxRecordDecl(isLambda()) matches the implicit class declaration of 3489decltype(x) 3490</pre></td></tr> 3491 3492 3493<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> 3494<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for 3495isSameOrDerivedFrom(hasName(...)). 3496</pre></td></tr> 3497 3498 3499<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> 3500<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 3501member variable template instantiations. 3502 3503Given 3504 template <typename T> class X {}; class A {}; X<A> x; 3505or 3506 template <typename T> class X {}; class A {}; template class X<A>; 3507or 3508 template <typename T> class X {}; class A {}; extern template class X<A>; 3509cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3510 matches the template instantiation of X<A>. 3511 3512But given 3513 template <typename T> class X {}; class A {}; 3514 template <> class X<A> {}; X<A> x; 3515cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3516 does not match, as X<A> is an explicit template specialization. 3517 3518Usable 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>> 3519</pre></td></tr> 3520 3521 3522<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName2')"><a name="hasAnyOperatorName2Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 3523<tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the 3524specified names. 3525 3526 hasAnyOperatorName("+", "-") 3527 Is equivalent to 3528 anyOf(hasOperatorName("+"), hasOperatorName("-")) 3529</pre></td></tr> 3530 3531 3532<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName2')"><a name="hasOperatorName2Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 3533<tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or 3534unary). 3535 3536Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3537 !(a || b) 3538</pre></td></tr> 3539 3540 3541<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('isAssignmentOperator2')"><a name="isAssignmentOperator2Anchor">isAssignmentOperator</a></td><td></td></tr> 3542<tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators. 3543 3544Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3545 if (a == b) 3546 a += b; 3547 3548Example 2: matches s1 = s2 3549 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3550 struct S { S& operator=(const S&); }; 3551 void x() { S s1, s2; s1 = s2; } 3552</pre></td></tr> 3553 3554 3555<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('isComparisonOperator2')"><a name="isComparisonOperator2Anchor">isComparisonOperator</a></td><td></td></tr> 3556<tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators. 3557 3558Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3559 if (a == b) 3560 a += b; 3561 3562Example 2: matches s1 < s2 3563 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3564 struct S { bool operator<(const S& other); }; 3565 void x(S s1, S s2) { bool b1 = s1 < s2; } 3566</pre></td></tr> 3567 3568 3569<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> 3570<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3571a specific number of arguments (including absent default arguments). 3572 3573Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3574 void f(int x, int y); 3575 f(0, 0); 3576</pre></td></tr> 3577 3578 3579<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> 3580<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 3581a specific number of arguments (including absent default arguments). 3582 3583Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3584 void f(int x, int y); 3585 f(0, 0); 3586</pre></td></tr> 3587 3588 3589<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> 3590<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL. 3591 3592Example matches y(x) but not y(42) or NS::y(x). 3593 namespace NS { 3594 struct X {}; 3595 void y(X); 3596 } 3597 3598 void y(...); 3599 3600 void test() { 3601 NS::X x; 3602 y(x); // Matches 3603 NS::y(x); // Doesn't match 3604 y(42); // Doesn't match 3605 using NS::y; 3606 y(x); // Found by both unqualified lookup and ADL, doesn't match 3607 } 3608</pre></td></tr> 3609 3610 3611<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> 3612<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 3613 3614Example: matches the implicit cast around 0 3615(matcher = castExpr(hasCastKind(CK_NullToPointer))) 3616 int *p = 0; 3617 3618If the matcher is use from clang-query, CastKind parameter 3619should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer"). 3620</pre></td></tr> 3621 3622 3623<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> 3624<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr> 3625 3626 3627<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> 3628<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT. 3629 3630Given 3631 f('false, 3.14, 42); 3632characterLiteral(equals(0)) 3633 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3634 match false 3635floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3636 match 3.14 3637integerLiteral(equals(42)) 3638 matches 42 3639 3640Note that you cannot directly match a negative numeric literal because the 3641minus sign is not part of the literal: It is a unary operator whose operand 3642is the positive numeric literal. Instead, you must use a unaryOperator() 3643matcher to match the minus sign: 3644 3645unaryOperator(hasOperatorName("-"), 3646 hasUnaryOperand(integerLiteral(equals(13)))) 3647 3648Usable 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>>, 3649 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>> 3650</pre></td></tr> 3651 3652 3653<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> 3654<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr> 3655 3656 3657<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> 3658<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr> 3659 3660 3661<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> 3662<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 3663 3664Given 3665 template<typename T> struct C {}; 3666 C<int> c; 3667classTemplateSpecializationDecl(templateArgumentCountIs(1)) 3668 matches C<int>. 3669</pre></td></tr> 3670 3671 3672<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> 3673<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 3674child statements. 3675 3676Example: Given 3677 { for (;;) {} } 3678compoundStmt(statementCountIs(0))) 3679 matches '{}' 3680 but does not match the outer compound statement. 3681</pre></td></tr> 3682 3683 3684<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> 3685<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 3686 3687Given 3688 int a[42]; 3689 int b[2 * 21]; 3690 int c[41], d[43]; 3691 char *s = "abcd"; 3692 wchar_t *ws = L"abcd"; 3693 char *w = "a"; 3694constantArrayType(hasSize(42)) 3695 matches "int a[42]" and "int b[2 * 21]" 3696stringLiteral(hasSize(4)) 3697 matches "abcd", L"abcd" 3698</pre></td></tr> 3699 3700 3701<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> 3702<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 3703declarations. 3704 3705Example: Given 3706 int a, b; 3707 int c; 3708 int d = 2, e; 3709declCountIs(2) 3710 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 3711</pre></td></tr> 3712 3713 3714<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> 3715<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 3716 3717Matches a node if it equals the node previously bound to ID. 3718 3719Given 3720 class X { int a; int b; }; 3721cxxRecordDecl( 3722 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3723 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3724 matches the class X, as a and b have the same type. 3725 3726Note that when multiple matches are involved via forEach* matchers, 3727equalsBoundNodes acts as a filter. 3728For example: 3729compoundStmt( 3730 forEachDescendant(varDecl().bind("d")), 3731 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3732will trigger a match for each combination of variable declaration 3733and reference to that variable declaration within a compound statement. 3734</pre></td></tr> 3735 3736 3737<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> 3738<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 3739 3740Decl has pointer identity in the AST. 3741</pre></td></tr> 3742 3743 3744<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> 3745<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 3746 3747Given 3748 __attribute__((device)) void f() { ... } 3749decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 3750f. If the matcher is used from clang-query, attr::Kind parameter should be 3751passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 3752</pre></td></tr> 3753 3754 3755<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> 3756<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro. 3757Does not match if only part of the statement is expanded from that macro or 3758if different parts of the the statement are expanded from different 3759appearances of the macro. 3760</pre></td></tr> 3761 3762 3763<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> 3764<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 3765partially matching a given regex. 3766 3767Example matches Y but not X 3768 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3769 #include "ASTMatcher.h" 3770 class X {}; 3771ASTMatcher.h: 3772 class Y {}; 3773 3774Usable 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>> 3775 3776If the matcher is used in clang-query, RegexFlags parameter 3777should be passed as a quoted string. e.g: "NoFlags". 3778Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3779</pre></td></tr> 3780 3781 3782<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> 3783<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 3784 3785Example matches X but not Y 3786 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3787 #include <Y.h> 3788 class X {}; 3789Y.h: 3790 class Y {}; 3791 3792Usable 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>> 3793</pre></td></tr> 3794 3795 3796<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> 3797<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 3798 3799Example matches Y but not X 3800 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3801 #include <SystemHeader.h> 3802 class X {}; 3803SystemHeader.h: 3804 class Y {}; 3805 3806Usable 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>> 3807</pre></td></tr> 3808 3809 3810<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> 3811<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added 3812by the compiler (eg. implicit default/copy constructors). 3813</pre></td></tr> 3814 3815 3816<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> 3817<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces. 3818 3819Given 3820 class vector {}; 3821 namespace foo { 3822 class vector {}; 3823 namespace std { 3824 class vector {}; 3825 } 3826 } 3827 namespace std { 3828 inline namespace __1 { 3829 class vector {}; // #1 3830 namespace experimental { 3831 class vector {}; 3832 } 3833 } 3834 } 3835cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1. 3836</pre></td></tr> 3837 3838 3839<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> 3840<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3841template instantiations. 3842 3843Given 3844 template<typename T> void A(T t) { T i; } 3845 A(0); 3846 A(0U); 3847functionDecl(isInstantiated()) 3848 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3849</pre></td></tr> 3850 3851 3852<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> 3853<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private 3854inheritance. 3855 3856Examples: 3857 class C { 3858 public: int a; 3859 protected: int b; 3860 private: int c; // fieldDecl(isPrivate()) matches 'c' 3861 }; 3862 3863 struct Base {}; 3864 struct Derived1 : private Base {}; // matches 'Base' 3865 class Derived2 : Base {}; // matches 'Base' 3866</pre></td></tr> 3867 3868 3869<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> 3870<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify 3871protected inheritance. 3872 3873Examples: 3874 class C { 3875 public: int a; 3876 protected: int b; // fieldDecl(isProtected()) matches 'b' 3877 private: int c; 3878 }; 3879 3880 class Base {}; 3881 class Derived : protected Base {}; // matches 'Base' 3882</pre></td></tr> 3883 3884 3885<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> 3886<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public 3887inheritance. 3888 3889Examples: 3890 class C { 3891 public: int a; // fieldDecl(isPublic()) matches 'a' 3892 protected: int b; 3893 private: int c; 3894 }; 3895 3896 class Base {}; 3897 class Derived1 : public Base {}; // matches 'Base' 3898 struct Derived2 : Base {}; // matches 'Base' 3899</pre></td></tr> 3900 3901 3902<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> 3903<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 3904a specific number of designators. 3905 3906Example: Given 3907 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 3908 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 3909designatorCountIs(2) 3910 matches '{ [2].y = 1.0, [0].x = 1.0 }', 3911 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 3912</pre></td></tr> 3913 3914 3915<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> 3916<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration. 3917 3918Example matches Y (matcher = enumDecl(isScoped())) 3919enum X {}; 3920enum class Y {}; 3921</pre></td></tr> 3922 3923 3924<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> 3925<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is 3926neither type- nor value-dependent. 3927 3928In the following example, the expression sizeof(sizeof(T() + T())) 3929is instantiation-dependent (since it involves a template parameter T), 3930but is neither type- nor value-dependent, since the type of the inner 3931sizeof is known (std::size_t) and therefore the size of the outer 3932sizeof is known. 3933 template<typename T> 3934 void f(T x, T y) { sizeof(sizeof(T() + T()); } 3935expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T()) 3936</pre></td></tr> 3937 3938 3939<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> 3940<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type 3941is not yet instantiated. 3942 3943For example, the expressions "x" and "x + y" are type-dependent in 3944the following code, but "y" is not type-dependent: 3945 template<typename T> 3946 void add(T x, int y) { 3947 x + y; 3948 } 3949expr(isTypeDependent()) matches x + y 3950</pre></td></tr> 3951 3952 3953<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> 3954<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a 3955non-type template parameter. 3956 3957For example, the array bound of "Chars" in the following example is 3958value-dependent. 3959 template<int Size> int f() { return Size; } 3960expr(isValueDependent()) matches return Size 3961</pre></td></tr> 3962 3963 3964<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> 3965<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 3966GNU's __null, C++11's nullptr, or C's NULL macro. 3967 3968Given: 3969 void *v1 = NULL; 3970 void *v2 = nullptr; 3971 void *v3 = __null; // GNU extension 3972 char *cp = (char *)0; 3973 int *ip = 0; 3974 int i = 0; 3975expr(nullPointerConstant()) 3976 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 3977 initializer for i. 3978</pre></td></tr> 3979 3980 3981<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> 3982<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 3983bit width. 3984 3985Given 3986 class C { 3987 int a : 2; 3988 int b : 4; 3989 int c : 2; 3990 }; 3991fieldDecl(hasBitWidth(2)) 3992 matches 'int a;' and 'int c;' but not 'int b;'. 3993</pre></td></tr> 3994 3995 3996<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> 3997<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 3998 3999Given 4000 class C { 4001 int a : 2; 4002 int b; 4003 }; 4004fieldDecl(isBitField()) 4005 matches 'int a;' but not 'int b;'. 4006</pre></td></tr> 4007 4008 4009<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> 4010<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 4011 4012Given 4013 f('false, 3.14, 42); 4014characterLiteral(equals(0)) 4015 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4016 match false 4017floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4018 match 3.14 4019integerLiteral(equals(42)) 4020 matches 42 4021 4022Note that you cannot directly match a negative numeric literal because the 4023minus sign is not part of the literal: It is a unary operator whose operand 4024is the positive numeric literal. Instead, you must use a unaryOperator() 4025matcher to match the minus sign: 4026 4027unaryOperator(hasOperatorName("-"), 4028 hasUnaryOperand(integerLiteral(equals(13)))) 4029 4030Usable 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>>, 4031 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>> 4032</pre></td></tr> 4033 4034 4035<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> 4036<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr> 4037 4038 4039<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> 4040<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names. 4041 4042Matches overloaded operator names specified in strings without the 4043"operator" prefix: e.g. "<<". 4044 4045 hasAnyOverloadedOperatorName("+", "-") 4046Is equivalent to 4047 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 4048</pre></td></tr> 4049 4050 4051<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> 4052<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 4053 4054Given: 4055 void f(); 4056 void g() noexcept; 4057 void h() noexcept(true); 4058 void i() noexcept(false); 4059 void j() throw(); 4060 void k() throw(int); 4061 void l() throw(...); 4062functionDecl(hasDynamicExceptionSpec()) and 4063 functionProtoType(hasDynamicExceptionSpec()) 4064 match the declarations of j, k, and l, but not f, g, h, or i. 4065</pre></td></tr> 4066 4067 4068<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> 4069<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 4070 4071Matches overloaded operator names specified in strings without the 4072"operator" prefix: e.g. "<<". 4073 4074Given: 4075 class A { int operator*(); }; 4076 const A &operator<<(const A &a, const A &b); 4077 A a; 4078 a << a; // <-- This matches 4079 4080cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 4081specified line and 4082cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 4083matches the declaration of A. 4084 4085Usable 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>> 4086</pre></td></tr> 4087 4088 4089<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> 4090<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 4091 4092Example matches Y (matcher = functionDecl(hasTrailingReturn())) 4093int X() {} 4094auto Y() -> int {} 4095</pre></td></tr> 4096 4097 4098<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> 4099<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations, 4100 and if constexpr. 4101 4102Given: 4103 constexpr int foo = 42; 4104 constexpr int bar(); 4105 void baz() { if constexpr(1 > 0) {} } 4106varDecl(isConstexpr()) 4107 matches the declaration of foo. 4108functionDecl(isConstexpr()) 4109 matches the declaration of bar. 4110ifStmt(isConstexpr()) 4111 matches the if statement in baz. 4112</pre></td></tr> 4113 4114 4115<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> 4116<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 4117 4118Given: 4119 class A { ~A(); }; 4120 class B { ~B() = default; }; 4121functionDecl(isDefaulted()) 4122 matches the declaration of ~B, but not ~A. 4123</pre></td></tr> 4124 4125 4126<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> 4127<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 4128 4129Example matches A, va, fa 4130 class A {}; 4131 class B; // Doesn't match, as it has no body. 4132 int va; 4133 extern int vb; // Doesn't match, as it doesn't define the variable. 4134 void fa() {} 4135 void fb(); // Doesn't match, as it has no body. 4136 @interface X 4137 - (void)ma; // Doesn't match, interface is declaration. 4138 @end 4139 @implementation X 4140 - (void)ma {} 4141 @end 4142 4143Usable 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>>, 4144 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4145</pre></td></tr> 4146 4147 4148<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> 4149<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 4150 4151Given: 4152 void Func(); 4153 void DeletedFunc() = delete; 4154functionDecl(isDeleted()) 4155 matches the declaration of DeletedFunc, but not Func. 4156</pre></td></tr> 4157 4158 4159<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> 4160<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 4161static member variable template instantiations. 4162 4163Given 4164 template<typename T> void A(T t) { } 4165 template<> void A(int N) { } 4166functionDecl(isExplicitTemplateSpecialization()) 4167 matches the specialization A<int>(). 4168 4169Usable 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>> 4170</pre></td></tr> 4171 4172 4173<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> 4174<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 4175 4176Given: 4177 extern "C" void f() {} 4178 extern "C" { void g() {} } 4179 void h() {} 4180 extern "C" int x = 1; 4181 extern "C" int y = 2; 4182 int z = 3; 4183functionDecl(isExternC()) 4184 matches the declaration of f and g, but not the declaration of h. 4185varDecl(isExternC()) 4186 matches the declaration of x and y, but not the declaration of z. 4187</pre></td></tr> 4188 4189 4190<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> 4191<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 4192the inline keyword. 4193 4194Given 4195 inline void f(); 4196 void g(); 4197 namespace n { 4198 inline namespace m {} 4199 } 4200functionDecl(isInline()) will match ::f(). 4201namespaceDecl(isInline()) will match n::m. 4202</pre></td></tr> 4203 4204 4205<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> 4206<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point 4207into an executable program. 4208</pre></td></tr> 4209 4210 4211<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> 4212<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 4213 4214Given 4215 void nope(); 4216 [[noreturn]] void a(); 4217 __attribute__((noreturn)) void b(); 4218 struct c { [[noreturn]] c(); }; 4219functionDecl(isNoReturn()) 4220 matches all of those except 4221 void nope(); 4222</pre></td></tr> 4223 4224 4225<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> 4226<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 4227 4228Given: 4229 void f(); 4230 void g() noexcept; 4231 void h() throw(); 4232 void i() throw(int); 4233 void j() noexcept(false); 4234functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4235 match the declarations of g, and h, but not f, i or j. 4236</pre></td></tr> 4237 4238 4239<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> 4240<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage 4241class specifier ("static" keyword) written in the source. 4242 4243Given: 4244 static void f() {} 4245 static int i = 0; 4246 extern int j; 4247 int k; 4248functionDecl(isStaticStorageClass()) 4249 matches the function declaration f. 4250varDecl(isStaticStorageClass()) 4251 matches the variable declaration i. 4252</pre></td></tr> 4253 4254 4255<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> 4256<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 4257member variable template instantiations. 4258 4259Given 4260 template <typename T> class X {}; class A {}; X<A> x; 4261or 4262 template <typename T> class X {}; class A {}; template class X<A>; 4263or 4264 template <typename T> class X {}; class A {}; extern template class X<A>; 4265cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4266 matches the template instantiation of X<A>. 4267 4268But given 4269 template <typename T> class X {}; class A {}; 4270 template <> class X<A> {}; X<A> x; 4271cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4272 does not match, as X<A> is an explicit template specialization. 4273 4274Usable 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>> 4275</pre></td></tr> 4276 4277 4278<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> 4279<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 4280 4281Example matches f, but not g or h. The function i will not match, even when 4282compiled in C mode. 4283 void f(...); 4284 void g(int); 4285 template <typename... Ts> void h(Ts...); 4286 void i(); 4287</pre></td></tr> 4288 4289 4290<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> 4291<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations. 4292 4293Given: 4294 void foo() __attribute__((__weakref__("__foo"))); 4295 void bar(); 4296functionDecl(isWeak()) 4297 matches the weak declaration "foo", but not "bar". 4298</pre></td></tr> 4299 4300 4301<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> 4302<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4303specific parameter count. 4304 4305Given 4306 void f(int i) {} 4307 void g(int i, int j) {} 4308 void h(int i, int j); 4309 void j(int i); 4310 void k(int x, int y, int z, ...); 4311functionDecl(parameterCountIs(2)) 4312 matches g and h 4313functionProtoType(parameterCountIs(2)) 4314 matches g and h 4315functionProtoType(parameterCountIs(3)) 4316 matches k 4317</pre></td></tr> 4318 4319 4320<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> 4321<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 4322 4323Given: 4324 void f(); 4325 void g() noexcept; 4326 void h() noexcept(true); 4327 void i() noexcept(false); 4328 void j() throw(); 4329 void k() throw(int); 4330 void l() throw(...); 4331functionDecl(hasDynamicExceptionSpec()) and 4332 functionProtoType(hasDynamicExceptionSpec()) 4333 match the declarations of j, k, and l, but not f, g, h, or i. 4334</pre></td></tr> 4335 4336 4337<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> 4338<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 4339 4340Given: 4341 void f(); 4342 void g() noexcept; 4343 void h() throw(); 4344 void i() throw(int); 4345 void j() noexcept(false); 4346functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4347 match the declarations of g, and h, but not f, i or j. 4348</pre></td></tr> 4349 4350 4351<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> 4352<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4353specific parameter count. 4354 4355Given 4356 void f(int i) {} 4357 void g(int i, int j) {} 4358 void h(int i, int j); 4359 void j(int i); 4360 void k(int x, int y, int z, ...); 4361functionDecl(parameterCountIs(2)) 4362 matches g and h 4363functionProtoType(parameterCountIs(2)) 4364 matches g and h 4365functionProtoType(parameterCountIs(3)) 4366 matches k 4367</pre></td></tr> 4368 4369 4370<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> 4371<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations, 4372 and if constexpr. 4373 4374Given: 4375 constexpr int foo = 42; 4376 constexpr int bar(); 4377 void baz() { if constexpr(1 > 0) {} } 4378varDecl(isConstexpr()) 4379 matches the declaration of foo. 4380functionDecl(isConstexpr()) 4381 matches the declaration of bar. 4382ifStmt(isConstexpr()) 4383 matches the if statement in baz. 4384</pre></td></tr> 4385 4386 4387<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> 4388<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 4389 4390 4391<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> 4392<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 4393 4394Given 4395 f('false, 3.14, 42); 4396characterLiteral(equals(0)) 4397 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4398 match false 4399floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4400 match 3.14 4401integerLiteral(equals(42)) 4402 matches 42 4403 4404Note that you cannot directly match a negative numeric literal because the 4405minus sign is not part of the literal: It is a unary operator whose operand 4406is the positive numeric literal. Instead, you must use a unaryOperator() 4407matcher to match the minus sign: 4408 4409unaryOperator(hasOperatorName("-"), 4410 hasUnaryOperand(integerLiteral(equals(13)))) 4411 4412Usable 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>>, 4413 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>> 4414</pre></td></tr> 4415 4416 4417<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> 4418<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 4419 4420 4421<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> 4422<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 4423 4424 4425<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> 4426<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 4427to '.'. 4428 4429Member calls on the implicit this pointer match as called with '->'. 4430 4431Given 4432 class Y { 4433 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 4434 template <class T> void f() { this->f<T>(); f<T>(); } 4435 int a; 4436 static int b; 4437 }; 4438 template <class T> 4439 class Z { 4440 void x() { this->m; } 4441 }; 4442memberExpr(isArrow()) 4443 matches this->x, x, y.x, a, this->b 4444cxxDependentScopeMemberExpr(isArrow()) 4445 matches this->m 4446unresolvedMemberExpr(isArrow()) 4447 matches this->f<T>, f<T> 4448</pre></td></tr> 4449 4450 4451<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> 4452<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 4453 4454This matcher is only provided as a performance optimization of hasName. 4455 hasAnyName(a, b, c) 4456 is equivalent to, but faster than 4457 anyOf(hasName(a), hasName(b), hasName(c)) 4458</pre></td></tr> 4459 4460 4461<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> 4462<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 4463 4464Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 4465void f() { 4466 int x; 4467 static int y; 4468} 4469int z; 4470 4471Example matches f() because it has external formal linkage despite being 4472unique to the translation unit as though it has internal likage 4473(matcher = functionDecl(hasExternalFormalLinkage())) 4474 4475namespace { 4476void f() {} 4477} 4478</pre></td></tr> 4479 4480 4481<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> 4482<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 4483 4484Supports specifying enclosing namespaces or classes by prefixing the name 4485with '<enclosing>::'. 4486Does not match typedefs of an underlying type with the given name. 4487 4488Example matches X (Name == "X") 4489 class X; 4490 4491Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 4492 namespace a { namespace b { class X; } } 4493</pre></td></tr> 4494 4495 4496<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> 4497<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 4498a substring matched by the given RegExp. 4499 4500Supports specifying enclosing namespaces or classes by 4501prefixing the name with '<enclosing>::'. Does not match typedefs 4502of an underlying type with the given name. 4503 4504Example matches X (regexp == "::X") 4505 class X; 4506 4507Example matches X (regexp is one of "::X", "^foo::.*X", among others) 4508 namespace foo { namespace bar { class X; } } 4509 4510If the matcher is used in clang-query, RegexFlags parameter 4511should be passed as a quoted string. e.g: "NoFlags". 4512Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4513</pre></td></tr> 4514 4515 4516<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> 4517<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 4518 4519Given 4520 namespace n { 4521 namespace {} // #1 4522 } 4523namespaceDecl(isAnonymous()) will match #1 but not ::n. 4524</pre></td></tr> 4525 4526 4527<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> 4528<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 4529the inline keyword. 4530 4531Given 4532 inline void f(); 4533 void g(); 4534 namespace n { 4535 inline namespace m {} 4536 } 4537functionDecl(isInline()) will match ::f(). 4538namespaceDecl(isInline()) will match n::m. 4539</pre></td></tr> 4540 4541 4542<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> 4543<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind 4544specified. 4545 4546Given 4547 4548 #pragma omp parallel 4549 #pragma omp parallel default(none) 4550 #pragma omp parallel default(shared) 4551 #pragma omp parallel default(firstprivate) 4552 4553``ompDefaultClause(isFirstPrivateKind())`` matches only 4554``default(firstprivate)``. 4555</pre></td></tr> 4556 4557 4558<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> 4559<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified. 4560 4561Given 4562 4563 #pragma omp parallel 4564 #pragma omp parallel default(none) 4565 #pragma omp parallel default(shared) 4566 #pragma omp parallel default(firstprivate) 4567 4568``ompDefaultClause(isNoneKind())`` matches only ``default(none)``. 4569</pre></td></tr> 4570 4571 4572<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> 4573<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified. 4574 4575Given 4576 4577 #pragma omp parallel 4578 #pragma omp parallel default(none) 4579 #pragma omp parallel default(shared) 4580 #pragma omp parallel default(firstprivate) 4581 4582``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``. 4583</pre></td></tr> 4584 4585 4586<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> 4587<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP 4588clause kind. 4589 4590Given 4591 4592 #pragma omp parallel 4593 #pragma omp parallel for 4594 #pragma omp for 4595 4596`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches 4597``omp parallel`` and ``omp parallel for``. 4598 4599If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter 4600should be passed as a quoted string. e.g., 4601``isAllowedToContainClauseKind("OMPC_default").`` 4602</pre></td></tr> 4603 4604 4605<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> 4606<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives, 4607i.e., directives that can't have a structured block. 4608 4609Given 4610 4611 #pragma omp parallel 4612 {} 4613 #pragma omp taskyield 4614 4615``ompExecutableDirective(isStandaloneDirective()))`` matches 4616``omp taskyield``. 4617</pre></td></tr> 4618 4619 4620<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> 4621<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 4622</pre></td></tr> 4623 4624 4625<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> 4626<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 4627</pre></td></tr> 4628 4629 4630<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> 4631<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for 4632isSameOrDerivedFrom(hasName(...)). 4633</pre></td></tr> 4634 4635 4636<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> 4637<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has 4638a specific number of arguments (including absent default arguments). 4639 4640Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 4641 void f(int x, int y); 4642 f(0, 0); 4643</pre></td></tr> 4644 4645 4646<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> 4647<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 4648Selector.getAsString() 4649 4650 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 4651 matches both of the expressions below: 4652 [myObj methodA:argA]; 4653 [myObj methodB:argB]; 4654</pre></td></tr> 4655 4656 4657<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> 4658<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 4659 4660objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 4661message expression in 4662 4663 UIWebView *webView = ...; 4664 CGRect bodyFrame = webView.frame; 4665 bodyFrame.size.height = self.bodyContentHeight; 4666 webView.frame = bodyFrame; 4667 // ^---- matches here 4668</pre></td></tr> 4669 4670 4671<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> 4672<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 4673 4674Matches only when the selector of the objCMessageExpr is NULL. This may 4675represent an error condition in the tree! 4676</pre></td></tr> 4677 4678 4679<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> 4680<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 4681 4682 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 4683 matches the outer message expr in the code below, but NOT the message 4684 invocation for self.bodyView. 4685 [self.bodyView loadHTMLString:html baseURL:NULL]; 4686</pre></td></tr> 4687 4688 4689<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> 4690<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 4691 4692 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 4693 matches self.bodyView in the code below, but NOT the outer message 4694 invocation of "loadHTMLString:baseURL:". 4695 [self.bodyView loadHTMLString:html baseURL:NULL]; 4696</pre></td></tr> 4697 4698 4699<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> 4700<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class. 4701 4702Example 4703matcher = objcMessageExpr(isClassMessage()) 4704matches 4705 [NSString stringWithFormat:@"format"]; 4706but not 4707 NSString *x = @"hello"; 4708 [x containsString:@"h"]; 4709</pre></td></tr> 4710 4711 4712<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> 4713<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance. 4714 4715Example 4716matcher = objcMessageExpr(isInstanceMessage()) 4717matches 4718 NSString *x = @"hello"; 4719 [x containsString:@"h"]; 4720but not 4721 [NSString stringWithFormat:@"format"]; 4722</pre></td></tr> 4723 4724 4725<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> 4726<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 4727a substring matched by the given RegExp. 4728 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 4729 invocation for self.bodyView. 4730 [self.bodyView loadHTMLString:html baseURL:NULL]; 4731 4732If the matcher is used in clang-query, RegexFlags parameter 4733should be passed as a quoted string. e.g: "NoFlags". 4734Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4735</pre></td></tr> 4736 4737 4738<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> 4739<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 4740 4741 matcher = objCMessageExpr(numSelectorArgs(0)); 4742 matches self.bodyView in the code below 4743 4744 matcher = objCMessageExpr(numSelectorArgs(2)); 4745 matches the invocation of "loadHTMLString:baseURL:" but not that 4746 of self.bodyView 4747 [self.bodyView loadHTMLString:html baseURL:NULL]; 4748</pre></td></tr> 4749 4750 4751<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> 4752<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method. 4753 4754Example 4755matcher = objcMethodDecl(isClassMethod()) 4756matches 4757@interface I + (void)foo; @end 4758but not 4759@interface I - (void)bar; @end 4760</pre></td></tr> 4761 4762 4763<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> 4764<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 4765 4766Example matches A, va, fa 4767 class A {}; 4768 class B; // Doesn't match, as it has no body. 4769 int va; 4770 extern int vb; // Doesn't match, as it doesn't define the variable. 4771 void fa() {} 4772 void fb(); // Doesn't match, as it has no body. 4773 @interface X 4774 - (void)ma; // Doesn't match, interface is declaration. 4775 @end 4776 @implementation X 4777 - (void)ma {} 4778 @end 4779 4780Usable 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>>, 4781 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4782</pre></td></tr> 4783 4784 4785<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> 4786<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method. 4787 4788Example 4789matcher = objcMethodDecl(isInstanceMethod()) 4790matches 4791@interface I - (void)bar; @end 4792but not 4793@interface I + (void)foo; @end 4794</pre></td></tr> 4795 4796 4797<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> 4798<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 4799 4800Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 4801void x(int val) {} 4802void y(int val = 0) {} 4803 4804Deprecated. Use hasInitializer() instead to be able to 4805match on the contents of the default argument. For example: 4806 4807void x(int val = 7) {} 4808void y(int val = 42) {} 4809parmVarDecl(hasInitializer(integerLiteral(equals(42)))) 4810 matches the parameter of y 4811 4812A matcher such as 4813 parmVarDecl(hasInitializer(anything())) 4814is equivalent to parmVarDecl(hasDefaultArgument()). 4815</pre></td></tr> 4816 4817 4818<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> 4819<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter 4820list. The parameter list could be that of either a block, function, or 4821objc-method. 4822 4823 4824Given 4825 4826void f(int a, int b, int c) { 4827} 4828 4829``parmVarDecl(isAtPosition(0))`` matches ``int a``. 4830 4831``parmVarDecl(isAtPosition(1))`` matches ``int b``. 4832</pre></td></tr> 4833 4834 4835<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> 4836<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 4837 4838Given 4839 class Y { public: void x(); }; 4840 void z() { Y* y; y->x(); } 4841cxxMemberCallExpr(on(hasType(asString("class Y *")))) 4842 matches y->x() 4843</pre></td></tr> 4844 4845 4846<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> 4847<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 4848 4849Matches a node if it equals the node previously bound to ID. 4850 4851Given 4852 class X { int a; int b; }; 4853cxxRecordDecl( 4854 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4855 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4856 matches the class X, as a and b have the same type. 4857 4858Note that when multiple matches are involved via forEach* matchers, 4859equalsBoundNodes acts as a filter. 4860For example: 4861compoundStmt( 4862 forEachDescendant(varDecl().bind("d")), 4863 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4864will trigger a match for each combination of variable declaration 4865and reference to that variable declaration within a compound statement. 4866</pre></td></tr> 4867 4868 4869<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> 4870<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 4871the node, not hidden within a typedef. 4872 4873Given 4874 typedef const int const_int; 4875 const_int i; 4876 int *const j; 4877 int *volatile k; 4878 int m; 4879varDecl(hasType(hasLocalQualifiers())) matches only j and k. 4880i is const-qualified but the qualifier is not local. 4881</pre></td></tr> 4882 4883 4884<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> 4885<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 4886 4887Given 4888 void a(char); 4889 void b(wchar_t); 4890 void c(double); 4891functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 4892matches "a(char)", "b(wchar_t)", but not "c(double)". 4893</pre></td></tr> 4894 4895 4896<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> 4897<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 4898the Objective-C object pointer type, which is different despite being 4899syntactically similar. 4900 4901Given 4902 int *i = nullptr; 4903 4904 @interface Foo 4905 @end 4906 Foo *f; 4907 4908 int j; 4909varDecl(hasType(isAnyPointer())) 4910 matches "int *i" and "Foo *f", but not "int j". 4911</pre></td></tr> 4912 4913 4914<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> 4915<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 4916include "top-level" const. 4917 4918Given 4919 void a(int); 4920 void b(int const); 4921 void c(const int); 4922 void d(const int*); 4923 void e(int const) {}; 4924functionDecl(hasAnyParameter(hasType(isConstQualified()))) 4925 matches "void b(int const)", "void c(const int)" and 4926 "void e(int const) {}". It does not match d as there 4927 is no top-level const on the parameter type "const int *". 4928</pre></td></tr> 4929 4930 4931<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> 4932<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 4933 4934Given 4935 void a(int); 4936 void b(long); 4937 void c(double); 4938functionDecl(hasAnyParameter(hasType(isInteger()))) 4939matches "a(int)", "b(long)", but not "c(double)". 4940</pre></td></tr> 4941 4942 4943<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> 4944<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 4945 4946Given 4947 void a(int); 4948 void b(unsigned long); 4949 void c(double); 4950functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 4951matches "a(int)", but not "b(unsigned long)" and "c(double)". 4952</pre></td></tr> 4953 4954 4955<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> 4956<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 4957 4958Given 4959 void a(int); 4960 void b(unsigned long); 4961 void c(double); 4962functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 4963matches "b(unsigned long)", but not "a(int)" and "c(double)". 4964</pre></td></tr> 4965 4966 4967<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> 4968<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 4969include "top-level" volatile. 4970 4971Given 4972 void a(int); 4973 void b(int volatile); 4974 void c(volatile int); 4975 void d(volatile int*); 4976 void e(int volatile) {}; 4977functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 4978 matches "void b(int volatile)", "void c(volatile int)" and 4979 "void e(int volatile) {}". It does not match d as there 4980 is no top-level volatile on the parameter type "volatile int *". 4981</pre></td></tr> 4982 4983 4984<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> 4985<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 4986 4987Matches a node if it equals the node previously bound to ID. 4988 4989Given 4990 class X { int a; int b; }; 4991cxxRecordDecl( 4992 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4993 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4994 matches the class X, as a and b have the same type. 4995 4996Note that when multiple matches are involved via forEach* matchers, 4997equalsBoundNodes acts as a filter. 4998For example: 4999compoundStmt( 5000 forEachDescendant(varDecl().bind("d")), 5001 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5002will trigger a match for each combination of variable declaration 5003and reference to that variable declaration within a compound statement. 5004</pre></td></tr> 5005 5006 5007<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> 5008<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 5009 5010Stmt has pointer identity in the AST. 5011</pre></td></tr> 5012 5013 5014<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> 5015<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro. 5016Does not match if only part of the statement is expanded from that macro or 5017if different parts of the the statement are expanded from different 5018appearances of the macro. 5019</pre></td></tr> 5020 5021 5022<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> 5023<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 5024partially matching a given regex. 5025 5026Example matches Y but not X 5027 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5028 #include "ASTMatcher.h" 5029 class X {}; 5030ASTMatcher.h: 5031 class Y {}; 5032 5033Usable 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>> 5034 5035If the matcher is used in clang-query, RegexFlags parameter 5036should be passed as a quoted string. e.g: "NoFlags". 5037Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5038</pre></td></tr> 5039 5040 5041<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> 5042<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 5043 5044Example matches X but not Y 5045 (matcher = cxxRecordDecl(isExpansionInMainFile()) 5046 #include <Y.h> 5047 class X {}; 5048Y.h: 5049 class Y {}; 5050 5051Usable 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>> 5052</pre></td></tr> 5053 5054 5055<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> 5056<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 5057 5058Example matches Y but not X 5059 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5060 #include <SystemHeader.h> 5061 class X {}; 5062SystemHeader.h: 5063 class Y {}; 5064 5065Usable 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>> 5066</pre></td></tr> 5067 5068 5069<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> 5070<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 5071 5072Given 5073 int j; 5074 template<typename T> void A(T t) { T i; j += 42;} 5075 A(0); 5076 A(0U); 5077declStmt(isInTemplateInstantiation()) 5078 matches 'int i;' and 'unsigned i'. 5079unless(stmt(isInTemplateInstantiation())) 5080 will NOT match j += 42; as it's shared between the template definition and 5081 instantiation. 5082</pre></td></tr> 5083 5084 5085<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> 5086<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 5087 5088Given 5089 int a[42]; 5090 int b[2 * 21]; 5091 int c[41], d[43]; 5092 char *s = "abcd"; 5093 wchar_t *ws = L"abcd"; 5094 char *w = "a"; 5095constantArrayType(hasSize(42)) 5096 matches "int a[42]" and "int b[2 * 21]" 5097stringLiteral(hasSize(4)) 5098 matches "abcd", L"abcd" 5099</pre></td></tr> 5100 5101 5102<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> 5103<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class." 5104 5105Example matches C, but not S, U or E. 5106 struct S {}; 5107 class C {}; 5108 union U {}; 5109 enum E {}; 5110</pre></td></tr> 5111 5112 5113<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> 5114<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 5115 5116Example matches A, va, fa 5117 class A {}; 5118 class B; // Doesn't match, as it has no body. 5119 int va; 5120 extern int vb; // Doesn't match, as it doesn't define the variable. 5121 void fa() {} 5122 void fb(); // Doesn't match, as it has no body. 5123 @interface X 5124 - (void)ma; // Doesn't match, interface is declaration. 5125 @end 5126 @implementation X 5127 - (void)ma {} 5128 @end 5129 5130Usable 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>>, 5131 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5132</pre></td></tr> 5133 5134 5135<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> 5136<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum." 5137 5138Example matches E, but not C, S or U. 5139 struct S {}; 5140 class C {}; 5141 union U {}; 5142 enum E {}; 5143</pre></td></tr> 5144 5145 5146<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> 5147<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct." 5148 5149Example matches S, but not C, U or E. 5150 struct S {}; 5151 class C {}; 5152 union U {}; 5153 enum E {}; 5154</pre></td></tr> 5155 5156 5157<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> 5158<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union." 5159 5160Example matches U, but not C, S or E. 5161 struct S {}; 5162 class C {}; 5163 union U {}; 5164 enum E {}; 5165</pre></td></tr> 5166 5167 5168<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> 5169<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 5170 5171Note that 'Value' is a string as the template argument's value is 5172an arbitrary precision integer. 'Value' must be euqal to the canonical 5173representation of that integral value in base 10. 5174 5175Given 5176 template<int T> struct C {}; 5177 C<42> c; 5178classTemplateSpecializationDecl( 5179 hasAnyTemplateArgument(equalsIntegralValue("42"))) 5180 matches the implicit instantiation of C in C<42>. 5181</pre></td></tr> 5182 5183 5184<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> 5185<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 5186 5187Given 5188 template<int T> struct C {}; 5189 C<42> c; 5190classTemplateSpecializationDecl( 5191 hasAnyTemplateArgument(isIntegral())) 5192 matches the implicit instantiation of C in C<42> 5193 with isIntegral() matching 42. 5194</pre></td></tr> 5195 5196 5197<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> 5198<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 5199 5200Given 5201 template<typename T> struct C {}; 5202 C<int> c; 5203classTemplateSpecializationDecl(templateArgumentCountIs(1)) 5204 matches C<int>. 5205</pre></td></tr> 5206 5207 5208<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> 5209<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro. 5210Does not match if only part of the statement is expanded from that macro or 5211if different parts of the the statement are expanded from different 5212appearances of the macro. 5213</pre></td></tr> 5214 5215 5216<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> 5217<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 5218partially matching a given regex. 5219 5220Example matches Y but not X 5221 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5222 #include "ASTMatcher.h" 5223 class X {}; 5224ASTMatcher.h: 5225 class Y {}; 5226 5227Usable 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>> 5228 5229If the matcher is used in clang-query, RegexFlags parameter 5230should be passed as a quoted string. e.g: "NoFlags". 5231Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5232</pre></td></tr> 5233 5234 5235<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> 5236<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 5237 5238Example matches X but not Y 5239 (matcher = cxxRecordDecl(isExpansionInMainFile()) 5240 #include <Y.h> 5241 class X {}; 5242Y.h: 5243 class Y {}; 5244 5245Usable 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>> 5246</pre></td></tr> 5247 5248 5249<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> 5250<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 5251 5252Example matches Y but not X 5253 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5254 #include <SystemHeader.h> 5255 class X {}; 5256SystemHeader.h: 5257 class Y {}; 5258 5259Usable 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>> 5260</pre></td></tr> 5261 5262 5263<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> 5264<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 5265 5266Given 5267 struct S { bool func(); }; 5268functionDecl(returns(booleanType())) 5269 matches "bool func();" 5270</pre></td></tr> 5271 5272 5273<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> 5274<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 5275 5276Matches a node if it equals the node previously bound to ID. 5277 5278Given 5279 class X { int a; int b; }; 5280cxxRecordDecl( 5281 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5282 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5283 matches the class X, as a and b have the same type. 5284 5285Note that when multiple matches are involved via forEach* matchers, 5286equalsBoundNodes acts as a filter. 5287For example: 5288compoundStmt( 5289 forEachDescendant(varDecl().bind("d")), 5290 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5291will trigger a match for each combination of variable declaration 5292and reference to that variable declaration within a compound statement. 5293</pre></td></tr> 5294 5295 5296<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> 5297<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 5298 5299Type has pointer identity in the AST. 5300</pre></td></tr> 5301 5302 5303<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> 5304<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 5305 5306Given 5307 int i; 5308 float f; 5309realFloatingPointType() 5310 matches "float f" but not "int i" 5311</pre></td></tr> 5312 5313 5314<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> 5315<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 5316 5317Given 5318 struct S { void func(); }; 5319functionDecl(returns(voidType())) 5320 matches "void func();" 5321</pre></td></tr> 5322 5323 5324<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> 5325<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 5326 5327Given 5328 int x; 5329 int s = sizeof(x) + alignof(x) 5330unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 5331 matches sizeof(x) 5332 5333If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter 5334should be passed as a quoted string. e.g., ofKind("UETT_SizeOf"). 5335</pre></td></tr> 5336 5337 5338<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName3')"><a name="hasAnyOperatorName3Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 5339<tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the 5340specified names. 5341 5342 hasAnyOperatorName("+", "-") 5343 Is equivalent to 5344 anyOf(hasOperatorName("+"), hasOperatorName("-")) 5345</pre></td></tr> 5346 5347 5348<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName3')"><a name="hasOperatorName3Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 5349<tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or 5350unary). 5351 5352Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 5353 !(a || b) 5354</pre></td></tr> 5355 5356 5357<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> 5358<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed 5359to '.'. 5360 5361Member calls on the implicit this pointer match as called with '->'. 5362 5363Given 5364 class Y { 5365 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 5366 template <class T> void f() { this->f<T>(); f<T>(); } 5367 int a; 5368 static int b; 5369 }; 5370 template <class T> 5371 class Z { 5372 void x() { this->m; } 5373 }; 5374memberExpr(isArrow()) 5375 matches this->x, x, y.x, a, this->b 5376cxxDependentScopeMemberExpr(isArrow()) 5377 matches this->m 5378unresolvedMemberExpr(isArrow()) 5379 matches this->f<T>, f<T> 5380</pre></td></tr> 5381 5382 5383<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> 5384<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 5385 5386Example matches x, but not y, z, or a. 5387(matcher = varDecl(hasAutomaticStorageDuration()) 5388void f() { 5389 int x; 5390 static int y; 5391 thread_local int z; 5392} 5393int a; 5394</pre></td></tr> 5395 5396 5397<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> 5398<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 5399 5400Example matches y and z (matcher = varDecl(hasGlobalStorage()) 5401void f() { 5402 int x; 5403 static int y; 5404} 5405int z; 5406</pre></td></tr> 5407 5408 5409<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> 5410<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 5411non-static local variable. 5412 5413Example matches x (matcher = varDecl(hasLocalStorage()) 5414void f() { 5415 int x; 5416 static int y; 5417} 5418int z; 5419</pre></td></tr> 5420 5421 5422<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> 5423<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 5424It includes the variable declared at namespace scope and those declared 5425with "static" and "extern" storage class specifiers. 5426 5427void f() { 5428 int x; 5429 static int y; 5430 thread_local int z; 5431} 5432int a; 5433static int b; 5434extern int c; 5435varDecl(hasStaticStorageDuration()) 5436 matches the function declaration y, a, b and c. 5437</pre></td></tr> 5438 5439 5440<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> 5441<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 5442 5443Example matches z, but not x, z, or a. 5444(matcher = varDecl(hasThreadStorageDuration()) 5445void f() { 5446 int x; 5447 static int y; 5448 thread_local int z; 5449} 5450int a; 5451</pre></td></tr> 5452 5453 5454<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> 5455<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations, 5456 and if constexpr. 5457 5458Given: 5459 constexpr int foo = 42; 5460 constexpr int bar(); 5461 void baz() { if constexpr(1 > 0) {} } 5462varDecl(isConstexpr()) 5463 matches the declaration of foo. 5464functionDecl(isConstexpr()) 5465 matches the declaration of bar. 5466ifStmt(isConstexpr()) 5467 matches the if statement in baz. 5468</pre></td></tr> 5469 5470 5471<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> 5472<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 5473 5474Example matches A, va, fa 5475 class A {}; 5476 class B; // Doesn't match, as it has no body. 5477 int va; 5478 extern int vb; // Doesn't match, as it doesn't define the variable. 5479 void fa() {} 5480 void fb(); // Doesn't match, as it has no body. 5481 @interface X 5482 - (void)ma; // Doesn't match, interface is declaration. 5483 @end 5484 @implementation X 5485 - (void)ma {} 5486 @end 5487 5488Usable 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>>, 5489 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5490</pre></td></tr> 5491 5492 5493<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> 5494<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 5495a C++ catch block, or an Objective-C statement. 5496 5497Example matches x (matcher = varDecl(isExceptionVariable()) 5498void f(int y) { 5499 try { 5500 } catch (int x) { 5501 } 5502} 5503</pre></td></tr> 5504 5505 5506<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> 5507<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 5508static member variable template instantiations. 5509 5510Given 5511 template<typename T> void A(T t) { } 5512 template<> void A(int N) { } 5513functionDecl(isExplicitTemplateSpecialization()) 5514 matches the specialization A<int>(). 5515 5516Usable 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>> 5517</pre></td></tr> 5518 5519 5520<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> 5521<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 5522 5523Given: 5524 extern "C" void f() {} 5525 extern "C" { void g() {} } 5526 void h() {} 5527 extern "C" int x = 1; 5528 extern "C" int y = 2; 5529 int z = 3; 5530functionDecl(isExternC()) 5531 matches the declaration of f and g, but not the declaration of h. 5532varDecl(isExternC()) 5533 matches the declaration of x and y, but not the declaration of z. 5534</pre></td></tr> 5535 5536 5537<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> 5538<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope. 5539 5540Example matches y (matcher = varDecl(isStaticLocal())) 5541void f() { 5542 int x; 5543 static int y; 5544} 5545static int z; 5546</pre></td></tr> 5547 5548 5549<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> 5550<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage 5551class specifier ("static" keyword) written in the source. 5552 5553Given: 5554 static void f() {} 5555 static int i = 0; 5556 extern int j; 5557 int k; 5558functionDecl(isStaticStorageClass()) 5559 matches the function declaration f. 5560varDecl(isStaticStorageClass()) 5561 matches the variable declaration i. 5562</pre></td></tr> 5563 5564 5565<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> 5566<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 5567member variable template instantiations. 5568 5569Given 5570 template <typename T> class X {}; class A {}; X<A> x; 5571or 5572 template <typename T> class X {}; class A {}; template class X<A>; 5573or 5574 template <typename T> class X {}; class A {}; extern template class X<A>; 5575cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5576 matches the template instantiation of X<A>. 5577 5578But given 5579 template <typename T> class X {}; class A {}; 5580 template <> class X<A> {}; X<A> x; 5581cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5582 does not match, as X<A> is an explicit template specialization. 5583 5584Usable 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>> 5585</pre></td></tr> 5586 5587<!--END_NARROWING_MATCHERS --> 5588</table> 5589 5590<!-- ======================================================================= --> 5591<h2 id="traversal-matchers">AST Traversal Matchers</h2> 5592<!-- ======================================================================= --> 5593 5594<p>Traversal matchers specify the relationship to other nodes that are 5595reachable from the current node.</p> 5596 5597<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 5598forEachDescendant) which work on all nodes and allow users to write more generic 5599match expressions.</p> 5600 5601<table> 5602<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 5603<!-- START_TRAVERSAL_MATCHERS --> 5604 5605<tr><td>Matcher<*></td><td class="name" onclick="toggle('binaryOperation0')"><a name="binaryOperation0Anchor">binaryOperation</a></td><td>Matcher<*>...Matcher<*></td></tr> 5606<tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators. 5607 5608The code 5609 var1 != var2; 5610might be represented in the clang AST as a binaryOperator, a 5611cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on 5612 5613* whether the types of var1 and var2 are fundamental (binaryOperator) or at 5614 least one is a class type (cxxOperatorCallExpr) 5615* whether the code appears in a template declaration, if at least one of the 5616 vars is a dependent-type (binaryOperator) 5617* whether the code relies on a rewritten binary operator, such as a 5618spaceship operator or an inverted equality operator 5619(cxxRewrittenBinaryOperator) 5620 5621This matcher elides details in places where the matchers for the nodes are 5622compatible. 5623 5624Given 5625 binaryOperation( 5626 hasOperatorName("!="), 5627 hasLHS(expr().bind("lhs")), 5628 hasRHS(expr().bind("rhs")) 5629 ) 5630matches each use of "!=" in: 5631 struct S{ 5632 bool operator!=(const S&) const; 5633 }; 5634 5635 void foo() 5636 { 5637 1 != 2; 5638 S() != S(); 5639 } 5640 5641 template<typename T> 5642 void templ() 5643 { 5644 1 != 2; 5645 T() != S(); 5646 } 5647 struct HasOpEq 5648 { 5649 bool operator==(const HasOpEq &) const; 5650 }; 5651 5652 void inverse() 5653 { 5654 HasOpEq s1; 5655 HasOpEq s2; 5656 if (s1 != s2) 5657 return; 5658 } 5659 5660 struct HasSpaceship 5661 { 5662 bool operator<=>(const HasOpEq &) const; 5663 }; 5664 5665 void use_spaceship() 5666 { 5667 HasSpaceship s1; 5668 HasSpaceship s2; 5669 if (s1 != s2) 5670 return; 5671 } 5672</pre></td></tr> 5673 5674 5675<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 5676<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 5677 5678Unlike anyOf, eachOf will generate a match result for each 5679matching submatcher. 5680 5681For example, in: 5682 class A { int a; int b; }; 5683The matcher: 5684 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 5685 has(fieldDecl(hasName("b")).bind("v")))) 5686will generate two results binding "v", the first of which binds 5687the field declaration of a, the second the field declaration of 5688b. 5689 5690Usable as: Any Matcher 5691</pre></td></tr> 5692 5693 5694<tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr> 5695<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 5696 5697Generates results for each match. 5698 5699For example, in: 5700 class A { class B {}; class C {}; }; 5701The matcher: 5702 cxxRecordDecl(hasName("::A"), 5703 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 5704will generate results for A, B and C. 5705 5706Usable as: Any Matcher 5707</pre></td></tr> 5708 5709 5710<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 5711<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5712provided matcher. 5713 5714Example matches X, A, A::X, B, B::C, B::C::X 5715 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 5716 class X {}; 5717 class A { class X {}; }; // Matches A, because A::X is a class of name 5718 // X inside A. 5719 class B { class C { class X {}; }; }; 5720 5721DescendantT must be an AST base type. 5722 5723As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 5724each result that matches instead of only on the first one. 5725 5726Note: Recursively combined ForEachDescendant can cause many matches: 5727 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 5728 forEachDescendant(cxxRecordDecl()) 5729 ))) 5730will match 10 times (plus injected class name matches) on: 5731 class A { class B { class C { class D { class E {}; }; }; }; }; 5732 5733Usable as: Any Matcher 5734</pre></td></tr> 5735 5736 5737<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 5738<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 5739provided matcher. 5740 5741Example matches X, Y, Y::X, Z::Y, Z::Y::X 5742 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 5743 class X {}; 5744 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X 5745 // inside Y. 5746 class Z { class Y { class X {}; }; }; // Does not match Z. 5747 5748ChildT must be an AST base type. 5749 5750As opposed to 'has', 'forEach' will cause a match for each result that 5751matches instead of only on the first one. 5752 5753Usable as: Any Matcher 5754</pre></td></tr> 5755 5756 5757<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 5758<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 5759matcher. 5760 5761Given 5762void f() { if (true) { int x = 42; } } 5763void g() { for (;;) { int x = 43; } } 5764expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 5765 5766Usable as: Any Matcher 5767</pre></td></tr> 5768 5769 5770<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 5771<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5772provided matcher. 5773 5774Example matches X, Y, Z 5775 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 5776 class X {}; // Matches X, because X::X is a class of name X inside X. 5777 class Y { class X {}; }; 5778 class Z { class Y { class X {}; }; }; 5779 5780DescendantT must be an AST base type. 5781 5782Usable as: Any Matcher 5783</pre></td></tr> 5784 5785 5786<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 5787<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 5788provided matcher. 5789 5790Example matches X, Y 5791 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 5792 class X {}; // Matches X, because X::X is a class of name X inside X. 5793 class Y { class X {}; }; 5794 class Z { class Y { class X {}; }; }; // Does not match Z. 5795 5796ChildT must be an AST base type. 5797 5798Usable as: Any Matcher 5799Note that has is direct matcher, so it also matches things like implicit 5800casts and paren casts. If you are matching with expr then you should 5801probably consider using ignoringParenImpCasts like: 5802has(ignoringParenImpCasts(expr())). 5803</pre></td></tr> 5804 5805 5806<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 5807<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 5808matcher. 5809 5810Given 5811void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 5812compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 5813 5814Usable as: Any Matcher 5815</pre></td></tr> 5816 5817 5818<tr><td>Matcher<*></td><td class="name" onclick="toggle('invocation0')"><a name="invocation0Anchor">invocation</a></td><td>Matcher<*>...Matcher<*></td></tr> 5819<tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls 5820 5821Because CallExpr and CXXConstructExpr do not share a common 5822base class with API accessing arguments etc, AST Matchers for code 5823which should match both are typically duplicated. This matcher 5824removes the need for duplication. 5825 5826Given code 5827struct ConstructorTakesInt 5828{ 5829 ConstructorTakesInt(int i) {} 5830}; 5831 5832void callTakesInt(int i) 5833{ 5834} 5835 5836void doCall() 5837{ 5838 callTakesInt(42); 5839} 5840 5841void doConstruct() 5842{ 5843 ConstructorTakesInt cti(42); 5844} 5845 5846The matcher 5847invocation(hasArgument(0, integerLiteral(equals(42)))) 5848matches the expression in both doCall and doConstruct 5849</pre></td></tr> 5850 5851 5852<tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr> 5853<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher. 5854 5855However, optionally will retain any bindings generated by the submatcher. 5856Useful when additional information which may or may not present about a main 5857matching node is desired. 5858 5859For example, in: 5860 class Foo { 5861 int bar; 5862 } 5863The matcher: 5864 cxxRecordDecl( 5865 optionally(has( 5866 fieldDecl(hasName("bar")).bind("var") 5867 ))).bind("record") 5868will produce a result binding for both "record" and "var". 5869The matcher will produce a "record" binding for even if there is no data 5870member named "bar" in that class. 5871 5872Usable as: Any Matcher 5873</pre></td></tr> 5874 5875 5876<tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr> 5877<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind. 5878 5879Given 5880 void foo() 5881 { 5882 int i = 3.0; 5883 } 5884The matcher 5885 traverse(TK_IgnoreUnlessSpelledInSource, 5886 varDecl(hasInitializer(floatLiteral().bind("init"))) 5887 ) 5888matches the variable declaration with "init" bound to the "3.0". 5889</pre></td></tr> 5890 5891 5892<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> 5893<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 5894switch statement or conditional operator. 5895 5896Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5897 if (true) {} 5898</pre></td></tr> 5899 5900 5901<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> 5902<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 5903(binary or ternary). 5904 5905Example matches b 5906 condition ? a : b 5907 condition ?: b 5908</pre></td></tr> 5909 5910 5911<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> 5912<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 5913 5914Example 1 (conditional ternary operator): matches a 5915 condition ? a : b 5916 5917Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 5918 condition ?: b 5919</pre></td></tr> 5920 5921 5922<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> 5923<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 5924matches the given matcher. 5925 5926The associated declaration is: 5927- for type nodes, the declaration of the underlying type 5928- for CallExpr, the declaration of the callee 5929- for MemberExpr, the declaration of the referenced member 5930- for CXXConstructExpr, the declaration of the constructor 5931- for CXXNewExpr, the declaration of the operator new 5932- for ObjCIvarExpr, the declaration of the ivar 5933 5934For type nodes, hasDeclaration will generally match the declaration of the 5935sugared type. Given 5936 class X {}; 5937 typedef X Y; 5938 Y y; 5939in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5940typedefDecl. A common use case is to match the underlying, desugared type. 5941This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5942 varDecl(hasType(hasUnqualifiedDesugaredType( 5943 recordType(hasDeclaration(decl()))))) 5944In this matcher, the decl will match the CXXRecordDecl of class X. 5945 5946Usable 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>>, 5947 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>>, 5948 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>>, 5949 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>>, 5950 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>>, 5951 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>>, 5952 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5953</pre></td></tr> 5954 5955 5956<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> 5957<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 5958 5959Given 5960 int i[5]; 5961 void f() { i[1] = 42; } 5962arraySubscriptExpression(hasBase(implicitCastExpr( 5963 hasSourceExpression(declRefExpr())))) 5964 matches i[1] with the declRefExpr() matching i 5965</pre></td></tr> 5966 5967 5968<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> 5969<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 5970 5971Given 5972 int i[5]; 5973 void f() { i[1] = 42; } 5974arraySubscriptExpression(hasIndex(integerLiteral())) 5975 matches i[1] with the integerLiteral() matching 1 5976</pre></td></tr> 5977 5978 5979<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasLHS3')"><a name="hasLHS3Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5980<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions. 5981 5982Example matches a (matcher = binaryOperator(hasLHS())) 5983 a || b 5984</pre></td></tr> 5985 5986 5987<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasRHS3')"><a name="hasRHS3Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5988<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions. 5989 5990Example matches b (matcher = binaryOperator(hasRHS())) 5991 a || b 5992</pre></td></tr> 5993 5994 5995<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> 5996<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 5997type. 5998 5999Given 6000 struct A {}; 6001 A a[7]; 6002 int b[7]; 6003arrayType(hasElementType(builtinType())) 6004 matches "int b[7]" 6005 6006Usable 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>> 6007</pre></td></tr> 6008 6009 6010<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> 6011<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 6012 6013Given 6014 _Atomic(int) i; 6015 _Atomic(float) f; 6016atomicType(hasValueType(isInteger())) 6017 matches "_Atomic(int) i" 6018 6019Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 6020</pre></td></tr> 6021 6022 6023<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> 6024<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 6025 6026Note: There is no TypeLoc for the deduced type and thus no 6027getDeducedLoc() matcher. 6028 6029Given 6030 auto a = 1; 6031 auto b = 2.0; 6032autoType(hasDeducedType(isInteger())) 6033 matches "auto a" 6034 6035Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 6036</pre></td></tr> 6037 6038 6039<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> 6040<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 6041binary operator matches. 6042</pre></td></tr> 6043 6044 6045<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> 6046<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 6047 6048Example matches a (matcher = binaryOperator(hasLHS())) 6049 a || b 6050</pre></td></tr> 6051 6052 6053<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> 6054<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator. 6055 6056Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6057 integerLiteral(equals(2))) 6058 1 + 2 // Match 6059 2 + 1 // Match 6060 1 + 1 // No match 6061 2 + 2 // No match 6062</pre></td></tr> 6063 6064 6065<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> 6066<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 6067 6068Example matches b (matcher = binaryOperator(hasRHS())) 6069 a || b 6070</pre></td></tr> 6071 6072 6073<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>></td><td class="name" onclick="toggle('forDecomposition0')"><a name="forDecomposition0Anchor">forDecomposition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> InnerMatcher</td></tr> 6074<tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to. 6075 6076For example, in: 6077void foo() 6078{ 6079 int arr[3]; 6080 auto &[f, s, t] = arr; 6081 6082 f = 42; 6083} 6084The matcher: 6085 bindingDecl(hasName("f"), 6086 forDecomposition(decompositionDecl()) 6087matches 'f' in 'auto &[f, s, t]'. 6088</pre></td></tr> 6089 6090 6091<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> 6092<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 6093block. 6094 6095Does not match the 'this' parameter of a method. 6096 6097Given 6098 class X { void f(int x, int y, int z) {} }; 6099cxxMethodDecl(hasAnyParameter(hasName("y"))) 6100 matches f(int x, int y, int z) {} 6101with hasAnyParameter(...) 6102 matching int y 6103 6104For ObjectiveC, given 6105 @interface I - (void) f:(int) y; @end 6106 6107the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 6108matches the declaration of method f with hasParameter 6109matching y. 6110 6111For blocks, given 6112 b = ^(int y) { printf("%d", y) }; 6113 6114the matcher blockDecl(hasAnyParameter(hasName("y"))) 6115matches the declaration of the block b with hasParameter 6116matching y. 6117</pre></td></tr> 6118 6119 6120<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> 6121<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 6122declaration or a block. 6123 6124Given 6125 class X { void f(int x) {} }; 6126cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6127 matches f(int x) {} 6128with hasParameter(...) 6129 matching int x 6130 6131For ObjectiveC, given 6132 @interface I - (void) f:(int) y; @end 6133 6134the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6135matches the declaration of method f with hasParameter 6136matching y. 6137</pre></td></tr> 6138 6139 6140<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</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> 6141<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher. 6142 6143Examples: 6144 int x; 6145declaratorDecl(hasTypeLoc(loc(asString("int")))) 6146 matches int x 6147 6148auto x = int(3); 6149cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6150 matches int(3) 6151 6152struct Foo { Foo(int, int); }; 6153auto x = Foo(1, 2); 6154cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6155 matches Foo(1, 2) 6156 6157Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6158 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6159 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6160 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6161 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6162 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6163 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6164 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6165</pre></td></tr> 6166 6167 6168<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> 6169<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 6170pointee matches a given matcher. 6171 6172Given 6173 int *a; 6174 int const *b; 6175 float const *f; 6176pointerType(pointee(isConstQualified(), isInteger())) 6177 matches "int const *b" 6178 6179Usable 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>>, 6180 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>> 6181</pre></td></tr> 6182 6183 6184<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasTypeLoc1')"><a name="hasTypeLoc1Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6185<tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher. 6186 6187Examples: 6188 int x; 6189declaratorDecl(hasTypeLoc(loc(asString("int")))) 6190 matches int x 6191 6192auto x = int(3); 6193cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6194 matches int(3) 6195 6196struct Foo { Foo(int, int); }; 6197auto x = Foo(1, 2); 6198cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6199 matches Foo(1, 2) 6200 6201Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6202 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6203 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6204 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6205 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6206 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6207 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6208 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6209</pre></td></tr> 6210 6211 6212<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasType8')"><a name="hasType8Anchor">hasType</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="hasType8"><pre>Overloaded to match the declaration of the expression's or value 6214declaration's type. 6215 6216In case of a value declaration (for example a variable declaration), 6217this resolves one layer of indirection. For example, in the value 6218declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6219X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6220declaration of x. 6221 6222Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6223 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6224 and friend class X (matcher = friendDecl(hasType("X")) 6225 and public virtual X (matcher = cxxBaseSpecifier(hasType( 6226 cxxRecordDecl(hasName("X")))) 6227 class X {}; 6228 void y(X &x) { x; X z; } 6229 class Y { friend class X; }; 6230 class Z : public virtual X {}; 6231 6232Example matches class Derived 6233(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6234class Base {}; 6235class Derived : Base {}; 6236 6237Usable 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>>, 6238Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6239</pre></td></tr> 6240 6241 6242<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</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_1QualType.html">QualType</a>> InnerMatcher</td></tr> 6243<tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type 6244matcher. 6245 6246Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6247 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6248 and U (matcher = typedefDecl(hasType(asString("int"))) 6249 and friend class X (matcher = friendDecl(hasType("X")) 6250 and public virtual X (matcher = cxxBaseSpecifier(hasType( 6251 asString("class X"))) 6252 class X {}; 6253 void y(X &x) { x; X z; } 6254 typedef int U; 6255 class Y { friend class X; }; 6256 class Z : public virtual X {}; 6257</pre></td></tr> 6258 6259 6260<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> 6261<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 6262 6263Given 6264 void f(int i); 6265 int y; 6266 f(y); 6267callExpr( 6268 forEachArgumentWithParam( 6269 declRefExpr(to(varDecl(hasName("y")))), 6270 parmVarDecl(hasType(isInteger())) 6271)) 6272 matches f(y); 6273with declRefExpr(...) 6274 matching int y 6275and parmVarDecl(...) 6276 matching int i 6277</pre></td></tr> 6278 6279 6280<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> 6281<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or 6282CXXConstructExpr. It is very similar to forEachArgumentWithParam but 6283it works on calls through function pointers as well. 6284 6285The difference is, that function pointers do not provide access to a 6286ParmVarDecl, but only the QualType for each argument. 6287 6288Given 6289 void f(int i); 6290 int y; 6291 f(y); 6292 void (*f_ptr)(int) = f; 6293 f_ptr(y); 6294callExpr( 6295 forEachArgumentWithParamType( 6296 declRefExpr(to(varDecl(hasName("y")))), 6297 qualType(isInteger()).bind("type) 6298)) 6299 matches f(y) and f_ptr(y) 6300with declRefExpr(...) 6301 matching int y 6302and qualType(...) 6303 matching int 6304</pre></td></tr> 6305 6306 6307<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> 6308<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 6309expression, or an ObjC-message-send expression. 6310 6311Given 6312 void x(int, int, int) { int y; x(1, y, 42); } 6313callExpr(hasAnyArgument(declRefExpr())) 6314 matches x(1, y, 42) 6315with hasAnyArgument(...) 6316 matching y 6317 6318For ObjectiveC, given 6319 @interface I - (void) f:(int) y; @end 6320 void foo(I *i) { [i f:12]; } 6321objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6322 matches [i f:12] 6323</pre></td></tr> 6324 6325 6326<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> 6327<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 6328call expression. 6329 6330Example matches y in x(y) 6331 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6332 void x(int) { int y; x(y); } 6333</pre></td></tr> 6334 6335 6336<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> 6337<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 6338matches the given matcher. 6339 6340The associated declaration is: 6341- for type nodes, the declaration of the underlying type 6342- for CallExpr, the declaration of the callee 6343- for MemberExpr, the declaration of the referenced member 6344- for CXXConstructExpr, the declaration of the constructor 6345- for CXXNewExpr, the declaration of the operator new 6346- for ObjCIvarExpr, the declaration of the ivar 6347 6348For type nodes, hasDeclaration will generally match the declaration of the 6349sugared type. Given 6350 class X {}; 6351 typedef X Y; 6352 Y y; 6353in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6354typedefDecl. A common use case is to match the underlying, desugared type. 6355This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6356 varDecl(hasType(hasUnqualifiedDesugaredType( 6357 recordType(hasDeclaration(decl()))))) 6358In this matcher, the decl will match the CXXRecordDecl of class X. 6359 6360Usable 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>>, 6361 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>>, 6362 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>>, 6363 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>>, 6364 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>>, 6365 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>>, 6366 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6367</pre></td></tr> 6368 6369 6370<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> 6371<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 6372 6373Given 6374 class A { A() : i(42), j(42) {} int i; int j; }; 6375cxxConstructorDecl(forEachConstructorInitializer( 6376 forField(decl().bind("x")) 6377)) 6378 will trigger two matches, binding for 'i' and 'j' respectively. 6379</pre></td></tr> 6380 6381 6382<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> 6383<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 6384 6385Given 6386 struct Foo { 6387 Foo() : foo_(1) { } 6388 int foo_; 6389 }; 6390cxxRecordDecl(has(cxxConstructorDecl( 6391 hasAnyConstructorInitializer(anything()) 6392))) 6393 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 6394</pre></td></tr> 6395 6396 6397<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> 6398<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 6399 6400Given 6401 struct Foo { 6402 Foo() : foo_(1) { } 6403 int foo_; 6404 }; 6405cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6406 forField(hasName("foo_")))))) 6407 matches Foo 6408with forField matching foo_ 6409</pre></td></tr> 6410 6411 6412<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('hasTypeLoc2')"><a name="hasTypeLoc2Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6413<tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher. 6414 6415Examples: 6416 int x; 6417declaratorDecl(hasTypeLoc(loc(asString("int")))) 6418 matches int x 6419 6420auto x = int(3); 6421cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6422 matches int(3) 6423 6424struct Foo { Foo(int, int); }; 6425auto x = Foo(1, 2); 6426cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6427 matches Foo(1, 2) 6428 6429Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6430 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6431 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6432 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6433 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6434 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6435 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6436 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6437</pre></td></tr> 6438 6439 6440<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> 6441<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 6442 6443Given 6444 struct Foo { 6445 Foo() : foo_(1) { } 6446 int foo_; 6447 }; 6448cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6449 withInitializer(integerLiteral(equals(1))))))) 6450 matches Foo 6451with withInitializer matching (1) 6452</pre></td></tr> 6453 6454 6455<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> 6456<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 6457given matcher. Implicit object expressions are included; that is, it matches 6458use of implicit `this`. 6459 6460Given 6461 struct X { 6462 int m; 6463 int f(X x) { x.m; return m; } 6464 }; 6465memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6466 matches `x.m`, but not `m`; however, 6467memberExpr(hasObjectExpression(hasType(pointsTo( 6468 cxxRecordDecl(hasName("X")))))) 6469 matches `m` (aka. `this->m`), but not `x.m`. 6470</pre></td></tr> 6471 6472 6473<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> 6474<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr> 6475 6476 6477<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> 6478<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer. 6479 6480Given: 6481 void foo() { 6482 if (int i = foobar(); i > 0) {} 6483 switch (int i = foobar(); i) {} 6484 for (auto& a = get_range(); auto& x : a) {} 6485 } 6486 void bar() { 6487 if (foobar() > 0) {} 6488 switch (foobar()) {} 6489 for (auto& x : get_range()) {} 6490 } 6491ifStmt(hasInitStatement(anything())) 6492 matches the if statement in foo but not in bar. 6493switchStmt(hasInitStatement(anything())) 6494 matches the switch statement in foo but not in bar. 6495cxxForRangeStmt(hasInitStatement(anything())) 6496 matches the range for statement in foo but not in bar. 6497</pre></td></tr> 6498 6499 6500<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> 6501<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 6502 6503Example: 6504 forStmt(hasLoopVariable(anything())) 6505matches 'int x' in 6506 for (int x : a) { } 6507</pre></td></tr> 6508 6509 6510<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> 6511<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 6512 6513Example: 6514 forStmt(hasRangeInit(anything())) 6515matches 'a' in 6516 for (int x : a) { } 6517</pre></td></tr> 6518 6519 6520<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc3')"><a name="hasTypeLoc3Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6521<tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher. 6522 6523Examples: 6524 int x; 6525declaratorDecl(hasTypeLoc(loc(asString("int")))) 6526 matches int x 6527 6528auto x = int(3); 6529cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6530 matches int(3) 6531 6532struct Foo { Foo(int, int); }; 6533auto x = Foo(1, 2); 6534cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6535 matches Foo(1, 2) 6536 6537Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6538 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6539 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6540 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6541 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6542 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6543 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6544 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6545</pre></td></tr> 6546 6547 6548<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> 6549<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 6550`on`, matches the argument directly without stripping away anything. 6551 6552Given 6553 class Y { public: void m(); }; 6554 Y g(); 6555 class X : public Y { void g(); }; 6556 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 6557cxxMemberCallExpr(onImplicitObjectArgument(hasType( 6558 cxxRecordDecl(hasName("Y"))))) 6559 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 6560cxxMemberCallExpr(on(callExpr())) 6561 does not match `(g()).m()`, because the parens are not ignored. 6562 6563FIXME: Overload to allow directly matching types? 6564</pre></td></tr> 6565 6566 6567<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> 6568<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 6569stripping off any parentheses or implicit casts. 6570 6571Given 6572 class Y { public: void m(); }; 6573 Y g(); 6574 class X : public Y {}; 6575 void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 6576cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 6577 matches `y.m()` and `(g()).m()`. 6578cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 6579 matches `x.m()`. 6580cxxMemberCallExpr(on(callExpr())) 6581 matches `(g()).m()`. 6582 6583FIXME: Overload to allow directly matching types? 6584</pre></td></tr> 6585 6586 6587<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> 6588<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 6589</pre></td></tr> 6590 6591 6592<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> 6593<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 6594matches the InnerMatcher, or is a pointer to a type that matches the 6595InnerMatcher. 6596 6597Given 6598 class Y { public: void m(); }; 6599 class X : public Y { void g(); }; 6600 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 6601cxxMemberCallExpr(thisPointerType(hasDeclaration( 6602 cxxRecordDecl(hasName("Y"))))) 6603 matches `y.m()`, `p->m()` and `x.m()`. 6604cxxMemberCallExpr(thisPointerType(hasDeclaration( 6605 cxxRecordDecl(hasName("X"))))) 6606 matches `x.g()`. 6607</pre></td></tr> 6608 6609 6610<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> 6611<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 6612produce multiple matches. 6613 6614Given 6615 class A { virtual void f(); }; 6616 class B : public A { void f(); }; 6617 class C : public B { void f(); }; 6618cxxMethodDecl(ofClass(hasName("C")), 6619 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6620 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 6621 that B::f is not overridden by C::f). 6622 6623The check can produce multiple matches in case of multiple inheritance, e.g. 6624 class A1 { virtual void f(); }; 6625 class A2 { virtual void f(); }; 6626 class C : public A1, public A2 { void f(); }; 6627cxxMethodDecl(ofClass(hasName("C")), 6628 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6629 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 6630 once with "b" binding "A2::f" and "d" binding "C::f". 6631</pre></td></tr> 6632 6633 6634<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> 6635<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 6636belongs to. 6637 6638FIXME: Generalize this for other kinds of declarations. 6639FIXME: What other kind of declarations would we need to generalize 6640this to? 6641 6642Example matches A() in the last line 6643 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 6644 ofClass(hasName("A")))))) 6645 class A { 6646 public: 6647 A(); 6648 }; 6649 A a = A(); 6650</pre></td></tr> 6651 6652 6653<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> 6654<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments. 6655 6656Given: 6657 MyClass *p1 = new (Storage) MyClass(); 6658cxxNewExpr(hasAnyPlacementArg(anything())) 6659 matches the expression 'new (Storage, 16) MyClass()'. 6660</pre></td></tr> 6661 6662 6663<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> 6664<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 6665 6666Given: 6667 MyClass *p1 = new MyClass[10]; 6668cxxNewExpr(hasArraySize(integerLiteral(equals(10)))) 6669 matches the expression 'new MyClass[10]'. 6670</pre></td></tr> 6671 6672 6673<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> 6674<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 6675matches the given matcher. 6676 6677The associated declaration is: 6678- for type nodes, the declaration of the underlying type 6679- for CallExpr, the declaration of the callee 6680- for MemberExpr, the declaration of the referenced member 6681- for CXXConstructExpr, the declaration of the constructor 6682- for CXXNewExpr, the declaration of the operator new 6683- for ObjCIvarExpr, the declaration of the ivar 6684 6685For type nodes, hasDeclaration will generally match the declaration of the 6686sugared type. Given 6687 class X {}; 6688 typedef X Y; 6689 Y y; 6690in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6691typedefDecl. A common use case is to match the underlying, desugared type. 6692This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6693 varDecl(hasType(hasUnqualifiedDesugaredType( 6694 recordType(hasDeclaration(decl()))))) 6695In this matcher, the decl will match the CXXRecordDecl of class X. 6696 6697Usable 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>>, 6698 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>>, 6699 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>>, 6700 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>>, 6701 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>>, 6702 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>>, 6703 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6704</pre></td></tr> 6705 6706 6707<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> 6708<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments. 6709 6710Given: 6711 MyClass *p1 = new (Storage, 16) MyClass(); 6712cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16)))) 6713 matches the expression 'new (Storage, 16) MyClass()'. 6714</pre></td></tr> 6715 6716 6717<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc4')"><a name="hasTypeLoc4Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6718<tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher. 6719 6720Examples: 6721 int x; 6722declaratorDecl(hasTypeLoc(loc(asString("int")))) 6723 matches int x 6724 6725auto x = int(3); 6726cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6727 matches int(3) 6728 6729struct Foo { Foo(int, int); }; 6730auto x = Foo(1, 2); 6731cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6732 matches Foo(1, 2) 6733 6734Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6735 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6736 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6737 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6738 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6739 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6740 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6741 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6742</pre></td></tr> 6743 6744 6745<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasEitherOperand1')"><a name="hasEitherOperand1Anchor">hasEitherOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6746<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a 6747binary operator matches. 6748</pre></td></tr> 6749 6750 6751<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</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> 6752<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 6753 6754Example matches a (matcher = binaryOperator(hasLHS())) 6755 a || b 6756</pre></td></tr> 6757 6758 6759<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOperands1')"><a name="hasOperands1Anchor">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> 6760<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator. 6761 6762Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6763 integerLiteral(equals(2))) 6764 1 + 2 // Match 6765 2 + 1 // Match 6766 1 + 1 // No match 6767 2 + 2 // No match 6768</pre></td></tr> 6769 6770 6771<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</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> 6772<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 6773 6774Example matches b (matcher = binaryOperator(hasRHS())) 6775 a || b 6776</pre></td></tr> 6777 6778 6779<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasUnaryOperand1')"><a name="hasUnaryOperand1Anchor">hasUnaryOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6780<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches. 6781 6782Example matches true (matcher = hasUnaryOperand( 6783 cxxBoolLiteral(equals(true)))) 6784 !true 6785</pre></td></tr> 6786 6787 6788<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> 6789<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher. 6790 6791Example: 6792matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6793 class Foo; 6794 class Bar : Foo {}; 6795 class Baz : Bar {}; 6796 class SpecialBase; 6797 class Proxy : SpecialBase {}; // matches Proxy 6798 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived 6799 6800FIXME: Refactor this and isDerivedFrom to reuse implementation. 6801</pre></td></tr> 6802 6803 6804<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> 6805<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher. 6806 6807Example: 6808matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6809 class Foo; 6810 class Bar : Foo {}; 6811 class Baz : Bar {}; 6812 class SpecialBase; 6813 class Proxy : SpecialBase {}; // matches Proxy 6814 class IndirectlyDerived : Proxy {}; // doesn't match 6815</pre></td></tr> 6816 6817 6818<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> 6819<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 6820 6821Given: 6822 class A { void func(); }; 6823 class B { void member(); }; 6824 6825cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 6826A but not B. 6827</pre></td></tr> 6828 6829 6830<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> 6831<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class 6832matching Base, or Objective-C classes that directly or indirectly 6833subclass a class matching Base. 6834 6835Note that a class is not considered to be derived from itself. 6836 6837Example matches Y, Z, C (Base == hasName("X")) 6838 class X; 6839 class Y : public X {}; // directly derived 6840 class Z : public Y {}; // indirectly derived 6841 typedef X A; 6842 typedef A B; 6843 class C : public B {}; // derived from a typedef of X 6844 6845In the following example, Bar matches isDerivedFrom(hasName("X")): 6846 class Foo; 6847 typedef Foo X; 6848 class Bar : public Foo {}; // derived from a type that X is a typedef of 6849 6850In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 6851 @interface NSObject @end 6852 @interface Bar : NSObject @end 6853 6854Usable 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>> 6855</pre></td></tr> 6856 6857 6858<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> 6859<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class 6860matching Base. 6861 6862Note that a class is not considered to be derived from itself. 6863 6864Example matches Y, C (Base == hasName("X")) 6865 class X; 6866 class Y : public X {}; // directly derived 6867 class Z : public Y {}; // indirectly derived 6868 typedef X A; 6869 typedef A B; 6870 class C : public B {}; // derived from a typedef of X 6871 6872In the following example, Bar matches isDerivedFrom(hasName("X")): 6873 class Foo; 6874 typedef Foo X; 6875 class Bar : public Foo {}; // derived from a type that X is a typedef of 6876</pre></td></tr> 6877 6878 6879<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> 6880<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 6881match Base. 6882</pre></td></tr> 6883 6884 6885<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasEitherOperand2')"><a name="hasEitherOperand2Anchor">hasEitherOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6886<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a 6887binary operator matches. 6888</pre></td></tr> 6889 6890 6891<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasLHS2')"><a name="hasLHS2Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6892<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions. 6893 6894Example matches a (matcher = binaryOperator(hasLHS())) 6895 a || b 6896</pre></td></tr> 6897 6898 6899<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasOperands2')"><a name="hasOperands2Anchor">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> 6900<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator. 6901 6902Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6903 integerLiteral(equals(2))) 6904 1 + 2 // Match 6905 2 + 1 // Match 6906 1 + 1 // No match 6907 2 + 2 // No match 6908</pre></td></tr> 6909 6910 6911<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasRHS2')"><a name="hasRHS2Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6912<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions. 6913 6914Example matches b (matcher = binaryOperator(hasRHS())) 6915 a || b 6916</pre></td></tr> 6917 6918 6919<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc5')"><a name="hasTypeLoc5Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6920<tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher. 6921 6922Examples: 6923 int x; 6924declaratorDecl(hasTypeLoc(loc(asString("int")))) 6925 matches int x 6926 6927auto x = int(3); 6928cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6929 matches int(3) 6930 6931struct Foo { Foo(int, int); }; 6932auto x = Foo(1, 2); 6933cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6934 matches Foo(1, 2) 6935 6936Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6937 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6938 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6939 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6940 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6941 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6942 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6943 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6944</pre></td></tr> 6945 6946 6947<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> 6948<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 6949expression, or an ObjC-message-send expression. 6950 6951Given 6952 void x(int, int, int) { int y; x(1, y, 42); } 6953callExpr(hasAnyArgument(declRefExpr())) 6954 matches x(1, y, 42) 6955with hasAnyArgument(...) 6956 matching y 6957 6958For ObjectiveC, given 6959 @interface I - (void) f:(int) y; @end 6960 void foo(I *i) { [i f:12]; } 6961objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6962 matches [i f:12] 6963</pre></td></tr> 6964 6965 6966<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> 6967<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 6968call expression. 6969 6970Example matches y in x(y) 6971 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6972 void x(int) { int y; x(y); } 6973</pre></td></tr> 6974 6975 6976<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc6')"><a name="hasTypeLoc6Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6977<tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher. 6978 6979Examples: 6980 int x; 6981declaratorDecl(hasTypeLoc(loc(asString("int")))) 6982 matches int x 6983 6984auto x = int(3); 6985cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6986 matches int(3) 6987 6988struct Foo { Foo(int, int); }; 6989auto x = Foo(1, 2); 6990cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6991 matches Foo(1, 2) 6992 6993Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6994 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6995 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6996 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6997 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6998 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6999 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7000 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7001</pre></td></tr> 7002 7003 7004<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> 7005<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 7006given matcher. 7007 7008Example matches y.x() (matcher = callExpr(callee( 7009 cxxMethodDecl(hasName("x"))))) 7010 class Y { public: void x(); }; 7011 void z() { Y y; y.x(); } 7012</pre></td></tr> 7013 7014 7015<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> 7016<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 7017 7018Given 7019 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 7020 void f() { f(); } 7021callExpr(callee(expr())) 7022 matches this->x(), x(), y.x(), f() 7023with callee(...) 7024 matching this->x, x, y.x, f respectively 7025 7026Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 7027because this introduces ambiguous overloads with calls to Callee taking a 7028internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 7029implemented in terms of implicit casts. 7030</pre></td></tr> 7031 7032 7033<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> 7034<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 7035 7036Given 7037 void f(int i); 7038 int y; 7039 f(y); 7040callExpr( 7041 forEachArgumentWithParam( 7042 declRefExpr(to(varDecl(hasName("y")))), 7043 parmVarDecl(hasType(isInteger())) 7044)) 7045 matches f(y); 7046with declRefExpr(...) 7047 matching int y 7048and parmVarDecl(...) 7049 matching int i 7050</pre></td></tr> 7051 7052 7053<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> 7054<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or 7055CXXConstructExpr. It is very similar to forEachArgumentWithParam but 7056it works on calls through function pointers as well. 7057 7058The difference is, that function pointers do not provide access to a 7059ParmVarDecl, but only the QualType for each argument. 7060 7061Given 7062 void f(int i); 7063 int y; 7064 f(y); 7065 void (*f_ptr)(int) = f; 7066 f_ptr(y); 7067callExpr( 7068 forEachArgumentWithParamType( 7069 declRefExpr(to(varDecl(hasName("y")))), 7070 qualType(isInteger()).bind("type) 7071)) 7072 matches f(y) and f_ptr(y) 7073with declRefExpr(...) 7074 matching int y 7075and qualType(...) 7076 matching int 7077</pre></td></tr> 7078 7079 7080<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> 7081<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 7082expression, or an ObjC-message-send expression. 7083 7084Given 7085 void x(int, int, int) { int y; x(1, y, 42); } 7086callExpr(hasAnyArgument(declRefExpr())) 7087 matches x(1, y, 42) 7088with hasAnyArgument(...) 7089 matching y 7090 7091For ObjectiveC, given 7092 @interface I - (void) f:(int) y; @end 7093 void foo(I *i) { [i f:12]; } 7094objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 7095 matches [i f:12] 7096</pre></td></tr> 7097 7098 7099<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> 7100<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 7101call expression. 7102 7103Example matches y in x(y) 7104 (matcher = callExpr(hasArgument(0, declRefExpr()))) 7105 void x(int) { int y; x(y); } 7106</pre></td></tr> 7107 7108 7109<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> 7110<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 7111matches the given matcher. 7112 7113The associated declaration is: 7114- for type nodes, the declaration of the underlying type 7115- for CallExpr, the declaration of the callee 7116- for MemberExpr, the declaration of the referenced member 7117- for CXXConstructExpr, the declaration of the constructor 7118- for CXXNewExpr, the declaration of the operator new 7119- for ObjCIvarExpr, the declaration of the ivar 7120 7121For type nodes, hasDeclaration will generally match the declaration of the 7122sugared type. Given 7123 class X {}; 7124 typedef X Y; 7125 Y y; 7126in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7127typedefDecl. A common use case is to match the underlying, desugared type. 7128This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7129 varDecl(hasType(hasUnqualifiedDesugaredType( 7130 recordType(hasDeclaration(decl()))))) 7131In this matcher, the decl will match the CXXRecordDecl of class X. 7132 7133Usable 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>>, 7134 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>>, 7135 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>>, 7136 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>>, 7137 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>>, 7138 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>>, 7139 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7140</pre></td></tr> 7141 7142 7143<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> 7144<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 7145extension, matches the constant given in the statement. 7146 7147Given 7148 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 7149caseStmt(hasCaseConstant(integerLiteral())) 7150 matches "case 1:" 7151</pre></td></tr> 7152 7153 7154<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> 7155<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 7156or opaque value's source expression matches the given matcher. 7157 7158Example 1: matches "a string" 7159(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 7160class URL { URL(string); }; 7161URL url = "a string"; 7162 7163Example 2: matches 'b' (matcher = 7164opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 7165int a = b ?: 1; 7166</pre></td></tr> 7167 7168 7169<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> 7170<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7171functionDecl that have at least one TemplateArgument matching the given 7172InnerMatcher. 7173 7174Given 7175 template<typename T> class A {}; 7176 template<> class A<double> {}; 7177 A<int> a; 7178 7179 template<typename T> f() {}; 7180 void func() { f<int>(); }; 7181 7182classTemplateSpecializationDecl(hasAnyTemplateArgument( 7183 refersToType(asString("int")))) 7184 matches the specialization A<int> 7185 7186functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7187 matches the specialization f<int> 7188</pre></td></tr> 7189 7190 7191<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> 7192<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 7193 7194Given 7195 template<typename T> class A {}; #1 7196 template<> class A<int> {}; #2 7197classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 7198 matches '#2' with classTemplateDecl() matching the class template 7199 declaration of 'A' at #1. 7200</pre></td></tr> 7201 7202 7203<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> 7204<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7205functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7206 7207Given 7208 template<typename T, typename U> class A {}; 7209 A<bool, int> b; 7210 A<int, bool> c; 7211 7212 template<typename T> void f() {} 7213 void func() { f<int>(); }; 7214classTemplateSpecializationDecl(hasTemplateArgument( 7215 1, refersToType(asString("int")))) 7216 matches the specialization A<bool, int> 7217 7218functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7219 matches the specialization f<int> 7220</pre></td></tr> 7221 7222 7223<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc7')"><a name="hasTypeLoc7Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7224<tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher. 7225 7226Examples: 7227 int x; 7228declaratorDecl(hasTypeLoc(loc(asString("int")))) 7229 matches int x 7230 7231auto x = int(3); 7232cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7233 matches int(3) 7234 7235struct Foo { Foo(int, int); }; 7236auto x = Foo(1, 2); 7237cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7238 matches Foo(1, 2) 7239 7240Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7241 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7242 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7243 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7244 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7245 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7246 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7247 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7248</pre></td></tr> 7249 7250 7251<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> 7252<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 7253type. 7254 7255Given 7256 struct A {}; 7257 A a[7]; 7258 int b[7]; 7259arrayType(hasElementType(builtinType())) 7260 matches "int b[7]" 7261 7262Usable 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>> 7263</pre></td></tr> 7264 7265 7266<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc8')"><a name="hasTypeLoc8Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7267<tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher. 7268 7269Examples: 7270 int x; 7271declaratorDecl(hasTypeLoc(loc(asString("int")))) 7272 matches int x 7273 7274auto x = int(3); 7275cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7276 matches int(3) 7277 7278struct Foo { Foo(int, int); }; 7279auto x = Foo(1, 2); 7280cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7281 matches Foo(1, 2) 7282 7283Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7284 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7285 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7286 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7287 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7288 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7289 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7290 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7291</pre></td></tr> 7292 7293 7294<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> 7295<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 7296a given matcher. Also matches StmtExprs that have CompoundStmt as children. 7297 7298Given 7299 { {}; 1+2; } 7300hasAnySubstatement(compoundStmt()) 7301 matches '{ {}; 1+2; }' 7302with compoundStmt() 7303 matching '{}' 7304</pre></td></tr> 7305 7306 7307<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> 7308<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher 7309</pre></td></tr> 7310 7311 7312<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> 7313<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 7314matches the given matcher. 7315 7316The associated declaration is: 7317- for type nodes, the declaration of the underlying type 7318- for CallExpr, the declaration of the callee 7319- for MemberExpr, the declaration of the referenced member 7320- for CXXConstructExpr, the declaration of the constructor 7321- for CXXNewExpr, the declaration of the operator new 7322- for ObjCIvarExpr, the declaration of the ivar 7323 7324For type nodes, hasDeclaration will generally match the declaration of the 7325sugared type. Given 7326 class X {}; 7327 typedef X Y; 7328 Y y; 7329in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7330typedefDecl. A common use case is to match the underlying, desugared type. 7331This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7332 varDecl(hasType(hasUnqualifiedDesugaredType( 7333 recordType(hasDeclaration(decl()))))) 7334In this matcher, the decl will match the CXXRecordDecl of class X. 7335 7336Usable 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>>, 7337 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>>, 7338 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>>, 7339 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>>, 7340 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>>, 7341 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>>, 7342 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7343</pre></td></tr> 7344 7345 7346<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> 7347<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 7348specific using shadow declaration. 7349 7350Given 7351 namespace a { void f() {} } 7352 using a::f; 7353 void g() { 7354 f(); // Matches this .. 7355 a::f(); // .. but not this. 7356 } 7357declRefExpr(throughUsingDecl(anything())) 7358 matches f() 7359</pre></td></tr> 7360 7361 7362<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> 7363<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 7364specified matcher. 7365 7366Example matches x in if(x) 7367 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 7368 bool x; 7369 if (x) {} 7370</pre></td></tr> 7371 7372 7373<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> 7374<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 7375 7376Note that this does not work for global declarations because the AST 7377breaks up multiple-declaration DeclStmt's into multiple single-declaration 7378DeclStmt's. 7379Example: Given non-global declarations 7380 int a, b = 0; 7381 int c; 7382 int d = 2, e; 7383declStmt(containsDeclaration( 7384 0, varDecl(hasInitializer(anything())))) 7385 matches only 'int d = 2, e;', and 7386declStmt(containsDeclaration(1, varDecl())) 7387 matches 'int a, b = 0' as well as 'int d = 2, e;' 7388 but 'int c;' is not matched. 7389</pre></td></tr> 7390 7391 7392<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> 7393<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 7394 7395Given 7396 int a, b; 7397 int c; 7398declStmt(hasSingleDecl(anything())) 7399 matches 'int c;' but not 'int a, b;'. 7400</pre></td></tr> 7401 7402 7403<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc9')"><a name="hasTypeLoc9Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7404<tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher. 7405 7406Examples: 7407 int x; 7408declaratorDecl(hasTypeLoc(loc(asString("int")))) 7409 matches int x 7410 7411auto x = int(3); 7412cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7413 matches int(3) 7414 7415struct Foo { Foo(int, int); }; 7416auto x = Foo(1, 2); 7417cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7418 matches Foo(1, 2) 7419 7420Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7421 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7422 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7423 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7424 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7425 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7426 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7427 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7428</pre></td></tr> 7429 7430 7431<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> 7432<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 7433Decl, matches InnerMatcher. 7434 7435Given 7436 namespace N { 7437 namespace M { 7438 class D {}; 7439 } 7440 } 7441 7442cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 7443declaration of class D. 7444</pre></td></tr> 7445 7446 7447<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> 7448<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type. 7449 7450Given 7451 decltype(1) a = 1; 7452 decltype(2.0) b = 2.0; 7453decltypeType(hasUnderlyingType(isInteger())) 7454 matches the type of "a" 7455 7456Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>> 7457</pre></td></tr> 7458 7459 7460<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>></td><td class="name" onclick="toggle('hasAnyBinding0')"><a name="hasAnyBinding0Anchor">hasAnyBinding</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>> InnerMatcher</td></tr> 7461<tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl. 7462 7463For example, in: 7464void foo() 7465{ 7466 int arr[3]; 7467 auto &[f, s, t] = arr; 7468 7469 f = 42; 7470} 7471The matcher: 7472 decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding")))) 7473matches the decomposition decl with 'f' bound to "fBinding". 7474</pre></td></tr> 7475 7476 7477<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>></td><td class="name" onclick="toggle('hasBinding0')"><a name="hasBinding0Anchor">hasBinding</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>> InnerMatcher</td></tr> 7478<tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl. 7479 7480For example, in: 7481void foo() 7482{ 7483 int arr[3]; 7484 auto &[f, s, t] = arr; 7485 7486 f = 42; 7487} 7488The matcher: 7489 decompositionDecl(hasBinding(0, 7490 bindingDecl(hasName("f").bind("fBinding")))) 7491matches the decomposition decl with 'f' bound to "fBinding". 7492</pre></td></tr> 7493 7494 7495<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> 7496<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr> 7497 7498 7499<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> 7500<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 7501switch statement or conditional operator. 7502 7503Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7504 if (true) {} 7505</pre></td></tr> 7506 7507 7508<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> 7509<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 7510matches InnerMatcher if the qualifier exists. 7511 7512Given 7513 namespace N { 7514 namespace M { 7515 class D {}; 7516 } 7517 } 7518 N::M::D d; 7519 7520elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 7521matches the type of the variable declaration of d. 7522</pre></td></tr> 7523 7524 7525<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> 7526<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 7527 7528Given 7529 namespace N { 7530 namespace M { 7531 class D {}; 7532 } 7533 } 7534 N::M::D d; 7535 7536elaboratedType(namesType(recordType( 7537hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 7538declaration of d. 7539</pre></td></tr> 7540 7541 7542<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> 7543<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 7544matches the given matcher. 7545 7546The associated declaration is: 7547- for type nodes, the declaration of the underlying type 7548- for CallExpr, the declaration of the callee 7549- for MemberExpr, the declaration of the referenced member 7550- for CXXConstructExpr, the declaration of the constructor 7551- for CXXNewExpr, the declaration of the operator new 7552- for ObjCIvarExpr, the declaration of the ivar 7553 7554For type nodes, hasDeclaration will generally match the declaration of the 7555sugared type. Given 7556 class X {}; 7557 typedef X Y; 7558 Y y; 7559in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7560typedefDecl. A common use case is to match the underlying, desugared type. 7561This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7562 varDecl(hasType(hasUnqualifiedDesugaredType( 7563 recordType(hasDeclaration(decl()))))) 7564In this matcher, the decl will match the CXXRecordDecl of class X. 7565 7566Usable 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>>, 7567 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>>, 7568 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>>, 7569 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>>, 7570 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>>, 7571 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>>, 7572 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7573</pre></td></tr> 7574 7575 7576<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> 7577<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 7578 7579(Note: Clang's AST refers to other conversions as "casts" too, and calls 7580actual casts "explicit" casts.) 7581</pre></td></tr> 7582 7583 7584<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc10')"><a name="hasTypeLoc10Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7585<tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher. 7586 7587Examples: 7588 int x; 7589declaratorDecl(hasTypeLoc(loc(asString("int")))) 7590 matches int x 7591 7592auto x = int(3); 7593cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7594 matches int(3) 7595 7596struct Foo { Foo(int, int); }; 7597auto x = Foo(1, 2); 7598cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7599 matches Foo(1, 2) 7600 7601Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7602 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7603 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7604 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7605 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7606 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7607 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7608 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7609</pre></td></tr> 7610 7611 7612<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</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> 7613<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 7614declaration's type. 7615 7616In case of a value declaration (for example a variable declaration), 7617this resolves one layer of indirection. For example, in the value 7618declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7619X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7620declaration of x. 7621 7622Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7623 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7624 and friend class X (matcher = friendDecl(hasType("X")) 7625 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7626 cxxRecordDecl(hasName("X")))) 7627 class X {}; 7628 void y(X &x) { x; X z; } 7629 class Y { friend class X; }; 7630 class Z : public virtual X {}; 7631 7632Example matches class Derived 7633(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7634class Base {}; 7635class Derived : Base {}; 7636 7637Usable 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>>, 7638Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7639</pre></td></tr> 7640 7641 7642<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> 7643<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 7644matcher. 7645 7646Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7647 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7648 and U (matcher = typedefDecl(hasType(asString("int"))) 7649 and friend class X (matcher = friendDecl(hasType("X")) 7650 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7651 asString("class X"))) 7652 class X {}; 7653 void y(X &x) { x; X z; } 7654 typedef int U; 7655 class Y { friend class X; }; 7656 class Z : public virtual X {}; 7657</pre></td></tr> 7658 7659 7660<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> 7661<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 7662elidable constructor and other corresponding bookkeeping nodes. 7663 7664In C++17, elidable copy constructors are no longer being generated in the 7665AST as it is not permitted by the standard. They are, however, part of the 7666AST in C++14 and earlier. So, a matcher must abstract over these differences 7667to work in all language modes. This matcher skips elidable constructor-call 7668AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 7669various implicit nodes inside the constructor calls, all of which will not 7670appear in the C++17 AST. 7671 7672Given 7673 7674struct H {}; 7675H G(); 7676void f() { 7677 H D = G(); 7678} 7679 7680``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 7681matches ``H D = G()`` in C++11 through C++17 (and beyond). 7682</pre></td></tr> 7683 7684 7685<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> 7686<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 7687are stripped off. 7688 7689Parentheses and explicit casts are not discarded. 7690Given 7691 int arr[5]; 7692 int a = 0; 7693 char b = 0; 7694 const int c = a; 7695 int *d = arr; 7696 long e = (long) 0l; 7697The matchers 7698 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 7699 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 7700would match the declarations for a, b, c, and d, but not e. 7701While 7702 varDecl(hasInitializer(integerLiteral())) 7703 varDecl(hasInitializer(declRefExpr())) 7704only match the declarations for b, c, and d. 7705</pre></td></tr> 7706 7707 7708<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> 7709<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 7710nodes are stripped off. 7711 7712Parentheses and explicit casts are not discarded. 7713Given 7714 class C {}; 7715 C a = C(); 7716 C b; 7717 C c = b; 7718The matchers 7719 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 7720would match the declarations for a, b, and c. 7721While 7722 varDecl(hasInitializer(cxxConstructExpr())) 7723only match the declarations for b and c. 7724</pre></td></tr> 7725 7726 7727<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> 7728<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 7729casts are stripped off. 7730 7731Implicit and non-C Style casts are also discarded. 7732Given 7733 int a = 0; 7734 char b = (0); 7735 void* c = reinterpret_cast<char*>(0); 7736 char d = char(0); 7737The matcher 7738 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 7739would match the declarations for a, b, c, and d. 7740while 7741 varDecl(hasInitializer(integerLiteral())) 7742only match the declaration for a. 7743</pre></td></tr> 7744 7745 7746<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> 7747<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 7748parentheses are stripped off. 7749 7750Explicit casts are not discarded. 7751Given 7752 int arr[5]; 7753 int a = 0; 7754 char b = (0); 7755 const int c = a; 7756 int *d = (arr); 7757 long e = ((long) 0l); 7758The matchers 7759 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 7760 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 7761would match the declarations for a, b, c, and d, but not e. 7762while 7763 varDecl(hasInitializer(integerLiteral())) 7764 varDecl(hasInitializer(declRefExpr())) 7765would only match the declaration for a. 7766</pre></td></tr> 7767 7768 7769<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> 7770<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 7771 7772Given 7773 const char* str = ("my-string"); 7774The matcher 7775 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 7776would match the implicit cast resulting from the assignment. 7777</pre></td></tr> 7778 7779 7780<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> 7781<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 7782 7783Given 7784 class C { 7785 int a = 2; 7786 int b = 3; 7787 int c; 7788 }; 7789fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 7790 matches 'int a;' but not 'int b;'. 7791fieldDecl(hasInClassInitializer(anything())) 7792 matches 'int a;' and 'int b;' but not 'int c;'. 7793</pre></td></tr> 7794 7795 7796<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> 7797<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr> 7798 7799 7800<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> 7801<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 7802switch statement or conditional operator. 7803 7804Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7805 if (true) {} 7806</pre></td></tr> 7807 7808 7809<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> 7810<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 7811 7812Example: 7813 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 7814matches '++x' in 7815 for (x; x < N; ++x) { } 7816</pre></td></tr> 7817 7818 7819<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> 7820<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 7821 7822Example: 7823 forStmt(hasLoopInit(declStmt())) 7824matches 'int x = 0' in 7825 for (int x = 0; x < N; ++x) { } 7826</pre></td></tr> 7827 7828 7829<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</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> 7830<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 7831declaration's type. 7832 7833In case of a value declaration (for example a variable declaration), 7834this resolves one layer of indirection. For example, in the value 7835declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7836X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7837declaration of x. 7838 7839Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7840 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7841 and friend class X (matcher = friendDecl(hasType("X")) 7842 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7843 cxxRecordDecl(hasName("X")))) 7844 class X {}; 7845 void y(X &x) { x; X z; } 7846 class Y { friend class X; }; 7847 class Z : public virtual X {}; 7848 7849Example matches class Derived 7850(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7851class Base {}; 7852class Derived : Base {}; 7853 7854Usable 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>>, 7855Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7856</pre></td></tr> 7857 7858 7859<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> 7860<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 7861matcher. 7862 7863Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7864 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7865 and U (matcher = typedefDecl(hasType(asString("int"))) 7866 and friend class X (matcher = friendDecl(hasType("X")) 7867 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7868 asString("class X"))) 7869 class X {}; 7870 void y(X &x) { x; X z; } 7871 typedef int U; 7872 class Y { friend class X; }; 7873 class Z : public virtual X {}; 7874</pre></td></tr> 7875 7876 7877<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> 7878<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST. 7879Note that this matcher matches all the declarations of a function whose 7880body is present in the AST. 7881 7882Given 7883 void f(); 7884 void f() {} 7885 void g(); 7886functionDecl(hasAnyBody(compoundStmt())) 7887 matches both 'void f();' 7888 and 'void f() {}' 7889with compoundStmt() 7890 matching '{}' 7891 but does not match 'void g();' 7892</pre></td></tr> 7893 7894 7895<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> 7896<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 7897block. 7898 7899Does not match the 'this' parameter of a method. 7900 7901Given 7902 class X { void f(int x, int y, int z) {} }; 7903cxxMethodDecl(hasAnyParameter(hasName("y"))) 7904 matches f(int x, int y, int z) {} 7905with hasAnyParameter(...) 7906 matching int y 7907 7908For ObjectiveC, given 7909 @interface I - (void) f:(int) y; @end 7910 7911the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 7912matches the declaration of method f with hasParameter 7913matching y. 7914 7915For blocks, given 7916 b = ^(int y) { printf("%d", y) }; 7917 7918the matcher blockDecl(hasAnyParameter(hasName("y"))) 7919matches the declaration of the block b with hasParameter 7920matching y. 7921</pre></td></tr> 7922 7923 7924<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> 7925<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7926functionDecl that have at least one TemplateArgument matching the given 7927InnerMatcher. 7928 7929Given 7930 template<typename T> class A {}; 7931 template<> class A<double> {}; 7932 A<int> a; 7933 7934 template<typename T> f() {}; 7935 void func() { f<int>(); }; 7936 7937classTemplateSpecializationDecl(hasAnyTemplateArgument( 7938 refersToType(asString("int")))) 7939 matches the specialization A<int> 7940 7941functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7942 matches the specialization f<int> 7943</pre></td></tr> 7944 7945 7946<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> 7947<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr> 7948 7949 7950<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> 7951<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 7952declaration. 7953 7954Given 7955 template<bool b> 7956 struct S { 7957 S(int); // #1 7958 explicit S(double); // #2 7959 operator int(); // #3 7960 explicit operator bool(); // #4 7961 explicit(false) S(bool) // # 7 7962 explicit(true) S(char) // # 8 7963 explicit(b) S(S) // # 9 7964 }; 7965 S(int) -> S<true> // #5 7966 explicit S(double) -> S<false> // #6 7967cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 7968cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 7969cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 7970</pre></td></tr> 7971 7972 7973<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> 7974<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 7975declaration or a block. 7976 7977Given 7978 class X { void f(int x) {} }; 7979cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 7980 matches f(int x) {} 7981with hasParameter(...) 7982 matching int x 7983 7984For ObjectiveC, given 7985 @interface I - (void) f:(int) y; @end 7986 7987the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 7988matches the declaration of method f with hasParameter 7989matching y. 7990</pre></td></tr> 7991 7992 7993<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> 7994<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7995functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7996 7997Given 7998 template<typename T, typename U> class A {}; 7999 A<bool, int> b; 8000 A<int, bool> c; 8001 8002 template<typename T> void f() {} 8003 void func() { f<int>(); }; 8004classTemplateSpecializationDecl(hasTemplateArgument( 8005 1, refersToType(asString("int")))) 8006 matches the specialization A<bool, int> 8007 8008functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 8009 matches the specialization f<int> 8010</pre></td></tr> 8011 8012 8013<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> 8014<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 8015 8016Given: 8017 class X { int f() { return 1; } }; 8018cxxMethodDecl(returns(asString("int"))) 8019 matches int f() { return 1; } 8020</pre></td></tr> 8021 8022 8023<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> 8024<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 8025switch statement or conditional operator. 8026 8027Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8028 if (true) {} 8029</pre></td></tr> 8030 8031 8032<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> 8033<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 8034 8035Given 8036 if (A* a = GetAPointer()) {} 8037hasConditionVariableStatement(...) 8038 matches 'A* a = GetAPointer()'. 8039</pre></td></tr> 8040 8041 8042<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> 8043<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 8044 8045Examples matches the if statement 8046 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 8047 if (false) false; else true; 8048</pre></td></tr> 8049 8050 8051<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> 8052<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 8053 8054Given: 8055 void foo() { 8056 if (int i = foobar(); i > 0) {} 8057 switch (int i = foobar(); i) {} 8058 for (auto& a = get_range(); auto& x : a) {} 8059 } 8060 void bar() { 8061 if (foobar() > 0) {} 8062 switch (foobar()) {} 8063 for (auto& x : get_range()) {} 8064 } 8065ifStmt(hasInitStatement(anything())) 8066 matches the if statement in foo but not in bar. 8067switchStmt(hasInitStatement(anything())) 8068 matches the switch statement in foo but not in bar. 8069cxxForRangeStmt(hasInitStatement(anything())) 8070 matches the range for statement in foo but not in bar. 8071</pre></td></tr> 8072 8073 8074<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> 8075<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 8076 8077Examples matches the if statement 8078 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 8079 if (false) true; else false; 8080</pre></td></tr> 8081 8082 8083<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> 8084<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 8085matcher. 8086 8087FIXME: Unit test this matcher 8088</pre></td></tr> 8089 8090 8091<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> 8092<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 8093 8094Example matches y. 8095 (matcher = initListExpr(hasInit(0, expr()))) 8096 int x{y}. 8097</pre></td></tr> 8098 8099 8100<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> 8101<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 8102(if expression have it). 8103</pre></td></tr> 8104 8105 8106<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> 8107<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 8108matches the given matcher. 8109 8110The associated declaration is: 8111- for type nodes, the declaration of the underlying type 8112- for CallExpr, the declaration of the callee 8113- for MemberExpr, the declaration of the referenced member 8114- for CXXConstructExpr, the declaration of the constructor 8115- for CXXNewExpr, the declaration of the operator new 8116- for ObjCIvarExpr, the declaration of the ivar 8117 8118For type nodes, hasDeclaration will generally match the declaration of the 8119sugared type. Given 8120 class X {}; 8121 typedef X Y; 8122 Y y; 8123in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8124typedefDecl. A common use case is to match the underlying, desugared type. 8125This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8126 varDecl(hasType(hasUnqualifiedDesugaredType( 8127 recordType(hasDeclaration(decl()))))) 8128In this matcher, the decl will match the CXXRecordDecl of class X. 8129 8130Usable 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>>, 8131 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>>, 8132 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>>, 8133 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>>, 8134 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>>, 8135 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>>, 8136 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8137</pre></td></tr> 8138 8139 8140<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> 8141<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 8142matches the given matcher. 8143 8144The associated declaration is: 8145- for type nodes, the declaration of the underlying type 8146- for CallExpr, the declaration of the callee 8147- for MemberExpr, the declaration of the referenced member 8148- for CXXConstructExpr, the declaration of the constructor 8149- for CXXNewExpr, the declaration of the operator new 8150- for ObjCIvarExpr, the declaration of the ivar 8151 8152For type nodes, hasDeclaration will generally match the declaration of the 8153sugared type. Given 8154 class X {}; 8155 typedef X Y; 8156 Y y; 8157in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8158typedefDecl. A common use case is to match the underlying, desugared type. 8159This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8160 varDecl(hasType(hasUnqualifiedDesugaredType( 8161 recordType(hasDeclaration(decl()))))) 8162In this matcher, the decl will match the CXXRecordDecl of class X. 8163 8164Usable 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>>, 8165 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>>, 8166 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>>, 8167 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>>, 8168 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>>, 8169 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>>, 8170 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8171</pre></td></tr> 8172 8173 8174<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> 8175<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression. 8176 8177Given 8178 struct foo { 8179 void bar() { 8180 auto f = [this](){}; 8181 } 8182 } 8183lambdaExpr(hasAnyCapture(cxxThisExpr())) 8184 matches [this](){}; 8185</pre></td></tr> 8186 8187 8188<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> 8189<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression. 8190 8191Given 8192 void foo() { 8193 int x; 8194 auto f = [x](){}; 8195 } 8196lambdaExpr(hasAnyCapture(anything())) 8197 matches [x](){}; 8198</pre></td></tr> 8199 8200 8201<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> 8202<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 8203matches the given matcher. 8204 8205The associated declaration is: 8206- for type nodes, the declaration of the underlying type 8207- for CallExpr, the declaration of the callee 8208- for MemberExpr, the declaration of the referenced member 8209- for CXXConstructExpr, the declaration of the constructor 8210- for CXXNewExpr, the declaration of the operator new 8211- for ObjCIvarExpr, the declaration of the ivar 8212 8213For type nodes, hasDeclaration will generally match the declaration of the 8214sugared type. Given 8215 class X {}; 8216 typedef X Y; 8217 Y y; 8218in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8219typedefDecl. A common use case is to match the underlying, desugared type. 8220This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8221 varDecl(hasType(hasUnqualifiedDesugaredType( 8222 recordType(hasDeclaration(decl()))))) 8223In this matcher, the decl will match the CXXRecordDecl of class X. 8224 8225Usable 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>>, 8226 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>>, 8227 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>>, 8228 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>>, 8229 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>>, 8230 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>>, 8231 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8232</pre></td></tr> 8233 8234 8235<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> 8236<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 8237given matcher. Implicit object expressions are included; that is, it matches 8238use of implicit `this`. 8239 8240Given 8241 struct X { 8242 int m; 8243 int f(X x) { x.m; return m; } 8244 }; 8245memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 8246 matches `x.m`, but not `m`; however, 8247memberExpr(hasObjectExpression(hasType(pointsTo( 8248 cxxRecordDecl(hasName("X")))))) 8249 matches `m` (aka. `this->m`), but not `x.m`. 8250</pre></td></tr> 8251 8252 8253<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> 8254<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 8255given matcher. 8256 8257Given 8258 struct { int first, second; } first, second; 8259 int i(second.first); 8260 int j(first.second); 8261memberExpr(member(hasName("first"))) 8262 matches second.first 8263 but not first.second (because the member name there is "second"). 8264</pre></td></tr> 8265 8266 8267<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> 8268<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 8269pointee matches a given matcher. 8270 8271Given 8272 int *a; 8273 int const *b; 8274 float const *f; 8275pointerType(pointee(isConstQualified(), isInteger())) 8276 matches "int const *b" 8277 8278Usable 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>>, 8279 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>> 8280</pre></td></tr> 8281 8282 8283<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> 8284<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 8285matcher. 8286 8287Given 8288 namespace N { template<class T> void f(T t); } 8289 template <class T> void g() { using N::f; f(T()); } 8290unresolvedLookupExpr(hasAnyDeclaration( 8291 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 8292 matches the use of f in g() . 8293</pre></td></tr> 8294 8295 8296<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> 8297<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 8298 8299Given 8300 struct A { struct B { struct C {}; }; }; 8301 A::B::C c; 8302nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 8303 matches "A::" 8304</pre></td></tr> 8305 8306 8307<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> 8308<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 8309NestedNameSpecifier-matcher matches. 8310</pre></td></tr> 8311 8312 8313<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> 8314<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 8315given TypeLoc. 8316 8317Given 8318 struct A { struct B { struct C {}; }; }; 8319 A::B::C c; 8320nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 8321 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 8322 matches "A::" 8323</pre></td></tr> 8324 8325 8326<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> 8327<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 8328 8329Given 8330 struct A { struct B { struct C {}; }; }; 8331 A::B::C c; 8332nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 8333 matches "A::" 8334</pre></td></tr> 8335 8336 8337<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> 8338<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 8339given namespace matcher. 8340 8341Given 8342 namespace ns { struct A {}; } 8343 ns::A a; 8344nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 8345 matches "ns::" 8346</pre></td></tr> 8347 8348 8349<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> 8350<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 8351given QualType matcher without qualifiers. 8352 8353Given 8354 struct A { struct B { struct C {}; }; }; 8355 A::B::C c; 8356nestedNameSpecifier(specifiesType( 8357 hasDeclaration(cxxRecordDecl(hasName("A"))) 8358)) 8359 matches "A::" 8360</pre></td></tr> 8361 8362 8363<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> 8364<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 8365 8366Given 8367 8368 #pragma omp parallel 8369 #pragma omp parallel default(none) 8370 8371``ompExecutableDirective(hasAnyClause(anything()))`` matches 8372``omp parallel default(none)``. 8373</pre></td></tr> 8374 8375 8376<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> 8377<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 8378 8379Prerequisite: the executable directive must not be standalone directive. 8380If it is, it will never match. 8381 8382Given 8383 8384 #pragma omp parallel 8385 ; 8386 #pragma omp parallel 8387 {} 8388 8389``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 8390</pre></td></tr> 8391 8392 8393<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> 8394<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 8395matching Base, or Objective-C classes that directly or indirectly 8396subclass a class matching Base. 8397 8398Note that a class is not considered to be derived from itself. 8399 8400Example matches Y, Z, C (Base == hasName("X")) 8401 class X; 8402 class Y : public X {}; // directly derived 8403 class Z : public Y {}; // indirectly derived 8404 typedef X A; 8405 typedef A B; 8406 class C : public B {}; // derived from a typedef of X 8407 8408In the following example, Bar matches isDerivedFrom(hasName("X")): 8409 class Foo; 8410 typedef Foo X; 8411 class Bar : public Foo {}; // derived from a type that X is a typedef of 8412 8413In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 8414 @interface NSObject @end 8415 @interface Bar : NSObject @end 8416 8417Usable 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>> 8418</pre></td></tr> 8419 8420 8421<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> 8422<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 8423matching Base. 8424 8425Note that a class is not considered to be derived from itself. 8426 8427Example matches Y, C (Base == hasName("X")) 8428 class X; 8429 class Y : public X {}; // directly derived 8430 class Z : public Y {}; // indirectly derived 8431 typedef X A; 8432 typedef A B; 8433 class C : public B {}; // derived from a typedef of X 8434 8435In the following example, Bar matches isDerivedFrom(hasName("X")): 8436 class Foo; 8437 typedef Foo X; 8438 class Bar : public Foo {}; // derived from a type that X is a typedef of 8439</pre></td></tr> 8440 8441 8442<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> 8443<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 8444match Base. 8445</pre></td></tr> 8446 8447 8448<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> 8449<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 8450expression, or an ObjC-message-send expression. 8451 8452Given 8453 void x(int, int, int) { int y; x(1, y, 42); } 8454callExpr(hasAnyArgument(declRefExpr())) 8455 matches x(1, y, 42) 8456with hasAnyArgument(...) 8457 matching y 8458 8459For ObjectiveC, given 8460 @interface I - (void) f:(int) y; @end 8461 void foo(I *i) { [i f:12]; } 8462objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 8463 matches [i f:12] 8464</pre></td></tr> 8465 8466 8467<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> 8468<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor 8469call expression. 8470 8471Example matches y in x(y) 8472 (matcher = callExpr(hasArgument(0, declRefExpr()))) 8473 void x(int) { int y; x(y); } 8474</pre></td></tr> 8475 8476 8477<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> 8478<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 8479and the inner matcher matches on that instance. 8480 8481For example the method call in 8482 NSString *x = @"hello"; 8483 [x containsString:@"h"]; 8484is matched by 8485objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 8486</pre></td></tr> 8487 8488 8489<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> 8490<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 8491 8492Example 8493matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 8494matches the [webView ...] message invocation. 8495 NSString *webViewJavaScript = ... 8496 UIWebView *webView = ... 8497 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 8498</pre></td></tr> 8499 8500 8501<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> 8502<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 8503block. 8504 8505Does not match the 'this' parameter of a method. 8506 8507Given 8508 class X { void f(int x, int y, int z) {} }; 8509cxxMethodDecl(hasAnyParameter(hasName("y"))) 8510 matches f(int x, int y, int z) {} 8511with hasAnyParameter(...) 8512 matching int y 8513 8514For ObjectiveC, given 8515 @interface I - (void) f:(int) y; @end 8516 8517the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 8518matches the declaration of method f with hasParameter 8519matching y. 8520 8521For blocks, given 8522 b = ^(int y) { printf("%d", y) }; 8523 8524the matcher blockDecl(hasAnyParameter(hasName("y"))) 8525matches the declaration of the block b with hasParameter 8526matching y. 8527</pre></td></tr> 8528 8529 8530<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> 8531<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 8532declaration or a block. 8533 8534Given 8535 class X { void f(int x) {} }; 8536cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 8537 matches f(int x) {} 8538with hasParameter(...) 8539 matching int x 8540 8541For ObjectiveC, given 8542 @interface I - (void) f:(int) y; @end 8543 8544the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 8545matches the declaration of method f with hasParameter 8546matching y. 8547</pre></td></tr> 8548 8549 8550<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc11')"><a name="hasTypeLoc11Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 8551<tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher. 8552 8553Examples: 8554 int x; 8555declaratorDecl(hasTypeLoc(loc(asString("int")))) 8556 matches int x 8557 8558auto x = int(3); 8559cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 8560 matches int(3) 8561 8562struct Foo { Foo(int, int); }; 8563auto x = Foo(1, 2); 8564cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 8565 matches Foo(1, 2) 8566 8567Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 8568 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 8569 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 8570 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 8571 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 8572 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 8573 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 8574 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 8575</pre></td></tr> 8576 8577 8578<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> 8579<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 8580or opaque value's source expression matches the given matcher. 8581 8582Example 1: matches "a string" 8583(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 8584class URL { URL(string); }; 8585URL url = "a string"; 8586 8587Example 2: matches 'b' (matcher = 8588opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 8589int a = b ?: 1; 8590</pre></td></tr> 8591 8592 8593<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> 8594<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 8595overloads matches the given matcher. 8596 8597Given 8598 template <typename T> void foo(T); 8599 template <typename T> void bar(T); 8600 template <typename T> void baz(T t) { 8601 foo(t); 8602 bar(t); 8603 } 8604unresolvedLookupExpr(hasAnyDeclaration( 8605 functionTemplateDecl(hasName("foo")))) 8606 matches foo in foo(t); but not bar in bar(t); 8607</pre></td></tr> 8608 8609 8610<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> 8611<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 8612 8613Given 8614 int (*ptr_to_array)[4]; 8615 int (*ptr_to_func)(int); 8616 8617varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 8618ptr_to_func but not ptr_to_array. 8619 8620Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 8621</pre></td></tr> 8622 8623 8624<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> 8625<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 8626pointee matches a given matcher. 8627 8628Given 8629 int *a; 8630 int const *b; 8631 float const *f; 8632pointerType(pointee(isConstQualified(), isInteger())) 8633 matches "int const *b" 8634 8635Usable 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>>, 8636 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>> 8637</pre></td></tr> 8638 8639 8640<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> 8641<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 8642 8643Given: 8644 typedef int &int_ref; 8645 int a; 8646 int_ref b = a; 8647 8648varDecl(hasType(qualType(referenceType()))))) will not match the 8649declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 8650</pre></td></tr> 8651 8652 8653<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> 8654<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 8655matches the given matcher. 8656 8657The associated declaration is: 8658- for type nodes, the declaration of the underlying type 8659- for CallExpr, the declaration of the callee 8660- for MemberExpr, the declaration of the referenced member 8661- for CXXConstructExpr, the declaration of the constructor 8662- for CXXNewExpr, the declaration of the operator new 8663- for ObjCIvarExpr, the declaration of the ivar 8664 8665For type nodes, hasDeclaration will generally match the declaration of the 8666sugared type. Given 8667 class X {}; 8668 typedef X Y; 8669 Y y; 8670in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8671typedefDecl. A common use case is to match the underlying, desugared type. 8672This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8673 varDecl(hasType(hasUnqualifiedDesugaredType( 8674 recordType(hasDeclaration(decl()))))) 8675In this matcher, the decl will match the CXXRecordDecl of class X. 8676 8677Usable 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>>, 8678 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>>, 8679 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>>, 8680 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>>, 8681 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>>, 8682 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>>, 8683 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8684</pre></td></tr> 8685 8686 8687<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> 8688<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 8689 8690Given 8691 void (*fp)(void); 8692The matcher 8693 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 8694would match the declaration for fp. 8695</pre></td></tr> 8696 8697 8698<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> 8699<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 8700</pre></td></tr> 8701 8702 8703<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> 8704<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 8705matches the specified matcher. 8706 8707Example matches y->x() 8708 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 8709 cxxRecordDecl(hasName("Y"))))))) 8710 class Y { public: void x(); }; 8711 void z() { Y *y; y->x(); } 8712</pre></td></tr> 8713 8714 8715<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> 8716<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 8717</pre></td></tr> 8718 8719 8720<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> 8721<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 8722type matches the specified matcher. 8723 8724Example matches X &x and const X &y 8725 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 8726 class X { 8727 void a(X b) { 8728 X &x = b; 8729 const X &y = b; 8730 } 8731 }; 8732</pre></td></tr> 8733 8734 8735<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> 8736<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 8737matches the given matcher. 8738 8739The associated declaration is: 8740- for type nodes, the declaration of the underlying type 8741- for CallExpr, the declaration of the callee 8742- for MemberExpr, the declaration of the referenced member 8743- for CXXConstructExpr, the declaration of the constructor 8744- for CXXNewExpr, the declaration of the operator new 8745- for ObjCIvarExpr, the declaration of the ivar 8746 8747For type nodes, hasDeclaration will generally match the declaration of the 8748sugared type. Given 8749 class X {}; 8750 typedef X Y; 8751 Y y; 8752in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8753typedefDecl. A common use case is to match the underlying, desugared type. 8754This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8755 varDecl(hasType(hasUnqualifiedDesugaredType( 8756 recordType(hasDeclaration(decl()))))) 8757In this matcher, the decl will match the CXXRecordDecl of class X. 8758 8759Usable 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>>, 8760 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>>, 8761 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>>, 8762 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>>, 8763 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>>, 8764 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>>, 8765 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8766</pre></td></tr> 8767 8768 8769<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> 8770<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 8771pointee matches a given matcher. 8772 8773Given 8774 int *a; 8775 int const *b; 8776 float const *f; 8777pointerType(pointee(isConstQualified(), isInteger())) 8778 matches "int const *b" 8779 8780Usable 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>>, 8781 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>> 8782</pre></td></tr> 8783 8784 8785<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> 8786<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 8787 8788Given 8789 return a + b; 8790hasReturnValue(binaryOperator()) 8791 matches 'return a + b' 8792with binaryOperator() 8793 matching 'a + b' 8794</pre></td></tr> 8795 8796 8797<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> 8798<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 8799a given matcher. Also matches StmtExprs that have CompoundStmt as children. 8800 8801Given 8802 { {}; 1+2; } 8803hasAnySubstatement(compoundStmt()) 8804 matches '{ {}; 1+2; }' 8805with compoundStmt() 8806 matching '{}' 8807</pre></td></tr> 8808 8809 8810<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> 8811<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8812alignof. 8813</pre></td></tr> 8814 8815 8816<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forCallable0')"><a name="forCallable0Anchor">forCallable</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8817<tr><td colspan="4" class="doc" id="forCallable0"><pre>Matches declaration of the function, method, or block the statement 8818belongs to. 8819 8820Given: 8821F& operator=(const F& o) { 8822 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 8823 return *this; 8824} 8825returnStmt(forCallable(functionDecl(hasName("operator=")))) 8826 matches 'return *this' 8827 but does not match 'return v > 0' 8828 8829Given: 8830-(void) foo { 8831 int x = 1; 8832 dispatch_sync(queue, ^{ int y = 2; }); 8833} 8834declStmt(forCallable(objcMethodDecl())) 8835 matches 'int x = 1' 8836 but does not match 'int y = 2'. 8837whereas declStmt(forCallable(blockDecl())) 8838 matches 'int y = 2' 8839 but does not match 'int x = 1'. 8840</pre></td></tr> 8841 8842 8843<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> 8844<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to. 8845 8846Deprecated. Use forCallable() to correctly handle the situation when 8847the declaration is not a function (but a block or an Objective-C method). 8848forFunction() not only fails to take non-functions into account but also 8849may match the wrong declaration in their presence. 8850 8851Given: 8852F& operator=(const F& o) { 8853 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 8854 return *this; 8855} 8856returnStmt(forFunction(hasName("operator="))) 8857 matches 'return *this' 8858 but does not match 'return v > 0' 8859</pre></td></tr> 8860 8861 8862<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> 8863<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8864sizeof. 8865</pre></td></tr> 8866 8867 8868<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> 8869<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 8870type that matches the provided matcher. 8871 8872Given 8873 template <typename T> 8874 double F(T t); 8875 int i; 8876 double j = F(i); 8877 8878substTemplateTypeParmType(hasReplacementType(type())) matches int 8879</pre></td></tr> 8880 8881 8882<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> 8883<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 8884statement. This matcher may produce multiple matches. 8885 8886Given 8887 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 8888switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 8889 matches four times, with "c" binding each of "case 1:", "case 2:", 8890"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 8891"switch (1)", "switch (2)" and "switch (2)". 8892</pre></td></tr> 8893 8894 8895<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> 8896<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 8897switch statement or conditional operator. 8898 8899Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8900 if (true) {} 8901</pre></td></tr> 8902 8903 8904<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> 8905<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 8906 8907Given: 8908 void foo() { 8909 if (int i = foobar(); i > 0) {} 8910 switch (int i = foobar(); i) {} 8911 for (auto& a = get_range(); auto& x : a) {} 8912 } 8913 void bar() { 8914 if (foobar() > 0) {} 8915 switch (foobar()) {} 8916 for (auto& x : get_range()) {} 8917 } 8918ifStmt(hasInitStatement(anything())) 8919 matches the if statement in foo but not in bar. 8920switchStmt(hasInitStatement(anything())) 8921 matches the switch statement in foo but not in bar. 8922cxxForRangeStmt(hasInitStatement(anything())) 8923 matches the range for statement in foo but not in bar. 8924</pre></td></tr> 8925 8926 8927<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> 8928<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 8929matches the given matcher. 8930 8931The associated declaration is: 8932- for type nodes, the declaration of the underlying type 8933- for CallExpr, the declaration of the callee 8934- for MemberExpr, the declaration of the referenced member 8935- for CXXConstructExpr, the declaration of the constructor 8936- for CXXNewExpr, the declaration of the operator new 8937- for ObjCIvarExpr, the declaration of the ivar 8938 8939For type nodes, hasDeclaration will generally match the declaration of the 8940sugared type. Given 8941 class X {}; 8942 typedef X Y; 8943 Y y; 8944in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8945typedefDecl. A common use case is to match the underlying, desugared type. 8946This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8947 varDecl(hasType(hasUnqualifiedDesugaredType( 8948 recordType(hasDeclaration(decl()))))) 8949In this matcher, the decl will match the CXXRecordDecl of class X. 8950 8951Usable 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>>, 8952 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>>, 8953 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>>, 8954 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>>, 8955 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>>, 8956 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>>, 8957 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8958</pre></td></tr> 8959 8960 8961<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>></td><td class="name" onclick="toggle('hasTypeLoc12')"><a name="hasTypeLoc12Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 8962<tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher. 8963 8964Examples: 8965 int x; 8966declaratorDecl(hasTypeLoc(loc(asString("int")))) 8967 matches int x 8968 8969auto x = int(3); 8970cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 8971 matches int(3) 8972 8973struct Foo { Foo(int, int); }; 8974auto x = Foo(1, 2); 8975cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 8976 matches Foo(1, 2) 8977 8978Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 8979 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 8980 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 8981 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 8982 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 8983 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 8984 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 8985 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 8986</pre></td></tr> 8987 8988 8989<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> 8990<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 8991 8992Given 8993 struct B { int next; }; 8994 template<int(B::*next_ptr)> struct A {}; 8995 A<&B::next> a; 8996templateSpecializationType(hasAnyTemplateArgument( 8997 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 8998 matches the specialization A<&B::next> with fieldDecl(...) matching 8999 B::next 9000</pre></td></tr> 9001 9002 9003<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> 9004<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 9005declaration. 9006 9007Given 9008 struct B { int next; }; 9009 template<int(B::*next_ptr)> struct A {}; 9010 A<&B::next> a; 9011classTemplateSpecializationDecl(hasAnyTemplateArgument( 9012 refersToDeclaration(fieldDecl(hasName("next"))))) 9013 matches the specialization A<&B::next> with fieldDecl(...) matching 9014 B::next 9015</pre></td></tr> 9016 9017 9018<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> 9019<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type. 9020 9021Given 9022 template<int T> struct C {}; 9023 C<42> c; 9024classTemplateSpecializationDecl( 9025 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 9026 matches the implicit instantiation of C in C<42>. 9027</pre></td></tr> 9028 9029 9030<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> 9031<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 9032 9033Given 9034 template<template <typename> class S> class X {}; 9035 template<typename T> class Y {}; 9036 X<Y> xi; 9037classTemplateSpecializationDecl(hasAnyTemplateArgument( 9038 refersToTemplate(templateName()))) 9039 matches the specialization X<Y> 9040</pre></td></tr> 9041 9042 9043<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> 9044<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 9045 9046Given 9047 struct X {}; 9048 template<typename T> struct A {}; 9049 A<X> a; 9050classTemplateSpecializationDecl(hasAnyTemplateArgument( 9051 refersToType(class(hasName("X"))))) 9052 matches the specialization A<X> 9053</pre></td></tr> 9054 9055 9056<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> 9057<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 9058functionDecl that have at least one TemplateArgument matching the given 9059InnerMatcher. 9060 9061Given 9062 template<typename T> class A {}; 9063 template<> class A<double> {}; 9064 A<int> a; 9065 9066 template<typename T> f() {}; 9067 void func() { f<int>(); }; 9068 9069classTemplateSpecializationDecl(hasAnyTemplateArgument( 9070 refersToType(asString("int")))) 9071 matches the specialization A<int> 9072 9073functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 9074 matches the specialization f<int> 9075</pre></td></tr> 9076 9077 9078<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> 9079<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 9080matches the given matcher. 9081 9082The associated declaration is: 9083- for type nodes, the declaration of the underlying type 9084- for CallExpr, the declaration of the callee 9085- for MemberExpr, the declaration of the referenced member 9086- for CXXConstructExpr, the declaration of the constructor 9087- for CXXNewExpr, the declaration of the operator new 9088- for ObjCIvarExpr, the declaration of the ivar 9089 9090For type nodes, hasDeclaration will generally match the declaration of the 9091sugared type. Given 9092 class X {}; 9093 typedef X Y; 9094 Y y; 9095in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9096typedefDecl. A common use case is to match the underlying, desugared type. 9097This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9098 varDecl(hasType(hasUnqualifiedDesugaredType( 9099 recordType(hasDeclaration(decl()))))) 9100In this matcher, the decl will match the CXXRecordDecl of class X. 9101 9102Usable 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>>, 9103 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>>, 9104 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>>, 9105 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>>, 9106 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>>, 9107 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>>, 9108 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9109</pre></td></tr> 9110 9111 9112<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> 9113<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 9114functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 9115 9116Given 9117 template<typename T, typename U> class A {}; 9118 A<bool, int> b; 9119 A<int, bool> c; 9120 9121 template<typename T> void f() {} 9122 void func() { f<int>(); }; 9123classTemplateSpecializationDecl(hasTemplateArgument( 9124 1, refersToType(asString("int")))) 9125 matches the specialization A<bool, int> 9126 9127functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 9128 matches the specialization f<int> 9129</pre></td></tr> 9130 9131 9132<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> 9133<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 9134matches the given matcher. 9135 9136The associated declaration is: 9137- for type nodes, the declaration of the underlying type 9138- for CallExpr, the declaration of the callee 9139- for MemberExpr, the declaration of the referenced member 9140- for CXXConstructExpr, the declaration of the constructor 9141- for CXXNewExpr, the declaration of the operator new 9142- for ObjCIvarExpr, the declaration of the ivar 9143 9144For type nodes, hasDeclaration will generally match the declaration of the 9145sugared type. Given 9146 class X {}; 9147 typedef X Y; 9148 Y y; 9149in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9150typedefDecl. A common use case is to match the underlying, desugared type. 9151This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9152 varDecl(hasType(hasUnqualifiedDesugaredType( 9153 recordType(hasDeclaration(decl()))))) 9154In this matcher, the decl will match the CXXRecordDecl of class X. 9155 9156Usable 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>>, 9157 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>>, 9158 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>>, 9159 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>>, 9160 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>>, 9161 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>>, 9162 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9163</pre></td></tr> 9164 9165 9166<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> 9167<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 9168QualType-matcher matches. 9169</pre></td></tr> 9170 9171 9172<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc13')"><a name="hasTypeLoc13Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 9173<tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher. 9174 9175Examples: 9176 int x; 9177declaratorDecl(hasTypeLoc(loc(asString("int")))) 9178 matches int x 9179 9180auto x = int(3); 9181cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 9182 matches int(3) 9183 9184struct Foo { Foo(int, int); }; 9185auto x = Foo(1, 2); 9186cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 9187 matches Foo(1, 2) 9188 9189Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 9190 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 9191 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 9192 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 9193 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 9194 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 9195 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 9196 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 9197</pre></td></tr> 9198 9199 9200<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> 9201<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 9202matcher. 9203 9204Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9205 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9206 and U (matcher = typedefDecl(hasType(asString("int"))) 9207 and friend class X (matcher = friendDecl(hasType("X")) 9208 and public virtual X (matcher = cxxBaseSpecifier(hasType( 9209 asString("class X"))) 9210 class X {}; 9211 void y(X &x) { x; X z; } 9212 typedef int U; 9213 class Y { friend class X; }; 9214 class Z : public virtual X {}; 9215</pre></td></tr> 9216 9217 9218<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> 9219<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 9220matches the given matcher. 9221 9222The associated declaration is: 9223- for type nodes, the declaration of the underlying type 9224- for CallExpr, the declaration of the callee 9225- for MemberExpr, the declaration of the referenced member 9226- for CXXConstructExpr, the declaration of the constructor 9227- for CXXNewExpr, the declaration of the operator new 9228- for ObjCIvarExpr, the declaration of the ivar 9229 9230For type nodes, hasDeclaration will generally match the declaration of the 9231sugared type. Given 9232 class X {}; 9233 typedef X Y; 9234 Y y; 9235in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9236typedefDecl. A common use case is to match the underlying, desugared type. 9237This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9238 varDecl(hasType(hasUnqualifiedDesugaredType( 9239 recordType(hasDeclaration(decl()))))) 9240In this matcher, the decl will match the CXXRecordDecl of class X. 9241 9242Usable 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>>, 9243 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>>, 9244 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>>, 9245 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>>, 9246 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>>, 9247 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>>, 9248 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9249</pre></td></tr> 9250 9251 9252<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> 9253<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 9254type of the matched node. 9255 9256For example, in: 9257 class A {}; 9258 using B = A; 9259The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 9260both B and A. 9261</pre></td></tr> 9262 9263 9264<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> 9265<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 9266 9267Given 9268 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 9269unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 9270 matches sizeof(a) and alignof(c) 9271</pre></td></tr> 9272 9273 9274<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> 9275<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 9276 9277Example matches true (matcher = hasUnaryOperand( 9278 cxxBoolLiteral(equals(true)))) 9279 !true 9280</pre></td></tr> 9281 9282 9283<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> 9284<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 9285given matcher. Implicit object expressions are included; that is, it matches 9286use of implicit `this`. 9287 9288Given 9289 struct X { 9290 int m; 9291 int f(X x) { x.m; return m; } 9292 }; 9293memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 9294 matches `x.m`, but not `m`; however, 9295memberExpr(hasObjectExpression(hasType(pointsTo( 9296 cxxRecordDecl(hasName("X")))))) 9297 matches `m` (aka. `this->m`), but not `x.m`. 9298</pre></td></tr> 9299 9300 9301<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> 9302<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 9303matches the given matcher. 9304 9305The associated declaration is: 9306- for type nodes, the declaration of the underlying type 9307- for CallExpr, the declaration of the callee 9308- for MemberExpr, the declaration of the referenced member 9309- for CXXConstructExpr, the declaration of the constructor 9310- for CXXNewExpr, the declaration of the operator new 9311- for ObjCIvarExpr, the declaration of the ivar 9312 9313For type nodes, hasDeclaration will generally match the declaration of the 9314sugared type. Given 9315 class X {}; 9316 typedef X Y; 9317 Y y; 9318in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9319typedefDecl. A common use case is to match the underlying, desugared type. 9320This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9321 varDecl(hasType(hasUnqualifiedDesugaredType( 9322 recordType(hasDeclaration(decl()))))) 9323In this matcher, the decl will match the CXXRecordDecl of class X. 9324 9325Usable 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>>, 9326 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>>, 9327 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>>, 9328 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>>, 9329 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>>, 9330 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>>, 9331 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9332</pre></td></tr> 9333 9334 9335<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> 9336<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 9337 9338Given 9339 namespace X { void b(); } 9340 using X::b; 9341usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 9342 matches using X::b </pre></td></tr> 9343 9344 9345<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> 9346<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 9347matched by the given matcher. 9348 9349Given 9350 namespace X { int a; void b(); } 9351 using X::a; 9352 using X::b; 9353usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 9354 matches using X::b but not using X::a </pre></td></tr> 9355 9356 9357<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</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> 9358<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value 9359declaration's type. 9360 9361In case of a value declaration (for example a variable declaration), 9362this resolves one layer of indirection. For example, in the value 9363declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 9364X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 9365declaration of x. 9366 9367Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9368 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9369 and friend class X (matcher = friendDecl(hasType("X")) 9370 and public virtual X (matcher = cxxBaseSpecifier(hasType( 9371 cxxRecordDecl(hasName("X")))) 9372 class X {}; 9373 void y(X &x) { x; X z; } 9374 class Y { friend class X; }; 9375 class Z : public virtual X {}; 9376 9377Example matches class Derived 9378(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 9379class Base {}; 9380class Derived : Base {}; 9381 9382Usable 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>>, 9383Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 9384</pre></td></tr> 9385 9386 9387<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> 9388<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 9389matcher. 9390 9391Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9392 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9393 and U (matcher = typedefDecl(hasType(asString("int"))) 9394 and friend class X (matcher = friendDecl(hasType("X")) 9395 and public virtual X (matcher = cxxBaseSpecifier(hasType( 9396 asString("class X"))) 9397 class X {}; 9398 void y(X &x) { x; X z; } 9399 typedef int U; 9400 class Y { friend class X; }; 9401 class Z : public virtual X {}; 9402</pre></td></tr> 9403 9404 9405<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> 9406<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 9407that matches the given matcher. 9408 9409Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 9410 bool y() { return true; } 9411 bool x = y(); 9412</pre></td></tr> 9413 9414 9415<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> 9416<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 9417expression. 9418 9419Given 9420 void f(int b) { 9421 int a[b]; 9422 } 9423variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 9424 varDecl(hasName("b"))))))) 9425 matches "int a[b]" 9426</pre></td></tr> 9427 9428 9429<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> 9430<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr> 9431 9432 9433<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> 9434<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 9435switch statement or conditional operator. 9436 9437Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 9438 if (true) {} 9439</pre></td></tr> 9440 9441<!--END_TRAVERSAL_MATCHERS --> 9442</table> 9443 9444</div> 9445</body> 9446</html> 9447 9448 9449