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, bindingDecl(hasName("f").bind("fBinding")))) 7156matches the decomposition decl with 'f' bound to "fBinding". 7157</pre></td></tr> 7158 7159 7160<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> 7161<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr> 7162 7163 7164<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> 7165<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 7166switch statement or conditional operator. 7167 7168Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7169 if (true) {} 7170</pre></td></tr> 7171 7172 7173<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> 7174<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 7175matches InnerMatcher if the qualifier exists. 7176 7177Given 7178 namespace N { 7179 namespace M { 7180 class D {}; 7181 } 7182 } 7183 N::M::D d; 7184 7185elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 7186matches the type of the variable declaration of d. 7187</pre></td></tr> 7188 7189 7190<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> 7191<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 7192 7193Given 7194 namespace N { 7195 namespace M { 7196 class D {}; 7197 } 7198 } 7199 N::M::D d; 7200 7201elaboratedType(namesType(recordType( 7202hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 7203declaration of d. 7204</pre></td></tr> 7205 7206 7207<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> 7208<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 7209matches the given matcher. 7210 7211The associated declaration is: 7212- for type nodes, the declaration of the underlying type 7213- for CallExpr, the declaration of the callee 7214- for MemberExpr, the declaration of the referenced member 7215- for CXXConstructExpr, the declaration of the constructor 7216- for CXXNewExpr, the declaration of the operator new 7217- for ObjCIvarExpr, the declaration of the ivar 7218 7219For type nodes, hasDeclaration will generally match the declaration of the 7220sugared type. Given 7221 class X {}; 7222 typedef X Y; 7223 Y y; 7224in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7225typedefDecl. A common use case is to match the underlying, desugared type. 7226This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7227 varDecl(hasType(hasUnqualifiedDesugaredType( 7228 recordType(hasDeclaration(decl()))))) 7229In this matcher, the decl will match the CXXRecordDecl of class X. 7230 7231Usable 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>>, 7232 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>>, 7233 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>>, 7234 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>>, 7235 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>>, 7236 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>>, 7237 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7238</pre></td></tr> 7239 7240 7241<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> 7242<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 7243 7244(Note: Clang's AST refers to other conversions as "casts" too, and calls 7245actual casts "explicit" casts.) 7246</pre></td></tr> 7247 7248 7249<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> 7250<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value 7251declaration's type. 7252 7253In case of a value declaration (for example a variable declaration), 7254this resolves one layer of indirection. For example, in the value 7255declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7256X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7257declaration of x. 7258 7259Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7260 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7261 and friend class X (matcher = friendDecl(hasType("X")) 7262 class X {}; 7263 void y(X &x) { x; X z; } 7264 class Y { friend class X; }; 7265 7266Example matches class Derived 7267(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7268class Base {}; 7269class Derived : Base {}; 7270 7271Usable 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>>, 7272Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7273</pre></td></tr> 7274 7275 7276<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> 7277<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 7278matcher. 7279 7280Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7281 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7282 and U (matcher = typedefDecl(hasType(asString("int"))) 7283 and friend class X (matcher = friendDecl(hasType("X")) 7284 class X {}; 7285 void y(X &x) { x; X z; } 7286 typedef int U; 7287 class Y { friend class X; }; 7288</pre></td></tr> 7289 7290 7291<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> 7292<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 7293elidable constructor and other corresponding bookkeeping nodes. 7294 7295In C++17, elidable copy constructors are no longer being generated in the 7296AST as it is not permitted by the standard. They are, however, part of the 7297AST in C++14 and earlier. So, a matcher must abstract over these differences 7298to work in all language modes. This matcher skips elidable constructor-call 7299AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 7300various implicit nodes inside the constructor calls, all of which will not 7301appear in the C++17 AST. 7302 7303Given 7304 7305struct H {}; 7306H G(); 7307void f() { 7308 H D = G(); 7309} 7310 7311``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 7312matches ``H D = G()`` in C++11 through C++17 (and beyond). 7313</pre></td></tr> 7314 7315 7316<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> 7317<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 7318are stripped off. 7319 7320Parentheses and explicit casts are not discarded. 7321Given 7322 int arr[5]; 7323 int a = 0; 7324 char b = 0; 7325 const int c = a; 7326 int *d = arr; 7327 long e = (long) 0l; 7328The matchers 7329 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 7330 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 7331would match the declarations for a, b, c, and d, but not e. 7332While 7333 varDecl(hasInitializer(integerLiteral())) 7334 varDecl(hasInitializer(declRefExpr())) 7335only match the declarations for b, c, and d. 7336</pre></td></tr> 7337 7338 7339<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> 7340<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 7341nodes are stripped off. 7342 7343Parentheses and explicit casts are not discarded. 7344Given 7345 class C {}; 7346 C a = C(); 7347 C b; 7348 C c = b; 7349The matchers 7350 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 7351would match the declarations for a, b, and c. 7352While 7353 varDecl(hasInitializer(cxxConstructExpr())) 7354only match the declarations for b and c. 7355</pre></td></tr> 7356 7357 7358<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> 7359<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 7360casts are stripped off. 7361 7362Implicit and non-C Style casts are also discarded. 7363Given 7364 int a = 0; 7365 char b = (0); 7366 void* c = reinterpret_cast<char*>(0); 7367 char d = char(0); 7368The matcher 7369 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 7370would match the declarations for a, b, c, and d. 7371while 7372 varDecl(hasInitializer(integerLiteral())) 7373only match the declaration for a. 7374</pre></td></tr> 7375 7376 7377<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> 7378<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 7379parentheses are stripped off. 7380 7381Explicit casts are not discarded. 7382Given 7383 int arr[5]; 7384 int a = 0; 7385 char b = (0); 7386 const int c = a; 7387 int *d = (arr); 7388 long e = ((long) 0l); 7389The matchers 7390 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 7391 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 7392would match the declarations for a, b, c, and d, but not e. 7393while 7394 varDecl(hasInitializer(integerLiteral())) 7395 varDecl(hasInitializer(declRefExpr())) 7396would only match the declaration for a. 7397</pre></td></tr> 7398 7399 7400<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> 7401<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 7402 7403Given 7404 const char* str = ("my-string"); 7405The matcher 7406 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 7407would match the implicit cast resulting from the assignment. 7408</pre></td></tr> 7409 7410 7411<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> 7412<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 7413 7414Given 7415 class C { 7416 int a = 2; 7417 int b = 3; 7418 int c; 7419 }; 7420fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 7421 matches 'int a;' but not 'int b;'. 7422fieldDecl(hasInClassInitializer(anything())) 7423 matches 'int a;' and 'int b;' but not 'int c;'. 7424</pre></td></tr> 7425 7426 7427<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> 7428<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr> 7429 7430 7431<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> 7432<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 7433switch statement or conditional operator. 7434 7435Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7436 if (true) {} 7437</pre></td></tr> 7438 7439 7440<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> 7441<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 7442 7443Example: 7444 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 7445matches '++x' in 7446 for (x; x < N; ++x) { } 7447</pre></td></tr> 7448 7449 7450<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> 7451<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 7452 7453Example: 7454 forStmt(hasLoopInit(declStmt())) 7455matches 'int x = 0' in 7456 for (int x = 0; x < N; ++x) { } 7457</pre></td></tr> 7458 7459 7460<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> 7461<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 7462declaration's type. 7463 7464In case of a value declaration (for example a variable declaration), 7465this resolves one layer of indirection. For example, in the value 7466declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7467X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7468declaration of x. 7469 7470Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7471 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7472 and friend class X (matcher = friendDecl(hasType("X")) 7473 class X {}; 7474 void y(X &x) { x; X z; } 7475 class Y { friend class X; }; 7476 7477Example matches class Derived 7478(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7479class Base {}; 7480class Derived : Base {}; 7481 7482Usable 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>>, 7483Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7484</pre></td></tr> 7485 7486 7487<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> 7488<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 7489matcher. 7490 7491Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7492 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7493 and U (matcher = typedefDecl(hasType(asString("int"))) 7494 and friend class X (matcher = friendDecl(hasType("X")) 7495 class X {}; 7496 void y(X &x) { x; X z; } 7497 typedef int U; 7498 class Y { friend class X; }; 7499</pre></td></tr> 7500 7501 7502<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> 7503<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST. 7504Note that this matcher matches all the declarations of a function whose 7505body is present in the AST. 7506 7507Given 7508 void f(); 7509 void f() {} 7510 void g(); 7511hasAnyBody(functionDecl()) 7512 matches both 'void f();' 7513 and 'void f() {}' 7514with compoundStmt() 7515 matching '{}' 7516 but does not match 'void g();' 7517</pre></td></tr> 7518 7519 7520<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> 7521<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 7522block. 7523 7524Does not match the 'this' parameter of a method. 7525 7526Given 7527 class X { void f(int x, int y, int z) {} }; 7528cxxMethodDecl(hasAnyParameter(hasName("y"))) 7529 matches f(int x, int y, int z) {} 7530with hasAnyParameter(...) 7531 matching int y 7532 7533For ObjectiveC, given 7534 @interface I - (void) f:(int) y; @end 7535 7536the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 7537matches the declaration of method f with hasParameter 7538matching y. 7539 7540For blocks, given 7541 b = ^(int y) { printf("%d", y) }; 7542 7543the matcher blockDecl(hasAnyParameter(hasName("y"))) 7544matches the declaration of the block b with hasParameter 7545matching y. 7546</pre></td></tr> 7547 7548 7549<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> 7550<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7551functionDecl that have at least one TemplateArgument matching the given 7552InnerMatcher. 7553 7554Given 7555 template<typename T> class A {}; 7556 template<> class A<double> {}; 7557 A<int> a; 7558 7559 template<typename T> f() {}; 7560 void func() { f<int>(); }; 7561 7562classTemplateSpecializationDecl(hasAnyTemplateArgument( 7563 refersToType(asString("int")))) 7564 matches the specialization A<int> 7565 7566functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7567 matches the specialization f<int> 7568</pre></td></tr> 7569 7570 7571<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> 7572<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr> 7573 7574 7575<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> 7576<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 7577declaration. 7578 7579Given 7580 template<bool b> 7581 struct S { 7582 S(int); // #1 7583 explicit S(double); // #2 7584 operator int(); // #3 7585 explicit operator bool(); // #4 7586 explicit(false) S(bool) // # 7 7587 explicit(true) S(char) // # 8 7588 explicit(b) S(S) // # 9 7589 }; 7590 S(int) -> S<true> // #5 7591 explicit S(double) -> S<false> // #6 7592cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 7593cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 7594cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 7595</pre></td></tr> 7596 7597 7598<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> 7599<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 7600declaration or a block. 7601 7602Given 7603 class X { void f(int x) {} }; 7604cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 7605 matches f(int x) {} 7606with hasParameter(...) 7607 matching int x 7608 7609For ObjectiveC, given 7610 @interface I - (void) f:(int) y; @end 7611 7612the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 7613matches the declaration of method f with hasParameter 7614matching y. 7615</pre></td></tr> 7616 7617 7618<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> 7619<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7620functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7621 7622Given 7623 template<typename T, typename U> class A {}; 7624 A<bool, int> b; 7625 A<int, bool> c; 7626 7627 template<typename T> void f() {} 7628 void func() { f<int>(); }; 7629classTemplateSpecializationDecl(hasTemplateArgument( 7630 1, refersToType(asString("int")))) 7631 matches the specialization A<bool, int> 7632 7633functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7634 matches the specialization f<int> 7635</pre></td></tr> 7636 7637 7638<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> 7639<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 7640 7641Given: 7642 class X { int f() { return 1; } }; 7643cxxMethodDecl(returns(asString("int"))) 7644 matches int f() { return 1; } 7645</pre></td></tr> 7646 7647 7648<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> 7649<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 7650switch statement or conditional operator. 7651 7652Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7653 if (true) {} 7654</pre></td></tr> 7655 7656 7657<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> 7658<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 7659 7660Given 7661 if (A* a = GetAPointer()) {} 7662hasConditionVariableStatement(...) 7663 matches 'A* a = GetAPointer()'. 7664</pre></td></tr> 7665 7666 7667<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> 7668<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 7669 7670Examples matches the if statement 7671 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 7672 if (false) false; else true; 7673</pre></td></tr> 7674 7675 7676<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> 7677<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 7678 7679Given: 7680 void foo() { 7681 if (int i = foobar(); i > 0) {} 7682 switch (int i = foobar(); i) {} 7683 for (auto& a = get_range(); auto& x : a) {} 7684 } 7685 void bar() { 7686 if (foobar() > 0) {} 7687 switch (foobar()) {} 7688 for (auto& x : get_range()) {} 7689 } 7690ifStmt(hasInitStatement(anything())) 7691 matches the if statement in foo but not in bar. 7692switchStmt(hasInitStatement(anything())) 7693 matches the switch statement in foo but not in bar. 7694cxxForRangeStmt(hasInitStatement(anything())) 7695 matches the range for statement in foo but not in bar. 7696</pre></td></tr> 7697 7698 7699<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> 7700<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 7701 7702Examples matches the if statement 7703 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 7704 if (false) true; else false; 7705</pre></td></tr> 7706 7707 7708<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> 7709<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 7710matcher. 7711 7712FIXME: Unit test this matcher 7713</pre></td></tr> 7714 7715 7716<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> 7717<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 7718 7719Example matches y. 7720 (matcher = initListExpr(hasInit(0, expr()))) 7721 int x{y}. 7722</pre></td></tr> 7723 7724 7725<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> 7726<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 7727(if expression have it). 7728</pre></td></tr> 7729 7730 7731<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> 7732<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 7733matches the given matcher. 7734 7735The associated declaration is: 7736- for type nodes, the declaration of the underlying type 7737- for CallExpr, the declaration of the callee 7738- for MemberExpr, the declaration of the referenced member 7739- for CXXConstructExpr, the declaration of the constructor 7740- for CXXNewExpr, the declaration of the operator new 7741- for ObjCIvarExpr, the declaration of the ivar 7742 7743For type nodes, hasDeclaration will generally match the declaration of the 7744sugared type. Given 7745 class X {}; 7746 typedef X Y; 7747 Y y; 7748in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7749typedefDecl. A common use case is to match the underlying, desugared type. 7750This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7751 varDecl(hasType(hasUnqualifiedDesugaredType( 7752 recordType(hasDeclaration(decl()))))) 7753In this matcher, the decl will match the CXXRecordDecl of class X. 7754 7755Usable 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>>, 7756 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>>, 7757 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>>, 7758 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>>, 7759 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>>, 7760 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>>, 7761 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7762</pre></td></tr> 7763 7764 7765<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> 7766<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 7767matches the given matcher. 7768 7769The associated declaration is: 7770- for type nodes, the declaration of the underlying type 7771- for CallExpr, the declaration of the callee 7772- for MemberExpr, the declaration of the referenced member 7773- for CXXConstructExpr, the declaration of the constructor 7774- for CXXNewExpr, the declaration of the operator new 7775- for ObjCIvarExpr, the declaration of the ivar 7776 7777For type nodes, hasDeclaration will generally match the declaration of the 7778sugared type. Given 7779 class X {}; 7780 typedef X Y; 7781 Y y; 7782in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7783typedefDecl. A common use case is to match the underlying, desugared type. 7784This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7785 varDecl(hasType(hasUnqualifiedDesugaredType( 7786 recordType(hasDeclaration(decl()))))) 7787In this matcher, the decl will match the CXXRecordDecl of class X. 7788 7789Usable 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>>, 7790 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>>, 7791 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>>, 7792 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>>, 7793 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>>, 7794 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>>, 7795 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7796</pre></td></tr> 7797 7798 7799<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> 7800<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression. 7801 7802Given 7803 struct foo { 7804 void bar() { 7805 auto f = [this](){}; 7806 } 7807 } 7808lambdaExpr(hasAnyCapture(cxxThisExpr())) 7809 matches [this](){}; 7810</pre></td></tr> 7811 7812 7813<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> 7814<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression. 7815 7816Given 7817 void foo() { 7818 int x; 7819 auto f = [x](){}; 7820 } 7821lambdaExpr(hasAnyCapture(anything())) 7822 matches [x](){}; 7823</pre></td></tr> 7824 7825 7826<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> 7827<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 7828matches the given matcher. 7829 7830The associated declaration is: 7831- for type nodes, the declaration of the underlying type 7832- for CallExpr, the declaration of the callee 7833- for MemberExpr, the declaration of the referenced member 7834- for CXXConstructExpr, the declaration of the constructor 7835- for CXXNewExpr, the declaration of the operator new 7836- for ObjCIvarExpr, the declaration of the ivar 7837 7838For type nodes, hasDeclaration will generally match the declaration of the 7839sugared type. Given 7840 class X {}; 7841 typedef X Y; 7842 Y y; 7843in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7844typedefDecl. A common use case is to match the underlying, desugared type. 7845This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7846 varDecl(hasType(hasUnqualifiedDesugaredType( 7847 recordType(hasDeclaration(decl()))))) 7848In this matcher, the decl will match the CXXRecordDecl of class X. 7849 7850Usable 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>>, 7851 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>>, 7852 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>>, 7853 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>>, 7854 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>>, 7855 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>>, 7856 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7857</pre></td></tr> 7858 7859 7860<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> 7861<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 7862given matcher. Implicit object expressions are included; that is, it matches 7863use of implicit `this`. 7864 7865Given 7866 struct X { 7867 int m; 7868 int f(X x) { x.m; return m; } 7869 }; 7870memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 7871 matches `x.m`, but not `m`; however, 7872memberExpr(hasObjectExpression(hasType(pointsTo( 7873 cxxRecordDecl(hasName("X")))))) 7874 matches `m` (aka. `this->m`), but not `x.m`. 7875</pre></td></tr> 7876 7877 7878<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> 7879<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 7880given matcher. 7881 7882Given 7883 struct { int first, second; } first, second; 7884 int i(second.first); 7885 int j(first.second); 7886memberExpr(member(hasName("first"))) 7887 matches second.first 7888 but not first.second (because the member name there is "second"). 7889</pre></td></tr> 7890 7891 7892<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> 7893<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 7894pointee matches a given matcher. 7895 7896Given 7897 int *a; 7898 int const *b; 7899 float const *f; 7900pointerType(pointee(isConstQualified(), isInteger())) 7901 matches "int const *b" 7902 7903Usable 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>>, 7904 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>> 7905</pre></td></tr> 7906 7907 7908<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> 7909<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 7910matcher. 7911 7912Given 7913 namespace N { template<class T> void f(T t); } 7914 template <class T> void g() { using N::f; f(T()); } 7915unresolvedLookupExpr(hasAnyDeclaration( 7916 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 7917 matches the use of f in g() . 7918</pre></td></tr> 7919 7920 7921<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> 7922<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 7923 7924Given 7925 struct A { struct B { struct C {}; }; }; 7926 A::B::C c; 7927nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 7928 matches "A::" 7929</pre></td></tr> 7930 7931 7932<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> 7933<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 7934NestedNameSpecifier-matcher matches. 7935</pre></td></tr> 7936 7937 7938<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> 7939<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 7940given TypeLoc. 7941 7942Given 7943 struct A { struct B { struct C {}; }; }; 7944 A::B::C c; 7945nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 7946 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 7947 matches "A::" 7948</pre></td></tr> 7949 7950 7951<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> 7952<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 7953 7954Given 7955 struct A { struct B { struct C {}; }; }; 7956 A::B::C c; 7957nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 7958 matches "A::" 7959</pre></td></tr> 7960 7961 7962<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> 7963<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 7964given namespace matcher. 7965 7966Given 7967 namespace ns { struct A {}; } 7968 ns::A a; 7969nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 7970 matches "ns::" 7971</pre></td></tr> 7972 7973 7974<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> 7975<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 7976given QualType matcher without qualifiers. 7977 7978Given 7979 struct A { struct B { struct C {}; }; }; 7980 A::B::C c; 7981nestedNameSpecifier(specifiesType( 7982 hasDeclaration(cxxRecordDecl(hasName("A"))) 7983)) 7984 matches "A::" 7985</pre></td></tr> 7986 7987 7988<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> 7989<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 7990 7991Given 7992 7993 #pragma omp parallel 7994 #pragma omp parallel default(none) 7995 7996``ompExecutableDirective(hasAnyClause(anything()))`` matches 7997``omp parallel default(none)``. 7998</pre></td></tr> 7999 8000 8001<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> 8002<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 8003 8004Prerequisite: the executable directive must not be standalone directive. 8005If it is, it will never match. 8006 8007Given 8008 8009 #pragma omp parallel 8010 ; 8011 #pragma omp parallel 8012 {} 8013 8014``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 8015</pre></td></tr> 8016 8017 8018<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> 8019<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 8020matching Base, or Objective-C classes that directly or indirectly 8021subclass a class matching Base. 8022 8023Note that a class is not considered to be derived from itself. 8024 8025Example matches Y, Z, C (Base == hasName("X")) 8026 class X; 8027 class Y : public X {}; // directly derived 8028 class Z : public Y {}; // indirectly derived 8029 typedef X A; 8030 typedef A B; 8031 class C : public B {}; // derived from a typedef of X 8032 8033In the following example, Bar matches isDerivedFrom(hasName("X")): 8034 class Foo; 8035 typedef Foo X; 8036 class Bar : public Foo {}; // derived from a type that X is a typedef of 8037 8038In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 8039 @interface NSObject @end 8040 @interface Bar : NSObject @end 8041 8042Usable 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>> 8043</pre></td></tr> 8044 8045 8046<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> 8047<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 8048matching Base. 8049 8050Note that a class is not considered to be derived from itself. 8051 8052Example matches Y, C (Base == hasName("X")) 8053 class X; 8054 class Y : public X {}; // directly derived 8055 class Z : public Y {}; // indirectly derived 8056 typedef X A; 8057 typedef A B; 8058 class C : public B {}; // derived from a typedef of X 8059 8060In the following example, Bar matches isDerivedFrom(hasName("X")): 8061 class Foo; 8062 typedef Foo X; 8063 class Bar : public Foo {}; // derived from a type that X is a typedef of 8064</pre></td></tr> 8065 8066 8067<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> 8068<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 8069match Base. 8070</pre></td></tr> 8071 8072 8073<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> 8074<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 8075expression, or an ObjC-message-send expression. 8076 8077Given 8078 void x(int, int, int) { int y; x(1, y, 42); } 8079callExpr(hasAnyArgument(declRefExpr())) 8080 matches x(1, y, 42) 8081with hasAnyArgument(...) 8082 matching y 8083 8084For ObjectiveC, given 8085 @interface I - (void) f:(int) y; @end 8086 void foo(I *i) { [i f:12]; } 8087objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 8088 matches [i f:12] 8089</pre></td></tr> 8090 8091 8092<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> 8093<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor 8094call expression. 8095 8096Example matches y in x(y) 8097 (matcher = callExpr(hasArgument(0, declRefExpr()))) 8098 void x(int) { int y; x(y); } 8099</pre></td></tr> 8100 8101 8102<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> 8103<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 8104and the inner matcher matches on that instance. 8105 8106For example the method call in 8107 NSString *x = @"hello"; 8108 [x containsString:@"h"]; 8109is matched by 8110objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 8111</pre></td></tr> 8112 8113 8114<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> 8115<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 8116 8117Example 8118matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 8119matches the [webView ...] message invocation. 8120 NSString *webViewJavaScript = ... 8121 UIWebView *webView = ... 8122 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 8123</pre></td></tr> 8124 8125 8126<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> 8127<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 8128block. 8129 8130Does not match the 'this' parameter of a method. 8131 8132Given 8133 class X { void f(int x, int y, int z) {} }; 8134cxxMethodDecl(hasAnyParameter(hasName("y"))) 8135 matches f(int x, int y, int z) {} 8136with hasAnyParameter(...) 8137 matching int y 8138 8139For ObjectiveC, given 8140 @interface I - (void) f:(int) y; @end 8141 8142the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 8143matches the declaration of method f with hasParameter 8144matching y. 8145 8146For blocks, given 8147 b = ^(int y) { printf("%d", y) }; 8148 8149the matcher blockDecl(hasAnyParameter(hasName("y"))) 8150matches the declaration of the block b with hasParameter 8151matching y. 8152</pre></td></tr> 8153 8154 8155<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> 8156<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 8157declaration or a block. 8158 8159Given 8160 class X { void f(int x) {} }; 8161cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 8162 matches f(int x) {} 8163with hasParameter(...) 8164 matching int x 8165 8166For ObjectiveC, given 8167 @interface I - (void) f:(int) y; @end 8168 8169the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 8170matches the declaration of method f with hasParameter 8171matching y. 8172</pre></td></tr> 8173 8174 8175<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> 8176<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 8177or opaque value's source expression matches the given matcher. 8178 8179Example 1: matches "a string" 8180(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 8181class URL { URL(string); }; 8182URL url = "a string"; 8183 8184Example 2: matches 'b' (matcher = 8185opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 8186int a = b ?: 1; 8187</pre></td></tr> 8188 8189 8190<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> 8191<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 8192overloads matches the given matcher. 8193 8194Given 8195 template <typename T> void foo(T); 8196 template <typename T> void bar(T); 8197 template <typename T> void baz(T t) { 8198 foo(t); 8199 bar(t); 8200 } 8201unresolvedLookupExpr(hasAnyDeclaration( 8202 functionTemplateDecl(hasName("foo")))) 8203 matches foo in foo(t); but not bar in bar(t); 8204</pre></td></tr> 8205 8206 8207<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> 8208<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 8209 8210Given 8211 int (*ptr_to_array)[4]; 8212 int (*ptr_to_func)(int); 8213 8214varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 8215ptr_to_func but not ptr_to_array. 8216 8217Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 8218</pre></td></tr> 8219 8220 8221<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> 8222<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 8223pointee matches a given matcher. 8224 8225Given 8226 int *a; 8227 int const *b; 8228 float const *f; 8229pointerType(pointee(isConstQualified(), isInteger())) 8230 matches "int const *b" 8231 8232Usable 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>>, 8233 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>> 8234</pre></td></tr> 8235 8236 8237<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> 8238<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 8239 8240Given: 8241 typedef int &int_ref; 8242 int a; 8243 int_ref b = a; 8244 8245varDecl(hasType(qualType(referenceType()))))) will not match the 8246declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 8247</pre></td></tr> 8248 8249 8250<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> 8251<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 8252matches the given matcher. 8253 8254The associated declaration is: 8255- for type nodes, the declaration of the underlying type 8256- for CallExpr, the declaration of the callee 8257- for MemberExpr, the declaration of the referenced member 8258- for CXXConstructExpr, the declaration of the constructor 8259- for CXXNewExpr, the declaration of the operator new 8260- for ObjCIvarExpr, the declaration of the ivar 8261 8262For type nodes, hasDeclaration will generally match the declaration of the 8263sugared type. Given 8264 class X {}; 8265 typedef X Y; 8266 Y y; 8267in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8268typedefDecl. A common use case is to match the underlying, desugared type. 8269This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8270 varDecl(hasType(hasUnqualifiedDesugaredType( 8271 recordType(hasDeclaration(decl()))))) 8272In this matcher, the decl will match the CXXRecordDecl of class X. 8273 8274Usable 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>>, 8275 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>>, 8276 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>>, 8277 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>>, 8278 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>>, 8279 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>>, 8280 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8281</pre></td></tr> 8282 8283 8284<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> 8285<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 8286 8287Given 8288 void (*fp)(void); 8289The matcher 8290 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 8291would match the declaration for fp. 8292</pre></td></tr> 8293 8294 8295<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> 8296<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 8297</pre></td></tr> 8298 8299 8300<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> 8301<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 8302matches the specified matcher. 8303 8304Example matches y->x() 8305 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 8306 cxxRecordDecl(hasName("Y"))))))) 8307 class Y { public: void x(); }; 8308 void z() { Y *y; y->x(); } 8309</pre></td></tr> 8310 8311 8312<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> 8313<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 8314</pre></td></tr> 8315 8316 8317<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> 8318<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 8319type matches the specified matcher. 8320 8321Example matches X &x and const X &y 8322 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 8323 class X { 8324 void a(X b) { 8325 X &x = b; 8326 const X &y = b; 8327 } 8328 }; 8329</pre></td></tr> 8330 8331 8332<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> 8333<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 8334matches the given matcher. 8335 8336The associated declaration is: 8337- for type nodes, the declaration of the underlying type 8338- for CallExpr, the declaration of the callee 8339- for MemberExpr, the declaration of the referenced member 8340- for CXXConstructExpr, the declaration of the constructor 8341- for CXXNewExpr, the declaration of the operator new 8342- for ObjCIvarExpr, the declaration of the ivar 8343 8344For type nodes, hasDeclaration will generally match the declaration of the 8345sugared type. Given 8346 class X {}; 8347 typedef X Y; 8348 Y y; 8349in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8350typedefDecl. A common use case is to match the underlying, desugared type. 8351This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8352 varDecl(hasType(hasUnqualifiedDesugaredType( 8353 recordType(hasDeclaration(decl()))))) 8354In this matcher, the decl will match the CXXRecordDecl of class X. 8355 8356Usable 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>>, 8357 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>>, 8358 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>>, 8359 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>>, 8360 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>>, 8361 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>>, 8362 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8363</pre></td></tr> 8364 8365 8366<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> 8367<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 8368pointee matches a given matcher. 8369 8370Given 8371 int *a; 8372 int const *b; 8373 float const *f; 8374pointerType(pointee(isConstQualified(), isInteger())) 8375 matches "int const *b" 8376 8377Usable 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>>, 8378 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>> 8379</pre></td></tr> 8380 8381 8382<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> 8383<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 8384 8385Given 8386 return a + b; 8387hasReturnValue(binaryOperator()) 8388 matches 'return a + b' 8389with binaryOperator() 8390 matching 'a + b' 8391</pre></td></tr> 8392 8393 8394<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> 8395<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 8396a given matcher. Also matches StmtExprs that have CompoundStmt as children. 8397 8398Given 8399 { {}; 1+2; } 8400hasAnySubstatement(compoundStmt()) 8401 matches '{ {}; 1+2; }' 8402with compoundStmt() 8403 matching '{}' 8404</pre></td></tr> 8405 8406 8407<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> 8408<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8409alignof. 8410</pre></td></tr> 8411 8412 8413<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> 8414<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to 8415 8416Given: 8417F& operator=(const F& o) { 8418 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 8419 return *this; 8420} 8421returnStmt(forFunction(hasName("operator="))) 8422 matches 'return *this' 8423 but does not match 'return v > 0' 8424</pre></td></tr> 8425 8426 8427<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> 8428<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8429sizeof. 8430</pre></td></tr> 8431 8432 8433<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> 8434<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 8435type that matches the provided matcher. 8436 8437Given 8438 template <typename T> 8439 double F(T t); 8440 int i; 8441 double j = F(i); 8442 8443substTemplateTypeParmType(hasReplacementType(type())) matches int 8444</pre></td></tr> 8445 8446 8447<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> 8448<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 8449statement. This matcher may produce multiple matches. 8450 8451Given 8452 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 8453switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 8454 matches four times, with "c" binding each of "case 1:", "case 2:", 8455"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 8456"switch (1)", "switch (2)" and "switch (2)". 8457</pre></td></tr> 8458 8459 8460<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> 8461<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 8462switch statement or conditional operator. 8463 8464Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8465 if (true) {} 8466</pre></td></tr> 8467 8468 8469<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> 8470<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 8471 8472Given: 8473 void foo() { 8474 if (int i = foobar(); i > 0) {} 8475 switch (int i = foobar(); i) {} 8476 for (auto& a = get_range(); auto& x : a) {} 8477 } 8478 void bar() { 8479 if (foobar() > 0) {} 8480 switch (foobar()) {} 8481 for (auto& x : get_range()) {} 8482 } 8483ifStmt(hasInitStatement(anything())) 8484 matches the if statement in foo but not in bar. 8485switchStmt(hasInitStatement(anything())) 8486 matches the switch statement in foo but not in bar. 8487cxxForRangeStmt(hasInitStatement(anything())) 8488 matches the range for statement in foo but not in bar. 8489</pre></td></tr> 8490 8491 8492<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> 8493<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 8494matches the given matcher. 8495 8496The associated declaration is: 8497- for type nodes, the declaration of the underlying type 8498- for CallExpr, the declaration of the callee 8499- for MemberExpr, the declaration of the referenced member 8500- for CXXConstructExpr, the declaration of the constructor 8501- for CXXNewExpr, the declaration of the operator new 8502- for ObjCIvarExpr, the declaration of the ivar 8503 8504For type nodes, hasDeclaration will generally match the declaration of the 8505sugared type. Given 8506 class X {}; 8507 typedef X Y; 8508 Y y; 8509in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8510typedefDecl. A common use case is to match the underlying, desugared type. 8511This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8512 varDecl(hasType(hasUnqualifiedDesugaredType( 8513 recordType(hasDeclaration(decl()))))) 8514In this matcher, the decl will match the CXXRecordDecl of class X. 8515 8516Usable 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>>, 8517 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>>, 8518 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>>, 8519 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>>, 8520 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>>, 8521 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>>, 8522 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8523</pre></td></tr> 8524 8525 8526<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> 8527<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 8528 8529Given 8530 struct B { int next; }; 8531 template<int(B::*next_ptr)> struct A {}; 8532 A<&B::next> a; 8533templateSpecializationType(hasAnyTemplateArgument( 8534 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 8535 matches the specialization A<&B::next> with fieldDecl(...) matching 8536 B::next 8537</pre></td></tr> 8538 8539 8540<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> 8541<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 8542declaration. 8543 8544Given 8545 struct B { int next; }; 8546 template<int(B::*next_ptr)> struct A {}; 8547 A<&B::next> a; 8548classTemplateSpecializationDecl(hasAnyTemplateArgument( 8549 refersToDeclaration(fieldDecl(hasName("next"))))) 8550 matches the specialization A<&B::next> with fieldDecl(...) matching 8551 B::next 8552</pre></td></tr> 8553 8554 8555<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> 8556<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type. 8557 8558Given 8559 template<int T> struct C {}; 8560 C<42> c; 8561classTemplateSpecializationDecl( 8562 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 8563 matches the implicit instantiation of C in C<42>. 8564</pre></td></tr> 8565 8566 8567<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> 8568<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 8569 8570Given 8571 template<template <typename> class S> class X {}; 8572 template<typename T> class Y {}; 8573 X<Y> xi; 8574classTemplateSpecializationDecl(hasAnyTemplateArgument( 8575 refersToTemplate(templateName()))) 8576 matches the specialization X<Y> 8577</pre></td></tr> 8578 8579 8580<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> 8581<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 8582 8583Given 8584 struct X {}; 8585 template<typename T> struct A {}; 8586 A<X> a; 8587classTemplateSpecializationDecl(hasAnyTemplateArgument( 8588 refersToType(class(hasName("X"))))) 8589 matches the specialization A<X> 8590</pre></td></tr> 8591 8592 8593<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> 8594<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8595functionDecl that have at least one TemplateArgument matching the given 8596InnerMatcher. 8597 8598Given 8599 template<typename T> class A {}; 8600 template<> class A<double> {}; 8601 A<int> a; 8602 8603 template<typename T> f() {}; 8604 void func() { f<int>(); }; 8605 8606classTemplateSpecializationDecl(hasAnyTemplateArgument( 8607 refersToType(asString("int")))) 8608 matches the specialization A<int> 8609 8610functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 8611 matches the specialization f<int> 8612</pre></td></tr> 8613 8614 8615<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> 8616<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 8617matches the given matcher. 8618 8619The associated declaration is: 8620- for type nodes, the declaration of the underlying type 8621- for CallExpr, the declaration of the callee 8622- for MemberExpr, the declaration of the referenced member 8623- for CXXConstructExpr, the declaration of the constructor 8624- for CXXNewExpr, the declaration of the operator new 8625- for ObjCIvarExpr, the declaration of the ivar 8626 8627For type nodes, hasDeclaration will generally match the declaration of the 8628sugared type. Given 8629 class X {}; 8630 typedef X Y; 8631 Y y; 8632in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8633typedefDecl. A common use case is to match the underlying, desugared type. 8634This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8635 varDecl(hasType(hasUnqualifiedDesugaredType( 8636 recordType(hasDeclaration(decl()))))) 8637In this matcher, the decl will match the CXXRecordDecl of class X. 8638 8639Usable 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>>, 8640 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>>, 8641 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>>, 8642 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>>, 8643 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>>, 8644 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>>, 8645 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8646</pre></td></tr> 8647 8648 8649<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> 8650<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8651functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 8652 8653Given 8654 template<typename T, typename U> class A {}; 8655 A<bool, int> b; 8656 A<int, bool> c; 8657 8658 template<typename T> void f() {} 8659 void func() { f<int>(); }; 8660classTemplateSpecializationDecl(hasTemplateArgument( 8661 1, refersToType(asString("int")))) 8662 matches the specialization A<bool, int> 8663 8664functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 8665 matches the specialization f<int> 8666</pre></td></tr> 8667 8668 8669<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> 8670<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 8671matches the given matcher. 8672 8673The associated declaration is: 8674- for type nodes, the declaration of the underlying type 8675- for CallExpr, the declaration of the callee 8676- for MemberExpr, the declaration of the referenced member 8677- for CXXConstructExpr, the declaration of the constructor 8678- for CXXNewExpr, the declaration of the operator new 8679- for ObjCIvarExpr, the declaration of the ivar 8680 8681For type nodes, hasDeclaration will generally match the declaration of the 8682sugared type. Given 8683 class X {}; 8684 typedef X Y; 8685 Y y; 8686in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8687typedefDecl. A common use case is to match the underlying, desugared type. 8688This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8689 varDecl(hasType(hasUnqualifiedDesugaredType( 8690 recordType(hasDeclaration(decl()))))) 8691In this matcher, the decl will match the CXXRecordDecl of class X. 8692 8693Usable 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>>, 8694 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>>, 8695 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>>, 8696 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>>, 8697 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>>, 8698 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>>, 8699 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8700</pre></td></tr> 8701 8702 8703<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> 8704<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 8705QualType-matcher matches. 8706</pre></td></tr> 8707 8708 8709<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> 8710<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 8711matcher. 8712 8713Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8714 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8715 and U (matcher = typedefDecl(hasType(asString("int"))) 8716 and friend class X (matcher = friendDecl(hasType("X")) 8717 class X {}; 8718 void y(X &x) { x; X z; } 8719 typedef int U; 8720 class Y { friend class X; }; 8721</pre></td></tr> 8722 8723 8724<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> 8725<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 8726matches the given matcher. 8727 8728The associated declaration is: 8729- for type nodes, the declaration of the underlying type 8730- for CallExpr, the declaration of the callee 8731- for MemberExpr, the declaration of the referenced member 8732- for CXXConstructExpr, the declaration of the constructor 8733- for CXXNewExpr, the declaration of the operator new 8734- for ObjCIvarExpr, the declaration of the ivar 8735 8736For type nodes, hasDeclaration will generally match the declaration of the 8737sugared type. Given 8738 class X {}; 8739 typedef X Y; 8740 Y y; 8741in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8742typedefDecl. A common use case is to match the underlying, desugared type. 8743This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8744 varDecl(hasType(hasUnqualifiedDesugaredType( 8745 recordType(hasDeclaration(decl()))))) 8746In this matcher, the decl will match the CXXRecordDecl of class X. 8747 8748Usable 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>>, 8749 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>>, 8750 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>>, 8751 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>>, 8752 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>>, 8753 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>>, 8754 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8755</pre></td></tr> 8756 8757 8758<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> 8759<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 8760type of the matched node. 8761 8762For example, in: 8763 class A {}; 8764 using B = A; 8765The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 8766both B and A. 8767</pre></td></tr> 8768 8769 8770<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> 8771<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 8772 8773Given 8774 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 8775unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 8776 matches sizeof(a) and alignof(c) 8777</pre></td></tr> 8778 8779 8780<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> 8781<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 8782 8783Example matches true (matcher = hasUnaryOperand( 8784 cxxBoolLiteral(equals(true)))) 8785 !true 8786</pre></td></tr> 8787 8788 8789<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> 8790<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 8791given matcher. Implicit object expressions are included; that is, it matches 8792use of implicit `this`. 8793 8794Given 8795 struct X { 8796 int m; 8797 int f(X x) { x.m; return m; } 8798 }; 8799memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 8800 matches `x.m`, but not `m`; however, 8801memberExpr(hasObjectExpression(hasType(pointsTo( 8802 cxxRecordDecl(hasName("X")))))) 8803 matches `m` (aka. `this->m`), but not `x.m`. 8804</pre></td></tr> 8805 8806 8807<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> 8808<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 8809matches the given matcher. 8810 8811The associated declaration is: 8812- for type nodes, the declaration of the underlying type 8813- for CallExpr, the declaration of the callee 8814- for MemberExpr, the declaration of the referenced member 8815- for CXXConstructExpr, the declaration of the constructor 8816- for CXXNewExpr, the declaration of the operator new 8817- for ObjCIvarExpr, the declaration of the ivar 8818 8819For type nodes, hasDeclaration will generally match the declaration of the 8820sugared type. Given 8821 class X {}; 8822 typedef X Y; 8823 Y y; 8824in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8825typedefDecl. A common use case is to match the underlying, desugared type. 8826This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8827 varDecl(hasType(hasUnqualifiedDesugaredType( 8828 recordType(hasDeclaration(decl()))))) 8829In this matcher, the decl will match the CXXRecordDecl of class X. 8830 8831Usable 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>>, 8832 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>>, 8833 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>>, 8834 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>>, 8835 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>>, 8836 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>>, 8837 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8838</pre></td></tr> 8839 8840 8841<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> 8842<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 8843 8844Given 8845 namespace X { void b(); } 8846 using X::b; 8847usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 8848 matches using X::b </pre></td></tr> 8849 8850 8851<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> 8852<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 8853matched by the given matcher. 8854 8855Given 8856 namespace X { int a; void b(); } 8857 using X::a; 8858 using X::b; 8859usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 8860 matches using X::b but not using X::a </pre></td></tr> 8861 8862 8863<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> 8864<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 8865declaration's type. 8866 8867In case of a value declaration (for example a variable declaration), 8868this resolves one layer of indirection. For example, in the value 8869declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 8870X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 8871declaration of x. 8872 8873Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8874 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8875 and friend class X (matcher = friendDecl(hasType("X")) 8876 class X {}; 8877 void y(X &x) { x; X z; } 8878 class Y { friend class X; }; 8879 8880Example matches class Derived 8881(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 8882class Base {}; 8883class Derived : Base {}; 8884 8885Usable 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>>, 8886Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 8887</pre></td></tr> 8888 8889 8890<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> 8891<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 8892matcher. 8893 8894Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8895 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8896 and U (matcher = typedefDecl(hasType(asString("int"))) 8897 and friend class X (matcher = friendDecl(hasType("X")) 8898 class X {}; 8899 void y(X &x) { x; X z; } 8900 typedef int U; 8901 class Y { friend class X; }; 8902</pre></td></tr> 8903 8904 8905<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> 8906<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 8907that matches the given matcher. 8908 8909Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 8910 bool y() { return true; } 8911 bool x = y(); 8912</pre></td></tr> 8913 8914 8915<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> 8916<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 8917expression. 8918 8919Given 8920 void f(int b) { 8921 int a[b]; 8922 } 8923variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 8924 varDecl(hasName("b"))))))) 8925 matches "int a[b]" 8926</pre></td></tr> 8927 8928 8929<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> 8930<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr> 8931 8932 8933<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> 8934<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 8935switch statement or conditional operator. 8936 8937Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8938 if (true) {} 8939</pre></td></tr> 8940 8941<!--END_TRAVERSAL_MATCHERS --> 8942</table> 8943 8944</div> 8945</body> 8946</html> 8947 8948 8949