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