1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 2 "http://www.w3.org/TR/html4/strict.dtd"> 3<html> 4<head> 5<title>AST Matcher Reference</title> 6<link type="text/css" rel="stylesheet" href="../menu.css" /> 7<link type="text/css" rel="stylesheet" href="../content.css" /> 8<style type="text/css"> 9td { 10 padding: .33em; 11} 12td.doc { 13 display: none; 14 border-bottom: 1px solid black; 15} 16td.name:hover { 17 color: blue; 18 cursor: pointer; 19} 20span.mono { font-family: monospace; } 21 22.traverse_compare, .traverse_compare td, .traverse_compare th { 23 border: 1px solid black; 24 border-collapse: collapse; 25} 26</style> 27<script type="text/javascript"> 28function toggle(id) { 29 if (!id) return; 30 row = document.getElementById(id); 31 if (row.style.display != 'table-cell') 32 row.style.display = 'table-cell'; 33 else 34 row.style.display = 'none'; 35} 36</script> 37</head> 38<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))"> 39 40<!--#include virtual="../menu.html.incl"--> 41 42<div id="content"> 43 44<h1>AST Matcher Reference</h1> 45 46<p>This document shows all currently implemented matchers. The matchers are grouped 47by category and node type they match. You can click on matcher names to show the 48matcher's source documentation.</p> 49 50<p>There are three different basic categories of matchers: 51<ul> 52<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li> 53<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li> 54<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li> 55</ul> 56</p> 57 58<p>Within each category the matchers are ordered by node type they match on. 59Note that if a matcher can match multiple node types, it will appear 60multiple times. This means that by searching for Matcher<Stmt> you can 61find all matchers that can be used to match on Stmt nodes.</p> 62 63<p>The exception to that rule are matchers that can match on any node. Those 64are marked with a * and are listed in the beginning of each category.</p> 65 66<p>Note that the categorization of matchers is a great help when you combine 67them into matcher expressions. You will usually want to form matcher expressions 68that read like english sentences by alternating between node matchers and 69narrowing or traversal matchers, like this: 70<pre> 71recordDecl(hasDescendant( 72 ifStmt(hasTrueExpression( 73 expr(hasDescendant( 74 ifStmt())))))) 75</pre> 76</p> 77 78<!-- ======================================================================= --> 79<h2 id="traverse-mode">Traverse Mode</h2> 80<!-- ======================================================================= --> 81 82<p>The default mode of operation of AST Matchers visits all nodes in the AST, 83even if they are not spelled in the source. This is 84<span class="mono">AsIs</span> mode. This mode requires writing AST matchers 85that explicitly traverse or ignore implicit nodes, such as parentheses 86surrounding an expression or expressions with cleanups. These implicit 87nodes are not always obvious from the syntax of the source code, and so this 88mode requires careful consideration and testing to get the desired behavior 89from an AST matcher. 90</p> 91 92<p>In addition, because template instantiations are matched in the default mode, 93transformations can be accidentally made to template declarations. Finally, 94because implicit nodes are matched by default, transformations can be made on 95entirely incorrect places in the code.</p> 96 97<p>For these reasons, it is possible to ignore AST nodes which are not spelled 98in the source using the <span class="mono">IgnoreUnlessSpelledInSource</span> 99mode. This is likely to be far less error-prone for users who are not already 100very familiar with where implicit nodes appear in the AST. It is also likely 101to be less error-prone for experienced AST users, as difficult cases do not 102need to be encountered and matcher expressions adjusted for these cases.</p> 103 104<p>In clang-query, the mode can be changed with 105<pre> 106set traversal IgnoreUnlessSpelledInSource 107</pre> 108</p> 109This affects both matchers and AST dump output in results. 110 111<p>When using the C++ API such as in clang-tidy checks, the 112<span class="mono">traverse()</span> matcher is used to set the mode: 113<pre> 114Finder->addMatcher(traverse(TK_IgnoreUnlessSpelledInSource, 115 returnStmt(hasReturnArgument(integerLiteral(equals(0)))) 116 ), this); 117</pre> 118</p> 119<p>The following table compares the <span class="mono">AsIs</span> mode with 120the <span class="mono">IgnoreUnlessSpelledInSource</span> mode:</p> 121 122<table class="traverse_compare"> 123<tr> 124<th></th> 125<th><span class="mono">AsIs</span></th> 126<th><span class="mono">IgnoreUnlessSpelledInSource</span></th> 127</tr> 128<tr> 129 <td>AST dump of <span class="mono">func1</span>: 130<pre> 131struct B { 132 B(int); 133}; 134 135B func1() { return 42; } 136</pre> 137 138 </td> 139 <td> 140C++98 dialect: 141<pre> 142FunctionDecl 143`-CompoundStmt 144 `-ReturnStmt 145 `-ExprWithCleanups 146 `-CXXConstructExpr 147 `-MaterializeTemporaryExpr 148 `-ImplicitCastExpr 149 `-ImplicitCastExpr 150 `-CXXConstructExpr 151 `-IntegerLiteral 'int' 42 152</pre> 153C++11, C++14 dialect: 154<pre> 155FunctionDecl 156`-CompoundStmt 157 `-ReturnStmt 158 `-ExprWithCleanups 159 `-CXXConstructExpr 160 `-MaterializeTemporaryExpr 161 `-ImplicitCastExpr 162 `-CXXConstructExpr 163 `-IntegerLiteral 'int' 42 164</pre> 165C++17, C++20 dialect: 166<pre> 167FunctionDecl 168`-CompoundStmt 169 `-ReturnStmt 170 `-ImplicitCastExpr 171 `-CXXConstructExpr 172 `-IntegerLiteral 'int' 42 173</pre> 174</td> 175 <td> 176All dialects: 177 <pre> 178FunctionDecl 179`-CompoundStmt 180 `-ReturnStmt 181 `-IntegerLiteral 'int' 42 182</pre></td> 183</tr> 184 185<tr> 186<td>Matcher for returned <span class="mono">42</span>: 187<pre> 188struct B { 189 B(int); 190}; 191 192B func1() { return 42; } 193</pre> 194 195 </td> 196 <td> 197All dialects: 198<pre> 199returnStmt(hasReturnValue( 200 ignoringImplicit( 201 ignoringElidableConstructorCall( 202 ignoringImplicit( 203 cxxConstructExpr(hasArgument(0, 204 ignoringImplicit( 205 integerLiteral().bind("returnVal") 206 ) 207 )) 208 ) 209 ) 210 ) 211 )) 212</pre></td> 213 <td> 214All dialects: 215<pre> 216returnStmt(hasReturnValue( 217 integerLiteral().bind("returnVal") 218)) 219</pre></td> 220</tr> 221<tr> 222<td>Match result for 223<pre>implicitCastExpr()</pre> 224given: 225<pre> 226struct B { 227 B(int); 228}; 229 230B func1() { return 42; } 231</pre> 232 233</td> 234<td> 235Match found.</td> 236 <td> 237No match.</td> 238</tr> 239<tr> 240 <td>Match result for: 241<pre> 242cxxConstructorDecl( 243 isCopyConstructor() 244 ).bind("prepend_explicit") 245</pre> 246given: 247<pre> 248struct Other {}; 249struct Copyable { 250 Other m_o; 251 Copyable(); 252}; 253</pre> 254</td> 255<td> 256Match found. Insertion produces incorrect output: 257<pre> 258struct Other {}; 259struct explicit Copyable { 260 Other m_o; 261 Copyable(); 262}; 263</pre> 264</td> 265<td> 266No match found. Incorrect replacement not possible. 267</td> 268</tr> 269<tr> 270 <td>Replacement of <span class="mono">begin()</span> 271 with <span class="mono">cbegin()</span>: 272<pre> 273cxxMemberCallExpr( 274 on(ConstContainerExpr), 275 callee(cxxMethodDecl(hasName("begin"))) 276 ).bind("replace_with_cbegin") 277</pre> 278given: 279<pre> 280void foo() { 281 const Container c; 282 c.begin(); 283 284 for (auto i : c) { 285 } 286} 287</pre> 288</td> 289<td> 2902 matches found. Replacement produces incorrect output: 291<pre> 292void foo() { 293 const Container c; 294 c.cbegin(); 295 296 for (auto i :.cbegin() c) { 297 } 298} 299</pre> 300</td> 301<td> 3021 match found. Replacement produces correct output: 303<pre> 304void foo() { 305 const Container c; 306 c.cbegin(); 307 308 for (auto i : c) { 309 } 310} 311</pre> 312</td> 313</tr> 314<tr> 315 <td>Replacement of <span class="mono">int</span> member 316 with <span class="mono">safe_int</span>: 317<pre> 318fieldDecl( 319 hasType(asString("int")) 320 ).bind("use_safe_int") 321</pre> 322given: 323<pre> 324struct S { 325 int m_i; 326}; 327 328template <typename T> struct TemplStruct { 329 TemplStruct() {} 330 ~TemplStruct() {} 331 332private: 333 T m_t; 334}; 335 336void instantiate() { TemplStruct<int> ti; } 337</pre> 338</td> 339<td> 3402 matches found. Replacement produces incorrect output: 341<pre> 342struct S { 343 safe_int m_i; 344}; 345 346template <typename T> struct TemplStruct { 347 TemplStruct() {} 348 ~TemplStruct() {} 349 350private: 351 safe_int m_t; 352}; 353 354void instantiate() { TemplStruct<int> ti; } 355</pre> 356</td> 357<td> 3581 match found. Replacement produces correct output: 359<pre> 360struct S { 361 safe_int m_i; 362}; 363 364template <typename T> struct TemplStruct { 365 TemplStruct() {} 366 ~TemplStruct() {} 367 368private: 369 T m_t; 370}; 371 372void instantiate() { TemplStruct<int> ti; } 373</pre> 374</td> 375</tr> 376<tr> 377 <td>Add prefix to member initializer 378<pre> 379cxxCtorInitializer( 380 forField(fieldDecl()) 381 ).bind("add_prefix") 382</pre> 383given: 384<pre> 385struct Simple {}; 386 387struct Record { 388 Record() : i(42) {} 389private: 390 int i; 391 Simple s; 392}; 393</pre> 394</td> 395<td> 3962 matches found. Replacement produces incorrect output: 397<pre> 398struct Simple {}; 399 400struct Record { 401 m_Record() : m_i(42) {} 402private: 403 int i; 404 Simple s; 405}; 406</pre> 407</td> 408<td> 4091 match found. Replacement produces correct output: 410<pre> 411struct Simple {}; 412 413struct Record { 414 Record() : m_i(42) {} 415private: 416 int i; 417 Simple s; 418}; 419</pre> 420</td> 421</tr> 422<tr> 423 <td>Ignored default arguments 424<pre> 425callExpr( 426 callee(functionDecl( 427 hasName("hasDefaultArg") 428 )), 429 argumentCountIs(1) 430 ).bind("add_prefix") 431</pre> 432given: 433<pre> 434void hasDefaultArg(int i, int j = 0) {} 435void callDefaultArg() { hasDefaultArg(42); } 436</pre> 437</td> 438<td> 439No match. 440</td> 441<td> 4421 match found. 443</td> 444</tr> 445<tr> 446 <td>Lambda fields 447<pre> 448fieldDecl( 449 hasType(asString("int")) 450 ).bind("make_safe") 451</pre> 452given: 453<pre> 454struct S { 455 int m_i; 456}; 457 458void func() { 459 int a = 0; 460 int c = 0; 461 462 auto l = [a, b = c](int d) { int e = d; }; 463 l(43); 464} 465</pre> 466</td> 467<td> 4682 matches found. Replacement produces incorrect output: 469<pre> 470struct S { 471 safe_int m_i; 472}; 473 474void func() { 475 int a = 0; 476 int c = 0; 477 478 auto l = [safe_a, safe_b = c](int d) { int e = d; }; 479 l(43); 480} 481</pre> 482</td> 483<td> 4841 match found. Replacement produces correct output: 485<pre> 486struct S { 487 safe_int m_i; 488}; 489 490void func() { 491 int a = 0; 492 int c = 0; 493 494 auto l = [a, b = c](int d) { int e = d; }; 495 l(43); 496} 497</pre> 498</td> 499 500</tr> 501 502 503 504 505 506<tr> 507 <td>Rewritten binary operators 508<pre> 509binaryOperator( 510 hasOperatorName("<"), 511 hasRHS(hasDescendant(integerLiteral(equals(0)))) 512 ) 513</pre> 514given: 515<pre> 516#include <compare> 517 518class HasSpaceship { 519public: 520 int x; 521 bool operator==(const HasSpaceship&) const = default; 522 std::strong_ordering operator<=>(const HasSpaceship&) const = default; 523}; 524 525bool isLess(const HasSpaceship& a, const HasSpaceship& b) { 526 return a < b; 527} 528</pre> 529</td> 530<td> 5311 match found. 532 533<pre> 534 return a < b; 535 ^~~~~ 536</pre> 537 538</td> 539<td> 540No match found. 541</td> 542</tr> 543</table> 544 545<!-- ======================================================================= --> 546<h2 id="decl-matchers">Node Matchers</h2> 547<!-- ======================================================================= --> 548 549<p>Node matchers are at the core of matcher expressions - they specify the type 550of node that is expected. Every match expression starts with a node matcher, 551which can then be further refined with a narrowing or traversal matcher. All 552traversal matchers take node matchers as their arguments.</p> 553 554<p>For convenience, all node matchers take an arbitrary number of arguments 555and implicitly act as allOf matchers.</p> 556 557<p>Node matchers are the only matchers that support the bind("id") call to 558bind the matched node to the given string, to be later retrieved from the 559match callback.</p> 560 561<p>It is important to remember that the arguments to node matchers are 562predicates on the same node, just with additional information about the type. 563This is often useful to make matcher expression more readable by inlining bind 564calls into redundant node matchers inside another node matcher: 565<pre> 566// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on 567// the same node. 568recordDecl(decl().bind("id"), hasName("::MyClass")) 569</pre> 570</p> 571 572<table> 573<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 574<!-- START_DECL_MATCHERS --> 575 576<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('cxxBaseSpecifier0')"><a name="cxxBaseSpecifier0Anchor">cxxBaseSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>...</td></tr> 577<tr><td colspan="4" class="doc" id="cxxBaseSpecifier0"><pre>Matches class bases. 578 579Examples matches public virtual B. 580 class B {}; 581 class C : public virtual B {}; 582</pre></td></tr> 583 584 585<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>...</td></tr> 586<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers. 587 588Examples matches i(42). 589 class C { 590 C() : i(42) {} 591 int i; 592 }; 593</pre></td></tr> 594 595 596<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>>...</td></tr> 597<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations. 598 599Given 600 class C { 601 public: 602 int a; 603 }; 604accessSpecDecl() 605 matches 'public:' 606</pre></td></tr> 607 608 609<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('bindingDecl0')"><a name="bindingDecl0Anchor">bindingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>>...</td></tr> 610<tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations 611Example matches foo and bar 612(matcher = bindingDecl() 613 614 auto [foo, bar] = std::make_pair{42, 42}; 615</pre></td></tr> 616 617 618<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>...</td></tr> 619<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations. 620 621Example matches the declaration of the nameless block printing an input 622integer. 623 624 myFunc(^(int p) { 625 printf("%d", p); 626 }) 627</pre></td></tr> 628 629 630<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>>...</td></tr> 631<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations. 632 633Example matches Z 634 template<class T> class Z {}; 635</pre></td></tr> 636 637 638<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>>...</td></tr> 639<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations. 640 641Given 642 template<class T1, class T2, int I> 643 class A {}; 644 645 template<class T, int I> 646 class A<T, T*, I> {}; 647 648 template<> 649 class A<int, int, 1> {}; 650classTemplatePartialSpecializationDecl() 651 matches the specialization A<T,T*,I> but not A<int,int,1> 652</pre></td></tr> 653 654 655<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>...</td></tr> 656<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations. 657 658Given 659 template<typename T> class A {}; 660 template<> class A<double> {}; 661 A<int> a; 662classTemplateSpecializationDecl() 663 matches the specializations A<int> and A<double> 664</pre></td></tr> 665 666 667<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>>...</td></tr> 668<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. 669 670Example matches Foo::Foo() and Foo::Foo(int) 671 class Foo { 672 public: 673 Foo(); 674 Foo(int); 675 int DoSomething(); 676 }; 677</pre></td></tr> 678 679 680<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>>...</td></tr> 681<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations. 682 683Example matches the operator. 684 class X { operator int() const; }; 685</pre></td></tr> 686 687 688<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>>...</td></tr> 689<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide. 690 691Example matches the deduction guide. 692 template<typename T> 693 class X { X(int) }; 694 X(int) -> X<int>; 695</pre></td></tr> 696 697 698<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>>...</td></tr> 699<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations. 700 701Example matches Foo::~Foo() 702 class Foo { 703 public: 704 virtual ~Foo(); 705 }; 706</pre></td></tr> 707 708 709<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>...</td></tr> 710<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations. 711 712Example matches y 713 class X { void y(); }; 714</pre></td></tr> 715 716 717<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>...</td></tr> 718<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations. 719 720Example matches X, Z 721 class X; 722 template<class T> class Z {}; 723</pre></td></tr> 724 725 726<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>...</td></tr> 727<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 728 729Examples matches X, C, and the friend declaration inside C; 730 void X(); 731 class C { 732 friend X; 733 }; 734</pre></td></tr> 735 736 737<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>...</td></tr> 738<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 739and non-type template parameter declarations). 740 741Given 742 class X { int y; }; 743declaratorDecl() 744 matches int y. 745</pre></td></tr> 746 747 748<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('decompositionDecl0')"><a name="decompositionDecl0Anchor">decompositionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>>...</td></tr> 749<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations. 750 751Examples matches the declaration node with foo and bar, but not 752number. 753(matcher = declStmt(has(decompositionDecl()))) 754 755 int number = 42; 756 auto [foo, bar] = std::make_pair{42, 42}; 757</pre></td></tr> 758 759 760<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>>...</td></tr> 761<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 762 763Example matches A, B, C 764 enum X { 765 A, B, C 766 }; 767</pre></td></tr> 768 769 770<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>>...</td></tr> 771<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 772 773Example matches X 774 enum X { 775 A, B, C 776 }; 777</pre></td></tr> 778 779 780<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>>...</td></tr> 781<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 782 783Given 784 class X { int m; }; 785fieldDecl() 786 matches 'm'. 787</pre></td></tr> 788 789 790<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>...</td></tr> 791<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 792 793Given 794 class X { friend void foo(); }; 795friendDecl() 796 matches 'friend void foo()'. 797</pre></td></tr> 798 799 800<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>...</td></tr> 801<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 802 803Example matches f 804 void f(); 805</pre></td></tr> 806 807 808<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>>...</td></tr> 809<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 810 811Example matches f 812 template<class T> void f(T t) {} 813</pre></td></tr> 814 815 816<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>>...</td></tr> 817<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations. 818 819Given 820 struct X { struct { int a; }; }; 821indirectFieldDecl() 822 matches 'a'. 823</pre></td></tr> 824 825 826<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>>...</td></tr> 827<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label. 828 829Given 830 goto FOO; 831 FOO: bar(); 832labelDecl() 833 matches 'FOO:' 834</pre></td></tr> 835 836 837<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>>...</td></tr> 838<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification. 839 840Given 841 extern "C" {} 842linkageSpecDecl() 843 matches "extern "C" {}" 844</pre></td></tr> 845 846 847<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>>...</td></tr> 848<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 849 850Example matches X, S, the anonymous union type, i, and U; 851 typedef int X; 852 struct S { 853 union { 854 int i; 855 } U; 856 }; 857</pre></td></tr> 858 859 860<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>>...</td></tr> 861<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias. 862 863Given 864 namespace test {} 865 namespace alias = ::test; 866namespaceAliasDecl() 867 matches "namespace alias" but not "namespace test" 868</pre></td></tr> 869 870 871<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>>...</td></tr> 872<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 873 874Given 875 namespace {} 876 namespace test {} 877namespaceDecl() 878 matches "namespace {}" and "namespace test {}" 879</pre></td></tr> 880 881 882<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>>...</td></tr> 883<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations. 884 885Given 886 template <typename T, int N> struct C {}; 887nonTypeTemplateParmDecl() 888 matches 'N', but not 'T'. 889</pre></td></tr> 890 891 892<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>>...</td></tr> 893<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations. 894 895Example matches Foo (Additions) 896 @interface Foo (Additions) 897 @end 898</pre></td></tr> 899 900 901<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>>...</td></tr> 902<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions. 903 904Example matches Foo (Additions) 905 @implementation Foo (Additions) 906 @end 907</pre></td></tr> 908 909 910<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>>...</td></tr> 911<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations. 912 913Example matches Foo 914 @implementation Foo 915 @end 916</pre></td></tr> 917 918 919<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>...</td></tr> 920<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 921 922Example matches Foo 923 @interface Foo 924 @end 925</pre></td></tr> 926 927 928<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>>...</td></tr> 929<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations. 930 931Example matches _enabled 932 @implementation Foo { 933 BOOL _enabled; 934 } 935 @end 936</pre></td></tr> 937 938 939<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>...</td></tr> 940<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations. 941 942Example matches both declaration and definition of -[Foo method] 943 @interface Foo 944 - (void)method; 945 @end 946 947 @implementation Foo 948 - (void)method {} 949 @end 950</pre></td></tr> 951 952 953<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>...</td></tr> 954<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations. 955 956Example matches enabled 957 @interface Foo 958 @property BOOL enabled; 959 @end 960</pre></td></tr> 961 962 963<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>>...</td></tr> 964<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations. 965 966Example matches FooDelegate 967 @protocol FooDelegate 968 @end 969</pre></td></tr> 970 971 972<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>>...</td></tr> 973<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 974 975Given 976 void f(int x); 977parmVarDecl() 978 matches int x. 979</pre></td></tr> 980 981 982<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>>...</td></tr> 983<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 984 985Example matches X, Z, U, and S 986 class X; 987 template<class T> class Z {}; 988 struct S {}; 989 union U {}; 990</pre></td></tr> 991 992 993<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>>...</td></tr> 994<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 995 996Example: 997 staticAssertExpr() 998matches 999 static_assert(sizeof(S) == sizeof(int)) 1000in 1001 struct S { 1002 int x; 1003 }; 1004 static_assert(sizeof(S) == sizeof(int)); 1005</pre></td></tr> 1006 1007 1008<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>...</td></tr> 1009<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations. 1010 1011Example matches X, Z, U, S, E 1012 class X; 1013 template<class T> class Z {}; 1014 struct S {}; 1015 union U {}; 1016 enum E { 1017 A, B, C 1018 }; 1019</pre></td></tr> 1020 1021 1022<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTemplateParmDecl0')"><a name="templateTemplateParmDecl0Anchor">templateTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl</a>>...</td></tr> 1023<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations. 1024 1025Given 1026 template <template <typename> class Z, int N> struct C {}; 1027templateTypeParmDecl() 1028 matches 'Z', but not 'N'. 1029</pre></td></tr> 1030 1031 1032<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>>...</td></tr> 1033<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 1034 1035Given 1036 template <typename T, int N> struct C {}; 1037templateTypeParmDecl() 1038 matches 'T', but not 'N'. 1039</pre></td></tr> 1040 1041 1042<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>>...</td></tr> 1043<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 1044 1045Given 1046 int X; 1047 namespace NS { 1048 int Y; 1049 } // namespace NS 1050decl(hasDeclContext(translationUnitDecl())) 1051 matches "int X", but not "int Y". 1052</pre></td></tr> 1053 1054 1055<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>>...</td></tr> 1056<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations. 1057 1058Given 1059 typedef int X; 1060 using Y = int; 1061typeAliasDecl() 1062 matches "using Y = int", but not "typedef int X" 1063</pre></td></tr> 1064 1065 1066<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>>...</td></tr> 1067<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations. 1068 1069typeAliasTemplateDecl() matches 1070 template <typename T> 1071 using Y = X<T>; 1072</pre></td></tr> 1073 1074 1075<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>>...</td></tr> 1076<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 1077 1078Given 1079 typedef int X; 1080 using Y = int; 1081typedefDecl() 1082 matches "typedef int X", but not "using Y = int" 1083</pre></td></tr> 1084 1085 1086<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>...</td></tr> 1087<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations. 1088 1089Given 1090 typedef int X; 1091 using Y = int; 1092typedefNameDecl() 1093 matches "typedef int X" and "using Y = int" 1094</pre></td></tr> 1095 1096 1097<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>>...</td></tr> 1098<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 1099typename. 1100 1101Given 1102 template <typename T> 1103 struct Base { typedef T Foo; }; 1104 1105 template<typename T> 1106 struct S : private Base<T> { 1107 using typename Base<T>::Foo; 1108 }; 1109unresolvedUsingTypenameDecl() 1110 matches using Base<T>::Foo </pre></td></tr> 1111 1112 1113<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>>...</td></tr> 1114<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 1115 1116Given 1117 template<typename X> 1118 class C : private X { 1119 using X::x; 1120 }; 1121unresolvedUsingValueDecl() 1122 matches using X::x </pre></td></tr> 1123 1124 1125<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>>...</td></tr> 1126<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 1127 1128Given 1129 namespace X { int x; } 1130 using X::x; 1131usingDecl() 1132 matches using X::x </pre></td></tr> 1133 1134 1135<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>>...</td></tr> 1136<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 1137 1138Given 1139 namespace X { int x; } 1140 using namespace X; 1141usingDirectiveDecl() 1142 matches using namespace X </pre></td></tr> 1143 1144 1145<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>...</td></tr> 1146<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 1147 1148Example matches A, B, C and F 1149 enum X { A, B, C }; 1150 void F(); 1151</pre></td></tr> 1152 1153 1154<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>...</td></tr> 1155<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 1156 1157Note: this does not match declarations of member variables, which are 1158"field" declarations in Clang parlance. 1159 1160Example matches a 1161 int a; 1162</pre></td></tr> 1163 1164 1165<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>>...</td></tr> 1166<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 1167</pre></td></tr> 1168 1169 1170<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>>...</td></tr> 1171<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 1172 1173Given 1174 namespace ns { 1175 struct A { static void f(); }; 1176 void A::f() {} 1177 void g() { A::f(); } 1178 } 1179 ns::A a; 1180nestedNameSpecifier() 1181 matches "ns::" and both "A::" 1182</pre></td></tr> 1183 1184 1185<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>></td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>>...</td></tr> 1186<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause. 1187 1188Given 1189 1190 #pragma omp parallel default(none) 1191 #pragma omp parallel default(shared) 1192 #pragma omp parallel default(firstprivate) 1193 #pragma omp parallel 1194 1195``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and 1196``default(firstprivate)`` 1197</pre></td></tr> 1198 1199 1200<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>...</td></tr> 1201<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 1202</pre></td></tr> 1203 1204 1205<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>...</td></tr> 1206<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension). 1207 1208Given 1209 FOO: bar(); 1210 void *ptr = &&FOO; 1211 goto *bar; 1212addrLabelExpr() 1213 matches '&&FOO' 1214</pre></td></tr> 1215 1216 1217<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>>...</td></tr> 1218<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 1219 1220Given 1221 int i = a[1]; 1222arraySubscriptExpr() 1223 matches "a[1]" 1224</pre></td></tr> 1225 1226 1227<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>>...</td></tr> 1228<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 1229 1230 int i = 100; 1231 __asm("mov al, 2"); 1232asmStmt() 1233 matches '__asm("mov al, 2")' 1234</pre></td></tr> 1235 1236 1237<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>>...</td></tr> 1238<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins. 1239Example matches __atomic_load_n(ptr, 1) 1240 void foo() { int *ptr; __atomic_load_n(ptr, 1); } 1241</pre></td></tr> 1242 1243 1244<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>>...</td></tr> 1245<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement. 1246 1247Given 1248 @autoreleasepool { 1249 int x = 0; 1250 } 1251autoreleasePoolStmt(stmt()) matches the declaration of "x" 1252inside the autorelease pool. 1253</pre></td></tr> 1254 1255 1256<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>>...</td></tr> 1257<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension). 1258 1259Example matches a ?: b 1260 (a ?: b) + 42; 1261</pre></td></tr> 1262 1263 1264<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>>...</td></tr> 1265<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 1266 1267Example matches a || b 1268 !(a || b) 1269See also the binaryOperation() matcher for more-general matching. 1270</pre></td></tr> 1271 1272 1273<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>>...</td></tr> 1274<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block. 1275 1276Example: matches "^{}": 1277 void f() { ^{}(); } 1278</pre></td></tr> 1279 1280 1281<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>>...</td></tr> 1282<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 1283 1284Given 1285 while (true) { break; } 1286breakStmt() 1287 matches 'break' 1288</pre></td></tr> 1289 1290 1291<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>>...</td></tr> 1292<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 1293 1294Example: Matches (int) 2.2f in 1295 int i = (int) 2.2f; 1296</pre></td></tr> 1297 1298 1299<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>...</td></tr> 1300<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 1301 1302Example matches x.y() and y() 1303 X x; 1304 x.y(); 1305 y(); 1306</pre></td></tr> 1307 1308 1309<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>>...</td></tr> 1310<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 1311 1312Given 1313 switch(a) { case 42: break; default: break; } 1314caseStmt() 1315 matches 'case 42:'. 1316</pre></td></tr> 1317 1318 1319<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>>...</td></tr> 1320<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 1321 1322Example: castExpr() matches each of the following: 1323 (int) 3; 1324 const_cast<Expr *>(SubExpr); 1325 char c = 0; 1326but does not match 1327 int i = (0); 1328 int k = 0; 1329</pre></td></tr> 1330 1331 1332<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>...</td></tr> 1333<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 1334 1335Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 1336though. 1337 1338Example matches 'a', L'a' 1339 char ch = 'a'; 1340 wchar_t chw = L'a'; 1341</pre></td></tr> 1342 1343 1344<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>>...</td></tr> 1345<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr. 1346</pre></td></tr> 1347 1348 1349<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('coawaitExpr0')"><a name="coawaitExpr0Anchor">coawaitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoawaitExpr.html">CoawaitExpr</a>>...</td></tr> 1350<tr><td colspan="4" class="doc" id="coawaitExpr0"><pre>Matches co_await expressions. 1351 1352Given 1353 co_await 1; 1354coawaitExpr() 1355 matches 'co_await 1' 1356</pre></td></tr> 1357 1358 1359<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>...</td></tr> 1360<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 1361 1362Example match: {1}, (1, 2) 1363 int array[4] = {1}; 1364 vector int myvec = (vector int)(1, 2); 1365</pre></td></tr> 1366 1367 1368<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>>...</td></tr> 1369<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 1370 1371Example matches '{}' and '{{}}' in 'for (;;) {{}}' 1372 for (;;) {{}} 1373</pre></td></tr> 1374 1375 1376<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>>...</td></tr> 1377<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 1378 1379Example matches a ? b : c 1380 (a ? b : c) + 42 1381</pre></td></tr> 1382 1383 1384<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>>...</td></tr> 1385<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper. 1386 1387Example matches the constant in the case statement: 1388 (matcher = constantExpr()) 1389 switch (a) { 1390 case 37: break; 1391 } 1392</pre></td></tr> 1393 1394 1395<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>>...</td></tr> 1396<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 1397 1398Given 1399 while (true) { continue; } 1400continueStmt() 1401 matches 'continue' 1402</pre></td></tr> 1403 1404 1405<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('coreturnStmt0')"><a name="coreturnStmt0Anchor">coreturnStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoreturnStmt.html">CoreturnStmt</a>>...</td></tr> 1406<tr><td colspan="4" class="doc" id="coreturnStmt0"><pre>Matches co_return statements. 1407 1408Given 1409 while (true) { co_return; } 1410coreturnStmt() 1411 matches 'co_return' 1412</pre></td></tr> 1413 1414 1415<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('coyieldExpr0')"><a name="coyieldExpr0Anchor">coyieldExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoyieldExpr.html">CoyieldExpr</a>>...</td></tr> 1416<tr><td colspan="4" class="doc" id="coyieldExpr0"><pre>Matches co_yield expressions. 1417 1418Given 1419 co_yield 1; 1420coyieldExpr() 1421 matches 'co_yield 1' 1422</pre></td></tr> 1423 1424 1425<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>>...</td></tr> 1426<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 1427 1428Example matches, 1429 kernel<<<i,j>>>(); 1430</pre></td></tr> 1431 1432 1433<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>>...</td></tr> 1434<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 1435 1436Example matches FunctionTakesString(GetStringByValue()) 1437 (matcher = cxxBindTemporaryExpr()) 1438 FunctionTakesString(GetStringByValue()); 1439 FunctionTakesStringByPointer(GetStringPointer()); 1440</pre></td></tr> 1441 1442 1443<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>...</td></tr> 1444<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 1445 1446Example matches true 1447 true 1448</pre></td></tr> 1449 1450 1451<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>>...</td></tr> 1452<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 1453 1454 try {} catch(int i) {} 1455cxxCatchStmt() 1456 matches 'catch(int i)' 1457</pre></td></tr> 1458 1459 1460<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>>...</td></tr> 1461<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 1462 1463Example: Matches const_cast<int*>(&r) in 1464 int n = 42; 1465 const int &r(n); 1466 int* p = const_cast<int*>(&r); 1467</pre></td></tr> 1468 1469 1470<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>...</td></tr> 1471<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 1472 1473Example matches string(ptr, n) and ptr within arguments of f 1474 (matcher = cxxConstructExpr()) 1475 void f(const string &a, const string &b); 1476 char *ptr; 1477 int n; 1478 f(string(ptr, n), ptr); 1479</pre></td></tr> 1480 1481 1482<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>>...</td></tr> 1483<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 1484 1485Example matches the CXXDefaultArgExpr placeholder inserted for the 1486 default value of the second parameter in the call expression f(42) 1487 (matcher = cxxDefaultArgExpr()) 1488 void f(int x, int y = 0); 1489 f(42); 1490</pre></td></tr> 1491 1492 1493<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>>...</td></tr> 1494<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 1495 1496Given 1497 delete X; 1498cxxDeleteExpr() 1499 matches 'delete X'. 1500</pre></td></tr> 1501 1502 1503<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>>...</td></tr> 1504<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be 1505resolved because the base expression or the member name was dependent. 1506 1507Given 1508 template <class T> void f() { T t; t.g(); } 1509cxxDependentScopeMemberExpr() 1510 matches t.g 1511</pre></td></tr> 1512 1513 1514<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>>...</td></tr> 1515<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 1516 1517Example: 1518 cxxDynamicCastExpr() 1519matches 1520 dynamic_cast<D*>(&b); 1521in 1522 struct B { virtual ~B() {} }; struct D : B {}; 1523 B b; 1524 D* p = dynamic_cast<D*>(&b); 1525</pre></td></tr> 1526 1527 1528<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>>...</td></tr> 1529<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 1530 1531cxxForRangeStmt() matches 'for (auto a : i)' 1532 int i[] = {1, 2, 3}; for (auto a : i); 1533 for(int j = 0; j < 5; ++j); 1534</pre></td></tr> 1535 1536 1537<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>...</td></tr> 1538<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 1539 1540Example: Matches Foo(bar); 1541 Foo f = bar; 1542 Foo g = (Foo) bar; 1543 Foo h = Foo(bar); 1544</pre></td></tr> 1545 1546 1547<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr> 1548<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 1549 1550Example matches x.y() 1551 X x; 1552 x.y(); 1553</pre></td></tr> 1554 1555 1556<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>...</td></tr> 1557<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 1558 1559Given 1560 new X; 1561cxxNewExpr() 1562 matches 'new X'. 1563</pre></td></tr> 1564 1565 1566<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>>...</td></tr> 1567<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions. 1568 1569Given 1570 bool a() noexcept; 1571 bool b() noexcept(true); 1572 bool c() noexcept(false); 1573 bool d() noexcept(noexcept(a())); 1574 bool e = noexcept(b()) || noexcept(c()); 1575cxxNoexceptExpr() 1576 matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`. 1577 doesn't match the noexcept specifier in the declarations a, b, c or d. 1578</pre></td></tr> 1579 1580 1581<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>>...</td></tr> 1582<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 1583</pre></td></tr> 1584 1585 1586<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr> 1587<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 1588 1589Note that if an operator isn't overloaded, it won't match. Instead, use 1590binaryOperator matcher. 1591Currently it does not match operators such as new delete. 1592FIXME: figure out why these do not match? 1593 1594Example matches both operator<<((o << b), c) and operator<<(o, b) 1595 (matcher = cxxOperatorCallExpr()) 1596 ostream &operator<< (ostream &out, int i) { }; 1597 ostream &o; int b = 1, c = 1; 1598 o << b << c; 1599See also the binaryOperation() matcher for more-general matching of binary 1600uses of this AST node. 1601</pre></td></tr> 1602 1603 1604<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>>...</td></tr> 1605<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 1606 1607Either the source expression or the destination type can be matched 1608using has(), but hasDestinationType() is more specific and can be 1609more readable. 1610 1611Example matches reinterpret_cast<char*>(&p) in 1612 void* p = reinterpret_cast<char*>(&p); 1613</pre></td></tr> 1614 1615 1616<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxRewrittenBinaryOperator0')"><a name="cxxRewrittenBinaryOperator0Anchor">cxxRewrittenBinaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>>...</td></tr> 1617<tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators 1618 1619Example matches use of "<": 1620 #include <compare> 1621 struct HasSpaceshipMem { 1622 int a; 1623 constexpr auto operator<=>(const HasSpaceshipMem&) const = default; 1624 }; 1625 void compare() { 1626 HasSpaceshipMem hs1, hs2; 1627 if (hs1 < hs2) 1628 return; 1629 } 1630See also the binaryOperation() matcher for more-general matching 1631of this AST node. 1632</pre></td></tr> 1633 1634 1635<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>>...</td></tr> 1636<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 1637 1638See also: hasDestinationType 1639See also: reinterpretCast 1640 1641Example: 1642 cxxStaticCastExpr() 1643matches 1644 static_cast<long>(8) 1645in 1646 long eight(static_cast<long>(8)); 1647</pre></td></tr> 1648 1649 1650<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>>...</td></tr> 1651<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions. 1652 1653Given 1654 std::vector<int> a({ 1, 2, 3 }); 1655 std::vector<int> b = { 4, 5 }; 1656 int c[] = { 6, 7 }; 1657 std::pair<int, int> d = { 8, 9 }; 1658cxxStdInitializerListExpr() 1659 matches "{ 1, 2, 3 }" and "{ 4, 5 }" 1660</pre></td></tr> 1661 1662 1663<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>...</td></tr> 1664<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 1665 1666Example: Matches Foo(bar, bar) 1667 Foo h = Foo(bar, bar); 1668</pre></td></tr> 1669 1670 1671<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>>...</td></tr> 1672<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 1673 1674Example matches the implicit this expression in "return i". 1675 (matcher = cxxThisExpr()) 1676struct foo { 1677 int i; 1678 int f() { return i; } 1679}; 1680</pre></td></tr> 1681 1682 1683<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>>...</td></tr> 1684<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 1685 1686 try { throw 5; } catch(int i) {} 1687cxxThrowExpr() 1688 matches 'throw 5' 1689</pre></td></tr> 1690 1691 1692<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>>...</td></tr> 1693<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 1694 1695 try {} catch(int i) {} 1696cxxTryStmt() 1697 matches 'try {}' 1698</pre></td></tr> 1699 1700 1701<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>...</td></tr> 1702<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 1703 1704Example matches T(t) in return statement of f 1705 (matcher = cxxUnresolvedConstructExpr()) 1706 template <typename T> 1707 void f(const T& t) { return T(t); } 1708</pre></td></tr> 1709 1710 1711<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>...</td></tr> 1712<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 1713 1714Example matches x in if (x) 1715 bool x; 1716 if (x) {} 1717</pre></td></tr> 1718 1719 1720<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>>...</td></tr> 1721<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 1722 1723Given 1724 int a; 1725declStmt() 1726 matches 'int a'. 1727</pre></td></tr> 1728 1729 1730<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>>...</td></tr> 1731<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 1732 1733Given 1734 switch(a) { case 42: break; default: break; } 1735defaultStmt() 1736 matches 'default:'. 1737</pre></td></tr> 1738 1739 1740<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('dependentCoawaitExpr0')"><a name="dependentCoawaitExpr0Anchor">dependentCoawaitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentCoawaitExpr.html">DependentCoawaitExpr</a>>...</td></tr> 1741<tr><td colspan="4" class="doc" id="dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent 1742</pre></td></tr> 1743 1744 1745<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>>...</td></tr> 1746<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8]. 1747 1748Example: Matches { [2].y = 1.0, [0].x = 1.0 } 1749 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 1750</pre></td></tr> 1751 1752 1753<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>>...</td></tr> 1754<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 1755 1756Given 1757 do {} while (true); 1758doStmt() 1759 matches 'do {} while(true)' 1760</pre></td></tr> 1761 1762 1763<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>...</td></tr> 1764<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 1765 1766Matches any cast expression written in user code, whether it be a 1767C-style cast, a functional-style cast, or a keyword cast. 1768 1769Does not match implicit conversions. 1770 1771Note: the name "explicitCast" is chosen to match Clang's terminology, as 1772Clang uses the term "cast" to apply to implicit conversions as well as to 1773actual cast expressions. 1774 1775See also: hasDestinationType. 1776 1777Example: matches all five of the casts in 1778 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 1779but does not match the implicit conversion in 1780 long ell = 42; 1781</pre></td></tr> 1782 1783 1784<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>...</td></tr> 1785<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 1786 1787Example matches x() 1788 void f() { x(); } 1789</pre></td></tr> 1790 1791 1792<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>>...</td></tr> 1793<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 1794of the sub-expression's evaluation. 1795 1796Example matches std::string() 1797 const std::string str = std::string(); 1798</pre></td></tr> 1799 1800 1801<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('fixedPointLiteral0')"><a name="fixedPointLiteral0Anchor">fixedPointLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FixedPointLiteral.html">FixedPointLiteral</a>>...</td></tr> 1802<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals 1803</pre></td></tr> 1804 1805 1806<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>...</td></tr> 1807<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g. 18081.0, 1.0f, 1.0L and 1e10. 1809 1810Does not match implicit conversions such as 1811 float a = 10; 1812</pre></td></tr> 1813 1814 1815<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>>...</td></tr> 1816<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 1817 1818Example matches 'for (;;) {}' 1819 for (;;) {} 1820 int i[] = {1, 2, 3}; for (auto a : i); 1821</pre></td></tr> 1822 1823 1824<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('genericSelectionExpr0')"><a name="genericSelectionExpr0Anchor">genericSelectionExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GenericSelectionExpr.html">GenericSelectionExpr</a>>...</td></tr> 1825<tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression. 1826</pre></td></tr> 1827 1828 1829<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>>...</td></tr> 1830<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 1831</pre></td></tr> 1832 1833 1834<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>>...</td></tr> 1835<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 1836 1837Given 1838 goto FOO; 1839 FOO: bar(); 1840gotoStmt() 1841 matches 'goto FOO' 1842</pre></td></tr> 1843 1844 1845<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>>...</td></tr> 1846<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 1847 1848Example matches 'if (x) {}' 1849 if (x) {} 1850</pre></td></tr> 1851 1852 1853<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>>...</td></tr> 1854<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating 1855point literals e.g.: 1i, 1.0i 1856</pre></td></tr> 1857 1858 1859<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>>...</td></tr> 1860<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 1861 1862This matches many different places, including function call return value 1863eliding, as well as any type conversions. 1864</pre></td></tr> 1865 1866 1867<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>>...</td></tr> 1868<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions. 1869 1870Given 1871 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 1872implicitValueInitExpr() 1873 matches "[0].y" (implicitly) 1874</pre></td></tr> 1875 1876 1877<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>>...</td></tr> 1878<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 1879 1880Given 1881 int a[] = { 1, 2 }; 1882 struct B { int x, y; }; 1883 B b = { 5, 6 }; 1884initListExpr() 1885 matches "{ 1, 2 }" and "{ 5, 6 }" 1886</pre></td></tr> 1887 1888 1889<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>...</td></tr> 1890<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g. 18911, 1L, 0x1 and 1U. 1892 1893Does not match character-encoded integers such as L'a'. 1894</pre></td></tr> 1895 1896 1897<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>...</td></tr> 1898<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 1899 1900Given 1901 goto FOO; 1902 FOO: bar(); 1903labelStmt() 1904 matches 'FOO:' 1905</pre></td></tr> 1906 1907 1908<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>>...</td></tr> 1909<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1910 1911Example matches [&](){return 5;} 1912 [&](){return 5;} 1913</pre></td></tr> 1914 1915 1916<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>>...</td></tr> 1917<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1918 1919Example: Given 1920 struct T {void func();}; 1921 T f(); 1922 void g(T); 1923materializeTemporaryExpr() matches 'f()' in these statements 1924 T u(f()); 1925 g(f()); 1926 f().func(); 1927but does not match 1928 f(); 1929</pre></td></tr> 1930 1931 1932<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>...</td></tr> 1933<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1934 1935Given 1936 class Y { 1937 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1938 int a; static int b; 1939 }; 1940memberExpr() 1941 matches this->x, x, y.x, a, this->b 1942</pre></td></tr> 1943 1944 1945<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>>...</td></tr> 1946<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1947 1948 foo();; 1949nullStmt() 1950 matches the second ';' 1951</pre></td></tr> 1952 1953 1954<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>>...</td></tr> 1955<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements. 1956 1957Example matches @catch 1958 @try {} 1959 @catch (...) {} 1960</pre></td></tr> 1961 1962 1963<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>>...</td></tr> 1964<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements. 1965 1966Example matches @finally 1967 @try {} 1968 @finally {} 1969</pre></td></tr> 1970 1971 1972<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>>...</td></tr> 1973<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar. 1974 1975Example: matches "a" in "init" method: 1976@implementation A { 1977 NSString *a; 1978} 1979- (void) init { 1980 a = @"hello"; 1981} 1982</pre></td></tr> 1983 1984 1985<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>>...</td></tr> 1986<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 1987 1988The innermost message send invokes the "alloc" class method on the 1989NSString class, while the outermost message send invokes the 1990"initWithString" instance method on the object returned from 1991NSString's "alloc". This matcher should match both message sends. 1992 [[NSString alloc] initWithString:@"Hello"] 1993</pre></td></tr> 1994 1995 1996<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>>...</td></tr> 1997<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements. 1998 1999Example matches @throw obj; 2000</pre></td></tr> 2001 2002 2003<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>>...</td></tr> 2004<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements. 2005 2006Example matches @try 2007 @try {} 2008 @catch (...) {} 2009</pre></td></tr> 2010 2011 2012<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>>...</td></tr> 2013<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive. 2014 2015Given 2016 2017 #pragma omp parallel 2018 #pragma omp parallel default(none) 2019 #pragma omp taskyield 2020 2021``ompExecutableDirective()`` matches ``omp parallel``, 2022``omp parallel default(none)`` and ``omp taskyield``. 2023</pre></td></tr> 2024 2025 2026<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>>...</td></tr> 2027<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers 2028to reference another expressions and can be met 2029in BinaryConditionalOperators, for example. 2030 2031Example matches 'a' 2032 (a ?: c) + 42; 2033</pre></td></tr> 2034 2035 2036<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>>...</td></tr> 2037<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions. 2038 2039Example matches (foo() + 1) 2040 int foo() { return 1; } 2041 int a = (foo() + 1); 2042</pre></td></tr> 2043 2044 2045<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>>...</td></tr> 2046<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions. 2047ParenListExprs don't have a predefined type and are used for late parsing. 2048In the final AST, they can be met in template declarations. 2049 2050Given 2051 template<typename T> class X { 2052 void f() { 2053 X x(*this); 2054 int a = 0, b = 1; int i = (a, b); 2055 } 2056 }; 2057parenListExpr() matches "*this" but NOT matches (a, b) because (a, b) 2058has a predefined type and is a ParenExpr, not a ParenListExpr. 2059</pre></td></tr> 2060 2061 2062<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>>...</td></tr> 2063<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2]. 2064 2065Example: Matches __func__ 2066 printf("%s", __func__); 2067</pre></td></tr> 2068 2069 2070<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>>...</td></tr> 2071<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 2072 2073Given 2074 return 1; 2075returnStmt() 2076 matches 'return 1' 2077</pre></td></tr> 2078 2079 2080<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>...</td></tr> 2081<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 2082 2083Given 2084 { ++a; } 2085stmt() 2086 matches both the compound statement '{ ++a; }' and '++a'. 2087</pre></td></tr> 2088 2089 2090<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>>...</td></tr> 2091<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension). 2092 2093Example match: ({ int X = 4; X; }) 2094 int C = ({ int X = 4; X; }); 2095</pre></td></tr> 2096 2097 2098<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>>...</td></tr> 2099<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 2100 2101Example matches "abcd", L"abcd" 2102 char *s = "abcd"; 2103 wchar_t *ws = L"abcd"; 2104</pre></td></tr> 2105 2106 2107<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>>...</td></tr> 2108<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 2109 2110Given 2111 template <int N> 2112 struct A { static const int n = N; }; 2113 struct B : public A<42> {}; 2114substNonTypeTemplateParmExpr() 2115 matches "N" in the right-hand side of "static const int n = N;" 2116</pre></td></tr> 2117 2118 2119<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>>...</td></tr> 2120<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 2121 2122Given 2123 switch(a) { case 42: break; default: break; } 2124switchCase() 2125 matches 'case 42:' and 'default:'. 2126</pre></td></tr> 2127 2128 2129<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>>...</td></tr> 2130<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 2131 2132Given 2133 switch(a) { case 42: break; default: break; } 2134switchStmt() 2135 matches 'switch(a)'. 2136</pre></td></tr> 2137 2138 2139<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>>...</td></tr> 2140<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 2141 2142Given 2143 Foo x = bar; 2144 int y = sizeof(x) + alignof(x); 2145unaryExprOrTypeTraitExpr() 2146 matches sizeof(x) and alignof(x) 2147</pre></td></tr> 2148 2149 2150<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>>...</td></tr> 2151<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 2152 2153Example matches !a 2154 !a || b 2155</pre></td></tr> 2156 2157 2158<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>>...</td></tr> 2159<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing 2160but could not be resolved to a specific declaration. 2161 2162Given 2163 template<typename T> 2164 T foo() { T a; return a; } 2165 template<typename T> 2166 void bar() { 2167 foo<T>(); 2168 } 2169unresolvedLookupExpr() 2170 matches foo<T>() </pre></td></tr> 2171 2172 2173<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>>...</td></tr> 2174<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions. 2175 2176Given 2177 struct X { 2178 template <class T> void f(); 2179 void g(); 2180 }; 2181 template <class T> void h() { X x; x.f<T>(); x.g(); } 2182unresolvedMemberExpr() 2183 matches x.f<T> 2184</pre></td></tr> 2185 2186 2187<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>>...</td></tr> 2188<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 2189 2190Example match: "foo"_suffix 2191</pre></td></tr> 2192 2193 2194<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>>...</td></tr> 2195<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 2196 2197Given 2198 while (true) {} 2199whileStmt() 2200 matches 'while (true) {}'. 2201</pre></td></tr> 2202 2203 2204<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>></td><td class="name" onclick="toggle('templateArgumentLoc0')"><a name="templateArgumentLoc0Anchor">templateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>...</td></tr> 2205<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info). 2206 2207Given 2208 template <typename T> struct C {}; 2209 C<int> c; 2210templateArgumentLoc() 2211 matches 'int' in C<int>. 2212</pre></td></tr> 2213 2214 2215<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>>...</td></tr> 2216<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 2217 2218Given 2219 template <typename T> struct C {}; 2220 C<int> c; 2221templateArgument() 2222 matches 'int' in C<int>. 2223</pre></td></tr> 2224 2225 2226<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>></td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>>...</td></tr> 2227<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name. 2228 2229Given 2230 template <typename T> class X { }; 2231 X<int> xi; 2232templateName() 2233 matches 'X' in X<int>. 2234</pre></td></tr> 2235 2236 2237<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>...</td></tr> 2238<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 2239</pre></td></tr> 2240 2241 2242<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>...</td></tr> 2243<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 2244 2245Given 2246 int a[] = { 2, 3 }; 2247 int b[4]; 2248 void f() { int c[a[0]]; } 2249arrayType() 2250 matches "int a[]", "int b[4]" and "int c[a[0]]"; 2251</pre></td></tr> 2252 2253 2254<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>>...</td></tr> 2255<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 2256 2257Given 2258 _Atomic(int) i; 2259atomicType() 2260 matches "_Atomic(int) i" 2261</pre></td></tr> 2262 2263 2264<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>>...</td></tr> 2265<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 2266 2267Given: 2268 auto n = 4; 2269 int v[] = { 2, 3 } 2270 for (auto i : v) { } 2271autoType() 2272 matches "auto n" and "auto i" 2273</pre></td></tr> 2274 2275 2276<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>...</td></tr> 2277<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 2278"void (^)(int)". 2279 2280The pointee is always required to be a FunctionType. 2281</pre></td></tr> 2282 2283 2284<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>>...</td></tr> 2285<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 2286 2287Given 2288 struct A {}; 2289 A a; 2290 int b; 2291 float c; 2292 bool d; 2293builtinType() 2294 matches "int b", "float c" and "bool d" 2295</pre></td></tr> 2296 2297 2298<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>>...</td></tr> 2299<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 2300 2301Given 2302 _Complex float f; 2303complexType() 2304 matches "_Complex float f" 2305</pre></td></tr> 2306 2307 2308<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>>...</td></tr> 2309<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 2310 2311Given 2312 void() { 2313 int a[2]; 2314 int b[] = { 2, 3 }; 2315 int c[b[0]]; 2316 } 2317constantArrayType() 2318 matches "int a[2]" 2319</pre></td></tr> 2320 2321 2322<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>>...</td></tr> 2323<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 2324Example matches i[] in declaration of f. 2325 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 2326Example matches i[1]. 2327 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 2328 void f(int i[]) { 2329 i[1] = 0; 2330 } 2331</pre></td></tr> 2332 2333 2334<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>>...</td></tr> 2335<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(<expr>) types. 2336 2337Given: 2338 short i = 1; 2339 int j = 42; 2340 decltype(i + j) result = i + j; 2341decltypeType() 2342 matches "decltype(i + j)" 2343</pre></td></tr> 2344 2345 2346<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>>...</td></tr> 2347<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class 2348template types. 2349 2350Given 2351 template <typename T> 2352 class C { public: C(T); }; 2353 2354 C c(123); 2355deducedTemplateSpecializationType() matches the type in the declaration 2356of the variable c. 2357</pre></td></tr> 2358 2359 2360<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>>...</td></tr> 2361<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 2362 2363Given 2364 template<typename T, int Size> 2365 class array { 2366 T data[Size]; 2367 }; 2368dependentSizedArrayType 2369 matches "T data[Size]" 2370</pre></td></tr> 2371 2372 2373<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>>...</td></tr> 2374<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 2375qualified name. 2376 2377Given 2378 namespace N { 2379 namespace M { 2380 class D {}; 2381 } 2382 } 2383 class C {}; 2384 2385 class C c; 2386 N::M::D d; 2387 2388elaboratedType() matches the type of the variable declarations of both 2389c and d. 2390</pre></td></tr> 2391 2392 2393<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>...</td></tr> 2394<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types. 2395 2396Given 2397 enum C { Green }; 2398 enum class S { Red }; 2399 2400 C c; 2401 S s; 2402 2403enumType() matches the type of the variable declarations of both c and 2404s. 2405</pre></td></tr> 2406 2407 2408<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>>...</td></tr> 2409<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes. 2410 2411Given 2412 int (*f)(int); 2413 void g(); 2414functionProtoType() 2415 matches "int (*f)(int)" and the type of "g" in C++ mode. 2416 In C mode, "g" is not matched because it does not contain a prototype. 2417</pre></td></tr> 2418 2419 2420<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>>...</td></tr> 2421<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 2422 2423Given 2424 int (*f)(int); 2425 void g(); 2426functionType() 2427 matches "int (*f)(int)" and the type of "g". 2428</pre></td></tr> 2429 2430 2431<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>>...</td></tr> 2432<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 2433 2434Given 2435 int a[] = { 2, 3 }; 2436 int b[42]; 2437 void f(int c[]) { int d[a[0]]; }; 2438incompleteArrayType() 2439 matches "int a[]" and "int c[]" 2440</pre></td></tr> 2441 2442 2443<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>...</td></tr> 2444<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 2445 2446Example matches S s, but not S<T> s. 2447 (matcher = parmVarDecl(hasType(injectedClassNameType()))) 2448 template <typename T> struct S { 2449 void f(S s); 2450 void g(S<T> s); 2451 }; 2452</pre></td></tr> 2453 2454 2455<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>>...</td></tr> 2456<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 2457 2458Given: 2459 int *a; 2460 int &b = *a; 2461 int &&c = 1; 2462 auto &d = b; 2463 auto &&e = c; 2464 auto &&f = 2; 2465 int g = 5; 2466 2467lValueReferenceType() matches the types of b, d, and e. e is 2468matched since the type is deduced as int& by reference collapsing rules. 2469</pre></td></tr> 2470 2471 2472<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>...</td></tr> 2473<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 2474Given 2475 struct A { int i; } 2476 A::* ptr = A::i; 2477memberPointerType() 2478 matches "A::* ptr" 2479</pre></td></tr> 2480 2481 2482<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>>...</td></tr> 2483<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 2484a pointer type, despite being syntactically similar. 2485 2486Given 2487 int *a; 2488 2489 @interface Foo 2490 @end 2491 Foo *f; 2492pointerType() 2493 matches "Foo *f", but does not match "int *a". 2494</pre></td></tr> 2495 2496 2497<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>>...</td></tr> 2498<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 2499 2500Given 2501 int (*ptr_to_array)[4]; 2502 int *array_of_ptrs[4]; 2503 2504varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 2505array_of_ptrs. 2506</pre></td></tr> 2507 2508 2509<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>...</td></tr> 2510<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 2511types. 2512 2513Given 2514 int *a; 2515 int &b = *a; 2516 int c = 5; 2517 2518 @interface Foo 2519 @end 2520 Foo *f; 2521pointerType() 2522 matches "int *a", but does not match "Foo *f". 2523</pre></td></tr> 2524 2525 2526<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>>...</td></tr> 2527<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 2528 2529Given: 2530 int *a; 2531 int &b = *a; 2532 int &&c = 1; 2533 auto &d = b; 2534 auto &&e = c; 2535 auto &&f = 2; 2536 int g = 5; 2537 2538rValueReferenceType() matches the types of c and f. e is not 2539matched as it is deduced to int& by reference collapsing rules. 2540</pre></td></tr> 2541 2542 2543<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>...</td></tr> 2544<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 2545 2546Given 2547 class C {}; 2548 struct S {}; 2549 2550 C c; 2551 S s; 2552 2553recordType() matches the type of the variable declarations of both c 2554and s. 2555</pre></td></tr> 2556 2557 2558<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>...</td></tr> 2559<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 2560 2561Given 2562 int *a; 2563 int &b = *a; 2564 int &&c = 1; 2565 auto &d = b; 2566 auto &&e = c; 2567 auto &&f = 2; 2568 int g = 5; 2569 2570referenceType() matches the types of b, c, d, e, and f. 2571</pre></td></tr> 2572 2573 2574<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>>...</td></tr> 2575<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 2576template type parameter. 2577 2578Given 2579 template <typename T> 2580 void F(T t) { 2581 int i = 1 + t; 2582 } 2583 2584substTemplateTypeParmType() matches the type of 't' but not '1' 2585</pre></td></tr> 2586 2587 2588<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>...</td></tr> 2589<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types). 2590 2591Given 2592 enum E {}; 2593 class C {}; 2594 2595 E e; 2596 C c; 2597 2598tagType() matches the type of the variable declarations of both e 2599and c. 2600</pre></td></tr> 2601 2602 2603<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>...</td></tr> 2604<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 2605 2606Given 2607 template <typename T> 2608 class C { }; 2609 2610 template class C<int>; // A 2611 C<char> var; // B 2612 2613templateSpecializationType() matches the type of the explicit 2614instantiation in A and the type of the variable declaration in B. 2615</pre></td></tr> 2616 2617 2618<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>...</td></tr> 2619<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 2620 2621Example matches T, but not int. 2622 (matcher = templateTypeParmType()) 2623 template <typename T> void f(int i); 2624</pre></td></tr> 2625 2626 2627<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>>...</td></tr> 2628<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 2629</pre></td></tr> 2630 2631 2632<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>...</td></tr> 2633<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 2634 2635Given 2636 typedef int X; 2637typedefType() 2638 matches "typedef int X" 2639</pre></td></tr> 2640 2641 2642<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>>...</td></tr> 2643<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 2644 2645Given: 2646 typedef __underlying_type(T) type; 2647unaryTransformType() 2648 matches "__underlying_type(T)" 2649</pre></td></tr> 2650 2651 2652<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>>...</td></tr> 2653<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 2654integer-constant-expression. 2655 2656Given 2657 void f() { 2658 int a[] = { 2, 3 } 2659 int b[42]; 2660 int c[a[0]]; 2661 } 2662variableArrayType() 2663 matches "int c[a[0]]" 2664</pre></td></tr> 2665 2666<!--END_DECL_MATCHERS --> 2667</table> 2668 2669<!-- ======================================================================= --> 2670<h2 id="narrowing-matchers">Narrowing Matchers</h2> 2671<!-- ======================================================================= --> 2672 2673<p>Narrowing matchers match certain attributes on the current node, thus 2674narrowing down the set of nodes of the current type to match on.</p> 2675 2676<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 2677which allow users to create more powerful match expressions.</p> 2678 2679<table> 2680<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 2681<!-- START_NARROWING_MATCHERS --> 2682 2683<tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2684<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 2685 2686Usable as: Any Matcher 2687</pre></td></tr> 2688 2689 2690<tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2691<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 2692 2693Usable as: Any Matcher 2694</pre></td></tr> 2695 2696 2697<tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 2698<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 2699 2700Useful when another matcher requires a child matcher, but there's no 2701additional constraint. This will often be used with an explicit conversion 2702to an internal::Matcher<> type such as TypeMatcher. 2703 2704Example: DeclarationMatcher(anything()) matches all declarations, e.g., 2705"int* p" and "void f()" in 2706 int* p; 2707 void f(); 2708 2709Usable as: Any Matcher 2710</pre></td></tr> 2711 2712 2713<tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr> 2714<tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within 2715 2716Given 2717 if (true); 2718 for (; true; ); 2719with the matcher 2720 mapAnyOf(ifStmt, forStmt).with( 2721 hasCondition(cxxBoolLiteralExpr(equals(true))) 2722 ).bind("trueCond") 2723matches the if and the for. It is equivalent to: 2724 auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true))); 2725 anyOf( 2726 ifStmt(trueCond).bind("trueCond"), 2727 forStmt(trueCond).bind("trueCond") 2728 ); 2729 2730The with() chain-call accepts zero or more matchers which are combined 2731as-if with allOf() in each of the node matchers. 2732Usable as: Any Matcher 2733</pre></td></tr> 2734 2735 2736<tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 2737<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 2738 2739Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 2740 class X {}; 2741 class Y {}; 2742 2743Usable as: Any Matcher 2744</pre></td></tr> 2745 2746 2747<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName0')"><a name="hasAnyOperatorName0Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 2748<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the 2749specified names. 2750 2751 hasAnyOperatorName("+", "-") 2752 Is equivalent to 2753 anyOf(hasOperatorName("+"), hasOperatorName("-")) 2754</pre></td></tr> 2755 2756 2757<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 2758<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 2759unary). 2760 2761Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 2762 !(a || b) 2763</pre></td></tr> 2764 2765 2766<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr> 2767<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators. 2768 2769Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2770 if (a == b) 2771 a += b; 2772 2773Example 2: matches s1 = s2 2774 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2775 struct S { S& operator=(const S&); }; 2776 void x() { S s1, s2; s1 = s2; } 2777</pre></td></tr> 2778 2779 2780<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('isComparisonOperator0')"><a name="isComparisonOperator0Anchor">isComparisonOperator</a></td><td></td></tr> 2781<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators. 2782 2783Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 2784 if (a == b) 2785 a += b; 2786 2787Example 2: matches s1 < s2 2788 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 2789 struct S { bool operator<(const S& other); }; 2790 void x(S s1, S s2) { bool b1 = s1 < s2; } 2791</pre></td></tr> 2792 2793 2794<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isPrivate1')"><a name="isPrivate1Anchor">isPrivate</a></td><td></td></tr> 2795<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private 2796inheritance. 2797 2798Examples: 2799 class C { 2800 public: int a; 2801 protected: int b; 2802 private: int c; // fieldDecl(isPrivate()) matches 'c' 2803 }; 2804 2805 struct Base {}; 2806 struct Derived1 : private Base {}; // matches 'Base' 2807 class Derived2 : Base {}; // matches 'Base' 2808</pre></td></tr> 2809 2810 2811<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isProtected1')"><a name="isProtected1Anchor">isProtected</a></td><td></td></tr> 2812<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify 2813protected inheritance. 2814 2815Examples: 2816 class C { 2817 public: int a; 2818 protected: int b; // fieldDecl(isProtected()) matches 'b' 2819 private: int c; 2820 }; 2821 2822 class Base {}; 2823 class Derived : protected Base {}; // matches 'Base' 2824</pre></td></tr> 2825 2826 2827<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isPublic1')"><a name="isPublic1Anchor">isPublic</a></td><td></td></tr> 2828<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public 2829inheritance. 2830 2831Examples: 2832 class C { 2833 public: int a; // fieldDecl(isPublic()) matches 'a' 2834 protected: int b; 2835 private: int c; 2836 }; 2837 2838 class Base {}; 2839 class Derived1 : public Base {}; // matches 'Base' 2840 struct Derived2 : Base {}; // matches 'Base' 2841</pre></td></tr> 2842 2843 2844<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isVirtual1')"><a name="isVirtual1Anchor">isVirtual</a></td><td></td></tr> 2845<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify 2846virtual inheritance. 2847 2848Example: 2849 class A { 2850 public: 2851 virtual void x(); // matches x 2852 }; 2853 2854Example: 2855 class Base {}; 2856 class DirectlyDerived : virtual Base {}; // matches Base 2857 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 2858 2859Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 2860</pre></td></tr> 2861 2862 2863<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr> 2864<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr> 2865 2866 2867<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT Value</td></tr> 2868<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT. 2869 2870Given 2871 f('false, 3.14, 42); 2872characterLiteral(equals(0)) 2873 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2874 match false 2875floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2876 match 3.14 2877integerLiteral(equals(42)) 2878 matches 42 2879 2880Note that you cannot directly match a negative numeric literal because the 2881minus sign is not part of the literal: It is a unary operator whose operand 2882is the positive numeric literal. Instead, you must use a unaryOperator() 2883matcher to match the minus sign: 2884 2885unaryOperator(hasOperatorName("-"), 2886 hasUnaryOperand(integerLiteral(equals(13)))) 2887 2888Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 2889 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 2890</pre></td></tr> 2891 2892 2893<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr> 2894<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr> 2895 2896 2897<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr> 2898<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr> 2899 2900 2901<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>></td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr> 2902<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 2903 2904Given 2905 try { 2906 // ... 2907 } catch (int) { 2908 // ... 2909 } catch (...) { 2910 // ... 2911 } 2912cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 2913</pre></td></tr> 2914 2915 2916<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 2917<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 2918a specific number of arguments (including absent default arguments). 2919 2920Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2921 void f(int x, int y); 2922 f(0, 0); 2923</pre></td></tr> 2924 2925 2926<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr> 2927<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 2928</pre></td></tr> 2929 2930 2931<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr> 2932<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 2933zero initialization. 2934 2935Given 2936void foo() { 2937 struct point { double x; double y; }; 2938 point pt[2] = { { 1.0, 2.0 } }; 2939} 2940initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 2941will match the implicit array filler for pt[1]. 2942</pre></td></tr> 2943 2944 2945<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr> 2946<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 2947 2948Given 2949 struct S { 2950 S(); // #1 2951 S(const S &); // #2 2952 S(S &&); // #3 2953 }; 2954cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 2955</pre></td></tr> 2956 2957 2958<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr> 2959<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 2960 2961Given 2962 struct S { 2963 S(); // #1 2964 S(const S &); // #2 2965 S(S &&); // #3 2966 }; 2967cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 2968</pre></td></tr> 2969 2970 2971<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr> 2972<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 2973 2974Given 2975 struct S { 2976 S(); // #1 2977 S(int) {} // #2 2978 S(S &&) : S() {} // #3 2979 }; 2980 S::S() : S(0) {} // #4 2981cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 2982#1 or #2. 2983</pre></td></tr> 2984 2985 2986<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr> 2987<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations 2988that have an explicit specifier if this explicit specifier is resolved to 2989true. 2990 2991Given 2992 template<bool b> 2993 struct S { 2994 S(int); // #1 2995 explicit S(double); // #2 2996 operator int(); // #3 2997 explicit operator bool(); // #4 2998 explicit(false) S(bool) // # 7 2999 explicit(true) S(char) // # 8 3000 explicit(b) S(S) // # 9 3001 }; 3002 S(int) -> S<true> // #5 3003 explicit S(double) -> S<false> // #6 3004cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3005cxxConversionDecl(isExplicit()) will match #4, but not #3. 3006cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3007</pre></td></tr> 3008 3009 3010<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr> 3011<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 3012 3013Given 3014 struct S { 3015 S(); // #1 3016 S(const S &); // #2 3017 S(S &&); // #3 3018 }; 3019cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 3020</pre></td></tr> 3021 3022 3023<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>></td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr> 3024<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations 3025that have an explicit specifier if this explicit specifier is resolved to 3026true. 3027 3028Given 3029 template<bool b> 3030 struct S { 3031 S(int); // #1 3032 explicit S(double); // #2 3033 operator int(); // #3 3034 explicit operator bool(); // #4 3035 explicit(false) S(bool) // # 7 3036 explicit(true) S(char) // # 8 3037 explicit(b) S(S) // # 9 3038 }; 3039 S(int) -> S<true> // #5 3040 explicit S(double) -> S<false> // #6 3041cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3042cxxConversionDecl(isExplicit()) will match #4, but not #3. 3043cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3044</pre></td></tr> 3045 3046 3047<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr> 3048<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 3049opposed to a member. 3050 3051Given 3052 struct B {}; 3053 struct D : B { 3054 int I; 3055 D(int i) : I(i) {} 3056 }; 3057 struct E : B { 3058 E() : B() {} 3059 }; 3060cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 3061 will match E(), but not match D(int). 3062</pre></td></tr> 3063 3064 3065<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr> 3066<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 3067opposed to a base. 3068 3069Given 3070 struct B {}; 3071 struct D : B { 3072 int I; 3073 D(int i) : I(i) {} 3074 }; 3075 struct E : B { 3076 E() : B() {} 3077 }; 3078cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 3079 will match D(int), but not match E(). 3080</pre></td></tr> 3081 3082 3083<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr> 3084<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 3085code (as opposed to implicitly added by the compiler). 3086 3087Given 3088 struct Foo { 3089 Foo() { } 3090 Foo(int) : foo_("A") { } 3091 string foo_; 3092 }; 3093cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 3094 will match Foo(int), but not Foo() 3095</pre></td></tr> 3096 3097 3098<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>></td><td class="name" onclick="toggle('isExplicit2')"><a name="isExplicit2Anchor">isExplicit</a></td><td></td></tr> 3099<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations 3100that have an explicit specifier if this explicit specifier is resolved to 3101true. 3102 3103Given 3104 template<bool b> 3105 struct S { 3106 S(int); // #1 3107 explicit S(double); // #2 3108 operator int(); // #3 3109 explicit operator bool(); // #4 3110 explicit(false) S(bool) // # 7 3111 explicit(true) S(char) // # 8 3112 explicit(b) S(S) // # 9 3113 }; 3114 S(int) -> S<true> // #5 3115 explicit S(double) -> S<false> // #6 3116cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3117cxxConversionDecl(isExplicit()) will match #4, but not #3. 3118cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3119</pre></td></tr> 3120 3121 3122<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('hasMemberName0')"><a name="hasMemberName0Anchor">hasMemberName</a></td><td>std::string N</td></tr> 3123<tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names. 3124 3125In template declarations, dependent members are not resolved and so can 3126not be matched to particular named declarations. 3127 3128This matcher allows to match on the known name of members. 3129 3130Given 3131 template <typename T> 3132 struct S { 3133 void mem(); 3134 }; 3135 template <typename T> 3136 void x() { 3137 S<T> s; 3138 s.mem(); 3139 } 3140cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()` 3141</pre></td></tr> 3142 3143 3144<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr> 3145<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed 3146to '.'. 3147 3148Member calls on the implicit this pointer match as called with '->'. 3149 3150Given 3151 class Y { 3152 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3153 template <class T> void f() { this->f<T>(); f<T>(); } 3154 int a; 3155 static int b; 3156 }; 3157 template <class T> 3158 class Z { 3159 void x() { this->m; } 3160 }; 3161memberExpr(isArrow()) 3162 matches this->x, x, y.x, a, this->b 3163cxxDependentScopeMemberExpr(isArrow()) 3164 matches this->m 3165unresolvedMemberExpr(isArrow()) 3166 matches this->f<T>, f<T> 3167</pre></td></tr> 3168 3169 3170<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('memberHasSameNameAsBoundNode0')"><a name="memberHasSameNameAsBoundNode0Anchor">memberHasSameNameAsBoundNode</a></td><td>std::string BindingID</td></tr> 3171<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound 3172node 3173 3174In template declarations, dependent members are not resolved and so can 3175not be matched to particular named declarations. 3176 3177This matcher allows to match on the name of already-bound VarDecl, FieldDecl 3178and CXXMethodDecl nodes. 3179 3180Given 3181 template <typename T> 3182 struct S { 3183 void mem(); 3184 }; 3185 template <typename T> 3186 void x() { 3187 S<T> s; 3188 s.mem(); 3189 } 3190The matcher 3191@code 3192cxxDependentScopeMemberExpr( 3193 hasObjectExpression(declRefExpr(hasType(templateSpecializationType( 3194 hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has( 3195 cxxMethodDecl(hasName("mem")).bind("templMem") 3196 ))))) 3197 )))), 3198 memberHasSameNameAsBoundNode("templMem") 3199 ) 3200@endcode 3201first matches and binds the @c mem member of the @c S template, then 3202compares its name to the usage in @c s.mem() in the @c x function template 3203</pre></td></tr> 3204 3205 3206<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr> 3207<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 3208 3209Given 3210struct A { 3211 void foo() const; 3212 void bar(); 3213}; 3214 3215cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 3216</pre></td></tr> 3217 3218 3219<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr> 3220<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 3221operator. 3222 3223Given 3224struct A { 3225 A &operator=(const A &); 3226 A &operator=(A &&); 3227}; 3228 3229cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 3230the second one. 3231</pre></td></tr> 3232 3233 3234<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr> 3235<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 3236 3237Given: 3238 class A final {}; 3239 3240 struct B { 3241 virtual void f(); 3242 }; 3243 3244 struct C : B { 3245 void f() final; 3246 }; 3247matches A and C::f, but not B, C, or B::f 3248</pre></td></tr> 3249 3250 3251<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr> 3252<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 3253operator. 3254 3255Given 3256struct A { 3257 A &operator=(const A &); 3258 A &operator=(A &&); 3259}; 3260 3261cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 3262the first one. 3263</pre></td></tr> 3264 3265 3266<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr> 3267<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 3268 3269Given 3270 class A { 3271 public: 3272 virtual void x(); 3273 }; 3274 class B : public A { 3275 public: 3276 virtual void x(); 3277 }; 3278 matches B::x 3279</pre></td></tr> 3280 3281 3282<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr> 3283<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 3284 3285Given 3286 class A { 3287 public: 3288 virtual void x() = 0; 3289 }; 3290 matches A::x 3291</pre></td></tr> 3292 3293 3294<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr> 3295<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 3296 3297Given 3298 struct S { 3299 S(); // #1 3300 S(const S &) = default; // #2 3301 S(S &&) = delete; // #3 3302 }; 3303cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 3304</pre></td></tr> 3305 3306 3307<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr> 3308<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify 3309virtual inheritance. 3310 3311Example: 3312 class A { 3313 public: 3314 virtual void x(); // matches x 3315 }; 3316 3317Example: 3318 class Base {}; 3319 class DirectlyDerived : virtual Base {}; // matches Base 3320 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 3321 3322Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 3323</pre></td></tr> 3324 3325 3326<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr> 3327<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 3328 3329Given 3330 class A { 3331 public: 3332 virtual void x(); 3333 }; 3334 class B : public A { 3335 public: 3336 void x(); 3337 }; 3338 matches A::x but not B::x 3339</pre></td></tr> 3340 3341 3342<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr> 3343<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions. 3344 3345Given: 3346 MyClass *p1 = new MyClass[10]; 3347cxxNewExpr(isArray()) 3348 matches the expression 'new MyClass[10]'. 3349</pre></td></tr> 3350 3351 3352<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasAnyOperatorName1')"><a name="hasAnyOperatorName1Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 3353<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the 3354specified names. 3355 3356 hasAnyOperatorName("+", "-") 3357 Is equivalent to 3358 anyOf(hasOperatorName("+"), hasOperatorName("-")) 3359</pre></td></tr> 3360 3361 3362<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName0')"><a name="hasAnyOverloadedOperatorName0Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 3363<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names. 3364 3365Matches overloaded operator names specified in strings without the 3366"operator" prefix: e.g. "<<". 3367 3368 hasAnyOverloadedOperatorName("+", "-") 3369Is equivalent to 3370 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3371</pre></td></tr> 3372 3373 3374<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 3375<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 3376unary). 3377 3378Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3379 !(a || b) 3380</pre></td></tr> 3381 3382 3383<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr> 3384<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 3385 3386Matches overloaded operator names specified in strings without the 3387"operator" prefix: e.g. "<<". 3388 3389Given: 3390 class A { int operator*(); }; 3391 const A &operator<<(const A &a, const A &b); 3392 A a; 3393 a << a; // <-- This matches 3394 3395cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3396specified line and 3397cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3398matches the declaration of A. 3399 3400Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 3401</pre></td></tr> 3402 3403 3404<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr> 3405<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators. 3406 3407Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3408 if (a == b) 3409 a += b; 3410 3411Example 2: matches s1 = s2 3412 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3413 struct S { S& operator=(const S&); }; 3414 void x() { S s1, s2; s1 = s2; } 3415</pre></td></tr> 3416 3417 3418<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('isComparisonOperator1')"><a name="isComparisonOperator1Anchor">isComparisonOperator</a></td><td></td></tr> 3419<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators. 3420 3421Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3422 if (a == b) 3423 a += b; 3424 3425Example 2: matches s1 < s2 3426 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3427 struct S { bool operator<(const S& other); }; 3428 void x(S s1, S s2) { bool b1 = s1 < s2; } 3429</pre></td></tr> 3430 3431 3432<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr> 3433<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined. 3434 3435Example matches x (matcher = cxxRecordDecl(hasDefinition())) 3436class x {}; 3437class y; 3438</pre></td></tr> 3439 3440 3441<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom2')"><a name="isDerivedFrom2Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr> 3442<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 3443</pre></td></tr> 3444 3445 3446<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom2')"><a name="isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr> 3447<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 3448</pre></td></tr> 3449 3450 3451<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr> 3452<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 3453static member variable template instantiations. 3454 3455Given 3456 template<typename T> void A(T t) { } 3457 template<> void A(int N) { } 3458functionDecl(isExplicitTemplateSpecialization()) 3459 matches the specialization A<int>(). 3460 3461Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 3462</pre></td></tr> 3463 3464 3465<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr> 3466<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 3467 3468Given: 3469 class A final {}; 3470 3471 struct B { 3472 virtual void f(); 3473 }; 3474 3475 struct C : B { 3476 void f() final; 3477 }; 3478matches A and C::f, but not B, C, or B::f 3479</pre></td></tr> 3480 3481 3482<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr> 3483<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 3484 3485Given: 3486 auto x = []{}; 3487 3488cxxRecordDecl(isLambda()) matches the implicit class declaration of 3489decltype(x) 3490</pre></td></tr> 3491 3492 3493<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom2')"><a name="isSameOrDerivedFrom2Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr> 3494<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for 3495isSameOrDerivedFrom(hasName(...)). 3496</pre></td></tr> 3497 3498 3499<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr> 3500<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 3501member variable template instantiations. 3502 3503Given 3504 template <typename T> class X {}; class A {}; X<A> x; 3505or 3506 template <typename T> class X {}; class A {}; template class X<A>; 3507or 3508 template <typename T> class X {}; class A {}; extern template class X<A>; 3509cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3510 matches the template instantiation of X<A>. 3511 3512But given 3513 template <typename T> class X {}; class A {}; 3514 template <> class X<A> {}; X<A> x; 3515cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3516 does not match, as X<A> is an explicit template specialization. 3517 3518Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 3519</pre></td></tr> 3520 3521 3522<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName2')"><a name="hasAnyOperatorName2Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 3523<tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the 3524specified names. 3525 3526 hasAnyOperatorName("+", "-") 3527 Is equivalent to 3528 anyOf(hasOperatorName("+"), hasOperatorName("-")) 3529</pre></td></tr> 3530 3531 3532<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName2')"><a name="hasOperatorName2Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 3533<tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or 3534unary). 3535 3536Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3537 !(a || b) 3538</pre></td></tr> 3539 3540 3541<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('isAssignmentOperator2')"><a name="isAssignmentOperator2Anchor">isAssignmentOperator</a></td><td></td></tr> 3542<tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators. 3543 3544Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3545 if (a == b) 3546 a += b; 3547 3548Example 2: matches s1 = s2 3549 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3550 struct S { S& operator=(const S&); }; 3551 void x() { S s1, s2; s1 = s2; } 3552</pre></td></tr> 3553 3554 3555<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('isComparisonOperator2')"><a name="isComparisonOperator2Anchor">isComparisonOperator</a></td><td></td></tr> 3556<tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators. 3557 3558Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3559 if (a == b) 3560 a += b; 3561 3562Example 2: matches s1 < s2 3563 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3564 struct S { bool operator<(const S& other); }; 3565 void x(S s1, S s2) { bool b1 = s1 < s2; } 3566</pre></td></tr> 3567 3568 3569<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 3570<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3571a specific number of arguments (including absent default arguments). 3572 3573Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3574 void f(int x, int y); 3575 f(0, 0); 3576</pre></td></tr> 3577 3578 3579<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('argumentCountIs0')"><a name="argumentCountIs0Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 3580<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 3581a specific number of arguments (including absent default arguments). 3582 3583Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3584 void f(int x, int y); 3585 f(0, 0); 3586</pre></td></tr> 3587 3588 3589<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('usesADL0')"><a name="usesADL0Anchor">usesADL</a></td><td></td></tr> 3590<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL. 3591 3592Example matches y(x) but not y(42) or NS::y(x). 3593 namespace NS { 3594 struct X {}; 3595 void y(X); 3596 } 3597 3598 void y(...); 3599 3600 void test() { 3601 NS::X x; 3602 y(x); // Matches 3603 NS::y(x); // Doesn't match 3604 y(42); // Doesn't match 3605 using NS::y; 3606 y(x); // Found by both unqualified lookup and ADL, doesn't match 3607 } 3608</pre></td></tr> 3609 3610 3611<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>></td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr> 3612<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 3613 3614Example: matches the implicit cast around 0 3615(matcher = castExpr(hasCastKind(CK_NullToPointer))) 3616 int *p = 0; 3617 3618If the matcher is use from clang-query, CastKind parameter 3619should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer"). 3620</pre></td></tr> 3621 3622 3623<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr> 3624<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr> 3625 3626 3627<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT Value</td></tr> 3628<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT. 3629 3630Given 3631 f('false, 3.14, 42); 3632characterLiteral(equals(0)) 3633 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3634 match false 3635floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3636 match 3.14 3637integerLiteral(equals(42)) 3638 matches 42 3639 3640Note that you cannot directly match a negative numeric literal because the 3641minus sign is not part of the literal: It is a unary operator whose operand 3642is the positive numeric literal. Instead, you must use a unaryOperator() 3643matcher to match the minus sign: 3644 3645unaryOperator(hasOperatorName("-"), 3646 hasUnaryOperand(integerLiteral(equals(13)))) 3647 3648Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 3649 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 3650</pre></td></tr> 3651 3652 3653<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr> 3654<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr> 3655 3656 3657<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr> 3658<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr> 3659 3660 3661<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr> 3662<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 3663 3664Given 3665 template<typename T> struct C {}; 3666 C<int> c; 3667classTemplateSpecializationDecl(templateArgumentCountIs(1)) 3668 matches C<int>. 3669</pre></td></tr> 3670 3671 3672<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>></td><td class="name" onclick="toggle('statementCountIs0')"><a name="statementCountIs0Anchor">statementCountIs</a></td><td>unsigned N</td></tr> 3673<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 3674child statements. 3675 3676Example: Given 3677 { for (;;) {} } 3678compoundStmt(statementCountIs(0))) 3679 matches '{}' 3680 but does not match the outer compound statement. 3681</pre></td></tr> 3682 3683 3684<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>></td><td class="name" onclick="toggle('hasSize0')"><a name="hasSize0Anchor">hasSize</a></td><td>unsigned N</td></tr> 3685<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 3686 3687Given 3688 int a[42]; 3689 int b[2 * 21]; 3690 int c[41], d[43]; 3691 char *s = "abcd"; 3692 wchar_t *ws = L"abcd"; 3693 char *w = "a"; 3694constantArrayType(hasSize(42)) 3695 matches "int a[42]" and "int b[2 * 21]" 3696stringLiteral(hasSize(4)) 3697 matches "abcd", L"abcd" 3698</pre></td></tr> 3699 3700 3701<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>></td><td class="name" onclick="toggle('declCountIs0')"><a name="declCountIs0Anchor">declCountIs</a></td><td>unsigned N</td></tr> 3702<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 3703declarations. 3704 3705Example: Given 3706 int a, b; 3707 int c; 3708 int d = 2, e; 3709declCountIs(2) 3710 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 3711</pre></td></tr> 3712 3713 3714<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 3715<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 3716 3717Matches a node if it equals the node previously bound to ID. 3718 3719Given 3720 class X { int a; int b; }; 3721cxxRecordDecl( 3722 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3723 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3724 matches the class X, as a and b have the same type. 3725 3726Note that when multiple matches are involved via forEach* matchers, 3727equalsBoundNodes acts as a filter. 3728For example: 3729compoundStmt( 3730 forEachDescendant(varDecl().bind("d")), 3731 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3732will trigger a match for each combination of variable declaration 3733and reference to that variable declaration within a compound statement. 3734</pre></td></tr> 3735 3736 3737<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr> 3738<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 3739 3740Decl has pointer identity in the AST. 3741</pre></td></tr> 3742 3743 3744<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr> 3745<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 3746 3747Given 3748 __attribute__((device)) void f() { ... } 3749decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 3750f. If the matcher is used from clang-query, attr::Kind parameter should be 3751passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 3752</pre></td></tr> 3753 3754 3755<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpandedFromMacro0')"><a name="isExpandedFromMacro0Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr> 3756<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro. 3757Does not match if only part of the statement is expanded from that macro or 3758if different parts of the the statement are expanded from different 3759appearances of the macro. 3760</pre></td></tr> 3761 3762 3763<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 3764<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 3765partially matching a given regex. 3766 3767Example matches Y but not X 3768 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3769 #include "ASTMatcher.h" 3770 class X {}; 3771ASTMatcher.h: 3772 class Y {}; 3773 3774Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3775 3776If the matcher is used in clang-query, RegexFlags parameter 3777should be passed as a quoted string. e.g: "NoFlags". 3778Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3779</pre></td></tr> 3780 3781 3782<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr> 3783<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 3784 3785Example matches X but not Y 3786 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3787 #include <Y.h> 3788 class X {}; 3789Y.h: 3790 class Y {}; 3791 3792Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3793</pre></td></tr> 3794 3795 3796<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr> 3797<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 3798 3799Example matches Y but not X 3800 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3801 #include <SystemHeader.h> 3802 class X {}; 3803SystemHeader.h: 3804 class Y {}; 3805 3806Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3807</pre></td></tr> 3808 3809 3810<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr> 3811<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added 3812by the compiler (eg. implicit default/copy constructors). 3813</pre></td></tr> 3814 3815 3816<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isInStdNamespace0')"><a name="isInStdNamespace0Anchor">isInStdNamespace</a></td><td></td></tr> 3817<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces. 3818 3819Given 3820 class vector {}; 3821 namespace foo { 3822 class vector {}; 3823 namespace std { 3824 class vector {}; 3825 } 3826 } 3827 namespace std { 3828 inline namespace __1 { 3829 class vector {}; // #1 3830 namespace experimental { 3831 class vector {}; 3832 } 3833 } 3834 } 3835cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1. 3836</pre></td></tr> 3837 3838 3839<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr> 3840<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3841template instantiations. 3842 3843Given 3844 template<typename T> void A(T t) { T i; } 3845 A(0); 3846 A(0U); 3847functionDecl(isInstantiated()) 3848 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3849</pre></td></tr> 3850 3851 3852<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr> 3853<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private 3854inheritance. 3855 3856Examples: 3857 class C { 3858 public: int a; 3859 protected: int b; 3860 private: int c; // fieldDecl(isPrivate()) matches 'c' 3861 }; 3862 3863 struct Base {}; 3864 struct Derived1 : private Base {}; // matches 'Base' 3865 class Derived2 : Base {}; // matches 'Base' 3866</pre></td></tr> 3867 3868 3869<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr> 3870<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify 3871protected inheritance. 3872 3873Examples: 3874 class C { 3875 public: int a; 3876 protected: int b; // fieldDecl(isProtected()) matches 'b' 3877 private: int c; 3878 }; 3879 3880 class Base {}; 3881 class Derived : protected Base {}; // matches 'Base' 3882</pre></td></tr> 3883 3884 3885<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr> 3886<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public 3887inheritance. 3888 3889Examples: 3890 class C { 3891 public: int a; // fieldDecl(isPublic()) matches 'a' 3892 protected: int b; 3893 private: int c; 3894 }; 3895 3896 class Base {}; 3897 class Derived1 : public Base {}; // matches 'Base' 3898 struct Derived2 : Base {}; // matches 'Base' 3899</pre></td></tr> 3900 3901 3902<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>></td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr> 3903<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 3904a specific number of designators. 3905 3906Example: Given 3907 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 3908 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 3909designatorCountIs(2) 3910 matches '{ [2].y = 1.0, [0].x = 1.0 }', 3911 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 3912</pre></td></tr> 3913 3914 3915<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>></td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr> 3916<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration. 3917 3918Example matches Y (matcher = enumDecl(isScoped())) 3919enum X {}; 3920enum class Y {}; 3921</pre></td></tr> 3922 3923 3924<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isInstantiationDependent0')"><a name="isInstantiationDependent0Anchor">isInstantiationDependent</a></td><td></td></tr> 3925<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is 3926neither type- nor value-dependent. 3927 3928In the following example, the expression sizeof(sizeof(T() + T())) 3929is instantiation-dependent (since it involves a template parameter T), 3930but is neither type- nor value-dependent, since the type of the inner 3931sizeof is known (std::size_t) and therefore the size of the outer 3932sizeof is known. 3933 template<typename T> 3934 void f(T x, T y) { sizeof(sizeof(T() + T()); } 3935expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T()) 3936</pre></td></tr> 3937 3938 3939<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr> 3940<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type 3941is not yet instantiated. 3942 3943For example, the expressions "x" and "x + y" are type-dependent in 3944the following code, but "y" is not type-dependent: 3945 template<typename T> 3946 void add(T x, int y) { 3947 x + y; 3948 } 3949expr(isTypeDependent()) matches x + y 3950</pre></td></tr> 3951 3952 3953<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr> 3954<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a 3955non-type template parameter. 3956 3957For example, the array bound of "Chars" in the following example is 3958value-dependent. 3959 template<int Size> int f() { return Size; } 3960expr(isValueDependent()) matches return Size 3961</pre></td></tr> 3962 3963 3964<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr> 3965<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 3966GNU's __null, C++11's nullptr, or C's NULL macro. 3967 3968Given: 3969 void *v1 = NULL; 3970 void *v2 = nullptr; 3971 void *v3 = __null; // GNU extension 3972 char *cp = (char *)0; 3973 int *ip = 0; 3974 int i = 0; 3975expr(nullPointerConstant()) 3976 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 3977 initializer for i. 3978</pre></td></tr> 3979 3980 3981<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr> 3982<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 3983bit width. 3984 3985Given 3986 class C { 3987 int a : 2; 3988 int b : 4; 3989 int c : 2; 3990 }; 3991fieldDecl(hasBitWidth(2)) 3992 matches 'int a;' and 'int c;' but not 'int b;'. 3993</pre></td></tr> 3994 3995 3996<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr> 3997<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 3998 3999Given 4000 class C { 4001 int a : 2; 4002 int b; 4003 }; 4004fieldDecl(isBitField()) 4005 matches 'int a;' but not 'int b;'. 4006</pre></td></tr> 4007 4008 4009<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>const ValueT Value</td></tr> 4010<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 4011 4012Given 4013 f('false, 3.14, 42); 4014characterLiteral(equals(0)) 4015 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4016 match false 4017floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4018 match 3.14 4019integerLiteral(equals(42)) 4020 matches 42 4021 4022Note that you cannot directly match a negative numeric literal because the 4023minus sign is not part of the literal: It is a unary operator whose operand 4024is the positive numeric literal. Instead, you must use a unaryOperator() 4025matcher to match the minus sign: 4026 4027unaryOperator(hasOperatorName("-"), 4028 hasUnaryOperand(integerLiteral(equals(13)))) 4029 4030Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 4031 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 4032</pre></td></tr> 4033 4034 4035<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name" onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr> 4036<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr> 4037 4038 4039<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName1')"><a name="hasAnyOverloadedOperatorName1Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 4040<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names. 4041 4042Matches overloaded operator names specified in strings without the 4043"operator" prefix: e.g. "<<". 4044 4045 hasAnyOverloadedOperatorName("+", "-") 4046Is equivalent to 4047 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 4048</pre></td></tr> 4049 4050 4051<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr> 4052<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 4053 4054Given: 4055 void f(); 4056 void g() noexcept; 4057 void h() noexcept(true); 4058 void i() noexcept(false); 4059 void j() throw(); 4060 void k() throw(int); 4061 void l() throw(...); 4062functionDecl(hasDynamicExceptionSpec()) and 4063 functionProtoType(hasDynamicExceptionSpec()) 4064 match the declarations of j, k, and l, but not f, g, h, or i. 4065</pre></td></tr> 4066 4067 4068<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr> 4069<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 4070 4071Matches overloaded operator names specified in strings without the 4072"operator" prefix: e.g. "<<". 4073 4074Given: 4075 class A { int operator*(); }; 4076 const A &operator<<(const A &a, const A &b); 4077 A a; 4078 a << a; // <-- This matches 4079 4080cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 4081specified line and 4082cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 4083matches the declaration of A. 4084 4085Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 4086</pre></td></tr> 4087 4088 4089<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr> 4090<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 4091 4092Example matches Y (matcher = functionDecl(hasTrailingReturn())) 4093int X() {} 4094auto Y() -> int {} 4095</pre></td></tr> 4096 4097 4098<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr> 4099<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations, 4100 and if constexpr. 4101 4102Given: 4103 constexpr int foo = 42; 4104 constexpr int bar(); 4105 void baz() { if constexpr(1 > 0) {} } 4106varDecl(isConstexpr()) 4107 matches the declaration of foo. 4108functionDecl(isConstexpr()) 4109 matches the declaration of bar. 4110ifStmt(isConstexpr()) 4111 matches the if statement in baz. 4112</pre></td></tr> 4113 4114 4115<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr> 4116<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 4117 4118Given: 4119 class A { ~A(); }; 4120 class B { ~B() = default; }; 4121functionDecl(isDefaulted()) 4122 matches the declaration of ~B, but not ~A. 4123</pre></td></tr> 4124 4125 4126<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr> 4127<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 4128 4129Example matches A, va, fa 4130 class A {}; 4131 class B; // Doesn't match, as it has no body. 4132 int va; 4133 extern int vb; // Doesn't match, as it doesn't define the variable. 4134 void fa() {} 4135 void fb(); // Doesn't match, as it has no body. 4136 @interface X 4137 - (void)ma; // Doesn't match, interface is declaration. 4138 @end 4139 @implementation X 4140 - (void)ma {} 4141 @end 4142 4143Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, 4144 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4145</pre></td></tr> 4146 4147 4148<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr> 4149<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 4150 4151Given: 4152 void Func(); 4153 void DeletedFunc() = delete; 4154functionDecl(isDeleted()) 4155 matches the declaration of DeletedFunc, but not Func. 4156</pre></td></tr> 4157 4158 4159<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization0')"><a name="isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr> 4160<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 4161static member variable template instantiations. 4162 4163Given 4164 template<typename T> void A(T t) { } 4165 template<> void A(int N) { } 4166functionDecl(isExplicitTemplateSpecialization()) 4167 matches the specialization A<int>(). 4168 4169Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 4170</pre></td></tr> 4171 4172 4173<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr> 4174<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 4175 4176Given: 4177 extern "C" void f() {} 4178 extern "C" { void g() {} } 4179 void h() {} 4180 extern "C" int x = 1; 4181 extern "C" int y = 2; 4182 int z = 3; 4183functionDecl(isExternC()) 4184 matches the declaration of f and g, but not the declaration of h. 4185varDecl(isExternC()) 4186 matches the declaration of x and y, but not the declaration of z. 4187</pre></td></tr> 4188 4189 4190<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr> 4191<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 4192the inline keyword. 4193 4194Given 4195 inline void f(); 4196 void g(); 4197 namespace n { 4198 inline namespace m {} 4199 } 4200functionDecl(isInline()) will match ::f(). 4201namespaceDecl(isInline()) will match n::m. 4202</pre></td></tr> 4203 4204 4205<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isMain0')"><a name="isMain0Anchor">isMain</a></td><td></td></tr> 4206<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point 4207into an executable program. 4208</pre></td></tr> 4209 4210 4211<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr> 4212<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 4213 4214Given 4215 void nope(); 4216 [[noreturn]] void a(); 4217 __attribute__((noreturn)) void b(); 4218 struct c { [[noreturn]] c(); }; 4219functionDecl(isNoReturn()) 4220 matches all of those except 4221 void nope(); 4222</pre></td></tr> 4223 4224 4225<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr> 4226<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 4227 4228Given: 4229 void f(); 4230 void g() noexcept; 4231 void h() throw(); 4232 void i() throw(int); 4233 void j() noexcept(false); 4234functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4235 match the declarations of g, and h, but not f, i or j. 4236</pre></td></tr> 4237 4238 4239<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr> 4240<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage 4241class specifier ("static" keyword) written in the source. 4242 4243Given: 4244 static void f() {} 4245 static int i = 0; 4246 extern int j; 4247 int k; 4248functionDecl(isStaticStorageClass()) 4249 matches the function declaration f. 4250varDecl(isStaticStorageClass()) 4251 matches the variable declaration i. 4252</pre></td></tr> 4253 4254 4255<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr> 4256<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 4257member variable template instantiations. 4258 4259Given 4260 template <typename T> class X {}; class A {}; X<A> x; 4261or 4262 template <typename T> class X {}; class A {}; template class X<A>; 4263or 4264 template <typename T> class X {}; class A {}; extern template class X<A>; 4265cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4266 matches the template instantiation of X<A>. 4267 4268But given 4269 template <typename T> class X {}; class A {}; 4270 template <> class X<A> {}; X<A> x; 4271cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4272 does not match, as X<A> is an explicit template specialization. 4273 4274Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 4275</pre></td></tr> 4276 4277 4278<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr> 4279<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 4280 4281Example matches f, but not g or h. The function i will not match, even when 4282compiled in C mode. 4283 void f(...); 4284 void g(int); 4285 template <typename... Ts> void h(Ts...); 4286 void i(); 4287</pre></td></tr> 4288 4289 4290<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isWeak0')"><a name="isWeak0Anchor">isWeak</a></td><td></td></tr> 4291<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations. 4292 4293Given: 4294 void foo() __attribute__((__weakref__("__foo"))); 4295 void bar(); 4296functionDecl(isWeak()) 4297 matches the weak declaration "foo", but not "bar". 4298</pre></td></tr> 4299 4300 4301<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('parameterCountIs0')"><a name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned N</td></tr> 4302<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4303specific parameter count. 4304 4305Given 4306 void f(int i) {} 4307 void g(int i, int j) {} 4308 void h(int i, int j); 4309 void j(int i); 4310 void k(int x, int y, int z, ...); 4311functionDecl(parameterCountIs(2)) 4312 matches g and h 4313functionProtoType(parameterCountIs(2)) 4314 matches g and h 4315functionProtoType(parameterCountIs(3)) 4316 matches k 4317</pre></td></tr> 4318 4319 4320<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr> 4321<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 4322 4323Given: 4324 void f(); 4325 void g() noexcept; 4326 void h() noexcept(true); 4327 void i() noexcept(false); 4328 void j() throw(); 4329 void k() throw(int); 4330 void l() throw(...); 4331functionDecl(hasDynamicExceptionSpec()) and 4332 functionProtoType(hasDynamicExceptionSpec()) 4333 match the declarations of j, k, and l, but not f, g, h, or i. 4334</pre></td></tr> 4335 4336 4337<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr> 4338<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 4339 4340Given: 4341 void f(); 4342 void g() noexcept; 4343 void h() throw(); 4344 void i() throw(int); 4345 void j() noexcept(false); 4346functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4347 match the declarations of g, and h, but not f, i or j. 4348</pre></td></tr> 4349 4350 4351<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr> 4352<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4353specific parameter count. 4354 4355Given 4356 void f(int i) {} 4357 void g(int i, int j) {} 4358 void h(int i, int j); 4359 void j(int i); 4360 void k(int x, int y, int z, ...); 4361functionDecl(parameterCountIs(2)) 4362 matches g and h 4363functionProtoType(parameterCountIs(2)) 4364 matches g and h 4365functionProtoType(parameterCountIs(3)) 4366 matches k 4367</pre></td></tr> 4368 4369 4370<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('isConstexpr2')"><a name="isConstexpr2Anchor">isConstexpr</a></td><td></td></tr> 4371<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations, 4372 and if constexpr. 4373 4374Given: 4375 constexpr int foo = 42; 4376 constexpr int bar(); 4377 void baz() { if constexpr(1 > 0) {} } 4378varDecl(isConstexpr()) 4379 matches the declaration of foo. 4380functionDecl(isConstexpr()) 4381 matches the declaration of bar. 4382ifStmt(isConstexpr()) 4383 matches the if statement in baz. 4384</pre></td></tr> 4385 4386 4387<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr> 4388<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 4389 4390 4391<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>const ValueT Value</td></tr> 4392<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 4393 4394Given 4395 f('false, 3.14, 42); 4396characterLiteral(equals(0)) 4397 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4398 match false 4399floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4400 match 3.14 4401integerLiteral(equals(42)) 4402 matches 42 4403 4404Note that you cannot directly match a negative numeric literal because the 4405minus sign is not part of the literal: It is a unary operator whose operand 4406is the positive numeric literal. Instead, you must use a unaryOperator() 4407matcher to match the minus sign: 4408 4409unaryOperator(hasOperatorName("-"), 4410 hasUnaryOperand(integerLiteral(equals(13)))) 4411 4412Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 4413 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 4414</pre></td></tr> 4415 4416 4417<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr> 4418<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 4419 4420 4421<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned Value</td></tr> 4422<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 4423 4424 4425<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('isArrow0')"><a name="isArrow0Anchor">isArrow</a></td><td></td></tr> 4426<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 4427to '.'. 4428 4429Member calls on the implicit this pointer match as called with '->'. 4430 4431Given 4432 class Y { 4433 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 4434 template <class T> void f() { this->f<T>(); f<T>(); } 4435 int a; 4436 static int b; 4437 }; 4438 template <class T> 4439 class Z { 4440 void x() { this->m; } 4441 }; 4442memberExpr(isArrow()) 4443 matches this->x, x, y.x, a, this->b 4444cxxDependentScopeMemberExpr(isArrow()) 4445 matches this->m 4446unresolvedMemberExpr(isArrow()) 4447 matches this->f<T>, f<T> 4448</pre></td></tr> 4449 4450 4451<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr> 4452<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 4453 4454This matcher is only provided as a performance optimization of hasName. 4455 hasAnyName(a, b, c) 4456 is equivalent to, but faster than 4457 anyOf(hasName(a), hasName(b), hasName(c)) 4458</pre></td></tr> 4459 4460 4461<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasExternalFormalLinkage0')"><a name="hasExternalFormalLinkage0Anchor">hasExternalFormalLinkage</a></td><td></td></tr> 4462<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 4463 4464Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 4465void f() { 4466 int x; 4467 static int y; 4468} 4469int z; 4470 4471Example matches f() because it has external formal linkage despite being 4472unique to the translation unit as though it has internal likage 4473(matcher = functionDecl(hasExternalFormalLinkage())) 4474 4475namespace { 4476void f() {} 4477} 4478</pre></td></tr> 4479 4480 4481<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>StringRef Name</td></tr> 4482<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 4483 4484Supports specifying enclosing namespaces or classes by prefixing the name 4485with '<enclosing>::'. 4486Does not match typedefs of an underlying type with the given name. 4487 4488Example matches X (Name == "X") 4489 class X; 4490 4491Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 4492 namespace a { namespace b { class X; } } 4493</pre></td></tr> 4494 4495 4496<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 4497<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 4498a substring matched by the given RegExp. 4499 4500Supports specifying enclosing namespaces or classes by 4501prefixing the name with '<enclosing>::'. Does not match typedefs 4502of an underlying type with the given name. 4503 4504Example matches X (regexp == "::X") 4505 class X; 4506 4507Example matches X (regexp is one of "::X", "^foo::.*X", among others) 4508 namespace foo { namespace bar { class X; } } 4509 4510If the matcher is used in clang-query, RegexFlags parameter 4511should be passed as a quoted string. e.g: "NoFlags". 4512Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4513</pre></td></tr> 4514 4515 4516<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>></td><td class="name" onclick="toggle('isAnonymous0')"><a name="isAnonymous0Anchor">isAnonymous</a></td><td></td></tr> 4517<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 4518 4519Given 4520 namespace n { 4521 namespace {} // #1 4522 } 4523namespaceDecl(isAnonymous()) will match #1 but not ::n. 4524</pre></td></tr> 4525 4526 4527<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>></td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr> 4528<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 4529the inline keyword. 4530 4531Given 4532 inline void f(); 4533 void g(); 4534 namespace n { 4535 inline namespace m {} 4536 } 4537functionDecl(isInline()) will match ::f(). 4538namespaceDecl(isInline()) will match n::m. 4539</pre></td></tr> 4540 4541 4542<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>></td><td class="name" onclick="toggle('isFirstPrivateKind0')"><a name="isFirstPrivateKind0Anchor">isFirstPrivateKind</a></td><td></td></tr> 4543<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind 4544specified. 4545 4546Given 4547 4548 #pragma omp parallel 4549 #pragma omp parallel default(none) 4550 #pragma omp parallel default(shared) 4551 #pragma omp parallel default(firstprivate) 4552 4553``ompDefaultClause(isFirstPrivateKind())`` matches only 4554``default(firstprivate)``. 4555</pre></td></tr> 4556 4557 4558<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>></td><td class="name" onclick="toggle('isNoneKind0')"><a name="isNoneKind0Anchor">isNoneKind</a></td><td></td></tr> 4559<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified. 4560 4561Given 4562 4563 #pragma omp parallel 4564 #pragma omp parallel default(none) 4565 #pragma omp parallel default(shared) 4566 #pragma omp parallel default(firstprivate) 4567 4568``ompDefaultClause(isNoneKind())`` matches only ``default(none)``. 4569</pre></td></tr> 4570 4571 4572<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>></td><td class="name" onclick="toggle('isSharedKind0')"><a name="isSharedKind0Anchor">isSharedKind</a></td><td></td></tr> 4573<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified. 4574 4575Given 4576 4577 #pragma omp parallel 4578 #pragma omp parallel default(none) 4579 #pragma omp parallel default(shared) 4580 #pragma omp parallel default(firstprivate) 4581 4582``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``. 4583</pre></td></tr> 4584 4585 4586<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('isAllowedToContainClauseKind0')"><a name="isAllowedToContainClauseKind0Anchor">isAllowedToContainClauseKind</a></td><td>OpenMPClauseKind CKind</td></tr> 4587<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP 4588clause kind. 4589 4590Given 4591 4592 #pragma omp parallel 4593 #pragma omp parallel for 4594 #pragma omp for 4595 4596`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches 4597``omp parallel`` and ``omp parallel for``. 4598 4599If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter 4600should be passed as a quoted string. e.g., 4601``isAllowedToContainClauseKind("OMPC_default").`` 4602</pre></td></tr> 4603 4604 4605<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('isStandaloneDirective0')"><a name="isStandaloneDirective0Anchor">isStandaloneDirective</a></td><td></td></tr> 4606<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives, 4607i.e., directives that can't have a structured block. 4608 4609Given 4610 4611 #pragma omp parallel 4612 {} 4613 #pragma omp taskyield 4614 4615``ompExecutableDirective(isStandaloneDirective()))`` matches 4616``omp taskyield``. 4617</pre></td></tr> 4618 4619 4620<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom3')"><a name="isDerivedFrom3Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr> 4621<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 4622</pre></td></tr> 4623 4624 4625<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom3')"><a name="isDirectlyDerivedFrom3Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr> 4626<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 4627</pre></td></tr> 4628 4629 4630<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom3')"><a name="isSameOrDerivedFrom3Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr> 4631<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for 4632isSameOrDerivedFrom(hasName(...)). 4633</pre></td></tr> 4634 4635 4636<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('argumentCountIs3')"><a name="argumentCountIs3Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 4637<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has 4638a specific number of arguments (including absent default arguments). 4639 4640Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 4641 void f(int x, int y); 4642 f(0, 0); 4643</pre></td></tr> 4644 4645 4646<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasAnySelector0')"><a name="hasAnySelector0Anchor">hasAnySelector</a></td><td>StringRef, ..., StringRef</td></tr> 4647<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 4648Selector.getAsString() 4649 4650 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 4651 matches both of the expressions below: 4652 [myObj methodA:argA]; 4653 [myObj methodB:argB]; 4654</pre></td></tr> 4655 4656 4657<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr> 4658<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 4659 4660objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 4661message expression in 4662 4663 UIWebView *webView = ...; 4664 CGRect bodyFrame = webView.frame; 4665 bodyFrame.size.height = self.bodyContentHeight; 4666 webView.frame = bodyFrame; 4667 // ^---- matches here 4668</pre></td></tr> 4669 4670 4671<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr> 4672<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 4673 4674Matches only when the selector of the objCMessageExpr is NULL. This may 4675represent an error condition in the tree! 4676</pre></td></tr> 4677 4678 4679<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasSelector0')"><a name="hasSelector0Anchor">hasSelector</a></td><td>std::string BaseName</td></tr> 4680<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 4681 4682 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 4683 matches the outer message expr in the code below, but NOT the message 4684 invocation for self.bodyView. 4685 [self.bodyView loadHTMLString:html baseURL:NULL]; 4686</pre></td></tr> 4687 4688 4689<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasUnarySelector0')"><a name="hasUnarySelector0Anchor">hasUnarySelector</a></td><td></td></tr> 4690<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 4691 4692 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 4693 matches self.bodyView in the code below, but NOT the outer message 4694 invocation of "loadHTMLString:baseURL:". 4695 [self.bodyView loadHTMLString:html baseURL:NULL]; 4696</pre></td></tr> 4697 4698 4699<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('isClassMessage0')"><a name="isClassMessage0Anchor">isClassMessage</a></td><td></td></tr> 4700<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class. 4701 4702Example 4703matcher = objcMessageExpr(isClassMessage()) 4704matches 4705 [NSString stringWithFormat:@"format"]; 4706but not 4707 NSString *x = @"hello"; 4708 [x containsString:@"h"]; 4709</pre></td></tr> 4710 4711 4712<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('isInstanceMessage0')"><a name="isInstanceMessage0Anchor">isInstanceMessage</a></td><td></td></tr> 4713<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance. 4714 4715Example 4716matcher = objcMessageExpr(isInstanceMessage()) 4717matches 4718 NSString *x = @"hello"; 4719 [x containsString:@"h"]; 4720but not 4721 [NSString stringWithFormat:@"format"]; 4722</pre></td></tr> 4723 4724 4725<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 4726<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 4727a substring matched by the given RegExp. 4728 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 4729 invocation for self.bodyView. 4730 [self.bodyView loadHTMLString:html baseURL:NULL]; 4731 4732If the matcher is used in clang-query, RegexFlags parameter 4733should be passed as a quoted string. e.g: "NoFlags". 4734Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4735</pre></td></tr> 4736 4737 4738<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr> 4739<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 4740 4741 matcher = objCMessageExpr(numSelectorArgs(0)); 4742 matches self.bodyView in the code below 4743 4744 matcher = objCMessageExpr(numSelectorArgs(2)); 4745 matches the invocation of "loadHTMLString:baseURL:" but not that 4746 of self.bodyView 4747 [self.bodyView loadHTMLString:html baseURL:NULL]; 4748</pre></td></tr> 4749 4750 4751<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isClassMethod0')"><a name="isClassMethod0Anchor">isClassMethod</a></td><td></td></tr> 4752<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method. 4753 4754Example 4755matcher = objcMethodDecl(isClassMethod()) 4756matches 4757@interface I + (void)foo; @end 4758but not 4759@interface I - (void)bar; @end 4760</pre></td></tr> 4761 4762 4763<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr> 4764<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 4765 4766Example matches A, va, fa 4767 class A {}; 4768 class B; // Doesn't match, as it has no body. 4769 int va; 4770 extern int vb; // Doesn't match, as it doesn't define the variable. 4771 void fa() {} 4772 void fb(); // Doesn't match, as it has no body. 4773 @interface X 4774 - (void)ma; // Doesn't match, interface is declaration. 4775 @end 4776 @implementation X 4777 - (void)ma {} 4778 @end 4779 4780Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, 4781 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4782</pre></td></tr> 4783 4784 4785<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isInstanceMethod0')"><a name="isInstanceMethod0Anchor">isInstanceMethod</a></td><td></td></tr> 4786<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method. 4787 4788Example 4789matcher = objcMethodDecl(isInstanceMethod()) 4790matches 4791@interface I - (void)bar; @end 4792but not 4793@interface I + (void)foo; @end 4794</pre></td></tr> 4795 4796 4797<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>></td><td class="name" onclick="toggle('hasDefaultArgument0')"><a name="hasDefaultArgument0Anchor">hasDefaultArgument</a></td><td></td></tr> 4798<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 4799 4800Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 4801void x(int val) {} 4802void y(int val = 0) {} 4803 4804Deprecated. Use hasInitializer() instead to be able to 4805match on the contents of the default argument. For example: 4806 4807void x(int val = 7) {} 4808void y(int val = 42) {} 4809parmVarDecl(hasInitializer(integerLiteral(equals(42)))) 4810 matches the parameter of y 4811 4812A matcher such as 4813 parmVarDecl(hasInitializer(anything())) 4814is equivalent to parmVarDecl(hasDefaultArgument()). 4815</pre></td></tr> 4816 4817 4818<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>></td><td class="name" onclick="toggle('isAtPosition0')"><a name="isAtPosition0Anchor">isAtPosition</a></td><td>unsigned N</td></tr> 4819<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter 4820list. The parameter list could be that of either a block, function, or 4821objc-method. 4822 4823 4824Given 4825 4826void f(int a, int b, int c) { 4827} 4828 4829``parmVarDecl(isAtPosition(0))`` matches ``int a``. 4830 4831``parmVarDecl(isAtPosition(1))`` matches ``int b``. 4832</pre></td></tr> 4833 4834 4835<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('asString0')"><a name="asString0Anchor">asString</a></td><td>std::string Name</td></tr> 4836<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 4837 4838Given 4839 class Y { public: void x(); }; 4840 void z() { Y* y; y->x(); } 4841cxxMemberCallExpr(on(hasType(asString("class Y *")))) 4842 matches y->x() 4843</pre></td></tr> 4844 4845 4846<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 4847<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 4848 4849Matches a node if it equals the node previously bound to ID. 4850 4851Given 4852 class X { int a; int b; }; 4853cxxRecordDecl( 4854 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4855 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4856 matches the class X, as a and b have the same type. 4857 4858Note that when multiple matches are involved via forEach* matchers, 4859equalsBoundNodes acts as a filter. 4860For example: 4861compoundStmt( 4862 forEachDescendant(varDecl().bind("d")), 4863 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4864will trigger a match for each combination of variable declaration 4865and reference to that variable declaration within a compound statement. 4866</pre></td></tr> 4867 4868 4869<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('hasLocalQualifiers0')"><a name="hasLocalQualifiers0Anchor">hasLocalQualifiers</a></td><td></td></tr> 4870<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 4871the node, not hidden within a typedef. 4872 4873Given 4874 typedef const int const_int; 4875 const_int i; 4876 int *const j; 4877 int *volatile k; 4878 int m; 4879varDecl(hasType(hasLocalQualifiers())) matches only j and k. 4880i is const-qualified but the qualifier is not local. 4881</pre></td></tr> 4882 4883 4884<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr> 4885<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 4886 4887Given 4888 void a(char); 4889 void b(wchar_t); 4890 void c(double); 4891functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 4892matches "a(char)", "b(wchar_t)", but not "c(double)". 4893</pre></td></tr> 4894 4895 4896<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr> 4897<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 4898the Objective-C object pointer type, which is different despite being 4899syntactically similar. 4900 4901Given 4902 int *i = nullptr; 4903 4904 @interface Foo 4905 @end 4906 Foo *f; 4907 4908 int j; 4909varDecl(hasType(isAnyPointer())) 4910 matches "int *i" and "Foo *f", but not "int j". 4911</pre></td></tr> 4912 4913 4914<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isConstQualified0')"><a name="isConstQualified0Anchor">isConstQualified</a></td><td></td></tr> 4915<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 4916include "top-level" const. 4917 4918Given 4919 void a(int); 4920 void b(int const); 4921 void c(const int); 4922 void d(const int*); 4923 void e(int const) {}; 4924functionDecl(hasAnyParameter(hasType(isConstQualified()))) 4925 matches "void b(int const)", "void c(const int)" and 4926 "void e(int const) {}". It does not match d as there 4927 is no top-level const on the parameter type "const int *". 4928</pre></td></tr> 4929 4930 4931<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isInteger0')"><a name="isInteger0Anchor">isInteger</a></td><td></td></tr> 4932<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 4933 4934Given 4935 void a(int); 4936 void b(long); 4937 void c(double); 4938functionDecl(hasAnyParameter(hasType(isInteger()))) 4939matches "a(int)", "b(long)", but not "c(double)". 4940</pre></td></tr> 4941 4942 4943<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr> 4944<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 4945 4946Given 4947 void a(int); 4948 void b(unsigned long); 4949 void c(double); 4950functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 4951matches "a(int)", but not "b(unsigned long)" and "c(double)". 4952</pre></td></tr> 4953 4954 4955<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr> 4956<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 4957 4958Given 4959 void a(int); 4960 void b(unsigned long); 4961 void c(double); 4962functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 4963matches "b(unsigned long)", but not "a(int)" and "c(double)". 4964</pre></td></tr> 4965 4966 4967<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr> 4968<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 4969include "top-level" volatile. 4970 4971Given 4972 void a(int); 4973 void b(int volatile); 4974 void c(volatile int); 4975 void d(volatile int*); 4976 void e(int volatile) {}; 4977functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 4978 matches "void b(int volatile)", "void c(volatile int)" and 4979 "void e(int volatile) {}". It does not match d as there 4980 is no top-level volatile on the parameter type "volatile int *". 4981</pre></td></tr> 4982 4983 4984<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 4985<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 4986 4987Matches a node if it equals the node previously bound to ID. 4988 4989Given 4990 class X { int a; int b; }; 4991cxxRecordDecl( 4992 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4993 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4994 matches the class X, as a and b have the same type. 4995 4996Note that when multiple matches are involved via forEach* matchers, 4997equalsBoundNodes acts as a filter. 4998For example: 4999compoundStmt( 5000 forEachDescendant(varDecl().bind("d")), 5001 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5002will trigger a match for each combination of variable declaration 5003and reference to that variable declaration within a compound statement. 5004</pre></td></tr> 5005 5006 5007<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>const Stmt* Other</td></tr> 5008<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 5009 5010Stmt has pointer identity in the AST. 5011</pre></td></tr> 5012 5013 5014<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpandedFromMacro1')"><a name="isExpandedFromMacro1Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr> 5015<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro. 5016Does not match if only part of the statement is expanded from that macro or 5017if different parts of the the statement are expanded from different 5018appearances of the macro. 5019</pre></td></tr> 5020 5021 5022<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 5023<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 5024partially matching a given regex. 5025 5026Example matches Y but not X 5027 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5028 #include "ASTMatcher.h" 5029 class X {}; 5030ASTMatcher.h: 5031 class Y {}; 5032 5033Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5034 5035If the matcher is used in clang-query, RegexFlags parameter 5036should be passed as a quoted string. e.g: "NoFlags". 5037Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5038</pre></td></tr> 5039 5040 5041<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr> 5042<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 5043 5044Example matches X but not Y 5045 (matcher = cxxRecordDecl(isExpansionInMainFile()) 5046 #include <Y.h> 5047 class X {}; 5048Y.h: 5049 class Y {}; 5050 5051Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5052</pre></td></tr> 5053 5054 5055<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr> 5056<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 5057 5058Example matches Y but not X 5059 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5060 #include <SystemHeader.h> 5061 class X {}; 5062SystemHeader.h: 5063 class Y {}; 5064 5065Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5066</pre></td></tr> 5067 5068 5069<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr> 5070<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 5071 5072Given 5073 int j; 5074 template<typename T> void A(T t) { T i; j += 42;} 5075 A(0); 5076 A(0U); 5077declStmt(isInTemplateInstantiation()) 5078 matches 'int i;' and 'unsigned i'. 5079unless(stmt(isInTemplateInstantiation())) 5080 will NOT match j += 42; as it's shared between the template definition and 5081 instantiation. 5082</pre></td></tr> 5083 5084 5085<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>></td><td class="name" onclick="toggle('hasSize1')"><a name="hasSize1Anchor">hasSize</a></td><td>unsigned N</td></tr> 5086<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 5087 5088Given 5089 int a[42]; 5090 int b[2 * 21]; 5091 int c[41], d[43]; 5092 char *s = "abcd"; 5093 wchar_t *ws = L"abcd"; 5094 char *w = "a"; 5095constantArrayType(hasSize(42)) 5096 matches "int a[42]" and "int b[2 * 21]" 5097stringLiteral(hasSize(4)) 5098 matches "abcd", L"abcd" 5099</pre></td></tr> 5100 5101 5102<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr> 5103<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class." 5104 5105Example matches C, but not S, U or E. 5106 struct S {}; 5107 class C {}; 5108 union U {}; 5109 enum E {}; 5110</pre></td></tr> 5111 5112 5113<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isDefinition0')"><a name="isDefinition0Anchor">isDefinition</a></td><td></td></tr> 5114<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 5115 5116Example matches A, va, fa 5117 class A {}; 5118 class B; // Doesn't match, as it has no body. 5119 int va; 5120 extern int vb; // Doesn't match, as it doesn't define the variable. 5121 void fa() {} 5122 void fb(); // Doesn't match, as it has no body. 5123 @interface X 5124 - (void)ma; // Doesn't match, interface is declaration. 5125 @end 5126 @implementation X 5127 - (void)ma {} 5128 @end 5129 5130Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, 5131 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5132</pre></td></tr> 5133 5134 5135<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isEnum0')"><a name="isEnum0Anchor">isEnum</a></td><td></td></tr> 5136<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum." 5137 5138Example matches E, but not C, S or U. 5139 struct S {}; 5140 class C {}; 5141 union U {}; 5142 enum E {}; 5143</pre></td></tr> 5144 5145 5146<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr> 5147<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct." 5148 5149Example matches S, but not C, U or E. 5150 struct S {}; 5151 class C {}; 5152 union U {}; 5153 enum E {}; 5154</pre></td></tr> 5155 5156 5157<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr> 5158<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union." 5159 5160Example matches U, but not C, S or E. 5161 struct S {}; 5162 class C {}; 5163 union U {}; 5164 enum E {}; 5165</pre></td></tr> 5166 5167 5168<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr> 5169<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 5170 5171Note that 'Value' is a string as the template argument's value is 5172an arbitrary precision integer. 'Value' must be euqal to the canonical 5173representation of that integral value in base 10. 5174 5175Given 5176 template<int T> struct C {}; 5177 C<42> c; 5178classTemplateSpecializationDecl( 5179 hasAnyTemplateArgument(equalsIntegralValue("42"))) 5180 matches the implicit instantiation of C in C<42>. 5181</pre></td></tr> 5182 5183 5184<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr> 5185<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 5186 5187Given 5188 template<int T> struct C {}; 5189 C<42> c; 5190classTemplateSpecializationDecl( 5191 hasAnyTemplateArgument(isIntegral())) 5192 matches the implicit instantiation of C in C<42> 5193 with isIntegral() matching 42. 5194</pre></td></tr> 5195 5196 5197<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('templateArgumentCountIs1')"><a name="templateArgumentCountIs1Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr> 5198<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 5199 5200Given 5201 template<typename T> struct C {}; 5202 C<int> c; 5203classTemplateSpecializationDecl(templateArgumentCountIs(1)) 5204 matches C<int>. 5205</pre></td></tr> 5206 5207 5208<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpandedFromMacro2')"><a name="isExpandedFromMacro2Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr> 5209<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro. 5210Does not match if only part of the statement is expanded from that macro or 5211if different parts of the the statement are expanded from different 5212appearances of the macro. 5213</pre></td></tr> 5214 5215 5216<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 5217<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 5218partially matching a given regex. 5219 5220Example matches Y but not X 5221 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5222 #include "ASTMatcher.h" 5223 class X {}; 5224ASTMatcher.h: 5225 class Y {}; 5226 5227Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5228 5229If the matcher is used in clang-query, RegexFlags parameter 5230should be passed as a quoted string. e.g: "NoFlags". 5231Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5232</pre></td></tr> 5233 5234 5235<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr> 5236<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 5237 5238Example matches X but not Y 5239 (matcher = cxxRecordDecl(isExpansionInMainFile()) 5240 #include <Y.h> 5241 class X {}; 5242Y.h: 5243 class Y {}; 5244 5245Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5246</pre></td></tr> 5247 5248 5249<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader2')"><a name="isExpansionInSystemHeader2Anchor">isExpansionInSystemHeader</a></td><td></td></tr> 5250<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 5251 5252Example matches Y but not X 5253 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5254 #include <SystemHeader.h> 5255 class X {}; 5256SystemHeader.h: 5257 class Y {}; 5258 5259Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5260</pre></td></tr> 5261 5262 5263<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr> 5264<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 5265 5266Given 5267 struct S { bool func(); }; 5268functionDecl(returns(booleanType())) 5269 matches "bool func();" 5270</pre></td></tr> 5271 5272 5273<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('equalsBoundNode2')"><a name="equalsBoundNode2Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 5274<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 5275 5276Matches a node if it equals the node previously bound to ID. 5277 5278Given 5279 class X { int a; int b; }; 5280cxxRecordDecl( 5281 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5282 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5283 matches the class X, as a and b have the same type. 5284 5285Note that when multiple matches are involved via forEach* matchers, 5286equalsBoundNodes acts as a filter. 5287For example: 5288compoundStmt( 5289 forEachDescendant(varDecl().bind("d")), 5290 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5291will trigger a match for each combination of variable declaration 5292and reference to that variable declaration within a compound statement. 5293</pre></td></tr> 5294 5295 5296<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('equalsNode2')"><a name="equalsNode2Anchor">equalsNode</a></td><td>const Type* Other</td></tr> 5297<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 5298 5299Type has pointer identity in the AST. 5300</pre></td></tr> 5301 5302 5303<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr> 5304<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 5305 5306Given 5307 int i; 5308 float f; 5309realFloatingPointType() 5310 matches "float f" but not "int i" 5311</pre></td></tr> 5312 5313 5314<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr> 5315<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 5316 5317Given 5318 struct S { void func(); }; 5319functionDecl(returns(voidType())) 5320 matches "void func();" 5321</pre></td></tr> 5322 5323 5324<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>></td><td class="name" onclick="toggle('ofKind0')"><a name="ofKind0Anchor">ofKind</a></td><td>UnaryExprOrTypeTrait Kind</td></tr> 5325<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 5326 5327Given 5328 int x; 5329 int s = sizeof(x) + alignof(x) 5330unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 5331 matches sizeof(x) 5332 5333If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter 5334should be passed as a quoted string. e.g., ofKind("UETT_SizeOf"). 5335</pre></td></tr> 5336 5337 5338<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName3')"><a name="hasAnyOperatorName3Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 5339<tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the 5340specified names. 5341 5342 hasAnyOperatorName("+", "-") 5343 Is equivalent to 5344 anyOf(hasOperatorName("+"), hasOperatorName("-")) 5345</pre></td></tr> 5346 5347 5348<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName3')"><a name="hasOperatorName3Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 5349<tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or 5350unary). 5351 5352Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 5353 !(a || b) 5354</pre></td></tr> 5355 5356 5357<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>></td><td class="name" onclick="toggle('isArrow1')"><a name="isArrow1Anchor">isArrow</a></td><td></td></tr> 5358<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed 5359to '.'. 5360 5361Member calls on the implicit this pointer match as called with '->'. 5362 5363Given 5364 class Y { 5365 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 5366 template <class T> void f() { this->f<T>(); f<T>(); } 5367 int a; 5368 static int b; 5369 }; 5370 template <class T> 5371 class Z { 5372 void x() { this->m; } 5373 }; 5374memberExpr(isArrow()) 5375 matches this->x, x, y.x, a, this->b 5376cxxDependentScopeMemberExpr(isArrow()) 5377 matches this->m 5378unresolvedMemberExpr(isArrow()) 5379 matches this->f<T>, f<T> 5380</pre></td></tr> 5381 5382 5383<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr> 5384<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 5385 5386Example matches x, but not y, z, or a. 5387(matcher = varDecl(hasAutomaticStorageDuration()) 5388void f() { 5389 int x; 5390 static int y; 5391 thread_local int z; 5392} 5393int a; 5394</pre></td></tr> 5395 5396 5397<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr> 5398<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 5399 5400Example matches y and z (matcher = varDecl(hasGlobalStorage()) 5401void f() { 5402 int x; 5403 static int y; 5404} 5405int z; 5406</pre></td></tr> 5407 5408 5409<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr> 5410<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 5411non-static local variable. 5412 5413Example matches x (matcher = varDecl(hasLocalStorage()) 5414void f() { 5415 int x; 5416 static int y; 5417} 5418int z; 5419</pre></td></tr> 5420 5421 5422<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr> 5423<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 5424It includes the variable declared at namespace scope and those declared 5425with "static" and "extern" storage class specifiers. 5426 5427void f() { 5428 int x; 5429 static int y; 5430 thread_local int z; 5431} 5432int a; 5433static int b; 5434extern int c; 5435varDecl(hasStaticStorageDuration()) 5436 matches the function declaration y, a, b and c. 5437</pre></td></tr> 5438 5439 5440<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr> 5441<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 5442 5443Example matches z, but not x, z, or a. 5444(matcher = varDecl(hasThreadStorageDuration()) 5445void f() { 5446 int x; 5447 static int y; 5448 thread_local int z; 5449} 5450int a; 5451</pre></td></tr> 5452 5453 5454<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr> 5455<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations, 5456 and if constexpr. 5457 5458Given: 5459 constexpr int foo = 42; 5460 constexpr int bar(); 5461 void baz() { if constexpr(1 > 0) {} } 5462varDecl(isConstexpr()) 5463 matches the declaration of foo. 5464functionDecl(isConstexpr()) 5465 matches the declaration of bar. 5466ifStmt(isConstexpr()) 5467 matches the if statement in baz. 5468</pre></td></tr> 5469 5470 5471<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isDefinition1')"><a name="isDefinition1Anchor">isDefinition</a></td><td></td></tr> 5472<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 5473 5474Example matches A, va, fa 5475 class A {}; 5476 class B; // Doesn't match, as it has no body. 5477 int va; 5478 extern int vb; // Doesn't match, as it doesn't define the variable. 5479 void fa() {} 5480 void fb(); // Doesn't match, as it has no body. 5481 @interface X 5482 - (void)ma; // Doesn't match, interface is declaration. 5483 @end 5484 @implementation X 5485 - (void)ma {} 5486 @end 5487 5488Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, 5489 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5490</pre></td></tr> 5491 5492 5493<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr> 5494<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 5495a C++ catch block, or an Objective-C statement. 5496 5497Example matches x (matcher = varDecl(isExceptionVariable()) 5498void f(int y) { 5499 try { 5500 } catch (int x) { 5501 } 5502} 5503</pre></td></tr> 5504 5505 5506<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization1')"><a name="isExplicitTemplateSpecialization1Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr> 5507<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 5508static member variable template instantiations. 5509 5510Given 5511 template<typename T> void A(T t) { } 5512 template<> void A(int N) { } 5513functionDecl(isExplicitTemplateSpecialization()) 5514 matches the specialization A<int>(). 5515 5516Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 5517</pre></td></tr> 5518 5519 5520<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr> 5521<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 5522 5523Given: 5524 extern "C" void f() {} 5525 extern "C" { void g() {} } 5526 void h() {} 5527 extern "C" int x = 1; 5528 extern "C" int y = 2; 5529 int z = 3; 5530functionDecl(isExternC()) 5531 matches the declaration of f and g, but not the declaration of h. 5532varDecl(isExternC()) 5533 matches the declaration of x and y, but not the declaration of z. 5534</pre></td></tr> 5535 5536 5537<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isStaticLocal0')"><a name="isStaticLocal0Anchor">isStaticLocal</a></td><td></td></tr> 5538<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope. 5539 5540Example matches y (matcher = varDecl(isStaticLocal())) 5541void f() { 5542 int x; 5543 static int y; 5544} 5545static int z; 5546</pre></td></tr> 5547 5548 5549<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr> 5550<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage 5551class specifier ("static" keyword) written in the source. 5552 5553Given: 5554 static void f() {} 5555 static int i = 0; 5556 extern int j; 5557 int k; 5558functionDecl(isStaticStorageClass()) 5559 matches the function declaration f. 5560varDecl(isStaticStorageClass()) 5561 matches the variable declaration i. 5562</pre></td></tr> 5563 5564 5565<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation1')"><a name="isTemplateInstantiation1Anchor">isTemplateInstantiation</a></td><td></td></tr> 5566<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 5567member variable template instantiations. 5568 5569Given 5570 template <typename T> class X {}; class A {}; X<A> x; 5571or 5572 template <typename T> class X {}; class A {}; template class X<A>; 5573or 5574 template <typename T> class X {}; class A {}; extern template class X<A>; 5575cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5576 matches the template instantiation of X<A>. 5577 5578But given 5579 template <typename T> class X {}; class A {}; 5580 template <> class X<A> {}; X<A> x; 5581cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5582 does not match, as X<A> is an explicit template specialization. 5583 5584Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 5585</pre></td></tr> 5586 5587<!--END_NARROWING_MATCHERS --> 5588</table> 5589 5590<!-- ======================================================================= --> 5591<h2 id="traversal-matchers">AST Traversal Matchers</h2> 5592<!-- ======================================================================= --> 5593 5594<p>Traversal matchers specify the relationship to other nodes that are 5595reachable from the current node.</p> 5596 5597<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 5598forEachDescendant) which work on all nodes and allow users to write more generic 5599match expressions.</p> 5600 5601<table> 5602<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 5603<!-- START_TRAVERSAL_MATCHERS --> 5604 5605<tr><td>Matcher<*></td><td class="name" onclick="toggle('binaryOperation0')"><a name="binaryOperation0Anchor">binaryOperation</a></td><td>Matcher<*>...Matcher<*></td></tr> 5606<tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators. 5607 5608The code 5609 var1 != var2; 5610might be represented in the clang AST as a binaryOperator, a 5611cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on 5612 5613* whether the types of var1 and var2 are fundamental (binaryOperator) or at 5614 least one is a class type (cxxOperatorCallExpr) 5615* whether the code appears in a template declaration, if at least one of the 5616 vars is a dependent-type (binaryOperator) 5617* whether the code relies on a rewritten binary operator, such as a 5618spaceship operator or an inverted equality operator 5619(cxxRewrittenBinaryOperator) 5620 5621This matcher elides details in places where the matchers for the nodes are 5622compatible. 5623 5624Given 5625 binaryOperation( 5626 hasOperatorName("!="), 5627 hasLHS(expr().bind("lhs")), 5628 hasRHS(expr().bind("rhs")) 5629 ) 5630matches each use of "!=" in: 5631 struct S{ 5632 bool operator!=(const S&) const; 5633 }; 5634 5635 void foo() 5636 { 5637 1 != 2; 5638 S() != S(); 5639 } 5640 5641 template<typename T> 5642 void templ() 5643 { 5644 1 != 2; 5645 T() != S(); 5646 } 5647 struct HasOpEq 5648 { 5649 bool operator==(const HasOpEq &) const; 5650 }; 5651 5652 void inverse() 5653 { 5654 HasOpEq s1; 5655 HasOpEq s2; 5656 if (s1 != s2) 5657 return; 5658 } 5659 5660 struct HasSpaceship 5661 { 5662 bool operator<=>(const HasOpEq &) const; 5663 }; 5664 5665 void use_spaceship() 5666 { 5667 HasSpaceship s1; 5668 HasSpaceship s2; 5669 if (s1 != s2) 5670 return; 5671 } 5672</pre></td></tr> 5673 5674 5675<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 5676<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 5677 5678Unlike anyOf, eachOf will generate a match result for each 5679matching submatcher. 5680 5681For example, in: 5682 class A { int a; int b; }; 5683The matcher: 5684 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 5685 has(fieldDecl(hasName("b")).bind("v")))) 5686will generate two results binding "v", the first of which binds 5687the field declaration of a, the second the field declaration of 5688b. 5689 5690Usable as: Any Matcher 5691</pre></td></tr> 5692 5693 5694<tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr> 5695<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 5696 5697Generates results for each match. 5698 5699For example, in: 5700 class A { class B {}; class C {}; }; 5701The matcher: 5702 cxxRecordDecl(hasName("::A"), 5703 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 5704will generate results for A, B and C. 5705 5706Usable as: Any Matcher 5707</pre></td></tr> 5708 5709 5710<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 5711<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5712provided matcher. 5713 5714Example matches X, A, A::X, B, B::C, B::C::X 5715 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 5716 class X {}; 5717 class A { class X {}; }; // Matches A, because A::X is a class of name 5718 // X inside A. 5719 class B { class C { class X {}; }; }; 5720 5721DescendantT must be an AST base type. 5722 5723As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 5724each result that matches instead of only on the first one. 5725 5726Note: Recursively combined ForEachDescendant can cause many matches: 5727 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 5728 forEachDescendant(cxxRecordDecl()) 5729 ))) 5730will match 10 times (plus injected class name matches) on: 5731 class A { class B { class C { class D { class E {}; }; }; }; }; 5732 5733Usable as: Any Matcher 5734</pre></td></tr> 5735 5736 5737<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 5738<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 5739provided matcher. 5740 5741Example matches X, Y, Y::X, Z::Y, Z::Y::X 5742 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 5743 class X {}; 5744 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X 5745 // inside Y. 5746 class Z { class Y { class X {}; }; }; // Does not match Z. 5747 5748ChildT must be an AST base type. 5749 5750As opposed to 'has', 'forEach' will cause a match for each result that 5751matches instead of only on the first one. 5752 5753Usable as: Any Matcher 5754</pre></td></tr> 5755 5756 5757<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 5758<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 5759matcher. 5760 5761Given 5762void f() { if (true) { int x = 42; } } 5763void g() { for (;;) { int x = 43; } } 5764expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 5765 5766Usable as: Any Matcher 5767</pre></td></tr> 5768 5769 5770<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 5771<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5772provided matcher. 5773 5774Example matches X, Y, Z 5775 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 5776 class X {}; // Matches X, because X::X is a class of name X inside X. 5777 class Y { class X {}; }; 5778 class Z { class Y { class X {}; }; }; 5779 5780DescendantT must be an AST base type. 5781 5782Usable as: Any Matcher 5783</pre></td></tr> 5784 5785 5786<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 5787<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 5788provided matcher. 5789 5790Example matches X, Y 5791 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 5792 class X {}; // Matches X, because X::X is a class of name X inside X. 5793 class Y { class X {}; }; 5794 class Z { class Y { class X {}; }; }; // Does not match Z. 5795 5796ChildT must be an AST base type. 5797 5798Usable as: Any Matcher 5799Note that has is direct matcher, so it also matches things like implicit 5800casts and paren casts. If you are matching with expr then you should 5801probably consider using ignoringParenImpCasts like: 5802has(ignoringParenImpCasts(expr())). 5803</pre></td></tr> 5804 5805 5806<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 5807<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 5808matcher. 5809 5810Given 5811void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 5812compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 5813 5814Usable as: Any Matcher 5815</pre></td></tr> 5816 5817 5818<tr><td>Matcher<*></td><td class="name" onclick="toggle('invocation0')"><a name="invocation0Anchor">invocation</a></td><td>Matcher<*>...Matcher<*></td></tr> 5819<tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls 5820 5821Because CallExpr and CXXConstructExpr do not share a common 5822base class with API accessing arguments etc, AST Matchers for code 5823which should match both are typically duplicated. This matcher 5824removes the need for duplication. 5825 5826Given code 5827struct ConstructorTakesInt 5828{ 5829 ConstructorTakesInt(int i) {} 5830}; 5831 5832void callTakesInt(int i) 5833{ 5834} 5835 5836void doCall() 5837{ 5838 callTakesInt(42); 5839} 5840 5841void doConstruct() 5842{ 5843 ConstructorTakesInt cti(42); 5844} 5845 5846The matcher 5847invocation(hasArgument(0, integerLiteral(equals(42)))) 5848matches the expression in both doCall and doConstruct 5849</pre></td></tr> 5850 5851 5852<tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr> 5853<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher. 5854 5855However, optionally will retain any bindings generated by the submatcher. 5856Useful when additional information which may or may not present about a main 5857matching node is desired. 5858 5859For example, in: 5860 class Foo { 5861 int bar; 5862 } 5863The matcher: 5864 cxxRecordDecl( 5865 optionally(has( 5866 fieldDecl(hasName("bar")).bind("var") 5867 ))).bind("record") 5868will produce a result binding for both "record" and "var". 5869The matcher will produce a "record" binding for even if there is no data 5870member named "bar" in that class. 5871 5872Usable as: Any Matcher 5873</pre></td></tr> 5874 5875 5876<tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr> 5877<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind. 5878 5879Given 5880 void foo() 5881 { 5882 int i = 3.0; 5883 } 5884The matcher 5885 traverse(TK_IgnoreUnlessSpelledInSource, 5886 varDecl(hasInitializer(floatLiteral().bind("init"))) 5887 ) 5888matches the variable declaration with "init" bound to the "3.0". 5889</pre></td></tr> 5890 5891 5892<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasCondition5')"><a name="hasCondition5Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5893<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 5894switch statement or conditional operator. 5895 5896Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5897 if (true) {} 5898</pre></td></tr> 5899 5900 5901<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasFalseExpression0')"><a name="hasFalseExpression0Anchor">hasFalseExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5902<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 5903(binary or ternary). 5904 5905Example matches b 5906 condition ? a : b 5907 condition ?: b 5908</pre></td></tr> 5909 5910 5911<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasTrueExpression0')"><a name="hasTrueExpression0Anchor">hasTrueExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5912<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 5913 5914Example 1 (conditional ternary operator): matches a 5915 condition ? a : b 5916 5917Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 5918 condition ?: b 5919</pre></td></tr> 5920 5921 5922<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>></td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5923<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 5924matches the given matcher. 5925 5926The associated declaration is: 5927- for type nodes, the declaration of the underlying type 5928- for CallExpr, the declaration of the callee 5929- for MemberExpr, the declaration of the referenced member 5930- for CXXConstructExpr, the declaration of the constructor 5931- for CXXNewExpr, the declaration of the operator new 5932- for ObjCIvarExpr, the declaration of the ivar 5933 5934For type nodes, hasDeclaration will generally match the declaration of the 5935sugared type. Given 5936 class X {}; 5937 typedef X Y; 5938 Y y; 5939in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5940typedefDecl. A common use case is to match the underlying, desugared type. 5941This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5942 varDecl(hasType(hasUnqualifiedDesugaredType( 5943 recordType(hasDeclaration(decl()))))) 5944In this matcher, the decl will match the CXXRecordDecl of class X. 5945 5946Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 5947 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 5948 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 5949 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 5950 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 5951 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 5952 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5953</pre></td></tr> 5954 5955 5956<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasBase0')"><a name="hasBase0Anchor">hasBase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5957<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 5958 5959Given 5960 int i[5]; 5961 void f() { i[1] = 42; } 5962arraySubscriptExpression(hasBase(implicitCastExpr( 5963 hasSourceExpression(declRefExpr())))) 5964 matches i[1] with the declRefExpr() matching i 5965</pre></td></tr> 5966 5967 5968<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasIndex0')"><a name="hasIndex0Anchor">hasIndex</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5969<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 5970 5971Given 5972 int i[5]; 5973 void f() { i[1] = 42; } 5974arraySubscriptExpression(hasIndex(integerLiteral())) 5975 matches i[1] with the integerLiteral() matching 1 5976</pre></td></tr> 5977 5978 5979<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasLHS3')"><a name="hasLHS3Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5980<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions. 5981 5982Example matches a (matcher = binaryOperator(hasLHS())) 5983 a || b 5984</pre></td></tr> 5985 5986 5987<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasRHS3')"><a name="hasRHS3Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5988<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions. 5989 5990Example matches b (matcher = binaryOperator(hasRHS())) 5991 a || b 5992</pre></td></tr> 5993 5994 5995<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>></td><td class="name" onclick="toggle('hasElementType0')"><a name="hasElementType0Anchor">hasElementType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 5996<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 5997type. 5998 5999Given 6000 struct A {}; 6001 A a[7]; 6002 int b[7]; 6003arrayType(hasElementType(builtinType())) 6004 matches "int b[7]" 6005 6006Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 6007</pre></td></tr> 6008 6009 6010<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>></td><td class="name" onclick="toggle('hasValueType0')"><a name="hasValueType0Anchor">hasValueType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 6011<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 6012 6013Given 6014 _Atomic(int) i; 6015 _Atomic(float) f; 6016atomicType(hasValueType(isInteger())) 6017 matches "_Atomic(int) i" 6018 6019Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 6020</pre></td></tr> 6021 6022 6023<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>></td><td class="name" onclick="toggle('hasDeducedType0')"><a name="hasDeducedType0Anchor">hasDeducedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 6024<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 6025 6026Note: There is no TypeLoc for the deduced type and thus no 6027getDeducedLoc() matcher. 6028 6029Given 6030 auto a = 1; 6031 auto b = 2.0; 6032autoType(hasDeducedType(isInteger())) 6033 matches "auto a" 6034 6035Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 6036</pre></td></tr> 6037 6038 6039<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6040<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 6041binary operator matches. 6042</pre></td></tr> 6043 6044 6045<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasLHS0')"><a name="hasLHS0Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6046<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 6047 6048Example matches a (matcher = binaryOperator(hasLHS())) 6049 a || b 6050</pre></td></tr> 6051 6052 6053<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasOperands0')"><a name="hasOperands0Anchor">hasOperands</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher1, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher2</td></tr> 6054<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator. 6055 6056Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6057 integerLiteral(equals(2))) 6058 1 + 2 // Match 6059 2 + 1 // Match 6060 1 + 1 // No match 6061 2 + 2 // No match 6062</pre></td></tr> 6063 6064 6065<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasRHS0')"><a name="hasRHS0Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6066<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 6067 6068Example matches b (matcher = binaryOperator(hasRHS())) 6069 a || b 6070</pre></td></tr> 6071 6072 6073<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>></td><td class="name" onclick="toggle('forDecomposition0')"><a name="forDecomposition0Anchor">forDecomposition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> InnerMatcher</td></tr> 6074<tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to. 6075 6076For example, in: 6077void foo() 6078{ 6079 int arr[3]; 6080 auto &[f, s, t] = arr; 6081 6082 f = 42; 6083} 6084The matcher: 6085 bindingDecl(hasName("f"), 6086 forDecomposition(decompositionDecl()) 6087matches 'f' in 'auto &[f, s, t]'. 6088</pre></td></tr> 6089 6090 6091<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>></td><td class="name" onclick="toggle('hasAnyParameter2')"><a name="hasAnyParameter2Anchor">hasAnyParameter</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 6092<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 6093block. 6094 6095Does not match the 'this' parameter of a method. 6096 6097Given 6098 class X { void f(int x, int y, int z) {} }; 6099cxxMethodDecl(hasAnyParameter(hasName("y"))) 6100 matches f(int x, int y, int z) {} 6101with hasAnyParameter(...) 6102 matching int y 6103 6104For ObjectiveC, given 6105 @interface I - (void) f:(int) y; @end 6106 6107the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 6108matches the declaration of method f with hasParameter 6109matching y. 6110 6111For blocks, given 6112 b = ^(int y) { printf("%d", y) }; 6113 6114the matcher blockDecl(hasAnyParameter(hasName("y"))) 6115matches the declaration of the block b with hasParameter 6116matching y. 6117</pre></td></tr> 6118 6119 6120<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>></td><td class="name" onclick="toggle('hasParameter2')"><a name="hasParameter2Anchor">hasParameter</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 6121<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 6122declaration or a block. 6123 6124Given 6125 class X { void f(int x) {} }; 6126cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6127 matches f(int x) {} 6128with hasParameter(...) 6129 matching int x 6130 6131For ObjectiveC, given 6132 @interface I - (void) f:(int) y; @end 6133 6134the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6135matches the declaration of method f with hasParameter 6136matching y. 6137</pre></td></tr> 6138 6139 6140<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_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> 6141<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 6142pointee matches a given matcher. 6143 6144Given 6145 int *a; 6146 int const *b; 6147 float const *f; 6148pointerType(pointee(isConstQualified(), isInteger())) 6149 matches "int const *b" 6150 6151Usable 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>>, 6152 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>> 6153</pre></td></tr> 6154 6155 6156<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasType8')"><a name="hasType8Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6157<tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value 6158declaration's type. 6159 6160In case of a value declaration (for example a variable declaration), 6161this resolves one layer of indirection. For example, in the value 6162declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6163X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6164declaration of x. 6165 6166Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6167 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6168 and friend class X (matcher = friendDecl(hasType("X")) 6169 and public virtual X (matcher = cxxBaseSpecifier(hasType( 6170 cxxRecordDecl(hasName("X")))) 6171 class X {}; 6172 void y(X &x) { x; X z; } 6173 class Y { friend class X; }; 6174 class Z : public virtual X {}; 6175 6176Example matches class Derived 6177(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6178class Base {}; 6179class Derived : Base {}; 6180 6181Usable 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>>, 6182Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6183</pre></td></tr> 6184 6185 6186<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 6187<tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type 6188matcher. 6189 6190Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6191 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6192 and U (matcher = typedefDecl(hasType(asString("int"))) 6193 and friend class X (matcher = friendDecl(hasType("X")) 6194 and public virtual X (matcher = cxxBaseSpecifier(hasType( 6195 asString("class X"))) 6196 class X {}; 6197 void y(X &x) { x; X z; } 6198 typedef int U; 6199 class Y { friend class X; }; 6200 class Z : public virtual X {}; 6201</pre></td></tr> 6202 6203 6204<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> 6205<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 6206 6207Given 6208 void f(int i); 6209 int y; 6210 f(y); 6211callExpr( 6212 forEachArgumentWithParam( 6213 declRefExpr(to(varDecl(hasName("y")))), 6214 parmVarDecl(hasType(isInteger())) 6215)) 6216 matches f(y); 6217with declRefExpr(...) 6218 matching int y 6219and parmVarDecl(...) 6220 matching int i 6221</pre></td></tr> 6222 6223 6224<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> 6225<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or 6226CXXConstructExpr. It is very similar to forEachArgumentWithParam but 6227it works on calls through function pointers as well. 6228 6229The difference is, that function pointers do not provide access to a 6230ParmVarDecl, but only the QualType for each argument. 6231 6232Given 6233 void f(int i); 6234 int y; 6235 f(y); 6236 void (*f_ptr)(int) = f; 6237 f_ptr(y); 6238callExpr( 6239 forEachArgumentWithParamType( 6240 declRefExpr(to(varDecl(hasName("y")))), 6241 qualType(isInteger()).bind("type) 6242)) 6243 matches f(y) and f_ptr(y) 6244with declRefExpr(...) 6245 matching int y 6246and qualType(...) 6247 matching int 6248</pre></td></tr> 6249 6250 6251<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> 6252<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 6253expression, or an ObjC-message-send expression. 6254 6255Given 6256 void x(int, int, int) { int y; x(1, y, 42); } 6257callExpr(hasAnyArgument(declRefExpr())) 6258 matches x(1, y, 42) 6259with hasAnyArgument(...) 6260 matching y 6261 6262For ObjectiveC, given 6263 @interface I - (void) f:(int) y; @end 6264 void foo(I *i) { [i f:12]; } 6265objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6266 matches [i f:12] 6267</pre></td></tr> 6268 6269 6270<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> 6271<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 6272call expression. 6273 6274Example matches y in x(y) 6275 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6276 void x(int) { int y; x(y); } 6277</pre></td></tr> 6278 6279 6280<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('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> 6281<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 6282matches the given matcher. 6283 6284The associated declaration is: 6285- for type nodes, the declaration of the underlying type 6286- for CallExpr, the declaration of the callee 6287- for MemberExpr, the declaration of the referenced member 6288- for CXXConstructExpr, the declaration of the constructor 6289- for CXXNewExpr, the declaration of the operator new 6290- for ObjCIvarExpr, the declaration of the ivar 6291 6292For type nodes, hasDeclaration will generally match the declaration of the 6293sugared type. Given 6294 class X {}; 6295 typedef X Y; 6296 Y y; 6297in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6298typedefDecl. A common use case is to match the underlying, desugared type. 6299This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6300 varDecl(hasType(hasUnqualifiedDesugaredType( 6301 recordType(hasDeclaration(decl()))))) 6302In this matcher, the decl will match the CXXRecordDecl of class X. 6303 6304Usable 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>>, 6305 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>>, 6306 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>>, 6307 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>>, 6308 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>>, 6309 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>>, 6310 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6311</pre></td></tr> 6312 6313 6314<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> 6315<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 6316 6317Given 6318 class A { A() : i(42), j(42) {} int i; int j; }; 6319cxxConstructorDecl(forEachConstructorInitializer( 6320 forField(decl().bind("x")) 6321)) 6322 will trigger two matches, binding for 'i' and 'j' respectively. 6323</pre></td></tr> 6324 6325 6326<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> 6327<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 6328 6329Given 6330 struct Foo { 6331 Foo() : foo_(1) { } 6332 int foo_; 6333 }; 6334cxxRecordDecl(has(cxxConstructorDecl( 6335 hasAnyConstructorInitializer(anything()) 6336))) 6337 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 6338</pre></td></tr> 6339 6340 6341<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> 6342<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 6343 6344Given 6345 struct Foo { 6346 Foo() : foo_(1) { } 6347 int foo_; 6348 }; 6349cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6350 forField(hasName("foo_")))))) 6351 matches Foo 6352with forField matching foo_ 6353</pre></td></tr> 6354 6355 6356<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> 6357<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 6358 6359Given 6360 struct Foo { 6361 Foo() : foo_(1) { } 6362 int foo_; 6363 }; 6364cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6365 withInitializer(integerLiteral(equals(1))))))) 6366 matches Foo 6367with withInitializer matching (1) 6368</pre></td></tr> 6369 6370 6371<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> 6372<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 6373given matcher. Implicit object expressions are included; that is, it matches 6374use of implicit `this`. 6375 6376Given 6377 struct X { 6378 int m; 6379 int f(X x) { x.m; return m; } 6380 }; 6381memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6382 matches `x.m`, but not `m`; however, 6383memberExpr(hasObjectExpression(hasType(pointsTo( 6384 cxxRecordDecl(hasName("X")))))) 6385 matches `m` (aka. `this->m`), but not `x.m`. 6386</pre></td></tr> 6387 6388 6389<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> 6390<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr> 6391 6392 6393<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> 6394<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer. 6395 6396Given: 6397 void foo() { 6398 if (int i = foobar(); i > 0) {} 6399 switch (int i = foobar(); i) {} 6400 for (auto& a = get_range(); auto& x : a) {} 6401 } 6402 void bar() { 6403 if (foobar() > 0) {} 6404 switch (foobar()) {} 6405 for (auto& x : get_range()) {} 6406 } 6407ifStmt(hasInitStatement(anything())) 6408 matches the if statement in foo but not in bar. 6409switchStmt(hasInitStatement(anything())) 6410 matches the switch statement in foo but not in bar. 6411cxxForRangeStmt(hasInitStatement(anything())) 6412 matches the range for statement in foo but not in bar. 6413</pre></td></tr> 6414 6415 6416<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> 6417<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 6418 6419Example: 6420 forStmt(hasLoopVariable(anything())) 6421matches 'int x' in 6422 for (int x : a) { } 6423</pre></td></tr> 6424 6425 6426<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> 6427<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 6428 6429Example: 6430 forStmt(hasRangeInit(anything())) 6431matches 'a' in 6432 for (int x : a) { } 6433</pre></td></tr> 6434 6435 6436<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> 6437<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 6438`on`, matches the argument directly without stripping away anything. 6439 6440Given 6441 class Y { public: void m(); }; 6442 Y g(); 6443 class X : public Y { void g(); }; 6444 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 6445cxxMemberCallExpr(onImplicitObjectArgument(hasType( 6446 cxxRecordDecl(hasName("Y"))))) 6447 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 6448cxxMemberCallExpr(on(callExpr())) 6449 does not match `(g()).m()`, because the parens are not ignored. 6450 6451FIXME: Overload to allow directly matching types? 6452</pre></td></tr> 6453 6454 6455<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> 6456<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 6457stripping off any parentheses or implicit casts. 6458 6459Given 6460 class Y { public: void m(); }; 6461 Y g(); 6462 class X : public Y {}; 6463 void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 6464cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 6465 matches `y.m()` and `(g()).m()`. 6466cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 6467 matches `x.m()`. 6468cxxMemberCallExpr(on(callExpr())) 6469 matches `(g()).m()`. 6470 6471FIXME: Overload to allow directly matching types? 6472</pre></td></tr> 6473 6474 6475<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> 6476<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 6477</pre></td></tr> 6478 6479 6480<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> 6481<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 6482matches the InnerMatcher, or is a pointer to a type that matches the 6483InnerMatcher. 6484 6485Given 6486 class Y { public: void m(); }; 6487 class X : public Y { void g(); }; 6488 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 6489cxxMemberCallExpr(thisPointerType(hasDeclaration( 6490 cxxRecordDecl(hasName("Y"))))) 6491 matches `y.m()`, `p->m()` and `x.m()`. 6492cxxMemberCallExpr(thisPointerType(hasDeclaration( 6493 cxxRecordDecl(hasName("X"))))) 6494 matches `x.g()`. 6495</pre></td></tr> 6496 6497 6498<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> 6499<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 6500produce multiple matches. 6501 6502Given 6503 class A { virtual void f(); }; 6504 class B : public A { void f(); }; 6505 class C : public B { void f(); }; 6506cxxMethodDecl(ofClass(hasName("C")), 6507 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6508 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 6509 that B::f is not overridden by C::f). 6510 6511The check can produce multiple matches in case of multiple inheritance, e.g. 6512 class A1 { virtual void f(); }; 6513 class A2 { virtual void f(); }; 6514 class C : public A1, public A2 { void f(); }; 6515cxxMethodDecl(ofClass(hasName("C")), 6516 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6517 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 6518 once with "b" binding "A2::f" and "d" binding "C::f". 6519</pre></td></tr> 6520 6521 6522<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> 6523<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 6524belongs to. 6525 6526FIXME: Generalize this for other kinds of declarations. 6527FIXME: What other kind of declarations would we need to generalize 6528this to? 6529 6530Example matches A() in the last line 6531 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 6532 ofClass(hasName("A")))))) 6533 class A { 6534 public: 6535 A(); 6536 }; 6537 A a = A(); 6538</pre></td></tr> 6539 6540 6541<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> 6542<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments. 6543 6544Given: 6545 MyClass *p1 = new (Storage) MyClass(); 6546cxxNewExpr(hasAnyPlacementArg(anything())) 6547 matches the expression 'new (Storage, 16) MyClass()'. 6548</pre></td></tr> 6549 6550 6551<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> 6552<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 6553 6554Given: 6555 MyClass *p1 = new MyClass[10]; 6556cxxNewExpr(hasArraySize(integerLiteral(equals(10)))) 6557 matches the expression 'new MyClass[10]'. 6558</pre></td></tr> 6559 6560 6561<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> 6562<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 6563matches the given matcher. 6564 6565The associated declaration is: 6566- for type nodes, the declaration of the underlying type 6567- for CallExpr, the declaration of the callee 6568- for MemberExpr, the declaration of the referenced member 6569- for CXXConstructExpr, the declaration of the constructor 6570- for CXXNewExpr, the declaration of the operator new 6571- for ObjCIvarExpr, the declaration of the ivar 6572 6573For type nodes, hasDeclaration will generally match the declaration of the 6574sugared type. Given 6575 class X {}; 6576 typedef X Y; 6577 Y y; 6578in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6579typedefDecl. A common use case is to match the underlying, desugared type. 6580This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6581 varDecl(hasType(hasUnqualifiedDesugaredType( 6582 recordType(hasDeclaration(decl()))))) 6583In this matcher, the decl will match the CXXRecordDecl of class X. 6584 6585Usable 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>>, 6586 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>>, 6587 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>>, 6588 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>>, 6589 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>>, 6590 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>>, 6591 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6592</pre></td></tr> 6593 6594 6595<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> 6596<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments. 6597 6598Given: 6599 MyClass *p1 = new (Storage, 16) MyClass(); 6600cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16)))) 6601 matches the expression 'new (Storage, 16) MyClass()'. 6602</pre></td></tr> 6603 6604 6605<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> 6606<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a 6607binary operator matches. 6608</pre></td></tr> 6609 6610 6611<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> 6612<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 6613 6614Example matches a (matcher = binaryOperator(hasLHS())) 6615 a || b 6616</pre></td></tr> 6617 6618 6619<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> 6620<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator. 6621 6622Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6623 integerLiteral(equals(2))) 6624 1 + 2 // Match 6625 2 + 1 // Match 6626 1 + 1 // No match 6627 2 + 2 // No match 6628</pre></td></tr> 6629 6630 6631<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> 6632<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 6633 6634Example matches b (matcher = binaryOperator(hasRHS())) 6635 a || b 6636</pre></td></tr> 6637 6638 6639<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> 6640<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches. 6641 6642Example matches true (matcher = hasUnaryOperand( 6643 cxxBoolLiteral(equals(true)))) 6644 !true 6645</pre></td></tr> 6646 6647 6648<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> 6649<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher. 6650 6651Example: 6652matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6653 class Foo; 6654 class Bar : Foo {}; 6655 class Baz : Bar {}; 6656 class SpecialBase; 6657 class Proxy : SpecialBase {}; // matches Proxy 6658 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived 6659 6660FIXME: Refactor this and isDerivedFrom to reuse implementation. 6661</pre></td></tr> 6662 6663 6664<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> 6665<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher. 6666 6667Example: 6668matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6669 class Foo; 6670 class Bar : Foo {}; 6671 class Baz : Bar {}; 6672 class SpecialBase; 6673 class Proxy : SpecialBase {}; // matches Proxy 6674 class IndirectlyDerived : Proxy {}; // doesn't match 6675</pre></td></tr> 6676 6677 6678<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> 6679<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 6680 6681Given: 6682 class A { void func(); }; 6683 class B { void member(); }; 6684 6685cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 6686A but not B. 6687</pre></td></tr> 6688 6689 6690<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> 6691<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class 6692matching Base, or Objective-C classes that directly or indirectly 6693subclass a class matching Base. 6694 6695Note that a class is not considered to be derived from itself. 6696 6697Example matches Y, Z, C (Base == hasName("X")) 6698 class X; 6699 class Y : public X {}; // directly derived 6700 class Z : public Y {}; // indirectly derived 6701 typedef X A; 6702 typedef A B; 6703 class C : public B {}; // derived from a typedef of X 6704 6705In the following example, Bar matches isDerivedFrom(hasName("X")): 6706 class Foo; 6707 typedef Foo X; 6708 class Bar : public Foo {}; // derived from a type that X is a typedef of 6709 6710In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 6711 @interface NSObject @end 6712 @interface Bar : NSObject @end 6713 6714Usable 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>> 6715</pre></td></tr> 6716 6717 6718<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> 6719<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class 6720matching Base. 6721 6722Note that a class is not considered to be derived from itself. 6723 6724Example matches Y, C (Base == hasName("X")) 6725 class X; 6726 class Y : public X {}; // directly derived 6727 class Z : public Y {}; // indirectly derived 6728 typedef X A; 6729 typedef A B; 6730 class C : public B {}; // derived from a typedef of X 6731 6732In the following example, Bar matches isDerivedFrom(hasName("X")): 6733 class Foo; 6734 typedef Foo X; 6735 class Bar : public Foo {}; // derived from a type that X is a typedef of 6736</pre></td></tr> 6737 6738 6739<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> 6740<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 6741match Base. 6742</pre></td></tr> 6743 6744 6745<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> 6746<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a 6747binary operator matches. 6748</pre></td></tr> 6749 6750 6751<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_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> 6752<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions. 6753 6754Example matches a (matcher = binaryOperator(hasLHS())) 6755 a || b 6756</pre></td></tr> 6757 6758 6759<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_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> 6760<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator. 6761 6762Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6763 integerLiteral(equals(2))) 6764 1 + 2 // Match 6765 2 + 1 // Match 6766 1 + 1 // No match 6767 2 + 2 // No match 6768</pre></td></tr> 6769 6770 6771<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_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> 6772<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions. 6773 6774Example matches b (matcher = binaryOperator(hasRHS())) 6775 a || b 6776</pre></td></tr> 6777 6778 6779<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_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> 6780<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 6781expression, or an ObjC-message-send expression. 6782 6783Given 6784 void x(int, int, int) { int y; x(1, y, 42); } 6785callExpr(hasAnyArgument(declRefExpr())) 6786 matches x(1, y, 42) 6787with hasAnyArgument(...) 6788 matching y 6789 6790For ObjectiveC, given 6791 @interface I - (void) f:(int) y; @end 6792 void foo(I *i) { [i f:12]; } 6793objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6794 matches [i f:12] 6795</pre></td></tr> 6796 6797 6798<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> 6799<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 6800call expression. 6801 6802Example matches y in x(y) 6803 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6804 void x(int) { int y; x(y); } 6805</pre></td></tr> 6806 6807 6808<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> 6809<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 6810given matcher. 6811 6812Example matches y.x() (matcher = callExpr(callee( 6813 cxxMethodDecl(hasName("x"))))) 6814 class Y { public: void x(); }; 6815 void z() { Y y; y.x(); } 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('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> 6820<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 6821 6822Given 6823 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 6824 void f() { f(); } 6825callExpr(callee(expr())) 6826 matches this->x(), x(), y.x(), f() 6827with callee(...) 6828 matching this->x, x, y.x, f respectively 6829 6830Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 6831because this introduces ambiguous overloads with calls to Callee taking a 6832internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 6833implemented in terms of implicit casts. 6834</pre></td></tr> 6835 6836 6837<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> 6838<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 6839 6840Given 6841 void f(int i); 6842 int y; 6843 f(y); 6844callExpr( 6845 forEachArgumentWithParam( 6846 declRefExpr(to(varDecl(hasName("y")))), 6847 parmVarDecl(hasType(isInteger())) 6848)) 6849 matches f(y); 6850with declRefExpr(...) 6851 matching int y 6852and parmVarDecl(...) 6853 matching int i 6854</pre></td></tr> 6855 6856 6857<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> 6858<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or 6859CXXConstructExpr. It is very similar to forEachArgumentWithParam but 6860it works on calls through function pointers as well. 6861 6862The difference is, that function pointers do not provide access to a 6863ParmVarDecl, but only the QualType for each argument. 6864 6865Given 6866 void f(int i); 6867 int y; 6868 f(y); 6869 void (*f_ptr)(int) = f; 6870 f_ptr(y); 6871callExpr( 6872 forEachArgumentWithParamType( 6873 declRefExpr(to(varDecl(hasName("y")))), 6874 qualType(isInteger()).bind("type) 6875)) 6876 matches f(y) and f_ptr(y) 6877with declRefExpr(...) 6878 matching int y 6879and qualType(...) 6880 matching int 6881</pre></td></tr> 6882 6883 6884<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> 6885<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 6886expression, or an ObjC-message-send expression. 6887 6888Given 6889 void x(int, int, int) { int y; x(1, y, 42); } 6890callExpr(hasAnyArgument(declRefExpr())) 6891 matches x(1, y, 42) 6892with hasAnyArgument(...) 6893 matching y 6894 6895For ObjectiveC, given 6896 @interface I - (void) f:(int) y; @end 6897 void foo(I *i) { [i f:12]; } 6898objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6899 matches [i f:12] 6900</pre></td></tr> 6901 6902 6903<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> 6904<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 6905call expression. 6906 6907Example matches y in x(y) 6908 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6909 void x(int) { int y; x(y); } 6910</pre></td></tr> 6911 6912 6913<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> 6914<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 6915matches the given matcher. 6916 6917The associated declaration is: 6918- for type nodes, the declaration of the underlying type 6919- for CallExpr, the declaration of the callee 6920- for MemberExpr, the declaration of the referenced member 6921- for CXXConstructExpr, the declaration of the constructor 6922- for CXXNewExpr, the declaration of the operator new 6923- for ObjCIvarExpr, the declaration of the ivar 6924 6925For type nodes, hasDeclaration will generally match the declaration of the 6926sugared type. Given 6927 class X {}; 6928 typedef X Y; 6929 Y y; 6930in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6931typedefDecl. A common use case is to match the underlying, desugared type. 6932This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6933 varDecl(hasType(hasUnqualifiedDesugaredType( 6934 recordType(hasDeclaration(decl()))))) 6935In this matcher, the decl will match the CXXRecordDecl of class X. 6936 6937Usable 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>>, 6938 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>>, 6939 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>>, 6940 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>>, 6941 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>>, 6942 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>>, 6943 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6944</pre></td></tr> 6945 6946 6947<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> 6948<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 6949extension, matches the constant given in the statement. 6950 6951Given 6952 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 6953caseStmt(hasCaseConstant(integerLiteral())) 6954 matches "case 1:" 6955</pre></td></tr> 6956 6957 6958<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> 6959<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 6960or opaque value's source expression matches the given matcher. 6961 6962Example 1: matches "a string" 6963(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 6964class URL { URL(string); }; 6965URL url = "a string"; 6966 6967Example 2: matches 'b' (matcher = 6968opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 6969int a = b ?: 1; 6970</pre></td></tr> 6971 6972 6973<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> 6974<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6975functionDecl that have at least one TemplateArgument matching the given 6976InnerMatcher. 6977 6978Given 6979 template<typename T> class A {}; 6980 template<> class A<double> {}; 6981 A<int> a; 6982 6983 template<typename T> f() {}; 6984 void func() { f<int>(); }; 6985 6986classTemplateSpecializationDecl(hasAnyTemplateArgument( 6987 refersToType(asString("int")))) 6988 matches the specialization A<int> 6989 6990functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 6991 matches the specialization f<int> 6992</pre></td></tr> 6993 6994 6995<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> 6996<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 6997 6998Given 6999 template<typename T> class A {}; #1 7000 template<> class A<int> {}; #2 7001classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 7002 matches '#2' with classTemplateDecl() matching the class template 7003 declaration of 'A' at #1. 7004</pre></td></tr> 7005 7006 7007<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> 7008<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7009functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7010 7011Given 7012 template<typename T, typename U> class A {}; 7013 A<bool, int> b; 7014 A<int, bool> c; 7015 7016 template<typename T> void f() {} 7017 void func() { f<int>(); }; 7018classTemplateSpecializationDecl(hasTemplateArgument( 7019 1, refersToType(asString("int")))) 7020 matches the specialization A<bool, int> 7021 7022functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7023 matches the specialization f<int> 7024</pre></td></tr> 7025 7026 7027<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> 7028<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 7029type. 7030 7031Given 7032 struct A {}; 7033 A a[7]; 7034 int b[7]; 7035arrayType(hasElementType(builtinType())) 7036 matches "int b[7]" 7037 7038Usable 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>> 7039</pre></td></tr> 7040 7041 7042<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> 7043<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 7044a given matcher. Also matches StmtExprs that have CompoundStmt as children. 7045 7046Given 7047 { {}; 1+2; } 7048hasAnySubstatement(compoundStmt()) 7049 matches '{ {}; 1+2; }' 7050with compoundStmt() 7051 matching '{}' 7052</pre></td></tr> 7053 7054 7055<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> 7056<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher 7057</pre></td></tr> 7058 7059 7060<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> 7061<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 7062matches the given matcher. 7063 7064The associated declaration is: 7065- for type nodes, the declaration of the underlying type 7066- for CallExpr, the declaration of the callee 7067- for MemberExpr, the declaration of the referenced member 7068- for CXXConstructExpr, the declaration of the constructor 7069- for CXXNewExpr, the declaration of the operator new 7070- for ObjCIvarExpr, the declaration of the ivar 7071 7072For type nodes, hasDeclaration will generally match the declaration of the 7073sugared type. Given 7074 class X {}; 7075 typedef X Y; 7076 Y y; 7077in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7078typedefDecl. A common use case is to match the underlying, desugared type. 7079This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7080 varDecl(hasType(hasUnqualifiedDesugaredType( 7081 recordType(hasDeclaration(decl()))))) 7082In this matcher, the decl will match the CXXRecordDecl of class X. 7083 7084Usable 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>>, 7085 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>>, 7086 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>>, 7087 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>>, 7088 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>>, 7089 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>>, 7090 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7091</pre></td></tr> 7092 7093 7094<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> 7095<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 7096specific using shadow declaration. 7097 7098Given 7099 namespace a { void f() {} } 7100 using a::f; 7101 void g() { 7102 f(); // Matches this .. 7103 a::f(); // .. but not this. 7104 } 7105declRefExpr(throughUsingDecl(anything())) 7106 matches f() 7107</pre></td></tr> 7108 7109 7110<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> 7111<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 7112specified matcher. 7113 7114Example matches x in if(x) 7115 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 7116 bool x; 7117 if (x) {} 7118</pre></td></tr> 7119 7120 7121<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> 7122<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 7123 7124Note that this does not work for global declarations because the AST 7125breaks up multiple-declaration DeclStmt's into multiple single-declaration 7126DeclStmt's. 7127Example: Given non-global declarations 7128 int a, b = 0; 7129 int c; 7130 int d = 2, e; 7131declStmt(containsDeclaration( 7132 0, varDecl(hasInitializer(anything())))) 7133 matches only 'int d = 2, e;', and 7134declStmt(containsDeclaration(1, varDecl())) 7135 matches 'int a, b = 0' as well as 'int d = 2, e;' 7136 but 'int c;' is not matched. 7137</pre></td></tr> 7138 7139 7140<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> 7141<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 7142 7143Given 7144 int a, b; 7145 int c; 7146declStmt(hasSingleDecl(anything())) 7147 matches 'int c;' but not 'int a, b;'. 7148</pre></td></tr> 7149 7150 7151<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> 7152<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 7153the inner matcher. 7154 7155Given 7156 int x; 7157declaratorDecl(hasTypeLoc(loc(asString("int")))) 7158 matches int x 7159</pre></td></tr> 7160 7161 7162<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> 7163<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 7164Decl, matches InnerMatcher. 7165 7166Given 7167 namespace N { 7168 namespace M { 7169 class D {}; 7170 } 7171 } 7172 7173cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 7174declaration of class D. 7175</pre></td></tr> 7176 7177 7178<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> 7179<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type. 7180 7181Given 7182 decltype(1) a = 1; 7183 decltype(2.0) b = 2.0; 7184decltypeType(hasUnderlyingType(isInteger())) 7185 matches the type of "a" 7186 7187Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>> 7188</pre></td></tr> 7189 7190 7191<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> 7192<tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl. 7193 7194For example, in: 7195void foo() 7196{ 7197 int arr[3]; 7198 auto &[f, s, t] = arr; 7199 7200 f = 42; 7201} 7202The matcher: 7203 decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding")))) 7204matches the decomposition decl with 'f' bound to "fBinding". 7205</pre></td></tr> 7206 7207 7208<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> 7209<tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl. 7210 7211For example, in: 7212void foo() 7213{ 7214 int arr[3]; 7215 auto &[f, s, t] = arr; 7216 7217 f = 42; 7218} 7219The matcher: 7220 decompositionDecl(hasBinding(0, 7221 bindingDecl(hasName("f").bind("fBinding")))) 7222matches the decomposition decl with 'f' bound to "fBinding". 7223</pre></td></tr> 7224 7225 7226<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> 7227<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr> 7228 7229 7230<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> 7231<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 7232switch statement or conditional operator. 7233 7234Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7235 if (true) {} 7236</pre></td></tr> 7237 7238 7239<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> 7240<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 7241matches InnerMatcher if the qualifier exists. 7242 7243Given 7244 namespace N { 7245 namespace M { 7246 class D {}; 7247 } 7248 } 7249 N::M::D d; 7250 7251elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 7252matches the type of the variable declaration of d. 7253</pre></td></tr> 7254 7255 7256<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> 7257<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 7258 7259Given 7260 namespace N { 7261 namespace M { 7262 class D {}; 7263 } 7264 } 7265 N::M::D d; 7266 7267elaboratedType(namesType(recordType( 7268hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 7269declaration of d. 7270</pre></td></tr> 7271 7272 7273<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> 7274<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 7275matches the given matcher. 7276 7277The associated declaration is: 7278- for type nodes, the declaration of the underlying type 7279- for CallExpr, the declaration of the callee 7280- for MemberExpr, the declaration of the referenced member 7281- for CXXConstructExpr, the declaration of the constructor 7282- for CXXNewExpr, the declaration of the operator new 7283- for ObjCIvarExpr, the declaration of the ivar 7284 7285For type nodes, hasDeclaration will generally match the declaration of the 7286sugared type. Given 7287 class X {}; 7288 typedef X Y; 7289 Y y; 7290in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7291typedefDecl. A common use case is to match the underlying, desugared type. 7292This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7293 varDecl(hasType(hasUnqualifiedDesugaredType( 7294 recordType(hasDeclaration(decl()))))) 7295In this matcher, the decl will match the CXXRecordDecl of class X. 7296 7297Usable 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>>, 7298 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>>, 7299 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>>, 7300 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>>, 7301 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>>, 7302 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>>, 7303 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7304</pre></td></tr> 7305 7306 7307<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> 7308<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 7309 7310(Note: Clang's AST refers to other conversions as "casts" too, and calls 7311actual casts "explicit" casts.) 7312</pre></td></tr> 7313 7314 7315<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('hasType5')"><a name="hasType5Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7316<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 7317declaration's type. 7318 7319In case of a value declaration (for example a variable declaration), 7320this resolves one layer of indirection. For example, in the value 7321declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7322X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7323declaration of x. 7324 7325Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7326 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7327 and friend class X (matcher = friendDecl(hasType("X")) 7328 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7329 cxxRecordDecl(hasName("X")))) 7330 class X {}; 7331 void y(X &x) { x; X z; } 7332 class Y { friend class X; }; 7333 class Z : public virtual X {}; 7334 7335Example matches class Derived 7336(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7337class Base {}; 7338class Derived : Base {}; 7339 7340Usable 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>>, 7341Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7342</pre></td></tr> 7343 7344 7345<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> 7346<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 7347matcher. 7348 7349Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7350 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7351 and U (matcher = typedefDecl(hasType(asString("int"))) 7352 and friend class X (matcher = friendDecl(hasType("X")) 7353 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7354 asString("class X"))) 7355 class X {}; 7356 void y(X &x) { x; X z; } 7357 typedef int U; 7358 class Y { friend class X; }; 7359 class Z : public virtual X {}; 7360</pre></td></tr> 7361 7362 7363<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> 7364<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 7365elidable constructor and other corresponding bookkeeping nodes. 7366 7367In C++17, elidable copy constructors are no longer being generated in the 7368AST as it is not permitted by the standard. They are, however, part of the 7369AST in C++14 and earlier. So, a matcher must abstract over these differences 7370to work in all language modes. This matcher skips elidable constructor-call 7371AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 7372various implicit nodes inside the constructor calls, all of which will not 7373appear in the C++17 AST. 7374 7375Given 7376 7377struct H {}; 7378H G(); 7379void f() { 7380 H D = G(); 7381} 7382 7383``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 7384matches ``H D = G()`` in C++11 through C++17 (and beyond). 7385</pre></td></tr> 7386 7387 7388<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> 7389<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 7390are stripped off. 7391 7392Parentheses and explicit casts are not discarded. 7393Given 7394 int arr[5]; 7395 int a = 0; 7396 char b = 0; 7397 const int c = a; 7398 int *d = arr; 7399 long e = (long) 0l; 7400The matchers 7401 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 7402 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 7403would match the declarations for a, b, c, and d, but not e. 7404While 7405 varDecl(hasInitializer(integerLiteral())) 7406 varDecl(hasInitializer(declRefExpr())) 7407only match the declarations for b, c, and d. 7408</pre></td></tr> 7409 7410 7411<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> 7412<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 7413nodes are stripped off. 7414 7415Parentheses and explicit casts are not discarded. 7416Given 7417 class C {}; 7418 C a = C(); 7419 C b; 7420 C c = b; 7421The matchers 7422 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 7423would match the declarations for a, b, and c. 7424While 7425 varDecl(hasInitializer(cxxConstructExpr())) 7426only match the declarations for b and c. 7427</pre></td></tr> 7428 7429 7430<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> 7431<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 7432casts are stripped off. 7433 7434Implicit and non-C Style casts are also discarded. 7435Given 7436 int a = 0; 7437 char b = (0); 7438 void* c = reinterpret_cast<char*>(0); 7439 char d = char(0); 7440The matcher 7441 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 7442would match the declarations for a, b, c, and d. 7443while 7444 varDecl(hasInitializer(integerLiteral())) 7445only match the declaration for a. 7446</pre></td></tr> 7447 7448 7449<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> 7450<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 7451parentheses are stripped off. 7452 7453Explicit casts are not discarded. 7454Given 7455 int arr[5]; 7456 int a = 0; 7457 char b = (0); 7458 const int c = a; 7459 int *d = (arr); 7460 long e = ((long) 0l); 7461The matchers 7462 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 7463 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 7464would match the declarations for a, b, c, and d, but not e. 7465while 7466 varDecl(hasInitializer(integerLiteral())) 7467 varDecl(hasInitializer(declRefExpr())) 7468would only match the declaration for a. 7469</pre></td></tr> 7470 7471 7472<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> 7473<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 7474 7475Given 7476 const char* str = ("my-string"); 7477The matcher 7478 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 7479would match the implicit cast resulting from the assignment. 7480</pre></td></tr> 7481 7482 7483<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> 7484<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 7485 7486Given 7487 class C { 7488 int a = 2; 7489 int b = 3; 7490 int c; 7491 }; 7492fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 7493 matches 'int a;' but not 'int b;'. 7494fieldDecl(hasInClassInitializer(anything())) 7495 matches 'int a;' and 'int b;' but not 'int c;'. 7496</pre></td></tr> 7497 7498 7499<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> 7500<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr> 7501 7502 7503<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> 7504<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 7505switch statement or conditional operator. 7506 7507Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7508 if (true) {} 7509</pre></td></tr> 7510 7511 7512<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> 7513<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 7514 7515Example: 7516 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 7517matches '++x' in 7518 for (x; x < N; ++x) { } 7519</pre></td></tr> 7520 7521 7522<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> 7523<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 7524 7525Example: 7526 forStmt(hasLoopInit(declStmt())) 7527matches 'int x = 0' in 7528 for (int x = 0; x < N; ++x) { } 7529</pre></td></tr> 7530 7531 7532<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>></td><td class="name" onclick="toggle('hasType6')"><a name="hasType6Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7533<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 7534declaration's type. 7535 7536In case of a value declaration (for example a variable declaration), 7537this resolves one layer of indirection. For example, in the value 7538declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7539X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7540declaration of x. 7541 7542Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7543 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7544 and friend class X (matcher = friendDecl(hasType("X")) 7545 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7546 cxxRecordDecl(hasName("X")))) 7547 class X {}; 7548 void y(X &x) { x; X z; } 7549 class Y { friend class X; }; 7550 class Z : public virtual X {}; 7551 7552Example matches class Derived 7553(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7554class Base {}; 7555class Derived : Base {}; 7556 7557Usable 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>>, 7558Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7559</pre></td></tr> 7560 7561 7562<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> 7563<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 7564matcher. 7565 7566Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7567 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7568 and U (matcher = typedefDecl(hasType(asString("int"))) 7569 and friend class X (matcher = friendDecl(hasType("X")) 7570 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7571 asString("class X"))) 7572 class X {}; 7573 void y(X &x) { x; X z; } 7574 typedef int U; 7575 class Y { friend class X; }; 7576 class Z : public virtual X {}; 7577</pre></td></tr> 7578 7579 7580<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> 7581<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST. 7582Note that this matcher matches all the declarations of a function whose 7583body is present in the AST. 7584 7585Given 7586 void f(); 7587 void f() {} 7588 void g(); 7589functionDecl(hasAnyBody(compoundStmt())) 7590 matches both 'void f();' 7591 and 'void f() {}' 7592with compoundStmt() 7593 matching '{}' 7594 but does not match 'void g();' 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('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> 7599<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 7600block. 7601 7602Does not match the 'this' parameter of a method. 7603 7604Given 7605 class X { void f(int x, int y, int z) {} }; 7606cxxMethodDecl(hasAnyParameter(hasName("y"))) 7607 matches f(int x, int y, int z) {} 7608with hasAnyParameter(...) 7609 matching int y 7610 7611For ObjectiveC, given 7612 @interface I - (void) f:(int) y; @end 7613 7614the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 7615matches the declaration of method f with hasParameter 7616matching y. 7617 7618For blocks, given 7619 b = ^(int y) { printf("%d", y) }; 7620 7621the matcher blockDecl(hasAnyParameter(hasName("y"))) 7622matches the declaration of the block b with hasParameter 7623matching y. 7624</pre></td></tr> 7625 7626 7627<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> 7628<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7629functionDecl that have at least one TemplateArgument matching the given 7630InnerMatcher. 7631 7632Given 7633 template<typename T> class A {}; 7634 template<> class A<double> {}; 7635 A<int> a; 7636 7637 template<typename T> f() {}; 7638 void func() { f<int>(); }; 7639 7640classTemplateSpecializationDecl(hasAnyTemplateArgument( 7641 refersToType(asString("int")))) 7642 matches the specialization A<int> 7643 7644functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7645 matches the specialization f<int> 7646</pre></td></tr> 7647 7648 7649<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> 7650<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr> 7651 7652 7653<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> 7654<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 7655declaration. 7656 7657Given 7658 template<bool b> 7659 struct S { 7660 S(int); // #1 7661 explicit S(double); // #2 7662 operator int(); // #3 7663 explicit operator bool(); // #4 7664 explicit(false) S(bool) // # 7 7665 explicit(true) S(char) // # 8 7666 explicit(b) S(S) // # 9 7667 }; 7668 S(int) -> S<true> // #5 7669 explicit S(double) -> S<false> // #6 7670cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 7671cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 7672cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 7673</pre></td></tr> 7674 7675 7676<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> 7677<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 7678declaration or a block. 7679 7680Given 7681 class X { void f(int x) {} }; 7682cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 7683 matches f(int x) {} 7684with hasParameter(...) 7685 matching int x 7686 7687For ObjectiveC, given 7688 @interface I - (void) f:(int) y; @end 7689 7690the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 7691matches the declaration of method f with hasParameter 7692matching y. 7693</pre></td></tr> 7694 7695 7696<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> 7697<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7698functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7699 7700Given 7701 template<typename T, typename U> class A {}; 7702 A<bool, int> b; 7703 A<int, bool> c; 7704 7705 template<typename T> void f() {} 7706 void func() { f<int>(); }; 7707classTemplateSpecializationDecl(hasTemplateArgument( 7708 1, refersToType(asString("int")))) 7709 matches the specialization A<bool, int> 7710 7711functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7712 matches the specialization f<int> 7713</pre></td></tr> 7714 7715 7716<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> 7717<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 7718 7719Given: 7720 class X { int f() { return 1; } }; 7721cxxMethodDecl(returns(asString("int"))) 7722 matches int f() { return 1; } 7723</pre></td></tr> 7724 7725 7726<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> 7727<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 7728switch statement or conditional operator. 7729 7730Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7731 if (true) {} 7732</pre></td></tr> 7733 7734 7735<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> 7736<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 7737 7738Given 7739 if (A* a = GetAPointer()) {} 7740hasConditionVariableStatement(...) 7741 matches 'A* a = GetAPointer()'. 7742</pre></td></tr> 7743 7744 7745<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> 7746<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 7747 7748Examples matches the if statement 7749 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 7750 if (false) false; else true; 7751</pre></td></tr> 7752 7753 7754<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> 7755<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 7756 7757Given: 7758 void foo() { 7759 if (int i = foobar(); i > 0) {} 7760 switch (int i = foobar(); i) {} 7761 for (auto& a = get_range(); auto& x : a) {} 7762 } 7763 void bar() { 7764 if (foobar() > 0) {} 7765 switch (foobar()) {} 7766 for (auto& x : get_range()) {} 7767 } 7768ifStmt(hasInitStatement(anything())) 7769 matches the if statement in foo but not in bar. 7770switchStmt(hasInitStatement(anything())) 7771 matches the switch statement in foo but not in bar. 7772cxxForRangeStmt(hasInitStatement(anything())) 7773 matches the range for statement in foo but not in bar. 7774</pre></td></tr> 7775 7776 7777<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> 7778<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 7779 7780Examples matches the if statement 7781 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 7782 if (false) true; else false; 7783</pre></td></tr> 7784 7785 7786<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> 7787<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 7788matcher. 7789 7790FIXME: Unit test this matcher 7791</pre></td></tr> 7792 7793 7794<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> 7795<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 7796 7797Example matches y. 7798 (matcher = initListExpr(hasInit(0, expr()))) 7799 int x{y}. 7800</pre></td></tr> 7801 7802 7803<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> 7804<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 7805(if expression have it). 7806</pre></td></tr> 7807 7808 7809<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> 7810<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 7811matches the given matcher. 7812 7813The associated declaration is: 7814- for type nodes, the declaration of the underlying type 7815- for CallExpr, the declaration of the callee 7816- for MemberExpr, the declaration of the referenced member 7817- for CXXConstructExpr, the declaration of the constructor 7818- for CXXNewExpr, the declaration of the operator new 7819- for ObjCIvarExpr, the declaration of the ivar 7820 7821For type nodes, hasDeclaration will generally match the declaration of the 7822sugared type. Given 7823 class X {}; 7824 typedef X Y; 7825 Y y; 7826in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7827typedefDecl. A common use case is to match the underlying, desugared type. 7828This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7829 varDecl(hasType(hasUnqualifiedDesugaredType( 7830 recordType(hasDeclaration(decl()))))) 7831In this matcher, the decl will match the CXXRecordDecl of class X. 7832 7833Usable 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>>, 7834 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>>, 7835 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>>, 7836 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>>, 7837 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>>, 7838 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>>, 7839 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7840</pre></td></tr> 7841 7842 7843<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> 7844<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 7845matches the given matcher. 7846 7847The associated declaration is: 7848- for type nodes, the declaration of the underlying type 7849- for CallExpr, the declaration of the callee 7850- for MemberExpr, the declaration of the referenced member 7851- for CXXConstructExpr, the declaration of the constructor 7852- for CXXNewExpr, the declaration of the operator new 7853- for ObjCIvarExpr, the declaration of the ivar 7854 7855For type nodes, hasDeclaration will generally match the declaration of the 7856sugared type. Given 7857 class X {}; 7858 typedef X Y; 7859 Y y; 7860in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7861typedefDecl. A common use case is to match the underlying, desugared type. 7862This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7863 varDecl(hasType(hasUnqualifiedDesugaredType( 7864 recordType(hasDeclaration(decl()))))) 7865In this matcher, the decl will match the CXXRecordDecl of class X. 7866 7867Usable 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>>, 7868 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>>, 7869 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>>, 7870 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>>, 7871 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>>, 7872 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>>, 7873 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7874</pre></td></tr> 7875 7876 7877<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> 7878<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression. 7879 7880Given 7881 struct foo { 7882 void bar() { 7883 auto f = [this](){}; 7884 } 7885 } 7886lambdaExpr(hasAnyCapture(cxxThisExpr())) 7887 matches [this](){}; 7888</pre></td></tr> 7889 7890 7891<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> 7892<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression. 7893 7894Given 7895 void foo() { 7896 int x; 7897 auto f = [x](){}; 7898 } 7899lambdaExpr(hasAnyCapture(anything())) 7900 matches [x](){}; 7901</pre></td></tr> 7902 7903 7904<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> 7905<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 7906matches the given matcher. 7907 7908The associated declaration is: 7909- for type nodes, the declaration of the underlying type 7910- for CallExpr, the declaration of the callee 7911- for MemberExpr, the declaration of the referenced member 7912- for CXXConstructExpr, the declaration of the constructor 7913- for CXXNewExpr, the declaration of the operator new 7914- for ObjCIvarExpr, the declaration of the ivar 7915 7916For type nodes, hasDeclaration will generally match the declaration of the 7917sugared type. Given 7918 class X {}; 7919 typedef X Y; 7920 Y y; 7921in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7922typedefDecl. A common use case is to match the underlying, desugared type. 7923This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7924 varDecl(hasType(hasUnqualifiedDesugaredType( 7925 recordType(hasDeclaration(decl()))))) 7926In this matcher, the decl will match the CXXRecordDecl of class X. 7927 7928Usable 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>>, 7929 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>>, 7930 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>>, 7931 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>>, 7932 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>>, 7933 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>>, 7934 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7935</pre></td></tr> 7936 7937 7938<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> 7939<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 7940given matcher. Implicit object expressions are included; that is, it matches 7941use of implicit `this`. 7942 7943Given 7944 struct X { 7945 int m; 7946 int f(X x) { x.m; return m; } 7947 }; 7948memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 7949 matches `x.m`, but not `m`; however, 7950memberExpr(hasObjectExpression(hasType(pointsTo( 7951 cxxRecordDecl(hasName("X")))))) 7952 matches `m` (aka. `this->m`), but not `x.m`. 7953</pre></td></tr> 7954 7955 7956<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> 7957<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 7958given matcher. 7959 7960Given 7961 struct { int first, second; } first, second; 7962 int i(second.first); 7963 int j(first.second); 7964memberExpr(member(hasName("first"))) 7965 matches second.first 7966 but not first.second (because the member name there is "second"). 7967</pre></td></tr> 7968 7969 7970<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> 7971<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 7972pointee matches a given matcher. 7973 7974Given 7975 int *a; 7976 int const *b; 7977 float const *f; 7978pointerType(pointee(isConstQualified(), isInteger())) 7979 matches "int const *b" 7980 7981Usable 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>>, 7982 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>> 7983</pre></td></tr> 7984 7985 7986<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> 7987<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 7988matcher. 7989 7990Given 7991 namespace N { template<class T> void f(T t); } 7992 template <class T> void g() { using N::f; f(T()); } 7993unresolvedLookupExpr(hasAnyDeclaration( 7994 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 7995 matches the use of f in g() . 7996</pre></td></tr> 7997 7998 7999<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> 8000<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 8001 8002Given 8003 struct A { struct B { struct C {}; }; }; 8004 A::B::C c; 8005nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 8006 matches "A::" 8007</pre></td></tr> 8008 8009 8010<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> 8011<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 8012NestedNameSpecifier-matcher matches. 8013</pre></td></tr> 8014 8015 8016<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> 8017<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 8018given TypeLoc. 8019 8020Given 8021 struct A { struct B { struct C {}; }; }; 8022 A::B::C c; 8023nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 8024 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 8025 matches "A::" 8026</pre></td></tr> 8027 8028 8029<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> 8030<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 8031 8032Given 8033 struct A { struct B { struct C {}; }; }; 8034 A::B::C c; 8035nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 8036 matches "A::" 8037</pre></td></tr> 8038 8039 8040<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> 8041<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 8042given namespace matcher. 8043 8044Given 8045 namespace ns { struct A {}; } 8046 ns::A a; 8047nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 8048 matches "ns::" 8049</pre></td></tr> 8050 8051 8052<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> 8053<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 8054given QualType matcher without qualifiers. 8055 8056Given 8057 struct A { struct B { struct C {}; }; }; 8058 A::B::C c; 8059nestedNameSpecifier(specifiesType( 8060 hasDeclaration(cxxRecordDecl(hasName("A"))) 8061)) 8062 matches "A::" 8063</pre></td></tr> 8064 8065 8066<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> 8067<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 8068 8069Given 8070 8071 #pragma omp parallel 8072 #pragma omp parallel default(none) 8073 8074``ompExecutableDirective(hasAnyClause(anything()))`` matches 8075``omp parallel default(none)``. 8076</pre></td></tr> 8077 8078 8079<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> 8080<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 8081 8082Prerequisite: the executable directive must not be standalone directive. 8083If it is, it will never match. 8084 8085Given 8086 8087 #pragma omp parallel 8088 ; 8089 #pragma omp parallel 8090 {} 8091 8092``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 8093</pre></td></tr> 8094 8095 8096<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> 8097<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 8098matching Base, or Objective-C classes that directly or indirectly 8099subclass a class matching Base. 8100 8101Note that a class is not considered to be derived from itself. 8102 8103Example matches Y, Z, C (Base == hasName("X")) 8104 class X; 8105 class Y : public X {}; // directly derived 8106 class Z : public Y {}; // indirectly derived 8107 typedef X A; 8108 typedef A B; 8109 class C : public B {}; // derived from a typedef of X 8110 8111In the following example, Bar matches isDerivedFrom(hasName("X")): 8112 class Foo; 8113 typedef Foo X; 8114 class Bar : public Foo {}; // derived from a type that X is a typedef of 8115 8116In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 8117 @interface NSObject @end 8118 @interface Bar : NSObject @end 8119 8120Usable 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>> 8121</pre></td></tr> 8122 8123 8124<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> 8125<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 8126matching Base. 8127 8128Note that a class is not considered to be derived from itself. 8129 8130Example matches Y, C (Base == hasName("X")) 8131 class X; 8132 class Y : public X {}; // directly derived 8133 class Z : public Y {}; // indirectly derived 8134 typedef X A; 8135 typedef A B; 8136 class C : public B {}; // derived from a typedef of X 8137 8138In the following example, Bar matches isDerivedFrom(hasName("X")): 8139 class Foo; 8140 typedef Foo X; 8141 class Bar : public Foo {}; // derived from a type that X is a typedef of 8142</pre></td></tr> 8143 8144 8145<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> 8146<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 8147match Base. 8148</pre></td></tr> 8149 8150 8151<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> 8152<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 8153expression, or an ObjC-message-send expression. 8154 8155Given 8156 void x(int, int, int) { int y; x(1, y, 42); } 8157callExpr(hasAnyArgument(declRefExpr())) 8158 matches x(1, y, 42) 8159with hasAnyArgument(...) 8160 matching y 8161 8162For ObjectiveC, given 8163 @interface I - (void) f:(int) y; @end 8164 void foo(I *i) { [i f:12]; } 8165objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 8166 matches [i f:12] 8167</pre></td></tr> 8168 8169 8170<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> 8171<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor 8172call expression. 8173 8174Example matches y in x(y) 8175 (matcher = callExpr(hasArgument(0, declRefExpr()))) 8176 void x(int) { int y; x(y); } 8177</pre></td></tr> 8178 8179 8180<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> 8181<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 8182and the inner matcher matches on that instance. 8183 8184For example the method call in 8185 NSString *x = @"hello"; 8186 [x containsString:@"h"]; 8187is matched by 8188objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 8189</pre></td></tr> 8190 8191 8192<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> 8193<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 8194 8195Example 8196matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 8197matches the [webView ...] message invocation. 8198 NSString *webViewJavaScript = ... 8199 UIWebView *webView = ... 8200 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 8201</pre></td></tr> 8202 8203 8204<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> 8205<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 8206block. 8207 8208Does not match the 'this' parameter of a method. 8209 8210Given 8211 class X { void f(int x, int y, int z) {} }; 8212cxxMethodDecl(hasAnyParameter(hasName("y"))) 8213 matches f(int x, int y, int z) {} 8214with hasAnyParameter(...) 8215 matching int y 8216 8217For ObjectiveC, given 8218 @interface I - (void) f:(int) y; @end 8219 8220the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 8221matches the declaration of method f with hasParameter 8222matching y. 8223 8224For blocks, given 8225 b = ^(int y) { printf("%d", y) }; 8226 8227the matcher blockDecl(hasAnyParameter(hasName("y"))) 8228matches the declaration of the block b with hasParameter 8229matching y. 8230</pre></td></tr> 8231 8232 8233<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> 8234<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 8235declaration or a block. 8236 8237Given 8238 class X { void f(int x) {} }; 8239cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 8240 matches f(int x) {} 8241with hasParameter(...) 8242 matching int x 8243 8244For ObjectiveC, given 8245 @interface I - (void) f:(int) y; @end 8246 8247the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 8248matches the declaration of method f with hasParameter 8249matching y. 8250</pre></td></tr> 8251 8252 8253<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> 8254<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 8255or opaque value's source expression matches the given matcher. 8256 8257Example 1: matches "a string" 8258(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 8259class URL { URL(string); }; 8260URL url = "a string"; 8261 8262Example 2: matches 'b' (matcher = 8263opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 8264int a = b ?: 1; 8265</pre></td></tr> 8266 8267 8268<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> 8269<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 8270overloads matches the given matcher. 8271 8272Given 8273 template <typename T> void foo(T); 8274 template <typename T> void bar(T); 8275 template <typename T> void baz(T t) { 8276 foo(t); 8277 bar(t); 8278 } 8279unresolvedLookupExpr(hasAnyDeclaration( 8280 functionTemplateDecl(hasName("foo")))) 8281 matches foo in foo(t); but not bar in bar(t); 8282</pre></td></tr> 8283 8284 8285<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> 8286<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 8287 8288Given 8289 int (*ptr_to_array)[4]; 8290 int (*ptr_to_func)(int); 8291 8292varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 8293ptr_to_func but not ptr_to_array. 8294 8295Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 8296</pre></td></tr> 8297 8298 8299<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> 8300<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 8301pointee matches a given matcher. 8302 8303Given 8304 int *a; 8305 int const *b; 8306 float const *f; 8307pointerType(pointee(isConstQualified(), isInteger())) 8308 matches "int const *b" 8309 8310Usable 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>>, 8311 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>> 8312</pre></td></tr> 8313 8314 8315<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> 8316<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 8317 8318Given: 8319 typedef int &int_ref; 8320 int a; 8321 int_ref b = a; 8322 8323varDecl(hasType(qualType(referenceType()))))) will not match the 8324declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 8325</pre></td></tr> 8326 8327 8328<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> 8329<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 8330matches the given matcher. 8331 8332The associated declaration is: 8333- for type nodes, the declaration of the underlying type 8334- for CallExpr, the declaration of the callee 8335- for MemberExpr, the declaration of the referenced member 8336- for CXXConstructExpr, the declaration of the constructor 8337- for CXXNewExpr, the declaration of the operator new 8338- for ObjCIvarExpr, the declaration of the ivar 8339 8340For type nodes, hasDeclaration will generally match the declaration of the 8341sugared type. Given 8342 class X {}; 8343 typedef X Y; 8344 Y y; 8345in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8346typedefDecl. A common use case is to match the underlying, desugared type. 8347This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8348 varDecl(hasType(hasUnqualifiedDesugaredType( 8349 recordType(hasDeclaration(decl()))))) 8350In this matcher, the decl will match the CXXRecordDecl of class X. 8351 8352Usable 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>>, 8353 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>>, 8354 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>>, 8355 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>>, 8356 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>>, 8357 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>>, 8358 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8359</pre></td></tr> 8360 8361 8362<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> 8363<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 8364 8365Given 8366 void (*fp)(void); 8367The matcher 8368 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 8369would match the declaration for fp. 8370</pre></td></tr> 8371 8372 8373<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> 8374<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 8375</pre></td></tr> 8376 8377 8378<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> 8379<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 8380matches the specified matcher. 8381 8382Example matches y->x() 8383 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 8384 cxxRecordDecl(hasName("Y"))))))) 8385 class Y { public: void x(); }; 8386 void z() { Y *y; y->x(); } 8387</pre></td></tr> 8388 8389 8390<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> 8391<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 8392</pre></td></tr> 8393 8394 8395<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> 8396<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 8397type matches the specified matcher. 8398 8399Example matches X &x and const X &y 8400 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 8401 class X { 8402 void a(X b) { 8403 X &x = b; 8404 const X &y = b; 8405 } 8406 }; 8407</pre></td></tr> 8408 8409 8410<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> 8411<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 8412matches the given matcher. 8413 8414The associated declaration is: 8415- for type nodes, the declaration of the underlying type 8416- for CallExpr, the declaration of the callee 8417- for MemberExpr, the declaration of the referenced member 8418- for CXXConstructExpr, the declaration of the constructor 8419- for CXXNewExpr, the declaration of the operator new 8420- for ObjCIvarExpr, the declaration of the ivar 8421 8422For type nodes, hasDeclaration will generally match the declaration of the 8423sugared type. Given 8424 class X {}; 8425 typedef X Y; 8426 Y y; 8427in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8428typedefDecl. A common use case is to match the underlying, desugared type. 8429This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8430 varDecl(hasType(hasUnqualifiedDesugaredType( 8431 recordType(hasDeclaration(decl()))))) 8432In this matcher, the decl will match the CXXRecordDecl of class X. 8433 8434Usable 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>>, 8435 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>>, 8436 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>>, 8437 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>>, 8438 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>>, 8439 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>>, 8440 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8441</pre></td></tr> 8442 8443 8444<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> 8445<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 8446pointee matches a given matcher. 8447 8448Given 8449 int *a; 8450 int const *b; 8451 float const *f; 8452pointerType(pointee(isConstQualified(), isInteger())) 8453 matches "int const *b" 8454 8455Usable 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>>, 8456 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>> 8457</pre></td></tr> 8458 8459 8460<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> 8461<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 8462 8463Given 8464 return a + b; 8465hasReturnValue(binaryOperator()) 8466 matches 'return a + b' 8467with binaryOperator() 8468 matching 'a + b' 8469</pre></td></tr> 8470 8471 8472<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> 8473<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 8474a given matcher. Also matches StmtExprs that have CompoundStmt as children. 8475 8476Given 8477 { {}; 1+2; } 8478hasAnySubstatement(compoundStmt()) 8479 matches '{ {}; 1+2; }' 8480with compoundStmt() 8481 matching '{}' 8482</pre></td></tr> 8483 8484 8485<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> 8486<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8487alignof. 8488</pre></td></tr> 8489 8490 8491<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> 8492<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to 8493 8494Given: 8495F& operator=(const F& o) { 8496 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 8497 return *this; 8498} 8499returnStmt(forFunction(hasName("operator="))) 8500 matches 'return *this' 8501 but does not match 'return v > 0' 8502</pre></td></tr> 8503 8504 8505<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> 8506<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8507sizeof. 8508</pre></td></tr> 8509 8510 8511<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> 8512<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 8513type that matches the provided matcher. 8514 8515Given 8516 template <typename T> 8517 double F(T t); 8518 int i; 8519 double j = F(i); 8520 8521substTemplateTypeParmType(hasReplacementType(type())) matches int 8522</pre></td></tr> 8523 8524 8525<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> 8526<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 8527statement. This matcher may produce multiple matches. 8528 8529Given 8530 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 8531switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 8532 matches four times, with "c" binding each of "case 1:", "case 2:", 8533"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 8534"switch (1)", "switch (2)" and "switch (2)". 8535</pre></td></tr> 8536 8537 8538<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> 8539<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 8540switch statement or conditional operator. 8541 8542Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8543 if (true) {} 8544</pre></td></tr> 8545 8546 8547<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> 8548<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 8549 8550Given: 8551 void foo() { 8552 if (int i = foobar(); i > 0) {} 8553 switch (int i = foobar(); i) {} 8554 for (auto& a = get_range(); auto& x : a) {} 8555 } 8556 void bar() { 8557 if (foobar() > 0) {} 8558 switch (foobar()) {} 8559 for (auto& x : get_range()) {} 8560 } 8561ifStmt(hasInitStatement(anything())) 8562 matches the if statement in foo but not in bar. 8563switchStmt(hasInitStatement(anything())) 8564 matches the switch statement in foo but not in bar. 8565cxxForRangeStmt(hasInitStatement(anything())) 8566 matches the range for statement in foo but not in bar. 8567</pre></td></tr> 8568 8569 8570<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> 8571<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 8572matches the given matcher. 8573 8574The associated declaration is: 8575- for type nodes, the declaration of the underlying type 8576- for CallExpr, the declaration of the callee 8577- for MemberExpr, the declaration of the referenced member 8578- for CXXConstructExpr, the declaration of the constructor 8579- for CXXNewExpr, the declaration of the operator new 8580- for ObjCIvarExpr, the declaration of the ivar 8581 8582For type nodes, hasDeclaration will generally match the declaration of the 8583sugared type. Given 8584 class X {}; 8585 typedef X Y; 8586 Y y; 8587in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8588typedefDecl. A common use case is to match the underlying, desugared type. 8589This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8590 varDecl(hasType(hasUnqualifiedDesugaredType( 8591 recordType(hasDeclaration(decl()))))) 8592In this matcher, the decl will match the CXXRecordDecl of class X. 8593 8594Usable 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>>, 8595 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>>, 8596 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>>, 8597 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>>, 8598 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>>, 8599 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>>, 8600 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8601</pre></td></tr> 8602 8603 8604<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> 8605<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 8606 8607Given 8608 struct B { int next; }; 8609 template<int(B::*next_ptr)> struct A {}; 8610 A<&B::next> a; 8611templateSpecializationType(hasAnyTemplateArgument( 8612 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 8613 matches the specialization A<&B::next> with fieldDecl(...) matching 8614 B::next 8615</pre></td></tr> 8616 8617 8618<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> 8619<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 8620declaration. 8621 8622Given 8623 struct B { int next; }; 8624 template<int(B::*next_ptr)> struct A {}; 8625 A<&B::next> a; 8626classTemplateSpecializationDecl(hasAnyTemplateArgument( 8627 refersToDeclaration(fieldDecl(hasName("next"))))) 8628 matches the specialization A<&B::next> with fieldDecl(...) matching 8629 B::next 8630</pre></td></tr> 8631 8632 8633<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> 8634<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type. 8635 8636Given 8637 template<int T> struct C {}; 8638 C<42> c; 8639classTemplateSpecializationDecl( 8640 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 8641 matches the implicit instantiation of C in C<42>. 8642</pre></td></tr> 8643 8644 8645<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> 8646<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 8647 8648Given 8649 template<template <typename> class S> class X {}; 8650 template<typename T> class Y {}; 8651 X<Y> xi; 8652classTemplateSpecializationDecl(hasAnyTemplateArgument( 8653 refersToTemplate(templateName()))) 8654 matches the specialization X<Y> 8655</pre></td></tr> 8656 8657 8658<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> 8659<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 8660 8661Given 8662 struct X {}; 8663 template<typename T> struct A {}; 8664 A<X> a; 8665classTemplateSpecializationDecl(hasAnyTemplateArgument( 8666 refersToType(class(hasName("X"))))) 8667 matches the specialization A<X> 8668</pre></td></tr> 8669 8670 8671<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> 8672<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8673functionDecl that have at least one TemplateArgument matching the given 8674InnerMatcher. 8675 8676Given 8677 template<typename T> class A {}; 8678 template<> class A<double> {}; 8679 A<int> a; 8680 8681 template<typename T> f() {}; 8682 void func() { f<int>(); }; 8683 8684classTemplateSpecializationDecl(hasAnyTemplateArgument( 8685 refersToType(asString("int")))) 8686 matches the specialization A<int> 8687 8688functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 8689 matches the specialization f<int> 8690</pre></td></tr> 8691 8692 8693<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> 8694<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 8695matches the given matcher. 8696 8697The associated declaration is: 8698- for type nodes, the declaration of the underlying type 8699- for CallExpr, the declaration of the callee 8700- for MemberExpr, the declaration of the referenced member 8701- for CXXConstructExpr, the declaration of the constructor 8702- for CXXNewExpr, the declaration of the operator new 8703- for ObjCIvarExpr, the declaration of the ivar 8704 8705For type nodes, hasDeclaration will generally match the declaration of the 8706sugared type. Given 8707 class X {}; 8708 typedef X Y; 8709 Y y; 8710in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8711typedefDecl. A common use case is to match the underlying, desugared type. 8712This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8713 varDecl(hasType(hasUnqualifiedDesugaredType( 8714 recordType(hasDeclaration(decl()))))) 8715In this matcher, the decl will match the CXXRecordDecl of class X. 8716 8717Usable 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>>, 8718 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>>, 8719 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>>, 8720 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>>, 8721 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>>, 8722 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>>, 8723 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8724</pre></td></tr> 8725 8726 8727<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> 8728<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8729functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 8730 8731Given 8732 template<typename T, typename U> class A {}; 8733 A<bool, int> b; 8734 A<int, bool> c; 8735 8736 template<typename T> void f() {} 8737 void func() { f<int>(); }; 8738classTemplateSpecializationDecl(hasTemplateArgument( 8739 1, refersToType(asString("int")))) 8740 matches the specialization A<bool, int> 8741 8742functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 8743 matches the specialization f<int> 8744</pre></td></tr> 8745 8746 8747<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> 8748<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 8749matches the given matcher. 8750 8751The associated declaration is: 8752- for type nodes, the declaration of the underlying type 8753- for CallExpr, the declaration of the callee 8754- for MemberExpr, the declaration of the referenced member 8755- for CXXConstructExpr, the declaration of the constructor 8756- for CXXNewExpr, the declaration of the operator new 8757- for ObjCIvarExpr, the declaration of the ivar 8758 8759For type nodes, hasDeclaration will generally match the declaration of the 8760sugared type. Given 8761 class X {}; 8762 typedef X Y; 8763 Y y; 8764in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8765typedefDecl. A common use case is to match the underlying, desugared type. 8766This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8767 varDecl(hasType(hasUnqualifiedDesugaredType( 8768 recordType(hasDeclaration(decl()))))) 8769In this matcher, the decl will match the CXXRecordDecl of class X. 8770 8771Usable 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>>, 8772 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>>, 8773 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>>, 8774 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>>, 8775 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>>, 8776 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>>, 8777 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8778</pre></td></tr> 8779 8780 8781<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> 8782<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 8783QualType-matcher matches. 8784</pre></td></tr> 8785 8786 8787<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> 8788<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 8789matcher. 8790 8791Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8792 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8793 and U (matcher = typedefDecl(hasType(asString("int"))) 8794 and friend class X (matcher = friendDecl(hasType("X")) 8795 and public virtual X (matcher = cxxBaseSpecifier(hasType( 8796 asString("class X"))) 8797 class X {}; 8798 void y(X &x) { x; X z; } 8799 typedef int U; 8800 class Y { friend class X; }; 8801 class Z : public virtual X {}; 8802</pre></td></tr> 8803 8804 8805<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> 8806<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 8807matches the given matcher. 8808 8809The associated declaration is: 8810- for type nodes, the declaration of the underlying type 8811- for CallExpr, the declaration of the callee 8812- for MemberExpr, the declaration of the referenced member 8813- for CXXConstructExpr, the declaration of the constructor 8814- for CXXNewExpr, the declaration of the operator new 8815- for ObjCIvarExpr, the declaration of the ivar 8816 8817For type nodes, hasDeclaration will generally match the declaration of the 8818sugared type. Given 8819 class X {}; 8820 typedef X Y; 8821 Y y; 8822in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8823typedefDecl. A common use case is to match the underlying, desugared type. 8824This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8825 varDecl(hasType(hasUnqualifiedDesugaredType( 8826 recordType(hasDeclaration(decl()))))) 8827In this matcher, the decl will match the CXXRecordDecl of class X. 8828 8829Usable 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>>, 8830 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>>, 8831 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>>, 8832 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>>, 8833 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>>, 8834 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>>, 8835 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8836</pre></td></tr> 8837 8838 8839<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> 8840<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 8841type of the matched node. 8842 8843For example, in: 8844 class A {}; 8845 using B = A; 8846The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 8847both B and A. 8848</pre></td></tr> 8849 8850 8851<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> 8852<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 8853 8854Given 8855 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 8856unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 8857 matches sizeof(a) and alignof(c) 8858</pre></td></tr> 8859 8860 8861<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> 8862<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 8863 8864Example matches true (matcher = hasUnaryOperand( 8865 cxxBoolLiteral(equals(true)))) 8866 !true 8867</pre></td></tr> 8868 8869 8870<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> 8871<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 8872given matcher. Implicit object expressions are included; that is, it matches 8873use of implicit `this`. 8874 8875Given 8876 struct X { 8877 int m; 8878 int f(X x) { x.m; return m; } 8879 }; 8880memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 8881 matches `x.m`, but not `m`; however, 8882memberExpr(hasObjectExpression(hasType(pointsTo( 8883 cxxRecordDecl(hasName("X")))))) 8884 matches `m` (aka. `this->m`), but not `x.m`. 8885</pre></td></tr> 8886 8887 8888<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> 8889<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 8890matches the given matcher. 8891 8892The associated declaration is: 8893- for type nodes, the declaration of the underlying type 8894- for CallExpr, the declaration of the callee 8895- for MemberExpr, the declaration of the referenced member 8896- for CXXConstructExpr, the declaration of the constructor 8897- for CXXNewExpr, the declaration of the operator new 8898- for ObjCIvarExpr, the declaration of the ivar 8899 8900For type nodes, hasDeclaration will generally match the declaration of the 8901sugared type. Given 8902 class X {}; 8903 typedef X Y; 8904 Y y; 8905in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8906typedefDecl. A common use case is to match the underlying, desugared type. 8907This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8908 varDecl(hasType(hasUnqualifiedDesugaredType( 8909 recordType(hasDeclaration(decl()))))) 8910In this matcher, the decl will match the CXXRecordDecl of class X. 8911 8912Usable 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>>, 8913 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>>, 8914 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>>, 8915 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>>, 8916 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>>, 8917 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>>, 8918 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8919</pre></td></tr> 8920 8921 8922<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> 8923<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 8924 8925Given 8926 namespace X { void b(); } 8927 using X::b; 8928usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 8929 matches using X::b </pre></td></tr> 8930 8931 8932<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> 8933<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 8934matched by the given matcher. 8935 8936Given 8937 namespace X { int a; void b(); } 8938 using X::a; 8939 using X::b; 8940usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 8941 matches using X::b but not using X::a </pre></td></tr> 8942 8943 8944<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>></td><td class="name" onclick="toggle('hasType7')"><a name="hasType7Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8945<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value 8946declaration's type. 8947 8948In case of a value declaration (for example a variable declaration), 8949this resolves one layer of indirection. For example, in the value 8950declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 8951X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 8952declaration of x. 8953 8954Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8955 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8956 and friend class X (matcher = friendDecl(hasType("X")) 8957 and public virtual X (matcher = cxxBaseSpecifier(hasType( 8958 cxxRecordDecl(hasName("X")))) 8959 class X {}; 8960 void y(X &x) { x; X z; } 8961 class Y { friend class X; }; 8962 class Z : public virtual X {}; 8963 8964Example matches class Derived 8965(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 8966class Base {}; 8967class Derived : Base {}; 8968 8969Usable 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>>, 8970Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 8971</pre></td></tr> 8972 8973 8974<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> 8975<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 8976matcher. 8977 8978Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8979 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8980 and U (matcher = typedefDecl(hasType(asString("int"))) 8981 and friend class X (matcher = friendDecl(hasType("X")) 8982 and public virtual X (matcher = cxxBaseSpecifier(hasType( 8983 asString("class X"))) 8984 class X {}; 8985 void y(X &x) { x; X z; } 8986 typedef int U; 8987 class Y { friend class X; }; 8988 class Z : public virtual X {}; 8989</pre></td></tr> 8990 8991 8992<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> 8993<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 8994that matches the given matcher. 8995 8996Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 8997 bool y() { return true; } 8998 bool x = y(); 8999</pre></td></tr> 9000 9001 9002<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> 9003<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 9004expression. 9005 9006Given 9007 void f(int b) { 9008 int a[b]; 9009 } 9010variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 9011 varDecl(hasName("b"))))))) 9012 matches "int a[b]" 9013</pre></td></tr> 9014 9015 9016<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> 9017<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr> 9018 9019 9020<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> 9021<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 9022switch statement or conditional operator. 9023 9024Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 9025 if (true) {} 9026</pre></td></tr> 9027 9028<!--END_TRAVERSAL_MATCHERS --> 9029</table> 9030 9031</div> 9032</body> 9033</html> 9034 9035 9036