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_1Attr.html">Attr</a>></td><td class="name" onclick="toggle('attr0')"><a name="attr0Anchor">attr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>>...</td></tr> 577<tr><td colspan="4" class="doc" id="attr0"><pre>Matches attributes. 578Attributes may be attached with a variety of different syntaxes (including 579keywords, C++11 attributes, GNU ``__attribute``` and MSVC `__declspec``, 580and ``#pragma``s). They may also be implicit. 581 582Given 583 struct [[nodiscard]] Foo{}; 584 void bar(int * __attribute__((nonnull)) ); 585 __declspec(noinline) void baz(); 586 587 #pragma omp declare simd 588 int min(); 589attr() 590 matches "nodiscard", "nonnull", "noinline", and the whole "#pragma" line. 591</pre></td></tr> 592 593 594<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> 595<tr><td colspan="4" class="doc" id="cxxBaseSpecifier0"><pre>Matches class bases. 596 597Examples matches public virtual B. 598 class B {}; 599 class C : public virtual B {}; 600</pre></td></tr> 601 602 603<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> 604<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers. 605 606Examples matches i(42). 607 class C { 608 C() : i(42) {} 609 int i; 610 }; 611</pre></td></tr> 612 613 614<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> 615<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations. 616 617Given 618 class C { 619 public: 620 int a; 621 }; 622accessSpecDecl() 623 matches 'public:' 624</pre></td></tr> 625 626 627<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> 628<tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations 629Example matches foo and bar 630(matcher = bindingDecl() 631 632 auto [foo, bar] = std::make_pair{42, 42}; 633</pre></td></tr> 634 635 636<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> 637<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations. 638 639Example matches the declaration of the nameless block printing an input 640integer. 641 642 myFunc(^(int p) { 643 printf("%d", p); 644 }) 645</pre></td></tr> 646 647 648<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> 649<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations. 650 651Example matches Z 652 template<class T> class Z {}; 653</pre></td></tr> 654 655 656<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> 657<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations. 658 659Given 660 template<class T1, class T2, int I> 661 class A {}; 662 663 template<class T, int I> 664 class A<T, T*, I> {}; 665 666 template<> 667 class A<int, int, 1> {}; 668classTemplatePartialSpecializationDecl() 669 matches the specialization A<T,T*,I> but not A<int,int,1> 670</pre></td></tr> 671 672 673<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> 674<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations. 675 676Given 677 template<typename T> class A {}; 678 template<> class A<double> {}; 679 A<int> a; 680classTemplateSpecializationDecl() 681 matches the specializations A<int> and A<double> 682</pre></td></tr> 683 684 685<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> 686<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. 687 688Example matches Foo::Foo() and Foo::Foo(int) 689 class Foo { 690 public: 691 Foo(); 692 Foo(int); 693 int DoSomething(); 694 }; 695</pre></td></tr> 696 697 698<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>>...</td></tr> 699<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations. 700 701Example matches the operator. 702 class X { operator int() const; }; 703</pre></td></tr> 704 705 706<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> 707<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide. 708 709Example matches the deduction guide. 710 template<typename T> 711 class X { X(int) }; 712 X(int) -> X<int>; 713</pre></td></tr> 714 715 716<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> 717<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations. 718 719Example matches Foo::~Foo() 720 class Foo { 721 public: 722 virtual ~Foo(); 723 }; 724</pre></td></tr> 725 726 727<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> 728<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations. 729 730Example matches y 731 class X { void y(); }; 732</pre></td></tr> 733 734 735<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> 736<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations. 737 738Example matches X, Z 739 class X; 740 template<class T> class Z {}; 741</pre></td></tr> 742 743 744<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>...</td></tr> 745<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 746 747Examples matches X, C, and the friend declaration inside C; 748 void X(); 749 class C { 750 friend X; 751 }; 752</pre></td></tr> 753 754 755<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> 756<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 757and non-type template parameter declarations). 758 759Given 760 class X { int y; }; 761declaratorDecl() 762 matches int y. 763</pre></td></tr> 764 765 766<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> 767<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations. 768 769Examples matches the declaration node with foo and bar, but not 770number. 771(matcher = declStmt(has(decompositionDecl()))) 772 773 int number = 42; 774 auto [foo, bar] = std::make_pair{42, 42}; 775</pre></td></tr> 776 777 778<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> 779<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 780 781Example matches A, B, C 782 enum X { 783 A, B, C 784 }; 785</pre></td></tr> 786 787 788<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>>...</td></tr> 789<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 790 791Example matches X 792 enum X { 793 A, B, C 794 }; 795</pre></td></tr> 796 797 798<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> 799<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 800 801Given 802 class X { int m; }; 803fieldDecl() 804 matches 'm'. 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('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>...</td></tr> 809<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 810 811Given 812 class X { friend void foo(); }; 813friendDecl() 814 matches 'friend void foo()'. 815</pre></td></tr> 816 817 818<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> 819<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 820 821Example matches f 822 void f(); 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('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>>...</td></tr> 827<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 828 829Example matches f 830 template<class T> void f(T t) {} 831</pre></td></tr> 832 833 834<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> 835<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations. 836 837Given 838 struct X { struct { int a; }; }; 839indirectFieldDecl() 840 matches 'a'. 841</pre></td></tr> 842 843 844<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> 845<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label. 846 847Given 848 goto FOO; 849 FOO: bar(); 850labelDecl() 851 matches 'FOO:' 852</pre></td></tr> 853 854 855<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> 856<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification. 857 858Given 859 extern "C" {} 860linkageSpecDecl() 861 matches "extern "C" {}" 862</pre></td></tr> 863 864 865<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> 866<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 867 868Example matches X, S, the anonymous union type, i, and U; 869 typedef int X; 870 struct S { 871 union { 872 int i; 873 } U; 874 }; 875</pre></td></tr> 876 877 878<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> 879<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias. 880 881Given 882 namespace test {} 883 namespace alias = ::test; 884namespaceAliasDecl() 885 matches "namespace alias" but not "namespace test" 886</pre></td></tr> 887 888 889<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> 890<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 891 892Given 893 namespace {} 894 namespace test {} 895namespaceDecl() 896 matches "namespace {}" and "namespace test {}" 897</pre></td></tr> 898 899 900<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>>...</td></tr> 901<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations. 902 903Given 904 template <typename T, int N> struct C {}; 905nonTypeTemplateParmDecl() 906 matches 'N', but not 'T'. 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('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>>...</td></tr> 911<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations. 912 913Example matches Foo (Additions) 914 @interface Foo (Additions) 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('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>>...</td></tr> 920<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions. 921 922Example matches Foo (Additions) 923 @implementation Foo (Additions) 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('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>>...</td></tr> 929<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations. 930 931Example matches Foo 932 @implementation Foo 933 @end 934</pre></td></tr> 935 936 937<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> 938<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 939 940Example matches Foo 941 @interface Foo 942 @end 943</pre></td></tr> 944 945 946<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> 947<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations. 948 949Example matches _enabled 950 @implementation Foo { 951 BOOL _enabled; 952 } 953 @end 954</pre></td></tr> 955 956 957<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> 958<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations. 959 960Example matches both declaration and definition of -[Foo method] 961 @interface Foo 962 - (void)method; 963 @end 964 965 @implementation Foo 966 - (void)method {} 967 @end 968</pre></td></tr> 969 970 971<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> 972<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations. 973 974Example matches enabled 975 @interface Foo 976 @property BOOL enabled; 977 @end 978</pre></td></tr> 979 980 981<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> 982<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations. 983 984Example matches FooDelegate 985 @protocol FooDelegate 986 @end 987</pre></td></tr> 988 989 990<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> 991<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 992 993Given 994 void f(int x); 995parmVarDecl() 996 matches int x. 997</pre></td></tr> 998 999 1000<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> 1001<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 1002 1003Example matches X, Z, U, and S 1004 class X; 1005 template<class T> class Z {}; 1006 struct S {}; 1007 union U {}; 1008</pre></td></tr> 1009 1010 1011<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> 1012<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 1013 1014Example: 1015 staticAssertExpr() 1016matches 1017 static_assert(sizeof(S) == sizeof(int)) 1018in 1019 struct S { 1020 int x; 1021 }; 1022 static_assert(sizeof(S) == sizeof(int)); 1023</pre></td></tr> 1024 1025 1026<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> 1027<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations. 1028 1029Example matches X, Z, U, S, E 1030 class X; 1031 template<class T> class Z {}; 1032 struct S {}; 1033 union U {}; 1034 enum E { 1035 A, B, C 1036 }; 1037</pre></td></tr> 1038 1039 1040<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> 1041<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations. 1042 1043Given 1044 template <template <typename> class Z, int N> struct C {}; 1045templateTypeParmDecl() 1046 matches 'Z', but not 'N'. 1047</pre></td></tr> 1048 1049 1050<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> 1051<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 1052 1053Given 1054 template <typename T, int N> struct C {}; 1055templateTypeParmDecl() 1056 matches 'T', but not 'N'. 1057</pre></td></tr> 1058 1059 1060<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> 1061<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 1062 1063Given 1064 int X; 1065 namespace NS { 1066 int Y; 1067 } // namespace NS 1068decl(hasDeclContext(translationUnitDecl())) 1069 matches "int X", but not "int Y". 1070</pre></td></tr> 1071 1072 1073<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>>...</td></tr> 1074<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations. 1075 1076Given 1077 typedef int X; 1078 using Y = int; 1079typeAliasDecl() 1080 matches "using Y = int", but not "typedef int X" 1081</pre></td></tr> 1082 1083 1084<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> 1085<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations. 1086 1087typeAliasTemplateDecl() matches 1088 template <typename T> 1089 using Y = X<T>; 1090</pre></td></tr> 1091 1092 1093<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> 1094<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 1095 1096Given 1097 typedef int X; 1098 using Y = int; 1099typedefDecl() 1100 matches "typedef int X", but not "using Y = int" 1101</pre></td></tr> 1102 1103 1104<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>...</td></tr> 1105<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations. 1106 1107Given 1108 typedef int X; 1109 using Y = int; 1110typedefNameDecl() 1111 matches "typedef int X" and "using Y = int" 1112</pre></td></tr> 1113 1114 1115<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> 1116<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 1117typename. 1118 1119Given 1120 template <typename T> 1121 struct Base { typedef T Foo; }; 1122 1123 template<typename T> 1124 struct S : private Base<T> { 1125 using typename Base<T>::Foo; 1126 }; 1127unresolvedUsingTypenameDecl() 1128 matches using Base<T>::Foo </pre></td></tr> 1129 1130 1131<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> 1132<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 1133 1134Given 1135 template<typename X> 1136 class C : private X { 1137 using X::x; 1138 }; 1139unresolvedUsingValueDecl() 1140 matches using X::x </pre></td></tr> 1141 1142 1143<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> 1144<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 1145 1146Given 1147 namespace X { int x; } 1148 using X::x; 1149usingDecl() 1150 matches using X::x </pre></td></tr> 1151 1152 1153<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> 1154<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 1155 1156Given 1157 namespace X { int x; } 1158 using namespace X; 1159usingDirectiveDecl() 1160 matches using namespace X </pre></td></tr> 1161 1162 1163<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingEnumDecl0')"><a name="usingEnumDecl0Anchor">usingEnumDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingEnumDecl.html">UsingEnumDecl</a>>...</td></tr> 1164<tr><td colspan="4" class="doc" id="usingEnumDecl0"><pre>Matches using-enum declarations. 1165 1166Given 1167 namespace X { enum x {...}; } 1168 using enum X::x; 1169usingEnumDecl() 1170 matches using enum X::x </pre></td></tr> 1171 1172 1173<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> 1174<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 1175 1176Example matches A, B, C and F 1177 enum X { A, B, C }; 1178 void F(); 1179</pre></td></tr> 1180 1181 1182<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> 1183<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 1184 1185Note: this does not match declarations of member variables, which are 1186"field" declarations in Clang parlance. 1187 1188Example matches a 1189 int a; 1190</pre></td></tr> 1191 1192 1193<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>></td><td class="name" onclick="toggle('lambdaCapture0')"><a name="lambdaCapture0Anchor">lambdaCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>>...</td></tr> 1194<tr><td colspan="4" class="doc" id="lambdaCapture0"><pre>Matches lambda captures. 1195 1196Given 1197 int main() { 1198 int x; 1199 auto f = [x](){}; 1200 auto g = [x = 1](){}; 1201 } 1202In the matcher `lambdaExpr(hasAnyCapture(lambdaCapture()))`, 1203`lambdaCapture()` matches `x` and `x=1`. 1204</pre></td></tr> 1205 1206 1207<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> 1208<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 1209</pre></td></tr> 1210 1211 1212<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> 1213<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 1214 1215Given 1216 namespace ns { 1217 struct A { static void f(); }; 1218 void A::f() {} 1219 void g() { A::f(); } 1220 } 1221 ns::A a; 1222nestedNameSpecifier() 1223 matches "ns::" and both "A::" 1224</pre></td></tr> 1225 1226 1227<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> 1228<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause. 1229 1230Given 1231 1232 #pragma omp parallel default(none) 1233 #pragma omp parallel default(shared) 1234 #pragma omp parallel default(firstprivate) 1235 #pragma omp parallel 1236 1237``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and 1238``default(firstprivate)`` 1239</pre></td></tr> 1240 1241 1242<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> 1243<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 1244</pre></td></tr> 1245 1246 1247<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>...</td></tr> 1248<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension). 1249 1250Given 1251 FOO: bar(); 1252 void *ptr = &&FOO; 1253 goto *bar; 1254addrLabelExpr() 1255 matches '&&FOO' 1256</pre></td></tr> 1257 1258 1259<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> 1260<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 1261 1262Given 1263 int i = a[1]; 1264arraySubscriptExpr() 1265 matches "a[1]" 1266</pre></td></tr> 1267 1268 1269<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> 1270<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 1271 1272 int i = 100; 1273 __asm("mov al, 2"); 1274asmStmt() 1275 matches '__asm("mov al, 2")' 1276</pre></td></tr> 1277 1278 1279<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> 1280<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins. 1281Example matches __atomic_load_n(ptr, 1) 1282 void foo() { int *ptr; __atomic_load_n(ptr, 1); } 1283</pre></td></tr> 1284 1285 1286<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> 1287<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement. 1288 1289Given 1290 @autoreleasepool { 1291 int x = 0; 1292 } 1293autoreleasePoolStmt(stmt()) matches the declaration of "x" 1294inside the autorelease pool. 1295</pre></td></tr> 1296 1297 1298<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> 1299<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension). 1300 1301Example matches a ?: b 1302 (a ?: b) + 42; 1303</pre></td></tr> 1304 1305 1306<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> 1307<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 1308 1309Example matches a || b 1310 !(a || b) 1311See also the binaryOperation() matcher for more-general matching. 1312</pre></td></tr> 1313 1314 1315<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> 1316<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block. 1317 1318Example: matches "^{}": 1319 void f() { ^{}(); } 1320</pre></td></tr> 1321 1322 1323<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>>...</td></tr> 1324<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 1325 1326Given 1327 while (true) { break; } 1328breakStmt() 1329 matches 'break' 1330</pre></td></tr> 1331 1332 1333<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> 1334<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 1335 1336Example: Matches (int) 2.2f in 1337 int i = (int) 2.2f; 1338</pre></td></tr> 1339 1340 1341<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> 1342<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 1343 1344Example matches x.y() and y() 1345 X x; 1346 x.y(); 1347 y(); 1348</pre></td></tr> 1349 1350 1351<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> 1352<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 1353 1354Given 1355 switch(a) { case 42: break; default: break; } 1356caseStmt() 1357 matches 'case 42:'. 1358</pre></td></tr> 1359 1360 1361<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> 1362<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 1363 1364Example: castExpr() matches each of the following: 1365 (int) 3; 1366 const_cast<Expr *>(SubExpr); 1367 char c = 0; 1368but does not match 1369 int i = (0); 1370 int k = 0; 1371</pre></td></tr> 1372 1373 1374<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> 1375<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 1376 1377Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 1378though. 1379 1380Example matches 'a', L'a' 1381 char ch = 'a'; 1382 wchar_t chw = L'a'; 1383</pre></td></tr> 1384 1385 1386<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>>...</td></tr> 1387<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr. 1388</pre></td></tr> 1389 1390 1391<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('coawaitExpr0')"><a name="coawaitExpr0Anchor">coawaitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoawaitExpr.html">CoawaitExpr</a>>...</td></tr> 1392<tr><td colspan="4" class="doc" id="coawaitExpr0"><pre>Matches co_await expressions. 1393 1394Given 1395 co_await 1; 1396coawaitExpr() 1397 matches 'co_await 1' 1398</pre></td></tr> 1399 1400 1401<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> 1402<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 1403 1404Example match: {1}, (1, 2) 1405 int array[4] = {1}; 1406 vector int myvec = (vector int)(1, 2); 1407</pre></td></tr> 1408 1409 1410<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> 1411<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 1412 1413Example matches '{}' and '{{}}' in 'for (;;) {{}}' 1414 for (;;) {{}} 1415</pre></td></tr> 1416 1417 1418<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> 1419<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 1420 1421Example matches a ? b : c 1422 (a ? b : c) + 42 1423</pre></td></tr> 1424 1425 1426<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> 1427<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper. 1428 1429Example matches the constant in the case statement: 1430 (matcher = constantExpr()) 1431 switch (a) { 1432 case 37: break; 1433 } 1434</pre></td></tr> 1435 1436 1437<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>>...</td></tr> 1438<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 1439 1440Given 1441 while (true) { continue; } 1442continueStmt() 1443 matches 'continue' 1444</pre></td></tr> 1445 1446 1447<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> 1448<tr><td colspan="4" class="doc" id="coreturnStmt0"><pre>Matches co_return statements. 1449 1450Given 1451 while (true) { co_return; } 1452coreturnStmt() 1453 matches 'co_return' 1454</pre></td></tr> 1455 1456 1457<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> 1458<tr><td colspan="4" class="doc" id="coyieldExpr0"><pre>Matches co_yield expressions. 1459 1460Given 1461 co_yield 1; 1462coyieldExpr() 1463 matches 'co_yield 1' 1464</pre></td></tr> 1465 1466 1467<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> 1468<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 1469 1470Example matches, 1471 kernel<<<i,j>>>(); 1472</pre></td></tr> 1473 1474 1475<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>>...</td></tr> 1476<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 1477 1478Example matches FunctionTakesString(GetStringByValue()) 1479 (matcher = cxxBindTemporaryExpr()) 1480 FunctionTakesString(GetStringByValue()); 1481 FunctionTakesStringByPointer(GetStringPointer()); 1482</pre></td></tr> 1483 1484 1485<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> 1486<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 1487 1488Example matches true 1489 true 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('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>>...</td></tr> 1494<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 1495 1496 try {} catch(int i) {} 1497cxxCatchStmt() 1498 matches 'catch(int i)' 1499</pre></td></tr> 1500 1501 1502<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> 1503<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 1504 1505Example: Matches const_cast<int*>(&r) in 1506 int n = 42; 1507 const int &r(n); 1508 int* p = const_cast<int*>(&r); 1509</pre></td></tr> 1510 1511 1512<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> 1513<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 1514 1515Example matches string(ptr, n) and ptr within arguments of f 1516 (matcher = cxxConstructExpr()) 1517 void f(const string &a, const string &b); 1518 char *ptr; 1519 int n; 1520 f(string(ptr, n), ptr); 1521</pre></td></tr> 1522 1523 1524<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> 1525<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 1526 1527Example matches the CXXDefaultArgExpr placeholder inserted for the 1528 default value of the second parameter in the call expression f(42) 1529 (matcher = cxxDefaultArgExpr()) 1530 void f(int x, int y = 0); 1531 f(42); 1532</pre></td></tr> 1533 1534 1535<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> 1536<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 1537 1538Given 1539 delete X; 1540cxxDeleteExpr() 1541 matches 'delete X'. 1542</pre></td></tr> 1543 1544 1545<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> 1546<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be 1547resolved because the base expression or the member name was dependent. 1548 1549Given 1550 template <class T> void f() { T t; t.g(); } 1551cxxDependentScopeMemberExpr() 1552 matches t.g 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('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>>...</td></tr> 1557<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 1558 1559Example: 1560 cxxDynamicCastExpr() 1561matches 1562 dynamic_cast<D*>(&b); 1563in 1564 struct B { virtual ~B() {} }; struct D : B {}; 1565 B b; 1566 D* p = dynamic_cast<D*>(&b); 1567</pre></td></tr> 1568 1569 1570<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> 1571<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 1572 1573cxxForRangeStmt() matches 'for (auto a : i)' 1574 int i[] = {1, 2, 3}; for (auto a : i); 1575 for(int j = 0; j < 5; ++j); 1576</pre></td></tr> 1577 1578 1579<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> 1580<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 1581 1582Example: Matches Foo(bar); 1583 Foo f = bar; 1584 Foo g = (Foo) bar; 1585 Foo h = Foo(bar); 1586</pre></td></tr> 1587 1588 1589<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr> 1590<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 1591 1592Example matches x.y() 1593 X x; 1594 x.y(); 1595</pre></td></tr> 1596 1597 1598<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> 1599<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 1600 1601Given 1602 new X; 1603cxxNewExpr() 1604 matches 'new X'. 1605</pre></td></tr> 1606 1607 1608<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>>...</td></tr> 1609<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions. 1610 1611Given 1612 bool a() noexcept; 1613 bool b() noexcept(true); 1614 bool c() noexcept(false); 1615 bool d() noexcept(noexcept(a())); 1616 bool e = noexcept(b()) || noexcept(c()); 1617cxxNoexceptExpr() 1618 matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`. 1619 doesn't match the noexcept specifier in the declarations a, b, c or d. 1620</pre></td></tr> 1621 1622 1623<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> 1624<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 1625</pre></td></tr> 1626 1627 1628<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr> 1629<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 1630 1631Note that if an operator isn't overloaded, it won't match. Instead, use 1632binaryOperator matcher. 1633Currently it does not match operators such as new delete. 1634FIXME: figure out why these do not match? 1635 1636Example matches both operator<<((o << b), c) and operator<<(o, b) 1637 (matcher = cxxOperatorCallExpr()) 1638 ostream &operator<< (ostream &out, int i) { }; 1639 ostream &o; int b = 1, c = 1; 1640 o << b << c; 1641See also the binaryOperation() matcher for more-general matching of binary 1642uses of this AST node. 1643</pre></td></tr> 1644 1645 1646<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>>...</td></tr> 1647<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 1648 1649Either the source expression or the destination type can be matched 1650using has(), but hasDestinationType() is more specific and can be 1651more readable. 1652 1653Example matches reinterpret_cast<char*>(&p) in 1654 void* p = reinterpret_cast<char*>(&p); 1655</pre></td></tr> 1656 1657 1658<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> 1659<tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators 1660 1661Example matches use of "<": 1662 #include <compare> 1663 struct HasSpaceshipMem { 1664 int a; 1665 constexpr auto operator<=>(const HasSpaceshipMem&) const = default; 1666 }; 1667 void compare() { 1668 HasSpaceshipMem hs1, hs2; 1669 if (hs1 < hs2) 1670 return; 1671 } 1672See also the binaryOperation() matcher for more-general matching 1673of this AST node. 1674</pre></td></tr> 1675 1676 1677<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> 1678<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 1679 1680See also: hasDestinationType 1681See also: reinterpretCast 1682 1683Example: 1684 cxxStaticCastExpr() 1685matches 1686 static_cast<long>(8) 1687in 1688 long eight(static_cast<long>(8)); 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('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>>...</td></tr> 1693<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions. 1694 1695Given 1696 std::vector<int> a({ 1, 2, 3 }); 1697 std::vector<int> b = { 4, 5 }; 1698 int c[] = { 6, 7 }; 1699 std::pair<int, int> d = { 8, 9 }; 1700cxxStdInitializerListExpr() 1701 matches "{ 1, 2, 3 }" and "{ 4, 5 }" 1702</pre></td></tr> 1703 1704 1705<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> 1706<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 1707 1708Example: Matches Foo(bar, bar) 1709 Foo h = Foo(bar, bar); 1710</pre></td></tr> 1711 1712 1713<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> 1714<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 1715 1716Example matches the implicit this expression in "return i". 1717 (matcher = cxxThisExpr()) 1718struct foo { 1719 int i; 1720 int f() { return i; } 1721}; 1722</pre></td></tr> 1723 1724 1725<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> 1726<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 1727 1728 try { throw 5; } catch(int i) {} 1729cxxThrowExpr() 1730 matches 'throw 5' 1731</pre></td></tr> 1732 1733 1734<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> 1735<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 1736 1737 try {} catch(int i) {} 1738cxxTryStmt() 1739 matches 'try {}' 1740</pre></td></tr> 1741 1742 1743<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> 1744<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 1745 1746Example matches T(t) in return statement of f 1747 (matcher = cxxUnresolvedConstructExpr()) 1748 template <typename T> 1749 void f(const T& t) { return T(t); } 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('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>...</td></tr> 1754<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 1755 1756Example matches x in if (x) 1757 bool x; 1758 if (x) {} 1759</pre></td></tr> 1760 1761 1762<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>>...</td></tr> 1763<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 1764 1765Given 1766 int a; 1767declStmt() 1768 matches 'int a'. 1769</pre></td></tr> 1770 1771 1772<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>>...</td></tr> 1773<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 1774 1775Given 1776 switch(a) { case 42: break; default: break; } 1777defaultStmt() 1778 matches 'default:'. 1779</pre></td></tr> 1780 1781 1782<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> 1783<tr><td colspan="4" class="doc" id="dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent 1784</pre></td></tr> 1785 1786 1787<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> 1788<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8]. 1789 1790Example: Matches { [2].y = 1.0, [0].x = 1.0 } 1791 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 1792</pre></td></tr> 1793 1794 1795<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> 1796<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 1797 1798Given 1799 do {} while (true); 1800doStmt() 1801 matches 'do {} while(true)' 1802</pre></td></tr> 1803 1804 1805<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> 1806<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 1807 1808Matches any cast expression written in user code, whether it be a 1809C-style cast, a functional-style cast, or a keyword cast. 1810 1811Does not match implicit conversions. 1812 1813Note: the name "explicitCast" is chosen to match Clang's terminology, as 1814Clang uses the term "cast" to apply to implicit conversions as well as to 1815actual cast expressions. 1816 1817See also: hasDestinationType. 1818 1819Example: matches all five of the casts in 1820 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 1821but does not match the implicit conversion in 1822 long ell = 42; 1823</pre></td></tr> 1824 1825 1826<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> 1827<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 1828 1829Example matches x() 1830 void f() { x(); } 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('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>>...</td></tr> 1835<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 1836of the sub-expression's evaluation. 1837 1838Example matches std::string() 1839 const std::string str = std::string(); 1840</pre></td></tr> 1841 1842 1843<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> 1844<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals 1845</pre></td></tr> 1846 1847 1848<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> 1849<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g. 18501.0, 1.0f, 1.0L and 1e10. 1851 1852Does not match implicit conversions such as 1853 float a = 10; 1854</pre></td></tr> 1855 1856 1857<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> 1858<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 1859 1860Example matches 'for (;;) {}' 1861 for (;;) {} 1862 int i[] = {1, 2, 3}; for (auto a : i); 1863</pre></td></tr> 1864 1865 1866<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> 1867<tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression. 1868</pre></td></tr> 1869 1870 1871<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> 1872<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 1873</pre></td></tr> 1874 1875 1876<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> 1877<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 1878 1879Given 1880 goto FOO; 1881 FOO: bar(); 1882gotoStmt() 1883 matches 'goto FOO' 1884</pre></td></tr> 1885 1886 1887<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> 1888<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 1889 1890Example matches 'if (x) {}' 1891 if (x) {} 1892</pre></td></tr> 1893 1894 1895<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>>...</td></tr> 1896<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating 1897point literals e.g.: 1i, 1.0i 1898</pre></td></tr> 1899 1900 1901<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>>...</td></tr> 1902<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 1903 1904This matches many different places, including function call return value 1905eliding, as well as any type conversions. 1906</pre></td></tr> 1907 1908 1909<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>>...</td></tr> 1910<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions. 1911 1912Given 1913 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 1914implicitValueInitExpr() 1915 matches "[0].y" (implicitly) 1916</pre></td></tr> 1917 1918 1919<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>>...</td></tr> 1920<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 1921 1922Given 1923 int a[] = { 1, 2 }; 1924 struct B { int x, y; }; 1925 B b = { 5, 6 }; 1926initListExpr() 1927 matches "{ 1, 2 }" and "{ 5, 6 }" 1928</pre></td></tr> 1929 1930 1931<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> 1932<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g. 19331, 1L, 0x1 and 1U. 1934 1935Does not match character-encoded integers such as L'a'. 1936</pre></td></tr> 1937 1938 1939<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> 1940<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 1941 1942Given 1943 goto FOO; 1944 FOO: bar(); 1945labelStmt() 1946 matches 'FOO:' 1947</pre></td></tr> 1948 1949 1950<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> 1951<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1952 1953Example matches [&](){return 5;} 1954 [&](){return 5;} 1955</pre></td></tr> 1956 1957 1958<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> 1959<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1960 1961Example: Given 1962 struct T {void func();}; 1963 T f(); 1964 void g(T); 1965materializeTemporaryExpr() matches 'f()' in these statements 1966 T u(f()); 1967 g(f()); 1968 f().func(); 1969but does not match 1970 f(); 1971</pre></td></tr> 1972 1973 1974<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> 1975<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1976 1977Given 1978 class Y { 1979 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1980 int a; static int b; 1981 }; 1982memberExpr() 1983 matches this->x, x, y.x, a, this->b 1984</pre></td></tr> 1985 1986 1987<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> 1988<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1989 1990 foo();; 1991nullStmt() 1992 matches the second ';' 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('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>>...</td></tr> 1997<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements. 1998 1999Example matches @catch 2000 @try {} 2001 @catch (...) {} 2002</pre></td></tr> 2003 2004 2005<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> 2006<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements. 2007 2008Example matches @finally 2009 @try {} 2010 @finally {} 2011</pre></td></tr> 2012 2013 2014<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> 2015<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar. 2016 2017Example: matches "a" in "init" method: 2018@implementation A { 2019 NSString *a; 2020} 2021- (void) init { 2022 a = @"hello"; 2023} 2024</pre></td></tr> 2025 2026 2027<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> 2028<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 2029 2030The innermost message send invokes the "alloc" class method on the 2031NSString class, while the outermost message send invokes the 2032"initWithString" instance method on the object returned from 2033NSString's "alloc". This matcher should match both message sends. 2034 [[NSString alloc] initWithString:@"Hello"] 2035</pre></td></tr> 2036 2037 2038<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> 2039<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements. 2040 2041Example matches @throw obj; 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('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>>...</td></tr> 2046<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements. 2047 2048Example matches @try 2049 @try {} 2050 @catch (...) {} 2051</pre></td></tr> 2052 2053 2054<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>>...</td></tr> 2055<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive. 2056 2057Given 2058 2059 #pragma omp parallel 2060 #pragma omp parallel default(none) 2061 #pragma omp taskyield 2062 2063``ompExecutableDirective()`` matches ``omp parallel``, 2064``omp parallel default(none)`` and ``omp taskyield``. 2065</pre></td></tr> 2066 2067 2068<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> 2069<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers 2070to reference another expressions and can be met 2071in BinaryConditionalOperators, for example. 2072 2073Example matches 'a' 2074 (a ?: c) + 42; 2075</pre></td></tr> 2076 2077 2078<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> 2079<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions. 2080 2081Example matches (foo() + 1) 2082 int foo() { return 1; } 2083 int a = (foo() + 1); 2084</pre></td></tr> 2085 2086 2087<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> 2088<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions. 2089ParenListExprs don't have a predefined type and are used for late parsing. 2090In the final AST, they can be met in template declarations. 2091 2092Given 2093 template<typename T> class X { 2094 void f() { 2095 X x(*this); 2096 int a = 0, b = 1; int i = (a, b); 2097 } 2098 }; 2099parenListExpr() matches "*this" but NOT matches (a, b) because (a, b) 2100has a predefined type and is a ParenExpr, not a ParenListExpr. 2101</pre></td></tr> 2102 2103 2104<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> 2105<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2]. 2106 2107Example: Matches __func__ 2108 printf("%s", __func__); 2109</pre></td></tr> 2110 2111 2112<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> 2113<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 2114 2115Given 2116 return 1; 2117returnStmt() 2118 matches 'return 1' 2119</pre></td></tr> 2120 2121 2122<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> 2123<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 2124 2125Given 2126 { ++a; } 2127stmt() 2128 matches both the compound statement '{ ++a; }' and '++a'. 2129</pre></td></tr> 2130 2131 2132<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> 2133<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension). 2134 2135Example match: ({ int X = 4; X; }) 2136 int C = ({ int X = 4; X; }); 2137</pre></td></tr> 2138 2139 2140<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> 2141<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 2142 2143Example matches "abcd", L"abcd" 2144 char *s = "abcd"; 2145 wchar_t *ws = L"abcd"; 2146</pre></td></tr> 2147 2148 2149<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> 2150<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 2151 2152Given 2153 template <int N> 2154 struct A { static const int n = N; }; 2155 struct B : public A<42> {}; 2156substNonTypeTemplateParmExpr() 2157 matches "N" in the right-hand side of "static const int n = N;" 2158</pre></td></tr> 2159 2160 2161<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> 2162<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 2163 2164Given 2165 switch(a) { case 42: break; default: break; } 2166switchCase() 2167 matches 'case 42:' and 'default:'. 2168</pre></td></tr> 2169 2170 2171<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> 2172<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 2173 2174Given 2175 switch(a) { case 42: break; default: break; } 2176switchStmt() 2177 matches 'switch(a)'. 2178</pre></td></tr> 2179 2180 2181<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> 2182<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 2183 2184Given 2185 Foo x = bar; 2186 int y = sizeof(x) + alignof(x); 2187unaryExprOrTypeTraitExpr() 2188 matches sizeof(x) and alignof(x) 2189</pre></td></tr> 2190 2191 2192<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> 2193<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 2194 2195Example matches !a 2196 !a || b 2197</pre></td></tr> 2198 2199 2200<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> 2201<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing 2202but could not be resolved to a specific declaration. 2203 2204Given 2205 template<typename T> 2206 T foo() { T a; return a; } 2207 template<typename T> 2208 void bar() { 2209 foo<T>(); 2210 } 2211unresolvedLookupExpr() 2212 matches foo<T>() </pre></td></tr> 2213 2214 2215<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> 2216<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions. 2217 2218Given 2219 struct X { 2220 template <class T> void f(); 2221 void g(); 2222 }; 2223 template <class T> void h() { X x; x.f<T>(); x.g(); } 2224unresolvedMemberExpr() 2225 matches x.f<T> 2226</pre></td></tr> 2227 2228 2229<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> 2230<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 2231 2232Example match: "foo"_suffix 2233</pre></td></tr> 2234 2235 2236<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> 2237<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 2238 2239Given 2240 while (true) {} 2241whileStmt() 2242 matches 'while (true) {}'. 2243</pre></td></tr> 2244 2245 2246<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> 2247<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info). 2248 2249Given 2250 template <typename T> struct C {}; 2251 C<int> c; 2252templateArgumentLoc() 2253 matches 'int' in C<int>. 2254</pre></td></tr> 2255 2256 2257<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> 2258<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 2259 2260Given 2261 template <typename T> struct C {}; 2262 C<int> c; 2263templateArgument() 2264 matches 'int' in C<int>. 2265</pre></td></tr> 2266 2267 2268<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> 2269<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name. 2270 2271Given 2272 template <typename T> class X { }; 2273 X<int> xi; 2274templateName() 2275 matches 'X' in X<int>. 2276</pre></td></tr> 2277 2278 2279<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('elaboratedTypeLoc0')"><a name="elaboratedTypeLoc0Anchor">elaboratedTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html">ElaboratedTypeLoc</a>>...</td></tr> 2280<tr><td colspan="4" class="doc" id="elaboratedTypeLoc0"><pre>Matches C or C++ elaborated `TypeLoc`s. 2281 2282Given 2283 struct s {}; 2284 struct s ss; 2285elaboratedTypeLoc() 2286 matches the `TypeLoc` of the variable declaration of `ss`. 2287</pre></td></tr> 2288 2289 2290<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('pointerTypeLoc0')"><a name="pointerTypeLoc0Anchor">pointerTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>>...</td></tr> 2291<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer `TypeLoc`s. 2292 2293Given 2294 int* x; 2295pointerTypeLoc() 2296 matches `int*`. 2297</pre></td></tr> 2298 2299 2300<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('qualifiedTypeLoc0')"><a name="qualifiedTypeLoc0Anchor">qualifiedTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualifiedTypeLoc.html">QualifiedTypeLoc</a>>...</td></tr> 2301<tr><td colspan="4" class="doc" id="qualifiedTypeLoc0"><pre>Matches `QualifiedTypeLoc`s in the clang AST. 2302 2303Given 2304 const int x = 0; 2305qualifiedTypeLoc() 2306 matches `const int`. 2307</pre></td></tr> 2308 2309 2310<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('referenceTypeLoc0')"><a name="referenceTypeLoc0Anchor">referenceTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>>...</td></tr> 2311<tr><td colspan="4" class="doc" id="referenceTypeLoc0"><pre>Matches reference `TypeLoc`s. 2312 2313Given 2314 int x = 3; 2315 int& l = x; 2316 int&& r = 3; 2317referenceTypeLoc() 2318 matches `int&` and `int&&`. 2319</pre></td></tr> 2320 2321 2322<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('templateSpecializationTypeLoc0')"><a name="templateSpecializationTypeLoc0Anchor">templateSpecializationTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>>...</td></tr> 2323<tr><td colspan="4" class="doc" id="templateSpecializationTypeLoc0"><pre>Matches template specialization `TypeLoc`s. 2324 2325Given 2326 template <typename T> class C {}; 2327 C<char> var; 2328varDecl(hasTypeLoc(templateSpecializationTypeLoc(typeLoc()))) 2329 matches `C<char> var`. 2330</pre></td></tr> 2331 2332 2333<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> 2334<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 2335</pre></td></tr> 2336 2337 2338<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>...</td></tr> 2339<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 2340 2341Given 2342 int a[] = { 2, 3 }; 2343 int b[4]; 2344 void f() { int c[a[0]]; } 2345arrayType() 2346 matches "int a[]", "int b[4]" and "int c[a[0]]"; 2347</pre></td></tr> 2348 2349 2350<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> 2351<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 2352 2353Given 2354 _Atomic(int) i; 2355atomicType() 2356 matches "_Atomic(int) i" 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('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>>...</td></tr> 2361<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 2362 2363Given: 2364 auto n = 4; 2365 int v[] = { 2, 3 } 2366 for (auto i : v) { } 2367autoType() 2368 matches "auto n" and "auto i" 2369</pre></td></tr> 2370 2371 2372<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> 2373<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 2374"void (^)(int)". 2375 2376The pointee is always required to be a FunctionType. 2377</pre></td></tr> 2378 2379 2380<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>>...</td></tr> 2381<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 2382 2383Given 2384 struct A {}; 2385 A a; 2386 int b; 2387 float c; 2388 bool d; 2389builtinType() 2390 matches "int b", "float c" and "bool d" 2391</pre></td></tr> 2392 2393 2394<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> 2395<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 2396 2397Given 2398 _Complex float f; 2399complexType() 2400 matches "_Complex float f" 2401</pre></td></tr> 2402 2403 2404<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> 2405<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 2406 2407Given 2408 void() { 2409 int a[2]; 2410 int b[] = { 2, 3 }; 2411 int c[b[0]]; 2412 } 2413constantArrayType() 2414 matches "int a[2]" 2415</pre></td></tr> 2416 2417 2418<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> 2419<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 2420Example matches i[] in declaration of f. 2421 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 2422Example matches i[1]. 2423 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 2424 void f(int i[]) { 2425 i[1] = 0; 2426 } 2427</pre></td></tr> 2428 2429 2430<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> 2431<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(<expr>) types. 2432 2433Given: 2434 short i = 1; 2435 int j = 42; 2436 decltype(i + j) result = i + j; 2437decltypeType() 2438 matches "decltype(i + j)" 2439</pre></td></tr> 2440 2441 2442<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> 2443<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class 2444template types. 2445 2446Given 2447 template <typename T> 2448 class C { public: C(T); }; 2449 2450 C c(123); 2451deducedTemplateSpecializationType() matches the type in the declaration 2452of the variable c. 2453</pre></td></tr> 2454 2455 2456<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> 2457<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 2458 2459Given 2460 template<typename T, int Size> 2461 class array { 2462 T data[Size]; 2463 }; 2464dependentSizedArrayType 2465 matches "T data[Size]" 2466</pre></td></tr> 2467 2468 2469<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> 2470<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 2471qualified name. 2472 2473Given 2474 namespace N { 2475 namespace M { 2476 class D {}; 2477 } 2478 } 2479 class C {}; 2480 2481 class C c; 2482 N::M::D d; 2483 2484elaboratedType() matches the type of the variable declarations of both 2485c and d. 2486</pre></td></tr> 2487 2488 2489<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> 2490<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types. 2491 2492Given 2493 enum C { Green }; 2494 enum class S { Red }; 2495 2496 C c; 2497 S s; 2498 2499enumType() matches the type of the variable declarations of both c and 2500s. 2501</pre></td></tr> 2502 2503 2504<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> 2505<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes. 2506 2507Given 2508 int (*f)(int); 2509 void g(); 2510functionProtoType() 2511 matches "int (*f)(int)" and the type of "g" in C++ mode. 2512 In C mode, "g" is not matched because it does not contain a prototype. 2513</pre></td></tr> 2514 2515 2516<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> 2517<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 2518 2519Given 2520 int (*f)(int); 2521 void g(); 2522functionType() 2523 matches "int (*f)(int)" and the type of "g". 2524</pre></td></tr> 2525 2526 2527<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> 2528<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 2529 2530Given 2531 int a[] = { 2, 3 }; 2532 int b[42]; 2533 void f(int c[]) { int d[a[0]]; }; 2534incompleteArrayType() 2535 matches "int a[]" and "int c[]" 2536</pre></td></tr> 2537 2538 2539<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> 2540<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 2541 2542Example matches S s, but not S<T> s. 2543 (matcher = parmVarDecl(hasType(injectedClassNameType()))) 2544 template <typename T> struct S { 2545 void f(S s); 2546 void g(S<T> s); 2547 }; 2548</pre></td></tr> 2549 2550 2551<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> 2552<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 2553 2554Given: 2555 int *a; 2556 int &b = *a; 2557 int &&c = 1; 2558 auto &d = b; 2559 auto &&e = c; 2560 auto &&f = 2; 2561 int g = 5; 2562 2563lValueReferenceType() matches the types of b, d, and e. e is 2564matched since the type is deduced as int& by reference collapsing rules. 2565</pre></td></tr> 2566 2567 2568<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> 2569<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 2570Given 2571 struct A { int i; } 2572 A::* ptr = A::i; 2573memberPointerType() 2574 matches "A::* ptr" 2575</pre></td></tr> 2576 2577 2578<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> 2579<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 2580a pointer type, despite being syntactically similar. 2581 2582Given 2583 int *a; 2584 2585 @interface Foo 2586 @end 2587 Foo *f; 2588pointerType() 2589 matches "Foo *f", but does not match "int *a". 2590</pre></td></tr> 2591 2592 2593<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> 2594<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 2595 2596Given 2597 int (*ptr_to_array)[4]; 2598 int *array_of_ptrs[4]; 2599 2600varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 2601array_of_ptrs. 2602</pre></td></tr> 2603 2604 2605<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> 2606<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 2607types. 2608 2609Given 2610 int *a; 2611 int &b = *a; 2612 int c = 5; 2613 2614 @interface Foo 2615 @end 2616 Foo *f; 2617pointerType() 2618 matches "int *a", but does not match "Foo *f". 2619</pre></td></tr> 2620 2621 2622<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> 2623<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 2624 2625Given: 2626 int *a; 2627 int &b = *a; 2628 int &&c = 1; 2629 auto &d = b; 2630 auto &&e = c; 2631 auto &&f = 2; 2632 int g = 5; 2633 2634rValueReferenceType() matches the types of c and f. e is not 2635matched as it is deduced to int& by reference collapsing rules. 2636</pre></td></tr> 2637 2638 2639<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> 2640<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 2641 2642Given 2643 class C {}; 2644 struct S {}; 2645 2646 C c; 2647 S s; 2648 2649recordType() matches the type of the variable declarations of both c 2650and s. 2651</pre></td></tr> 2652 2653 2654<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> 2655<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 2656 2657Given 2658 int *a; 2659 int &b = *a; 2660 int &&c = 1; 2661 auto &d = b; 2662 auto &&e = c; 2663 auto &&f = 2; 2664 int g = 5; 2665 2666referenceType() matches the types of b, c, d, e, and f. 2667</pre></td></tr> 2668 2669 2670<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> 2671<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 2672template type parameter. 2673 2674Given 2675 template <typename T> 2676 void F(T t) { 2677 int i = 1 + t; 2678 } 2679 2680substTemplateTypeParmType() matches the type of 't' but not '1' 2681</pre></td></tr> 2682 2683 2684<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> 2685<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types). 2686 2687Given 2688 enum E {}; 2689 class C {}; 2690 2691 E e; 2692 C c; 2693 2694tagType() matches the type of the variable declarations of both e 2695and c. 2696</pre></td></tr> 2697 2698 2699<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> 2700<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 2701 2702Given 2703 template <typename T> 2704 class C { }; 2705 2706 template class C<int>; // A 2707 C<char> var; // B 2708 2709templateSpecializationType() matches the type of the explicit 2710instantiation in A and the type of the variable declaration in B. 2711</pre></td></tr> 2712 2713 2714<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> 2715<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 2716 2717Example matches T, but not int. 2718 (matcher = templateTypeParmType()) 2719 template <typename T> void f(int i); 2720</pre></td></tr> 2721 2722 2723<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> 2724<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 2725</pre></td></tr> 2726 2727 2728<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> 2729<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 2730 2731Given 2732 typedef int X; 2733typedefType() 2734 matches "typedef int X" 2735</pre></td></tr> 2736 2737 2738<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> 2739<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 2740 2741Given: 2742 typedef __underlying_type(T) type; 2743unaryTransformType() 2744 matches "__underlying_type(T)" 2745</pre></td></tr> 2746 2747 2748<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> 2749<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 2750integer-constant-expression. 2751 2752Given 2753 void f() { 2754 int a[] = { 2, 3 } 2755 int b[42]; 2756 int c[a[0]]; 2757 } 2758variableArrayType() 2759 matches "int c[a[0]]" 2760</pre></td></tr> 2761 2762<!--END_DECL_MATCHERS --> 2763</table> 2764 2765<!-- ======================================================================= --> 2766<h2 id="narrowing-matchers">Narrowing Matchers</h2> 2767<!-- ======================================================================= --> 2768 2769<p>Narrowing matchers match certain attributes on the current node, thus 2770narrowing down the set of nodes of the current type to match on.</p> 2771 2772<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 2773which allow users to create more powerful match expressions.</p> 2774 2775<table> 2776<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 2777<!-- START_NARROWING_MATCHERS --> 2778 2779<tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2780<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 2781 2782Usable as: Any Matcher 2783</pre></td></tr> 2784 2785 2786<tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2787<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 2788 2789Usable as: Any Matcher 2790</pre></td></tr> 2791 2792 2793<tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 2794<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 2795 2796Useful when another matcher requires a child matcher, but there's no 2797additional constraint. This will often be used with an explicit conversion 2798to an internal::Matcher<> type such as TypeMatcher. 2799 2800Example: DeclarationMatcher(anything()) matches all declarations, e.g., 2801"int* p" and "void f()" in 2802 int* p; 2803 void f(); 2804 2805Usable as: Any Matcher 2806</pre></td></tr> 2807 2808 2809<tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr> 2810<tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within 2811 2812Given 2813 if (true); 2814 for (; true; ); 2815with the matcher 2816 mapAnyOf(ifStmt, forStmt).with( 2817 hasCondition(cxxBoolLiteralExpr(equals(true))) 2818 ).bind("trueCond") 2819matches the if and the for. It is equivalent to: 2820 auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true))); 2821 anyOf( 2822 ifStmt(trueCond).bind("trueCond"), 2823 forStmt(trueCond).bind("trueCond") 2824 ); 2825 2826The with() chain-call accepts zero or more matchers which are combined 2827as-if with allOf() in each of the node matchers. 2828Usable as: Any Matcher 2829</pre></td></tr> 2830 2831 2832<tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 2833<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 2834 2835Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 2836 class X {}; 2837 class Y {}; 2838 2839Usable as: Any Matcher 2840</pre></td></tr> 2841 2842 2843<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>></td><td class="name" onclick="toggle('isImplicit1')"><a name="isImplicit1Anchor">isImplicit</a></td><td></td></tr> 2844<tr><td colspan="4" class="doc" id="isImplicit1"><pre>Matches an entity that has been implicitly added by the compiler (e.g. 2845implicit default/copy constructors). 2846</pre></td></tr> 2847 2848 2849<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> 2850<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the 2851specified names. 2852 2853 hasAnyOperatorName("+", "-") 2854 Is equivalent to 2855 anyOf(hasOperatorName("+"), hasOperatorName("-")) 2856</pre></td></tr> 2857 2858 2859<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> 2860<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 2861unary). 2862 2863Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 2864 !(a || b) 2865</pre></td></tr> 2866 2867 2868<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> 2869<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators. 2870 2871Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2872 if (a == b) 2873 a += b; 2874 2875Example 2: matches s1 = s2 2876 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2877 struct S { S& operator=(const S&); }; 2878 void x() { S s1, s2; s1 = s2; } 2879</pre></td></tr> 2880 2881 2882<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> 2883<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators. 2884 2885Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 2886 if (a == b) 2887 a += b; 2888 2889Example 2: matches s1 < s2 2890 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 2891 struct S { bool operator<(const S& other); }; 2892 void x(S s1, S s2) { bool b1 = s1 < s2; } 2893</pre></td></tr> 2894 2895 2896<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> 2897<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private 2898inheritance. 2899 2900Examples: 2901 class C { 2902 public: int a; 2903 protected: int b; 2904 private: int c; // fieldDecl(isPrivate()) matches 'c' 2905 }; 2906 2907 struct Base {}; 2908 struct Derived1 : private Base {}; // matches 'Base' 2909 class Derived2 : Base {}; // matches 'Base' 2910</pre></td></tr> 2911 2912 2913<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> 2914<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify 2915protected inheritance. 2916 2917Examples: 2918 class C { 2919 public: int a; 2920 protected: int b; // fieldDecl(isProtected()) matches 'b' 2921 private: int c; 2922 }; 2923 2924 class Base {}; 2925 class Derived : protected Base {}; // matches 'Base' 2926</pre></td></tr> 2927 2928 2929<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> 2930<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public 2931inheritance. 2932 2933Examples: 2934 class C { 2935 public: int a; // fieldDecl(isPublic()) matches 'a' 2936 protected: int b; 2937 private: int c; 2938 }; 2939 2940 class Base {}; 2941 class Derived1 : public Base {}; // matches 'Base' 2942 struct Derived2 : Base {}; // matches 'Base' 2943</pre></td></tr> 2944 2945 2946<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> 2947<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify 2948virtual inheritance. 2949 2950Example: 2951 class A { 2952 public: 2953 virtual void x(); // matches x 2954 }; 2955 2956Example: 2957 class Base {}; 2958 class DirectlyDerived : virtual Base {}; // matches Base 2959 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 2960 2961Usable 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>> 2962</pre></td></tr> 2963 2964 2965<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> 2966<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr> 2967 2968 2969<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> 2970<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT. 2971 2972Given 2973 f('false, 3.14, 42); 2974characterLiteral(equals(0)) 2975 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2976 match false 2977floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2978 match 3.14 2979integerLiteral(equals(42)) 2980 matches 42 2981 2982Note that you cannot directly match a negative numeric literal because the 2983minus sign is not part of the literal: It is a unary operator whose operand 2984is the positive numeric literal. Instead, you must use a unaryOperator() 2985matcher to match the minus sign: 2986 2987unaryOperator(hasOperatorName("-"), 2988 hasUnaryOperand(integerLiteral(equals(13)))) 2989 2990Usable 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>>, 2991 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>> 2992</pre></td></tr> 2993 2994 2995<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> 2996<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr> 2997 2998 2999<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> 3000<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr> 3001 3002 3003<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> 3004<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 3005 3006Given 3007 try { 3008 // ... 3009 } catch (int) { 3010 // ... 3011 } catch (...) { 3012 // ... 3013 } 3014cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 3015</pre></td></tr> 3016 3017 3018<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> 3019<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 3020a specific number of arguments (including absent default arguments). 3021 3022Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3023 void f(int x, int y); 3024 f(0, 0); 3025</pre></td></tr> 3026 3027 3028<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> 3029<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 3030</pre></td></tr> 3031 3032 3033<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> 3034<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 3035zero initialization. 3036 3037Given 3038void foo() { 3039 struct point { double x; double y; }; 3040 point pt[2] = { { 1.0, 2.0 } }; 3041} 3042initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 3043will match the implicit array filler for pt[1]. 3044</pre></td></tr> 3045 3046 3047<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> 3048<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 3049 3050Given 3051 struct S { 3052 S(); // #1 3053 S(const S &); // #2 3054 S(S &&); // #3 3055 }; 3056cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 3057</pre></td></tr> 3058 3059 3060<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> 3061<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 3062 3063Given 3064 struct S { 3065 S(); // #1 3066 S(const S &); // #2 3067 S(S &&); // #3 3068 }; 3069cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 3070</pre></td></tr> 3071 3072 3073<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> 3074<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 3075 3076Given 3077 struct S { 3078 S(); // #1 3079 S(int) {} // #2 3080 S(S &&) : S() {} // #3 3081 }; 3082 S::S() : S(0) {} // #4 3083cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 3084#1 or #2. 3085</pre></td></tr> 3086 3087 3088<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> 3089<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations 3090that have an explicit specifier if this explicit specifier is resolved to 3091true. 3092 3093Given 3094 template<bool b> 3095 struct S { 3096 S(int); // #1 3097 explicit S(double); // #2 3098 operator int(); // #3 3099 explicit operator bool(); // #4 3100 explicit(false) S(bool) // # 7 3101 explicit(true) S(char) // # 8 3102 explicit(b) S(S) // # 9 3103 }; 3104 S(int) -> S<true> // #5 3105 explicit S(double) -> S<false> // #6 3106cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3107cxxConversionDecl(isExplicit()) will match #4, but not #3. 3108cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3109</pre></td></tr> 3110 3111 3112<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isInheritingConstructor0')"><a name="isInheritingConstructor0Anchor">isInheritingConstructor</a></td><td></td></tr> 3113<tr><td colspan="4" class="doc" id="isInheritingConstructor0"><pre></pre></td></tr> 3114 3115 3116<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> 3117<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 3118 3119Given 3120 struct S { 3121 S(); // #1 3122 S(const S &); // #2 3123 S(S &&); // #3 3124 }; 3125cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 3126</pre></td></tr> 3127 3128 3129<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> 3130<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations 3131that have an explicit specifier if this explicit specifier is resolved to 3132true. 3133 3134Given 3135 template<bool b> 3136 struct S { 3137 S(int); // #1 3138 explicit S(double); // #2 3139 operator int(); // #3 3140 explicit operator bool(); // #4 3141 explicit(false) S(bool) // # 7 3142 explicit(true) S(char) // # 8 3143 explicit(b) S(S) // # 9 3144 }; 3145 S(int) -> S<true> // #5 3146 explicit S(double) -> S<false> // #6 3147cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3148cxxConversionDecl(isExplicit()) will match #4, but not #3. 3149cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3150</pre></td></tr> 3151 3152 3153<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> 3154<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 3155opposed to a member. 3156 3157Given 3158 struct B {}; 3159 struct D : B { 3160 int I; 3161 D(int i) : I(i) {} 3162 }; 3163 struct E : B { 3164 E() : B() {} 3165 }; 3166cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 3167 will match E(), but not match D(int). 3168</pre></td></tr> 3169 3170 3171<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> 3172<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 3173opposed to a base. 3174 3175Given 3176 struct B {}; 3177 struct D : B { 3178 int I; 3179 D(int i) : I(i) {} 3180 }; 3181 struct E : B { 3182 E() : B() {} 3183 }; 3184cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 3185 will match D(int), but not match E(). 3186</pre></td></tr> 3187 3188 3189<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> 3190<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 3191code (as opposed to implicitly added by the compiler). 3192 3193Given 3194 struct Foo { 3195 Foo() { } 3196 Foo(int) : foo_("A") { } 3197 string foo_; 3198 }; 3199cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 3200 will match Foo(int), but not Foo() 3201</pre></td></tr> 3202 3203 3204<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> 3205<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations 3206that have an explicit specifier if this explicit specifier is resolved to 3207true. 3208 3209Given 3210 template<bool b> 3211 struct S { 3212 S(int); // #1 3213 explicit S(double); // #2 3214 operator int(); // #3 3215 explicit operator bool(); // #4 3216 explicit(false) S(bool) // # 7 3217 explicit(true) S(char) // # 8 3218 explicit(b) S(S) // # 9 3219 }; 3220 S(int) -> S<true> // #5 3221 explicit S(double) -> S<false> // #6 3222cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3223cxxConversionDecl(isExplicit()) will match #4, but not #3. 3224cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3225</pre></td></tr> 3226 3227 3228<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> 3229<tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names. 3230 3231In template declarations, dependent members are not resolved and so can 3232not be matched to particular named declarations. 3233 3234This matcher allows to match on the known name of members. 3235 3236Given 3237 template <typename T> 3238 struct S { 3239 void mem(); 3240 }; 3241 template <typename T> 3242 void x() { 3243 S<T> s; 3244 s.mem(); 3245 } 3246cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()` 3247</pre></td></tr> 3248 3249 3250<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> 3251<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed 3252to '.'. 3253 3254Member calls on the implicit this pointer match as called with '->'. 3255 3256Given 3257 class Y { 3258 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3259 template <class T> void f() { this->f<T>(); f<T>(); } 3260 int a; 3261 static int b; 3262 }; 3263 template <class T> 3264 class Z { 3265 void x() { this->m; } 3266 }; 3267memberExpr(isArrow()) 3268 matches this->x, x, y.x, a, this->b 3269cxxDependentScopeMemberExpr(isArrow()) 3270 matches this->m 3271unresolvedMemberExpr(isArrow()) 3272 matches this->f<T>, f<T> 3273</pre></td></tr> 3274 3275 3276<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> 3277<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound 3278node 3279 3280In template declarations, dependent members are not resolved and so can 3281not be matched to particular named declarations. 3282 3283This matcher allows to match on the name of already-bound VarDecl, FieldDecl 3284and CXXMethodDecl nodes. 3285 3286Given 3287 template <typename T> 3288 struct S { 3289 void mem(); 3290 }; 3291 template <typename T> 3292 void x() { 3293 S<T> s; 3294 s.mem(); 3295 } 3296The matcher 3297@code 3298cxxDependentScopeMemberExpr( 3299 hasObjectExpression(declRefExpr(hasType(templateSpecializationType( 3300 hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has( 3301 cxxMethodDecl(hasName("mem")).bind("templMem") 3302 ))))) 3303 )))), 3304 memberHasSameNameAsBoundNode("templMem") 3305 ) 3306@endcode 3307first matches and binds the @c mem member of the @c S template, then 3308compares its name to the usage in @c s.mem() in the @c x function template 3309</pre></td></tr> 3310 3311 3312<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> 3313<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 3314 3315Given 3316struct A { 3317 void foo() const; 3318 void bar(); 3319}; 3320 3321cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 3322</pre></td></tr> 3323 3324 3325<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> 3326<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 3327operator. 3328 3329Given 3330struct A { 3331 A &operator=(const A &); 3332 A &operator=(A &&); 3333}; 3334 3335cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 3336the second one. 3337</pre></td></tr> 3338 3339 3340<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> 3341<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 3342 3343Given: 3344 class A final {}; 3345 3346 struct B { 3347 virtual void f(); 3348 }; 3349 3350 struct C : B { 3351 void f() final; 3352 }; 3353matches A and C::f, but not B, C, or B::f 3354</pre></td></tr> 3355 3356 3357<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> 3358<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 3359operator. 3360 3361Given 3362struct A { 3363 A &operator=(const A &); 3364 A &operator=(A &&); 3365}; 3366 3367cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 3368the first one. 3369</pre></td></tr> 3370 3371 3372<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> 3373<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 3374 3375Given 3376 class A { 3377 public: 3378 virtual void x(); 3379 }; 3380 class B : public A { 3381 public: 3382 virtual void x(); 3383 }; 3384 matches B::x 3385</pre></td></tr> 3386 3387 3388<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> 3389<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 3390 3391Given 3392 class A { 3393 public: 3394 virtual void x() = 0; 3395 }; 3396 matches A::x 3397</pre></td></tr> 3398 3399 3400<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> 3401<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 3402 3403Given 3404 struct S { 3405 S(); // #1 3406 S(const S &) = default; // #2 3407 S(S &&) = delete; // #3 3408 }; 3409cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 3410</pre></td></tr> 3411 3412 3413<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> 3414<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify 3415virtual inheritance. 3416 3417Example: 3418 class A { 3419 public: 3420 virtual void x(); // matches x 3421 }; 3422 3423Example: 3424 class Base {}; 3425 class DirectlyDerived : virtual Base {}; // matches Base 3426 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 3427 3428Usable 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>> 3429</pre></td></tr> 3430 3431 3432<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> 3433<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 3434 3435Given 3436 class A { 3437 public: 3438 virtual void x(); 3439 }; 3440 class B : public A { 3441 public: 3442 void x(); 3443 }; 3444 matches A::x but not B::x 3445</pre></td></tr> 3446 3447 3448<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> 3449<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions. 3450 3451Given: 3452 MyClass *p1 = new MyClass[10]; 3453cxxNewExpr(isArray()) 3454 matches the expression 'new MyClass[10]'. 3455</pre></td></tr> 3456 3457 3458<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> 3459<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the 3460specified names. 3461 3462 hasAnyOperatorName("+", "-") 3463 Is equivalent to 3464 anyOf(hasOperatorName("+"), hasOperatorName("-")) 3465</pre></td></tr> 3466 3467 3468<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> 3469<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names. 3470 3471Matches overloaded operator names specified in strings without the 3472"operator" prefix: e.g. "<<". 3473 3474 hasAnyOverloadedOperatorName("+", "-") 3475Is equivalent to 3476 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3477</pre></td></tr> 3478 3479 3480<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> 3481<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 3482unary). 3483 3484Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3485 !(a || b) 3486</pre></td></tr> 3487 3488 3489<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> 3490<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 3491 3492Matches overloaded operator names specified in strings without the 3493"operator" prefix: e.g. "<<". 3494 3495Given: 3496 class A { int operator*(); }; 3497 const A &operator<<(const A &a, const A &b); 3498 A a; 3499 a << a; // <-- This matches 3500 3501cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3502specified line and 3503cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3504matches the declaration of A. 3505 3506Usable 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>> 3507</pre></td></tr> 3508 3509 3510<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> 3511<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators. 3512 3513Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3514 if (a == b) 3515 a += b; 3516 3517Example 2: matches s1 = s2 3518 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3519 struct S { S& operator=(const S&); }; 3520 void x() { S s1, s2; s1 = s2; } 3521</pre></td></tr> 3522 3523 3524<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> 3525<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators. 3526 3527Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3528 if (a == b) 3529 a += b; 3530 3531Example 2: matches s1 < s2 3532 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3533 struct S { bool operator<(const S& other); }; 3534 void x(S s1, S s2) { bool b1 = s1 < s2; } 3535</pre></td></tr> 3536 3537 3538<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> 3539<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined. 3540 3541Example matches x (matcher = cxxRecordDecl(hasDefinition())) 3542class x {}; 3543class y; 3544</pre></td></tr> 3545 3546 3547<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> 3548<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 3549</pre></td></tr> 3550 3551 3552<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> 3553<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 3554</pre></td></tr> 3555 3556 3557<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> 3558<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 3559static member variable template instantiations. 3560 3561Given 3562 template<typename T> void A(T t) { } 3563 template<> void A(int N) { } 3564functionDecl(isExplicitTemplateSpecialization()) 3565 matches the specialization A<int>(). 3566 3567Usable 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>> 3568</pre></td></tr> 3569 3570 3571<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> 3572<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 3573 3574Given: 3575 class A final {}; 3576 3577 struct B { 3578 virtual void f(); 3579 }; 3580 3581 struct C : B { 3582 void f() final; 3583 }; 3584matches A and C::f, but not B, C, or B::f 3585</pre></td></tr> 3586 3587 3588<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> 3589<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 3590 3591Given: 3592 auto x = []{}; 3593 3594cxxRecordDecl(isLambda()) matches the implicit class declaration of 3595decltype(x) 3596</pre></td></tr> 3597 3598 3599<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> 3600<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for 3601isSameOrDerivedFrom(hasName(...)). 3602</pre></td></tr> 3603 3604 3605<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> 3606<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 3607member variable template instantiations. 3608 3609Given 3610 template <typename T> class X {}; class A {}; X<A> x; 3611or 3612 template <typename T> class X {}; class A {}; template class X<A>; 3613or 3614 template <typename T> class X {}; class A {}; extern template class X<A>; 3615cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3616 matches the template instantiation of X<A>. 3617 3618But given 3619 template <typename T> class X {}; class A {}; 3620 template <> class X<A> {}; X<A> x; 3621cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3622 does not match, as X<A> is an explicit template specialization. 3623 3624Usable 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>> 3625</pre></td></tr> 3626 3627 3628<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> 3629<tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the 3630specified names. 3631 3632 hasAnyOperatorName("+", "-") 3633 Is equivalent to 3634 anyOf(hasOperatorName("+"), hasOperatorName("-")) 3635</pre></td></tr> 3636 3637 3638<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> 3639<tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or 3640unary). 3641 3642Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3643 !(a || b) 3644</pre></td></tr> 3645 3646 3647<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> 3648<tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators. 3649 3650Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3651 if (a == b) 3652 a += b; 3653 3654Example 2: matches s1 = s2 3655 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3656 struct S { S& operator=(const S&); }; 3657 void x() { S s1, s2; s1 = s2; } 3658</pre></td></tr> 3659 3660 3661<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> 3662<tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators. 3663 3664Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3665 if (a == b) 3666 a += b; 3667 3668Example 2: matches s1 < s2 3669 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3670 struct S { bool operator<(const S& other); }; 3671 void x(S s1, S s2) { bool b1 = s1 < s2; } 3672</pre></td></tr> 3673 3674 3675<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> 3676<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3677a specific number of arguments (including absent default arguments). 3678 3679Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3680 void f(int x, int y); 3681 f(0, 0); 3682</pre></td></tr> 3683 3684 3685<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> 3686<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 3687a specific number of arguments (including absent default arguments). 3688 3689Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3690 void f(int x, int y); 3691 f(0, 0); 3692</pre></td></tr> 3693 3694 3695<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> 3696<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL. 3697 3698Example matches y(x) but not y(42) or NS::y(x). 3699 namespace NS { 3700 struct X {}; 3701 void y(X); 3702 } 3703 3704 void y(...); 3705 3706 void test() { 3707 NS::X x; 3708 y(x); // Matches 3709 NS::y(x); // Doesn't match 3710 y(42); // Doesn't match 3711 using NS::y; 3712 y(x); // Found by both unqualified lookup and ADL, doesn't match 3713 } 3714</pre></td></tr> 3715 3716 3717<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> 3718<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 3719 3720Example: matches the implicit cast around 0 3721(matcher = castExpr(hasCastKind(CK_NullToPointer))) 3722 int *p = 0; 3723 3724If the matcher is use from clang-query, CastKind parameter 3725should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer"). 3726</pre></td></tr> 3727 3728 3729<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> 3730<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr> 3731 3732 3733<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> 3734<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT. 3735 3736Given 3737 f('false, 3.14, 42); 3738characterLiteral(equals(0)) 3739 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3740 match false 3741floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3742 match 3.14 3743integerLiteral(equals(42)) 3744 matches 42 3745 3746Note that you cannot directly match a negative numeric literal because the 3747minus sign is not part of the literal: It is a unary operator whose operand 3748is the positive numeric literal. Instead, you must use a unaryOperator() 3749matcher to match the minus sign: 3750 3751unaryOperator(hasOperatorName("-"), 3752 hasUnaryOperand(integerLiteral(equals(13)))) 3753 3754Usable 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>>, 3755 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>> 3756</pre></td></tr> 3757 3758 3759<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> 3760<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr> 3761 3762 3763<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> 3764<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr> 3765 3766 3767<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> 3768<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 3769 3770Given 3771 template<typename T> struct C {}; 3772 C<int> c; 3773classTemplateSpecializationDecl(templateArgumentCountIs(1)) 3774 matches C<int>. 3775</pre></td></tr> 3776 3777 3778<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> 3779<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 3780child statements. 3781 3782Example: Given 3783 { for (;;) {} } 3784compoundStmt(statementCountIs(0))) 3785 matches '{}' 3786 but does not match the outer compound statement. 3787</pre></td></tr> 3788 3789 3790<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> 3791<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 3792 3793Given 3794 int a[42]; 3795 int b[2 * 21]; 3796 int c[41], d[43]; 3797 char *s = "abcd"; 3798 wchar_t *ws = L"abcd"; 3799 char *w = "a"; 3800constantArrayType(hasSize(42)) 3801 matches "int a[42]" and "int b[2 * 21]" 3802stringLiteral(hasSize(4)) 3803 matches "abcd", L"abcd" 3804</pre></td></tr> 3805 3806 3807<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> 3808<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 3809declarations. 3810 3811Example: Given 3812 int a, b; 3813 int c; 3814 int d = 2, e; 3815declCountIs(2) 3816 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 3817</pre></td></tr> 3818 3819 3820<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> 3821<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 3822 3823Matches a node if it equals the node previously bound to ID. 3824 3825Given 3826 class X { int a; int b; }; 3827cxxRecordDecl( 3828 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3829 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3830 matches the class X, as a and b have the same type. 3831 3832Note that when multiple matches are involved via forEach* matchers, 3833equalsBoundNodes acts as a filter. 3834For example: 3835compoundStmt( 3836 forEachDescendant(varDecl().bind("d")), 3837 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3838will trigger a match for each combination of variable declaration 3839and reference to that variable declaration within a compound statement. 3840</pre></td></tr> 3841 3842 3843<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> 3844<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 3845 3846Decl has pointer identity in the AST. 3847</pre></td></tr> 3848 3849 3850<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> 3851<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 3852 3853Given 3854 __attribute__((device)) void f() { ... } 3855decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 3856f. If the matcher is used from clang-query, attr::Kind parameter should be 3857passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 3858</pre></td></tr> 3859 3860 3861<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> 3862<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro. 3863Does not match if only part of the statement is expanded from that macro or 3864if different parts of the statement are expanded from different 3865appearances of the macro. 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('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 3870<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 3871partially matching a given regex. 3872 3873Example matches Y but not X 3874 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3875 #include "ASTMatcher.h" 3876 class X {}; 3877ASTMatcher.h: 3878 class Y {}; 3879 3880Usable 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>> 3881 3882If the matcher is used in clang-query, RegexFlags parameter 3883should be passed as a quoted string. e.g: "NoFlags". 3884Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3885</pre></td></tr> 3886 3887 3888<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> 3889<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 3890 3891Example matches X but not Y 3892 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3893 #include <Y.h> 3894 class X {}; 3895Y.h: 3896 class Y {}; 3897 3898Usable 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>> 3899</pre></td></tr> 3900 3901 3902<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> 3903<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 3904 3905Example matches Y but not X 3906 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3907 #include <SystemHeader.h> 3908 class X {}; 3909SystemHeader.h: 3910 class Y {}; 3911 3912Usable 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>> 3913</pre></td></tr> 3914 3915 3916<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> 3917<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches an entity that has been implicitly added by the compiler (e.g. 3918implicit default/copy constructors). 3919</pre></td></tr> 3920 3921 3922<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> 3923<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces. 3924 3925Given 3926 class vector {}; 3927 namespace foo { 3928 class vector {}; 3929 namespace std { 3930 class vector {}; 3931 } 3932 } 3933 namespace std { 3934 inline namespace __1 { 3935 class vector {}; // #1 3936 namespace experimental { 3937 class vector {}; 3938 } 3939 } 3940 } 3941cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1. 3942</pre></td></tr> 3943 3944 3945<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> 3946<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3947template instantiations. 3948 3949Given 3950 template<typename T> void A(T t) { T i; } 3951 A(0); 3952 A(0U); 3953functionDecl(isInstantiated()) 3954 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3955</pre></td></tr> 3956 3957 3958<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> 3959<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private 3960inheritance. 3961 3962Examples: 3963 class C { 3964 public: int a; 3965 protected: int b; 3966 private: int c; // fieldDecl(isPrivate()) matches 'c' 3967 }; 3968 3969 struct Base {}; 3970 struct Derived1 : private Base {}; // matches 'Base' 3971 class Derived2 : Base {}; // matches 'Base' 3972</pre></td></tr> 3973 3974 3975<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> 3976<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify 3977protected inheritance. 3978 3979Examples: 3980 class C { 3981 public: int a; 3982 protected: int b; // fieldDecl(isProtected()) matches 'b' 3983 private: int c; 3984 }; 3985 3986 class Base {}; 3987 class Derived : protected Base {}; // matches 'Base' 3988</pre></td></tr> 3989 3990 3991<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> 3992<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public 3993inheritance. 3994 3995Examples: 3996 class C { 3997 public: int a; // fieldDecl(isPublic()) matches 'a' 3998 protected: int b; 3999 private: int c; 4000 }; 4001 4002 class Base {}; 4003 class Derived1 : public Base {}; // matches 'Base' 4004 struct Derived2 : Base {}; // matches 'Base' 4005</pre></td></tr> 4006 4007 4008<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> 4009<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 4010a specific number of designators. 4011 4012Example: Given 4013 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 4014 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 4015designatorCountIs(2) 4016 matches '{ [2].y = 1.0, [0].x = 1.0 }', 4017 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 4018</pre></td></tr> 4019 4020 4021<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> 4022<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration. 4023 4024Example matches Y (matcher = enumDecl(isScoped())) 4025enum X {}; 4026enum class Y {}; 4027</pre></td></tr> 4028 4029 4030<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> 4031<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is 4032neither type- nor value-dependent. 4033 4034In the following example, the expression sizeof(sizeof(T() + T())) 4035is instantiation-dependent (since it involves a template parameter T), 4036but is neither type- nor value-dependent, since the type of the inner 4037sizeof is known (std::size_t) and therefore the size of the outer 4038sizeof is known. 4039 template<typename T> 4040 void f(T x, T y) { sizeof(sizeof(T() + T()); } 4041expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T()) 4042</pre></td></tr> 4043 4044 4045<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> 4046<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type 4047is not yet instantiated. 4048 4049For example, the expressions "x" and "x + y" are type-dependent in 4050the following code, but "y" is not type-dependent: 4051 template<typename T> 4052 void add(T x, int y) { 4053 x + y; 4054 } 4055expr(isTypeDependent()) matches x + y 4056</pre></td></tr> 4057 4058 4059<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> 4060<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a 4061non-type template parameter. 4062 4063For example, the array bound of "Chars" in the following example is 4064value-dependent. 4065 template<int Size> int f() { return Size; } 4066expr(isValueDependent()) matches return Size 4067</pre></td></tr> 4068 4069 4070<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> 4071<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 4072GNU's __null, C++11's nullptr, or C's NULL macro. 4073 4074Given: 4075 void *v1 = NULL; 4076 void *v2 = nullptr; 4077 void *v3 = __null; // GNU extension 4078 char *cp = (char *)0; 4079 int *ip = 0; 4080 int i = 0; 4081expr(nullPointerConstant()) 4082 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 4083 initializer for i. 4084</pre></td></tr> 4085 4086 4087<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> 4088<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 4089bit width. 4090 4091Given 4092 class C { 4093 int a : 2; 4094 int b : 4; 4095 int c : 2; 4096 }; 4097fieldDecl(hasBitWidth(2)) 4098 matches 'int a;' and 'int c;' but not 'int b;'. 4099</pre></td></tr> 4100 4101 4102<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> 4103<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 4104 4105Given 4106 class C { 4107 int a : 2; 4108 int b; 4109 }; 4110fieldDecl(isBitField()) 4111 matches 'int a;' but not 'int b;'. 4112</pre></td></tr> 4113 4114 4115<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> 4116<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 4117 4118Given 4119 f('false, 3.14, 42); 4120characterLiteral(equals(0)) 4121 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4122 match false 4123floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4124 match 3.14 4125integerLiteral(equals(42)) 4126 matches 42 4127 4128Note that you cannot directly match a negative numeric literal because the 4129minus sign is not part of the literal: It is a unary operator whose operand 4130is the positive numeric literal. Instead, you must use a unaryOperator() 4131matcher to match the minus sign: 4132 4133unaryOperator(hasOperatorName("-"), 4134 hasUnaryOperand(integerLiteral(equals(13)))) 4135 4136Usable 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>>, 4137 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>> 4138</pre></td></tr> 4139 4140 4141<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> 4142<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr> 4143 4144 4145<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> 4146<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names. 4147 4148Matches overloaded operator names specified in strings without the 4149"operator" prefix: e.g. "<<". 4150 4151 hasAnyOverloadedOperatorName("+", "-") 4152Is equivalent to 4153 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 4154</pre></td></tr> 4155 4156 4157<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> 4158<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 4159 4160Given: 4161 void f(); 4162 void g() noexcept; 4163 void h() noexcept(true); 4164 void i() noexcept(false); 4165 void j() throw(); 4166 void k() throw(int); 4167 void l() throw(...); 4168functionDecl(hasDynamicExceptionSpec()) and 4169 functionProtoType(hasDynamicExceptionSpec()) 4170 match the declarations of j, k, and l, but not f, g, h, or i. 4171</pre></td></tr> 4172 4173 4174<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> 4175<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 4176 4177Matches overloaded operator names specified in strings without the 4178"operator" prefix: e.g. "<<". 4179 4180Given: 4181 class A { int operator*(); }; 4182 const A &operator<<(const A &a, const A &b); 4183 A a; 4184 a << a; // <-- This matches 4185 4186cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 4187specified line and 4188cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 4189matches the declaration of A. 4190 4191Usable 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>> 4192</pre></td></tr> 4193 4194 4195<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr> 4196<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 4197 4198Example matches Y (matcher = functionDecl(hasTrailingReturn())) 4199int X() {} 4200auto Y() -> int {} 4201</pre></td></tr> 4202 4203 4204<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isConsteval1')"><a name="isConsteval1Anchor">isConsteval</a></td><td></td></tr> 4205<tr><td colspan="4" class="doc" id="isConsteval1"><pre>Matches consteval function declarations and if consteval/if ! consteval 4206statements. 4207 4208Given: 4209 consteval int a(); 4210 void b() { if consteval {} } 4211 void c() { if ! consteval {} } 4212 void d() { if ! consteval {} else {} } 4213functionDecl(isConsteval()) 4214 matches the declaration of "int a()". 4215ifStmt(isConsteval()) 4216 matches the if statement in "void b()", "void c()", "void d()". 4217</pre></td></tr> 4218 4219 4220<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> 4221<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations, 4222 and if constexpr. 4223 4224Given: 4225 constexpr int foo = 42; 4226 constexpr int bar(); 4227 void baz() { if constexpr(1 > 0) {} } 4228varDecl(isConstexpr()) 4229 matches the declaration of foo. 4230functionDecl(isConstexpr()) 4231 matches the declaration of bar. 4232ifStmt(isConstexpr()) 4233 matches the if statement in baz. 4234</pre></td></tr> 4235 4236 4237<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> 4238<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 4239 4240Given: 4241 class A { ~A(); }; 4242 class B { ~B() = default; }; 4243functionDecl(isDefaulted()) 4244 matches the declaration of ~B, but not ~A. 4245</pre></td></tr> 4246 4247 4248<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> 4249<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 4250 4251Example matches A, va, fa 4252 class A {}; 4253 class B; // Doesn't match, as it has no body. 4254 int va; 4255 extern int vb; // Doesn't match, as it doesn't define the variable. 4256 void fa() {} 4257 void fb(); // Doesn't match, as it has no body. 4258 @interface X 4259 - (void)ma; // Doesn't match, interface is declaration. 4260 @end 4261 @implementation X 4262 - (void)ma {} 4263 @end 4264 4265Usable 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>>, 4266 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4267</pre></td></tr> 4268 4269 4270<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> 4271<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 4272 4273Given: 4274 void Func(); 4275 void DeletedFunc() = delete; 4276functionDecl(isDeleted()) 4277 matches the declaration of DeletedFunc, but not Func. 4278</pre></td></tr> 4279 4280 4281<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> 4282<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 4283static member variable template instantiations. 4284 4285Given 4286 template<typename T> void A(T t) { } 4287 template<> void A(int N) { } 4288functionDecl(isExplicitTemplateSpecialization()) 4289 matches the specialization A<int>(). 4290 4291Usable 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>> 4292</pre></td></tr> 4293 4294 4295<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> 4296<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 4297 4298Given: 4299 extern "C" void f() {} 4300 extern "C" { void g() {} } 4301 void h() {} 4302 extern "C" int x = 1; 4303 extern "C" int y = 2; 4304 int z = 3; 4305functionDecl(isExternC()) 4306 matches the declaration of f and g, but not the declaration of h. 4307varDecl(isExternC()) 4308 matches the declaration of x and y, but not the declaration of z. 4309</pre></td></tr> 4310 4311 4312<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> 4313<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 4314the inline keyword. 4315 4316Given 4317 inline void f(); 4318 void g(); 4319 namespace n { 4320 inline namespace m {} 4321 } 4322functionDecl(isInline()) will match ::f(). 4323namespaceDecl(isInline()) will match n::m. 4324</pre></td></tr> 4325 4326 4327<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> 4328<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point 4329into an executable program. 4330</pre></td></tr> 4331 4332 4333<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> 4334<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 4335 4336Given 4337 void nope(); 4338 [[noreturn]] void a(); 4339 __attribute__((noreturn)) void b(); 4340 struct c { [[noreturn]] c(); }; 4341functionDecl(isNoReturn()) 4342 matches all of those except 4343 void nope(); 4344</pre></td></tr> 4345 4346 4347<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> 4348<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 4349 4350Given: 4351 void f(); 4352 void g() noexcept; 4353 void h() throw(); 4354 void i() throw(int); 4355 void j() noexcept(false); 4356functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4357 match the declarations of g, and h, but not f, i or j. 4358</pre></td></tr> 4359 4360 4361<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> 4362<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage 4363class specifier ("static" keyword) written in the source. 4364 4365Given: 4366 static void f() {} 4367 static int i = 0; 4368 extern int j; 4369 int k; 4370functionDecl(isStaticStorageClass()) 4371 matches the function declaration f. 4372varDecl(isStaticStorageClass()) 4373 matches the variable declaration i. 4374</pre></td></tr> 4375 4376 4377<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> 4378<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 4379member variable template instantiations. 4380 4381Given 4382 template <typename T> class X {}; class A {}; X<A> x; 4383or 4384 template <typename T> class X {}; class A {}; template class X<A>; 4385or 4386 template <typename T> class X {}; class A {}; extern template class X<A>; 4387cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4388 matches the template instantiation of X<A>. 4389 4390But given 4391 template <typename T> class X {}; class A {}; 4392 template <> class X<A> {}; X<A> x; 4393cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4394 does not match, as X<A> is an explicit template specialization. 4395 4396Usable 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>> 4397</pre></td></tr> 4398 4399 4400<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> 4401<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 4402 4403Example matches f, but not g or h. The function i will not match, even when 4404compiled in C mode. 4405 void f(...); 4406 void g(int); 4407 template <typename... Ts> void h(Ts...); 4408 void i(); 4409</pre></td></tr> 4410 4411 4412<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> 4413<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations. 4414 4415Given: 4416 void foo() __attribute__((__weakref__("__foo"))); 4417 void bar(); 4418functionDecl(isWeak()) 4419 matches the weak declaration "foo", but not "bar". 4420</pre></td></tr> 4421 4422 4423<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> 4424<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4425specific parameter count. 4426 4427Given 4428 void f(int i) {} 4429 void g(int i, int j) {} 4430 void h(int i, int j); 4431 void j(int i); 4432 void k(int x, int y, int z, ...); 4433functionDecl(parameterCountIs(2)) 4434 matches g and h 4435functionProtoType(parameterCountIs(2)) 4436 matches g and h 4437functionProtoType(parameterCountIs(3)) 4438 matches k 4439</pre></td></tr> 4440 4441 4442<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> 4443<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 4444 4445Given: 4446 void f(); 4447 void g() noexcept; 4448 void h() noexcept(true); 4449 void i() noexcept(false); 4450 void j() throw(); 4451 void k() throw(int); 4452 void l() throw(...); 4453functionDecl(hasDynamicExceptionSpec()) and 4454 functionProtoType(hasDynamicExceptionSpec()) 4455 match the declarations of j, k, and l, but not f, g, h, or i. 4456</pre></td></tr> 4457 4458 4459<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> 4460<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 4461 4462Given: 4463 void f(); 4464 void g() noexcept; 4465 void h() throw(); 4466 void i() throw(int); 4467 void j() noexcept(false); 4468functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4469 match the declarations of g, and h, but not f, i or j. 4470</pre></td></tr> 4471 4472 4473<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> 4474<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4475specific parameter count. 4476 4477Given 4478 void f(int i) {} 4479 void g(int i, int j) {} 4480 void h(int i, int j); 4481 void j(int i); 4482 void k(int x, int y, int z, ...); 4483functionDecl(parameterCountIs(2)) 4484 matches g and h 4485functionProtoType(parameterCountIs(2)) 4486 matches g and h 4487functionProtoType(parameterCountIs(3)) 4488 matches k 4489</pre></td></tr> 4490 4491 4492<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('isConsteval2')"><a name="isConsteval2Anchor">isConsteval</a></td><td></td></tr> 4493<tr><td colspan="4" class="doc" id="isConsteval2"><pre>Matches consteval function declarations and if consteval/if ! consteval 4494statements. 4495 4496Given: 4497 consteval int a(); 4498 void b() { if consteval {} } 4499 void c() { if ! consteval {} } 4500 void d() { if ! consteval {} else {} } 4501functionDecl(isConsteval()) 4502 matches the declaration of "int a()". 4503ifStmt(isConsteval()) 4504 matches the if statement in "void b()", "void c()", "void d()". 4505</pre></td></tr> 4506 4507 4508<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> 4509<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations, 4510 and if constexpr. 4511 4512Given: 4513 constexpr int foo = 42; 4514 constexpr int bar(); 4515 void baz() { if constexpr(1 > 0) {} } 4516varDecl(isConstexpr()) 4517 matches the declaration of foo. 4518functionDecl(isConstexpr()) 4519 matches the declaration of bar. 4520ifStmt(isConstexpr()) 4521 matches the if statement in baz. 4522</pre></td></tr> 4523 4524 4525<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> 4526<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 4527 4528 4529<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> 4530<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 4531 4532Given 4533 f('false, 3.14, 42); 4534characterLiteral(equals(0)) 4535 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4536 match false 4537floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4538 match 3.14 4539integerLiteral(equals(42)) 4540 matches 42 4541 4542Note that you cannot directly match a negative numeric literal because the 4543minus sign is not part of the literal: It is a unary operator whose operand 4544is the positive numeric literal. Instead, you must use a unaryOperator() 4545matcher to match the minus sign: 4546 4547unaryOperator(hasOperatorName("-"), 4548 hasUnaryOperand(integerLiteral(equals(13)))) 4549 4550Usable 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>>, 4551 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>> 4552</pre></td></tr> 4553 4554 4555<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> 4556<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 4557 4558 4559<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> 4560<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 4561 4562 4563<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>></td><td class="name" onclick="toggle('capturesThis0')"><a name="capturesThis0Anchor">capturesThis</a></td><td></td></tr> 4564<tr><td colspan="4" class="doc" id="capturesThis0"><pre>Matches a `LambdaCapture` that refers to 'this'. 4565 4566Given 4567class C { 4568 int cc; 4569 int f() { 4570 auto l = [this]() { return cc; }; 4571 return l(); 4572 } 4573}; 4574lambdaExpr(hasAnyCapture(lambdaCapture(capturesThis()))) 4575 matches `[this]() { return cc; }`. 4576</pre></td></tr> 4577 4578 4579<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>></td><td class="name" onclick="toggle('isImplicit2')"><a name="isImplicit2Anchor">isImplicit</a></td><td></td></tr> 4580<tr><td colspan="4" class="doc" id="isImplicit2"><pre>Matches an entity that has been implicitly added by the compiler (e.g. 4581implicit default/copy constructors). 4582</pre></td></tr> 4583 4584 4585<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> 4586<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 4587to '.'. 4588 4589Member calls on the implicit this pointer match as called with '->'. 4590 4591Given 4592 class Y { 4593 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 4594 template <class T> void f() { this->f<T>(); f<T>(); } 4595 int a; 4596 static int b; 4597 }; 4598 template <class T> 4599 class Z { 4600 void x() { this->m; } 4601 }; 4602memberExpr(isArrow()) 4603 matches this->x, x, y.x, a, this->b 4604cxxDependentScopeMemberExpr(isArrow()) 4605 matches this->m 4606unresolvedMemberExpr(isArrow()) 4607 matches this->f<T>, f<T> 4608</pre></td></tr> 4609 4610 4611<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> 4612<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 4613 4614This matcher is only provided as a performance optimization of hasName. 4615 hasAnyName(a, b, c) 4616 is equivalent to, but faster than 4617 anyOf(hasName(a), hasName(b), hasName(c)) 4618</pre></td></tr> 4619 4620 4621<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> 4622<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 4623 4624Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 4625void f() { 4626 int x; 4627 static int y; 4628} 4629int z; 4630 4631Example matches f() because it has external formal linkage despite being 4632unique to the translation unit as though it has internal likage 4633(matcher = functionDecl(hasExternalFormalLinkage())) 4634 4635namespace { 4636void f() {} 4637} 4638</pre></td></tr> 4639 4640 4641<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> 4642<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 4643 4644Supports specifying enclosing namespaces or classes by prefixing the name 4645with '<enclosing>::'. 4646Does not match typedefs of an underlying type with the given name. 4647 4648Example matches X (Name == "X") 4649 class X; 4650 4651Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 4652 namespace a { namespace b { class X; } } 4653</pre></td></tr> 4654 4655 4656<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> 4657<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 4658a substring matched by the given RegExp. 4659 4660Supports specifying enclosing namespaces or classes by 4661prefixing the name with '<enclosing>::'. Does not match typedefs 4662of an underlying type with the given name. 4663 4664Example matches X (regexp == "::X") 4665 class X; 4666 4667Example matches X (regexp is one of "::X", "^foo::.*X", among others) 4668 namespace foo { namespace bar { class X; } } 4669 4670If the matcher is used in clang-query, RegexFlags parameter 4671should be passed as a quoted string. e.g: "NoFlags". 4672Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4673</pre></td></tr> 4674 4675 4676<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> 4677<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 4678 4679Given 4680 namespace n { 4681 namespace {} // #1 4682 } 4683namespaceDecl(isAnonymous()) will match #1 but not ::n. 4684</pre></td></tr> 4685 4686 4687<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> 4688<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 4689the inline keyword. 4690 4691Given 4692 inline void f(); 4693 void g(); 4694 namespace n { 4695 inline namespace m {} 4696 } 4697functionDecl(isInline()) will match ::f(). 4698namespaceDecl(isInline()) will match n::m. 4699</pre></td></tr> 4700 4701 4702<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> 4703<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind 4704specified. 4705 4706Given 4707 4708 #pragma omp parallel 4709 #pragma omp parallel default(none) 4710 #pragma omp parallel default(shared) 4711 #pragma omp parallel default(firstprivate) 4712 4713``ompDefaultClause(isFirstPrivateKind())`` matches only 4714``default(firstprivate)``. 4715</pre></td></tr> 4716 4717 4718<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> 4719<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified. 4720 4721Given 4722 4723 #pragma omp parallel 4724 #pragma omp parallel default(none) 4725 #pragma omp parallel default(shared) 4726 #pragma omp parallel default(firstprivate) 4727 4728``ompDefaultClause(isNoneKind())`` matches only ``default(none)``. 4729</pre></td></tr> 4730 4731 4732<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> 4733<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified. 4734 4735Given 4736 4737 #pragma omp parallel 4738 #pragma omp parallel default(none) 4739 #pragma omp parallel default(shared) 4740 #pragma omp parallel default(firstprivate) 4741 4742``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``. 4743</pre></td></tr> 4744 4745 4746<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> 4747<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP 4748clause kind. 4749 4750Given 4751 4752 #pragma omp parallel 4753 #pragma omp parallel for 4754 #pragma omp for 4755 4756`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches 4757``omp parallel`` and ``omp parallel for``. 4758 4759If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter 4760should be passed as a quoted string. e.g., 4761``isAllowedToContainClauseKind("OMPC_default").`` 4762</pre></td></tr> 4763 4764 4765<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> 4766<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives, 4767i.e., directives that can't have a structured block. 4768 4769Given 4770 4771 #pragma omp parallel 4772 {} 4773 #pragma omp taskyield 4774 4775``ompExecutableDirective(isStandaloneDirective()))`` matches 4776``omp taskyield``. 4777</pre></td></tr> 4778 4779 4780<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> 4781<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 4782</pre></td></tr> 4783 4784 4785<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> 4786<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 4787</pre></td></tr> 4788 4789 4790<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> 4791<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for 4792isSameOrDerivedFrom(hasName(...)). 4793</pre></td></tr> 4794 4795 4796<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> 4797<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has 4798a specific number of arguments (including absent default arguments). 4799 4800Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 4801 void f(int x, int y); 4802 f(0, 0); 4803</pre></td></tr> 4804 4805 4806<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> 4807<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 4808Selector.getAsString() 4809 4810 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 4811 matches both of the expressions below: 4812 [myObj methodA:argA]; 4813 [myObj methodB:argB]; 4814</pre></td></tr> 4815 4816 4817<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> 4818<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 4819 4820objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 4821message expression in 4822 4823 UIWebView *webView = ...; 4824 CGRect bodyFrame = webView.frame; 4825 bodyFrame.size.height = self.bodyContentHeight; 4826 webView.frame = bodyFrame; 4827 // ^---- matches here 4828</pre></td></tr> 4829 4830 4831<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> 4832<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 4833 4834Matches only when the selector of the objCMessageExpr is NULL. This may 4835represent an error condition in the tree! 4836</pre></td></tr> 4837 4838 4839<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> 4840<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 4841 4842 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 4843 matches the outer message expr in the code below, but NOT the message 4844 invocation for self.bodyView. 4845 [self.bodyView loadHTMLString:html baseURL:NULL]; 4846</pre></td></tr> 4847 4848 4849<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> 4850<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 4851 4852 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 4853 matches self.bodyView in the code below, but NOT the outer message 4854 invocation of "loadHTMLString:baseURL:". 4855 [self.bodyView loadHTMLString:html baseURL:NULL]; 4856</pre></td></tr> 4857 4858 4859<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> 4860<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class. 4861 4862Example 4863matcher = objcMessageExpr(isClassMessage()) 4864matches 4865 [NSString stringWithFormat:@"format"]; 4866but not 4867 NSString *x = @"hello"; 4868 [x containsString:@"h"]; 4869</pre></td></tr> 4870 4871 4872<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> 4873<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance. 4874 4875Example 4876matcher = objcMessageExpr(isInstanceMessage()) 4877matches 4878 NSString *x = @"hello"; 4879 [x containsString:@"h"]; 4880but not 4881 [NSString stringWithFormat:@"format"]; 4882</pre></td></tr> 4883 4884 4885<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> 4886<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 4887a substring matched by the given RegExp. 4888 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 4889 invocation for self.bodyView. 4890 [self.bodyView loadHTMLString:html baseURL:NULL]; 4891 4892If the matcher is used in clang-query, RegexFlags parameter 4893should be passed as a quoted string. e.g: "NoFlags". 4894Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4895</pre></td></tr> 4896 4897 4898<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> 4899<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 4900 4901 matcher = objCMessageExpr(numSelectorArgs(0)); 4902 matches self.bodyView in the code below 4903 4904 matcher = objCMessageExpr(numSelectorArgs(2)); 4905 matches the invocation of "loadHTMLString:baseURL:" but not that 4906 of self.bodyView 4907 [self.bodyView loadHTMLString:html baseURL:NULL]; 4908</pre></td></tr> 4909 4910 4911<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> 4912<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method. 4913 4914Example 4915matcher = objcMethodDecl(isClassMethod()) 4916matches 4917@interface I + (void)foo; @end 4918but not 4919@interface I - (void)bar; @end 4920</pre></td></tr> 4921 4922 4923<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> 4924<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 4925 4926Example matches A, va, fa 4927 class A {}; 4928 class B; // Doesn't match, as it has no body. 4929 int va; 4930 extern int vb; // Doesn't match, as it doesn't define the variable. 4931 void fa() {} 4932 void fb(); // Doesn't match, as it has no body. 4933 @interface X 4934 - (void)ma; // Doesn't match, interface is declaration. 4935 @end 4936 @implementation X 4937 - (void)ma {} 4938 @end 4939 4940Usable 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>>, 4941 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4942</pre></td></tr> 4943 4944 4945<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> 4946<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method. 4947 4948Example 4949matcher = objcMethodDecl(isInstanceMethod()) 4950matches 4951@interface I - (void)bar; @end 4952but not 4953@interface I + (void)foo; @end 4954</pre></td></tr> 4955 4956 4957<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> 4958<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 4959 4960Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 4961void x(int val) {} 4962void y(int val = 0) {} 4963 4964Deprecated. Use hasInitializer() instead to be able to 4965match on the contents of the default argument. For example: 4966 4967void x(int val = 7) {} 4968void y(int val = 42) {} 4969parmVarDecl(hasInitializer(integerLiteral(equals(42)))) 4970 matches the parameter of y 4971 4972A matcher such as 4973 parmVarDecl(hasInitializer(anything())) 4974is equivalent to parmVarDecl(hasDefaultArgument()). 4975</pre></td></tr> 4976 4977 4978<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> 4979<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter 4980list. The parameter list could be that of either a block, function, or 4981objc-method. 4982 4983 4984Given 4985 4986void f(int a, int b, int c) { 4987} 4988 4989``parmVarDecl(isAtPosition(0))`` matches ``int a``. 4990 4991``parmVarDecl(isAtPosition(1))`` matches ``int b``. 4992</pre></td></tr> 4993 4994 4995<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> 4996<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 4997 4998Given 4999 class Y { public: void x(); }; 5000 void z() { Y* y; y->x(); } 5001cxxMemberCallExpr(on(hasType(asString("class Y *")))) 5002 matches y->x() 5003</pre></td></tr> 5004 5005 5006<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> 5007<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 5008 5009Matches a node if it equals the node previously bound to ID. 5010 5011Given 5012 class X { int a; int b; }; 5013cxxRecordDecl( 5014 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5015 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5016 matches the class X, as a and b have the same type. 5017 5018Note that when multiple matches are involved via forEach* matchers, 5019equalsBoundNodes acts as a filter. 5020For example: 5021compoundStmt( 5022 forEachDescendant(varDecl().bind("d")), 5023 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5024will trigger a match for each combination of variable declaration 5025and reference to that variable declaration within a compound statement. 5026</pre></td></tr> 5027 5028 5029<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> 5030<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 5031the node, not hidden within a typedef. 5032 5033Given 5034 typedef const int const_int; 5035 const_int i; 5036 int *const j; 5037 int *volatile k; 5038 int m; 5039varDecl(hasType(hasLocalQualifiers())) matches only j and k. 5040i is const-qualified but the qualifier is not local. 5041</pre></td></tr> 5042 5043 5044<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> 5045<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 5046 5047Given 5048 void a(char); 5049 void b(wchar_t); 5050 void c(double); 5051functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 5052matches "a(char)", "b(wchar_t)", but not "c(double)". 5053</pre></td></tr> 5054 5055 5056<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> 5057<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 5058the Objective-C object pointer type, which is different despite being 5059syntactically similar. 5060 5061Given 5062 int *i = nullptr; 5063 5064 @interface Foo 5065 @end 5066 Foo *f; 5067 5068 int j; 5069varDecl(hasType(isAnyPointer())) 5070 matches "int *i" and "Foo *f", but not "int j". 5071</pre></td></tr> 5072 5073 5074<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> 5075<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 5076include "top-level" const. 5077 5078Given 5079 void a(int); 5080 void b(int const); 5081 void c(const int); 5082 void d(const int*); 5083 void e(int const) {}; 5084functionDecl(hasAnyParameter(hasType(isConstQualified()))) 5085 matches "void b(int const)", "void c(const int)" and 5086 "void e(int const) {}". It does not match d as there 5087 is no top-level const on the parameter type "const int *". 5088</pre></td></tr> 5089 5090 5091<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> 5092<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 5093 5094Given 5095 void a(int); 5096 void b(long); 5097 void c(double); 5098functionDecl(hasAnyParameter(hasType(isInteger()))) 5099matches "a(int)", "b(long)", but not "c(double)". 5100</pre></td></tr> 5101 5102 5103<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> 5104<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 5105 5106Given 5107 void a(int); 5108 void b(unsigned long); 5109 void c(double); 5110functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 5111matches "a(int)", but not "b(unsigned long)" and "c(double)". 5112</pre></td></tr> 5113 5114 5115<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> 5116<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 5117 5118Given 5119 void a(int); 5120 void b(unsigned long); 5121 void c(double); 5122functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 5123matches "b(unsigned long)", but not "a(int)" and "c(double)". 5124</pre></td></tr> 5125 5126 5127<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> 5128<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 5129include "top-level" volatile. 5130 5131Given 5132 void a(int); 5133 void b(int volatile); 5134 void c(volatile int); 5135 void d(volatile int*); 5136 void e(int volatile) {}; 5137functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 5138 matches "void b(int volatile)", "void c(volatile int)" and 5139 "void e(int volatile) {}". It does not match d as there 5140 is no top-level volatile on the parameter type "volatile int *". 5141</pre></td></tr> 5142 5143 5144<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> 5145<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 5146 5147Matches a node if it equals the node previously bound to ID. 5148 5149Given 5150 class X { int a; int b; }; 5151cxxRecordDecl( 5152 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5153 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5154 matches the class X, as a and b have the same type. 5155 5156Note that when multiple matches are involved via forEach* matchers, 5157equalsBoundNodes acts as a filter. 5158For example: 5159compoundStmt( 5160 forEachDescendant(varDecl().bind("d")), 5161 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5162will trigger a match for each combination of variable declaration 5163and reference to that variable declaration within a compound statement. 5164</pre></td></tr> 5165 5166 5167<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> 5168<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 5169 5170Stmt has pointer identity in the AST. 5171</pre></td></tr> 5172 5173 5174<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> 5175<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro. 5176Does not match if only part of the statement is expanded from that macro or 5177if different parts of the statement are expanded from different 5178appearances of the macro. 5179</pre></td></tr> 5180 5181 5182<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> 5183<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 5184partially matching a given regex. 5185 5186Example matches Y but not X 5187 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5188 #include "ASTMatcher.h" 5189 class X {}; 5190ASTMatcher.h: 5191 class Y {}; 5192 5193Usable 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>> 5194 5195If the matcher is used in clang-query, RegexFlags parameter 5196should be passed as a quoted string. e.g: "NoFlags". 5197Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5198</pre></td></tr> 5199 5200 5201<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> 5202<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 5203 5204Example matches X but not Y 5205 (matcher = cxxRecordDecl(isExpansionInMainFile()) 5206 #include <Y.h> 5207 class X {}; 5208Y.h: 5209 class Y {}; 5210 5211Usable 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>> 5212</pre></td></tr> 5213 5214 5215<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> 5216<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 5217 5218Example matches Y but not X 5219 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5220 #include <SystemHeader.h> 5221 class X {}; 5222SystemHeader.h: 5223 class Y {}; 5224 5225Usable 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>> 5226</pre></td></tr> 5227 5228 5229<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> 5230<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 5231 5232Given 5233 int j; 5234 template<typename T> void A(T t) { T i; j += 42;} 5235 A(0); 5236 A(0U); 5237declStmt(isInTemplateInstantiation()) 5238 matches 'int i;' and 'unsigned i'. 5239unless(stmt(isInTemplateInstantiation())) 5240 will NOT match j += 42; as it's shared between the template definition and 5241 instantiation. 5242</pre></td></tr> 5243 5244 5245<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> 5246<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 5247 5248Given 5249 int a[42]; 5250 int b[2 * 21]; 5251 int c[41], d[43]; 5252 char *s = "abcd"; 5253 wchar_t *ws = L"abcd"; 5254 char *w = "a"; 5255constantArrayType(hasSize(42)) 5256 matches "int a[42]" and "int b[2 * 21]" 5257stringLiteral(hasSize(4)) 5258 matches "abcd", L"abcd" 5259</pre></td></tr> 5260 5261 5262<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> 5263<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class." 5264 5265Example matches C, but not S, U or E. 5266 struct S {}; 5267 class C {}; 5268 union U {}; 5269 enum E {}; 5270</pre></td></tr> 5271 5272 5273<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> 5274<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 5275 5276Example matches A, va, fa 5277 class A {}; 5278 class B; // Doesn't match, as it has no body. 5279 int va; 5280 extern int vb; // Doesn't match, as it doesn't define the variable. 5281 void fa() {} 5282 void fb(); // Doesn't match, as it has no body. 5283 @interface X 5284 - (void)ma; // Doesn't match, interface is declaration. 5285 @end 5286 @implementation X 5287 - (void)ma {} 5288 @end 5289 5290Usable 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>>, 5291 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5292</pre></td></tr> 5293 5294 5295<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> 5296<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum." 5297 5298Example matches E, but not C, S or U. 5299 struct S {}; 5300 class C {}; 5301 union U {}; 5302 enum E {}; 5303</pre></td></tr> 5304 5305 5306<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> 5307<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct." 5308 5309Example matches S, but not C, U or E. 5310 struct S {}; 5311 class C {}; 5312 union U {}; 5313 enum E {}; 5314</pre></td></tr> 5315 5316 5317<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> 5318<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union." 5319 5320Example matches U, but not C, S or E. 5321 struct S {}; 5322 class C {}; 5323 union U {}; 5324 enum E {}; 5325</pre></td></tr> 5326 5327 5328<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> 5329<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 5330 5331Note that 'Value' is a string as the template argument's value is 5332an arbitrary precision integer. 'Value' must be euqal to the canonical 5333representation of that integral value in base 10. 5334 5335Given 5336 template<int T> struct C {}; 5337 C<42> c; 5338classTemplateSpecializationDecl( 5339 hasAnyTemplateArgument(equalsIntegralValue("42"))) 5340 matches the implicit instantiation of C in C<42>. 5341</pre></td></tr> 5342 5343 5344<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> 5345<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 5346 5347Given 5348 template<int T> struct C {}; 5349 C<42> c; 5350classTemplateSpecializationDecl( 5351 hasAnyTemplateArgument(isIntegral())) 5352 matches the implicit instantiation of C in C<42> 5353 with isIntegral() matching 42. 5354</pre></td></tr> 5355 5356 5357<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> 5358<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 5359 5360Given 5361 template<typename T> struct C {}; 5362 C<int> c; 5363classTemplateSpecializationDecl(templateArgumentCountIs(1)) 5364 matches C<int>. 5365</pre></td></tr> 5366 5367 5368<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> 5369<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro. 5370Does not match if only part of the statement is expanded from that macro or 5371if different parts of the statement are expanded from different 5372appearances of the macro. 5373</pre></td></tr> 5374 5375 5376<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> 5377<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 5378partially matching a given regex. 5379 5380Example matches Y but not X 5381 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5382 #include "ASTMatcher.h" 5383 class X {}; 5384ASTMatcher.h: 5385 class Y {}; 5386 5387Usable 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>> 5388 5389If the matcher is used in clang-query, RegexFlags parameter 5390should be passed as a quoted string. e.g: "NoFlags". 5391Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5392</pre></td></tr> 5393 5394 5395<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> 5396<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 5397 5398Example matches X but not Y 5399 (matcher = cxxRecordDecl(isExpansionInMainFile()) 5400 #include <Y.h> 5401 class X {}; 5402Y.h: 5403 class Y {}; 5404 5405Usable 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>> 5406</pre></td></tr> 5407 5408 5409<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> 5410<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 5411 5412Example matches Y but not X 5413 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5414 #include <SystemHeader.h> 5415 class X {}; 5416SystemHeader.h: 5417 class Y {}; 5418 5419Usable 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>> 5420</pre></td></tr> 5421 5422 5423<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> 5424<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 5425 5426Given 5427 struct S { bool func(); }; 5428functionDecl(returns(booleanType())) 5429 matches "bool func();" 5430</pre></td></tr> 5431 5432 5433<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> 5434<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 5435 5436Matches a node if it equals the node previously bound to ID. 5437 5438Given 5439 class X { int a; int b; }; 5440cxxRecordDecl( 5441 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5442 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5443 matches the class X, as a and b have the same type. 5444 5445Note that when multiple matches are involved via forEach* matchers, 5446equalsBoundNodes acts as a filter. 5447For example: 5448compoundStmt( 5449 forEachDescendant(varDecl().bind("d")), 5450 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5451will trigger a match for each combination of variable declaration 5452and reference to that variable declaration within a compound statement. 5453</pre></td></tr> 5454 5455 5456<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> 5457<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 5458 5459Type has pointer identity in the AST. 5460</pre></td></tr> 5461 5462 5463<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> 5464<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 5465 5466Given 5467 int i; 5468 float f; 5469realFloatingPointType() 5470 matches "float f" but not "int i" 5471</pre></td></tr> 5472 5473 5474<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> 5475<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 5476 5477Given 5478 struct S { void func(); }; 5479functionDecl(returns(voidType())) 5480 matches "void func();" 5481</pre></td></tr> 5482 5483 5484<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> 5485<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 5486 5487Given 5488 int x; 5489 int s = sizeof(x) + alignof(x) 5490unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 5491 matches sizeof(x) 5492 5493If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter 5494should be passed as a quoted string. e.g., ofKind("UETT_SizeOf"). 5495</pre></td></tr> 5496 5497 5498<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> 5499<tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the 5500specified names. 5501 5502 hasAnyOperatorName("+", "-") 5503 Is equivalent to 5504 anyOf(hasOperatorName("+"), hasOperatorName("-")) 5505</pre></td></tr> 5506 5507 5508<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> 5509<tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or 5510unary). 5511 5512Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 5513 !(a || b) 5514</pre></td></tr> 5515 5516 5517<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> 5518<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed 5519to '.'. 5520 5521Member calls on the implicit this pointer match as called with '->'. 5522 5523Given 5524 class Y { 5525 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 5526 template <class T> void f() { this->f<T>(); f<T>(); } 5527 int a; 5528 static int b; 5529 }; 5530 template <class T> 5531 class Z { 5532 void x() { this->m; } 5533 }; 5534memberExpr(isArrow()) 5535 matches this->x, x, y.x, a, this->b 5536cxxDependentScopeMemberExpr(isArrow()) 5537 matches this->m 5538unresolvedMemberExpr(isArrow()) 5539 matches this->f<T>, f<T> 5540</pre></td></tr> 5541 5542 5543<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> 5544<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 5545 5546Example matches x, but not y, z, or a. 5547(matcher = varDecl(hasAutomaticStorageDuration()) 5548void f() { 5549 int x; 5550 static int y; 5551 thread_local int z; 5552} 5553int a; 5554</pre></td></tr> 5555 5556 5557<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> 5558<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 5559 5560Example matches y and z (matcher = varDecl(hasGlobalStorage()) 5561void f() { 5562 int x; 5563 static int y; 5564} 5565int z; 5566</pre></td></tr> 5567 5568 5569<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> 5570<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 5571non-static local variable. 5572 5573Example matches x (matcher = varDecl(hasLocalStorage()) 5574void f() { 5575 int x; 5576 static int y; 5577} 5578int z; 5579</pre></td></tr> 5580 5581 5582<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> 5583<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 5584It includes the variable declared at namespace scope and those declared 5585with "static" and "extern" storage class specifiers. 5586 5587void f() { 5588 int x; 5589 static int y; 5590 thread_local int z; 5591} 5592int a; 5593static int b; 5594extern int c; 5595varDecl(hasStaticStorageDuration()) 5596 matches the function declaration y, a, b and c. 5597</pre></td></tr> 5598 5599 5600<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> 5601<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 5602 5603Example matches z, but not x, z, or a. 5604(matcher = varDecl(hasThreadStorageDuration()) 5605void f() { 5606 int x; 5607 static int y; 5608 thread_local int z; 5609} 5610int a; 5611</pre></td></tr> 5612 5613 5614<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> 5615<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations, 5616 and if constexpr. 5617 5618Given: 5619 constexpr int foo = 42; 5620 constexpr int bar(); 5621 void baz() { if constexpr(1 > 0) {} } 5622varDecl(isConstexpr()) 5623 matches the declaration of foo. 5624functionDecl(isConstexpr()) 5625 matches the declaration of bar. 5626ifStmt(isConstexpr()) 5627 matches the if statement in baz. 5628</pre></td></tr> 5629 5630 5631<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isConstinit0')"><a name="isConstinit0Anchor">isConstinit</a></td><td></td></tr> 5632<tr><td colspan="4" class="doc" id="isConstinit0"><pre>Matches constinit variable declarations. 5633 5634Given: 5635 constinit int foo = 42; 5636 constinit const char* bar = "baz"; 5637 int baz = 42; 5638 [[clang::require_constant_initialization]] int xyz = 42; 5639varDecl(isConstinit()) 5640 matches the declaration of `foo` and `bar`, but not `baz` and `xyz`. 5641</pre></td></tr> 5642 5643 5644<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> 5645<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 5646 5647Example matches A, va, fa 5648 class A {}; 5649 class B; // Doesn't match, as it has no body. 5650 int va; 5651 extern int vb; // Doesn't match, as it doesn't define the variable. 5652 void fa() {} 5653 void fb(); // Doesn't match, as it has no body. 5654 @interface X 5655 - (void)ma; // Doesn't match, interface is declaration. 5656 @end 5657 @implementation X 5658 - (void)ma {} 5659 @end 5660 5661Usable 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>>, 5662 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5663</pre></td></tr> 5664 5665 5666<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> 5667<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 5668a C++ catch block, or an Objective-C statement. 5669 5670Example matches x (matcher = varDecl(isExceptionVariable()) 5671void f(int y) { 5672 try { 5673 } catch (int x) { 5674 } 5675} 5676</pre></td></tr> 5677 5678 5679<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> 5680<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 5681static member variable template instantiations. 5682 5683Given 5684 template<typename T> void A(T t) { } 5685 template<> void A(int N) { } 5686functionDecl(isExplicitTemplateSpecialization()) 5687 matches the specialization A<int>(). 5688 5689Usable 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>> 5690</pre></td></tr> 5691 5692 5693<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> 5694<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 5695 5696Given: 5697 extern "C" void f() {} 5698 extern "C" { void g() {} } 5699 void h() {} 5700 extern "C" int x = 1; 5701 extern "C" int y = 2; 5702 int z = 3; 5703functionDecl(isExternC()) 5704 matches the declaration of f and g, but not the declaration of h. 5705varDecl(isExternC()) 5706 matches the declaration of x and y, but not the declaration of z. 5707</pre></td></tr> 5708 5709 5710<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isInitCapture0')"><a name="isInitCapture0Anchor">isInitCapture</a></td><td></td></tr> 5711<tr><td colspan="4" class="doc" id="isInitCapture0"><pre>Matches a variable serving as the implicit variable for a lambda init- 5712capture. 5713 5714Example matches x (matcher = varDecl(isInitCapture())) 5715auto f = [x=3]() { return x; }; 5716</pre></td></tr> 5717 5718 5719<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> 5720<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope. 5721 5722Example matches y (matcher = varDecl(isStaticLocal())) 5723void f() { 5724 int x; 5725 static int y; 5726} 5727static int z; 5728</pre></td></tr> 5729 5730 5731<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> 5732<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage 5733class specifier ("static" keyword) written in the source. 5734 5735Given: 5736 static void f() {} 5737 static int i = 0; 5738 extern int j; 5739 int k; 5740functionDecl(isStaticStorageClass()) 5741 matches the function declaration f. 5742varDecl(isStaticStorageClass()) 5743 matches the variable declaration i. 5744</pre></td></tr> 5745 5746 5747<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> 5748<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 5749member variable template instantiations. 5750 5751Given 5752 template <typename T> class X {}; class A {}; X<A> x; 5753or 5754 template <typename T> class X {}; class A {}; template class X<A>; 5755or 5756 template <typename T> class X {}; class A {}; extern template class X<A>; 5757cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5758 matches the template instantiation of X<A>. 5759 5760But given 5761 template <typename T> class X {}; class A {}; 5762 template <> class X<A> {}; X<A> x; 5763cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5764 does not match, as X<A> is an explicit template specialization. 5765 5766Usable 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>> 5767</pre></td></tr> 5768 5769<!--END_NARROWING_MATCHERS --> 5770</table> 5771 5772<!-- ======================================================================= --> 5773<h2 id="traversal-matchers">AST Traversal Matchers</h2> 5774<!-- ======================================================================= --> 5775 5776<p>Traversal matchers specify the relationship to other nodes that are 5777reachable from the current node.</p> 5778 5779<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 5780forEachDescendant) which work on all nodes and allow users to write more generic 5781match expressions.</p> 5782 5783<table> 5784<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 5785<!-- START_TRAVERSAL_MATCHERS --> 5786 5787<tr><td>Matcher<*></td><td class="name" onclick="toggle('binaryOperation0')"><a name="binaryOperation0Anchor">binaryOperation</a></td><td>Matcher<*>...Matcher<*></td></tr> 5788<tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators. 5789 5790The code 5791 var1 != var2; 5792might be represented in the clang AST as a binaryOperator, a 5793cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on 5794 5795* whether the types of var1 and var2 are fundamental (binaryOperator) or at 5796 least one is a class type (cxxOperatorCallExpr) 5797* whether the code appears in a template declaration, if at least one of the 5798 vars is a dependent-type (binaryOperator) 5799* whether the code relies on a rewritten binary operator, such as a 5800spaceship operator or an inverted equality operator 5801(cxxRewrittenBinaryOperator) 5802 5803This matcher elides details in places where the matchers for the nodes are 5804compatible. 5805 5806Given 5807 binaryOperation( 5808 hasOperatorName("!="), 5809 hasLHS(expr().bind("lhs")), 5810 hasRHS(expr().bind("rhs")) 5811 ) 5812matches each use of "!=" in: 5813 struct S{ 5814 bool operator!=(const S&) const; 5815 }; 5816 5817 void foo() 5818 { 5819 1 != 2; 5820 S() != S(); 5821 } 5822 5823 template<typename T> 5824 void templ() 5825 { 5826 1 != 2; 5827 T() != S(); 5828 } 5829 struct HasOpEq 5830 { 5831 bool operator==(const HasOpEq &) const; 5832 }; 5833 5834 void inverse() 5835 { 5836 HasOpEq s1; 5837 HasOpEq s2; 5838 if (s1 != s2) 5839 return; 5840 } 5841 5842 struct HasSpaceship 5843 { 5844 bool operator<=>(const HasOpEq &) const; 5845 }; 5846 5847 void use_spaceship() 5848 { 5849 HasSpaceship s1; 5850 HasSpaceship s2; 5851 if (s1 != s2) 5852 return; 5853 } 5854</pre></td></tr> 5855 5856 5857<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 5858<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 5859 5860Unlike anyOf, eachOf will generate a match result for each 5861matching submatcher. 5862 5863For example, in: 5864 class A { int a; int b; }; 5865The matcher: 5866 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 5867 has(fieldDecl(hasName("b")).bind("v")))) 5868will generate two results binding "v", the first of which binds 5869the field declaration of a, the second the field declaration of 5870b. 5871 5872Usable as: Any Matcher 5873</pre></td></tr> 5874 5875 5876<tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr> 5877<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 5878 5879Generates results for each match. 5880 5881For example, in: 5882 class A { class B {}; class C {}; }; 5883The matcher: 5884 cxxRecordDecl(hasName("::A"), 5885 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 5886will generate results for A, B and C. 5887 5888Usable as: Any Matcher 5889</pre></td></tr> 5890 5891 5892<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 5893<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5894provided matcher. 5895 5896Example matches X, A, A::X, B, B::C, B::C::X 5897 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 5898 class X {}; 5899 class A { class X {}; }; // Matches A, because A::X is a class of name 5900 // X inside A. 5901 class B { class C { class X {}; }; }; 5902 5903DescendantT must be an AST base type. 5904 5905As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 5906each result that matches instead of only on the first one. 5907 5908Note: Recursively combined ForEachDescendant can cause many matches: 5909 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 5910 forEachDescendant(cxxRecordDecl()) 5911 ))) 5912will match 10 times (plus injected class name matches) on: 5913 class A { class B { class C { class D { class E {}; }; }; }; }; 5914 5915Usable as: Any Matcher 5916</pre></td></tr> 5917 5918 5919<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 5920<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 5921provided matcher. 5922 5923Example matches X, Y, Y::X, Z::Y, Z::Y::X 5924 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 5925 class X {}; 5926 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X 5927 // inside Y. 5928 class Z { class Y { class X {}; }; }; // Does not match Z. 5929 5930ChildT must be an AST base type. 5931 5932As opposed to 'has', 'forEach' will cause a match for each result that 5933matches instead of only on the first one. 5934 5935Usable as: Any Matcher 5936</pre></td></tr> 5937 5938 5939<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 5940<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 5941matcher. 5942 5943Given 5944void f() { if (true) { int x = 42; } } 5945void g() { for (;;) { int x = 43; } } 5946expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 5947 5948Usable as: Any Matcher 5949</pre></td></tr> 5950 5951 5952<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 5953<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5954provided matcher. 5955 5956Example matches X, Y, Z 5957 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 5958 class X {}; // Matches X, because X::X is a class of name X inside X. 5959 class Y { class X {}; }; 5960 class Z { class Y { class X {}; }; }; 5961 5962DescendantT must be an AST base type. 5963 5964Usable as: Any Matcher 5965</pre></td></tr> 5966 5967 5968<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 5969<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 5970provided matcher. 5971 5972Example matches X, Y 5973 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 5974 class X {}; // Matches X, because X::X is a class of name X inside X. 5975 class Y { class X {}; }; 5976 class Z { class Y { class X {}; }; }; // Does not match Z. 5977 5978ChildT must be an AST base type. 5979 5980Usable as: Any Matcher 5981Note that has is direct matcher, so it also matches things like implicit 5982casts and paren casts. If you are matching with expr then you should 5983probably consider using ignoringParenImpCasts like: 5984has(ignoringParenImpCasts(expr())). 5985</pre></td></tr> 5986 5987 5988<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 5989<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 5990matcher. 5991 5992Given 5993void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 5994compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 5995 5996Usable as: Any Matcher 5997</pre></td></tr> 5998 5999 6000<tr><td>Matcher<*></td><td class="name" onclick="toggle('invocation0')"><a name="invocation0Anchor">invocation</a></td><td>Matcher<*>...Matcher<*></td></tr> 6001<tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls 6002 6003Because CallExpr and CXXConstructExpr do not share a common 6004base class with API accessing arguments etc, AST Matchers for code 6005which should match both are typically duplicated. This matcher 6006removes the need for duplication. 6007 6008Given code 6009struct ConstructorTakesInt 6010{ 6011 ConstructorTakesInt(int i) {} 6012}; 6013 6014void callTakesInt(int i) 6015{ 6016} 6017 6018void doCall() 6019{ 6020 callTakesInt(42); 6021} 6022 6023void doConstruct() 6024{ 6025 ConstructorTakesInt cti(42); 6026} 6027 6028The matcher 6029invocation(hasArgument(0, integerLiteral(equals(42)))) 6030matches the expression in both doCall and doConstruct 6031</pre></td></tr> 6032 6033 6034<tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr> 6035<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher. 6036 6037However, optionally will retain any bindings generated by the submatcher. 6038Useful when additional information which may or may not present about a main 6039matching node is desired. 6040 6041For example, in: 6042 class Foo { 6043 int bar; 6044 } 6045The matcher: 6046 cxxRecordDecl( 6047 optionally(has( 6048 fieldDecl(hasName("bar")).bind("var") 6049 ))).bind("record") 6050will produce a result binding for both "record" and "var". 6051The matcher will produce a "record" binding for even if there is no data 6052member named "bar" in that class. 6053 6054Usable as: Any Matcher 6055</pre></td></tr> 6056 6057 6058<tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr> 6059<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind. 6060 6061Given 6062 void foo() 6063 { 6064 int i = 3.0; 6065 } 6066The matcher 6067 traverse(TK_IgnoreUnlessSpelledInSource, 6068 varDecl(hasInitializer(floatLiteral().bind("init"))) 6069 ) 6070matches the variable declaration with "init" bound to the "3.0". 6071</pre></td></tr> 6072 6073 6074<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> 6075<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 6076switch statement or conditional operator. 6077 6078Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6079 if (true) {} 6080</pre></td></tr> 6081 6082 6083<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> 6084<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 6085(binary or ternary). 6086 6087Example matches b 6088 condition ? a : b 6089 condition ?: b 6090</pre></td></tr> 6091 6092 6093<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> 6094<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 6095 6096Example 1 (conditional ternary operator): matches a 6097 condition ? a : b 6098 6099Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 6100 condition ?: b 6101</pre></td></tr> 6102 6103 6104<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> 6105<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 6106matches the given matcher. 6107 6108The associated declaration is: 6109- for type nodes, the declaration of the underlying type 6110- for CallExpr, the declaration of the callee 6111- for MemberExpr, the declaration of the referenced member 6112- for CXXConstructExpr, the declaration of the constructor 6113- for CXXNewExpr, the declaration of the operator new 6114- for ObjCIvarExpr, the declaration of the ivar 6115 6116For type nodes, hasDeclaration will generally match the declaration of the 6117sugared type. Given 6118 class X {}; 6119 typedef X Y; 6120 Y y; 6121in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6122typedefDecl. A common use case is to match the underlying, desugared type. 6123This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6124 varDecl(hasType(hasUnqualifiedDesugaredType( 6125 recordType(hasDeclaration(decl()))))) 6126In this matcher, the decl will match the CXXRecordDecl of class X. 6127 6128Usable 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>>, 6129 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>>, 6130 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>>, 6131 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>>, 6132 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>>, 6133 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>>, 6134 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6135</pre></td></tr> 6136 6137 6138<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> 6139<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 6140 6141Given 6142 int i[5]; 6143 void f() { i[1] = 42; } 6144arraySubscriptExpression(hasBase(implicitCastExpr( 6145 hasSourceExpression(declRefExpr())))) 6146 matches i[1] with the declRefExpr() matching i 6147</pre></td></tr> 6148 6149 6150<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> 6151<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 6152 6153Given 6154 int i[5]; 6155 void f() { i[1] = 42; } 6156arraySubscriptExpression(hasIndex(integerLiteral())) 6157 matches i[1] with the integerLiteral() matching 1 6158</pre></td></tr> 6159 6160 6161<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> 6162<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions. 6163 6164Example matches a (matcher = binaryOperator(hasLHS())) 6165 a || b 6166</pre></td></tr> 6167 6168 6169<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> 6170<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions. 6171 6172Example matches b (matcher = binaryOperator(hasRHS())) 6173 a || b 6174</pre></td></tr> 6175 6176 6177<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> 6178<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 6179type. 6180 6181Given 6182 struct A {}; 6183 A a[7]; 6184 int b[7]; 6185arrayType(hasElementType(builtinType())) 6186 matches "int b[7]" 6187 6188Usable 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>> 6189</pre></td></tr> 6190 6191 6192<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> 6193<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 6194 6195Given 6196 _Atomic(int) i; 6197 _Atomic(float) f; 6198atomicType(hasValueType(isInteger())) 6199 matches "_Atomic(int) i" 6200 6201Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 6202</pre></td></tr> 6203 6204 6205<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> 6206<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 6207 6208Note: There is no TypeLoc for the deduced type and thus no 6209getDeducedLoc() matcher. 6210 6211Given 6212 auto a = 1; 6213 auto b = 2.0; 6214autoType(hasDeducedType(isInteger())) 6215 matches "auto a" 6216 6217Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 6218</pre></td></tr> 6219 6220 6221<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BaseUsingDecl.html">BaseUsingDecl</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> 6222<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 6223 6224Given 6225 namespace X { void b(); } 6226 using X::b; 6227usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 6228 matches using X::b </pre></td></tr> 6229 6230 6231<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> 6232<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 6233binary operator matches. 6234</pre></td></tr> 6235 6236 6237<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> 6238<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 6239 6240Example matches a (matcher = binaryOperator(hasLHS())) 6241 a || b 6242</pre></td></tr> 6243 6244 6245<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> 6246<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator. 6247 6248Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6249 integerLiteral(equals(2))) 6250 1 + 2 // Match 6251 2 + 1 // Match 6252 1 + 1 // No match 6253 2 + 2 // No match 6254</pre></td></tr> 6255 6256 6257<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> 6258<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 6259 6260Example matches b (matcher = binaryOperator(hasRHS())) 6261 a || b 6262</pre></td></tr> 6263 6264 6265<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> 6266<tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to. 6267 6268For example, in: 6269void foo() 6270{ 6271 int arr[3]; 6272 auto &[f, s, t] = arr; 6273 6274 f = 42; 6275} 6276The matcher: 6277 bindingDecl(hasName("f"), 6278 forDecomposition(decompositionDecl()) 6279matches 'f' in 'auto &[f, s, t]'. 6280</pre></td></tr> 6281 6282 6283<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> 6284<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 6285block. 6286 6287Does not match the 'this' parameter of a method. 6288 6289Given 6290 class X { void f(int x, int y, int z) {} }; 6291cxxMethodDecl(hasAnyParameter(hasName("y"))) 6292 matches f(int x, int y, int z) {} 6293with hasAnyParameter(...) 6294 matching int y 6295 6296For ObjectiveC, given 6297 @interface I - (void) f:(int) y; @end 6298 6299the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 6300matches the declaration of method f with hasParameter 6301matching y. 6302 6303For blocks, given 6304 b = ^(int y) { printf("%d", y) }; 6305 6306the matcher blockDecl(hasAnyParameter(hasName("y"))) 6307matches the declaration of the block b with hasParameter 6308matching y. 6309</pre></td></tr> 6310 6311 6312<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> 6313<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 6314declaration or a block. 6315 6316Given 6317 class X { void f(int x) {} }; 6318cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6319 matches f(int x) {} 6320with hasParameter(...) 6321 matching int x 6322 6323For ObjectiveC, given 6324 @interface I - (void) f:(int) y; @end 6325 6326the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6327matches the declaration of method f with hasParameter 6328matching y. 6329</pre></td></tr> 6330 6331 6332<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc0')"><a name="hasTypeLoc0Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6333<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher. 6334 6335Examples: 6336 int x; 6337declaratorDecl(hasTypeLoc(loc(asString("int")))) 6338 matches int x 6339 6340auto x = int(3); 6341cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6342 matches int(3) 6343 6344struct Foo { Foo(int, int); }; 6345auto x = Foo(1, 2); 6346cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6347 matches Foo(1, 2) 6348 6349Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6350 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6351 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6352 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6353 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6354 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6355 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6356 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6357</pre></td></tr> 6358 6359 6360<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> 6361<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 6362pointee matches a given matcher. 6363 6364Given 6365 int *a; 6366 int const *b; 6367 float const *f; 6368pointerType(pointee(isConstQualified(), isInteger())) 6369 matches "int const *b" 6370 6371Usable 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>>, 6372 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>> 6373</pre></td></tr> 6374 6375 6376<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasTypeLoc1')"><a name="hasTypeLoc1Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6377<tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher. 6378 6379Examples: 6380 int x; 6381declaratorDecl(hasTypeLoc(loc(asString("int")))) 6382 matches int x 6383 6384auto x = int(3); 6385cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6386 matches int(3) 6387 6388struct Foo { Foo(int, int); }; 6389auto x = Foo(1, 2); 6390cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6391 matches Foo(1, 2) 6392 6393Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6394 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6395 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6396 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6397 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6398 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6399 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6400 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6401</pre></td></tr> 6402 6403 6404<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> 6405<tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value 6406declaration's type. 6407 6408In case of a value declaration (for example a variable declaration), 6409this resolves one layer of indirection. For example, in the value 6410declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6411X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6412declaration of x. 6413 6414Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6415 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6416 and friend class X (matcher = friendDecl(hasType("X")) 6417 and public virtual X (matcher = cxxBaseSpecifier(hasType( 6418 cxxRecordDecl(hasName("X")))) 6419 class X {}; 6420 void y(X &x) { x; X z; } 6421 class Y { friend class X; }; 6422 class Z : public virtual X {}; 6423 6424Example matches class Derived 6425(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6426class Base {}; 6427class Derived : Base {}; 6428 6429Usable 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>>, 6430Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6431</pre></td></tr> 6432 6433 6434<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> 6435<tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type 6436matcher. 6437 6438Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6439 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6440 and U (matcher = typedefDecl(hasType(asString("int"))) 6441 and friend class X (matcher = friendDecl(hasType("X")) 6442 and public virtual X (matcher = cxxBaseSpecifier(hasType( 6443 asString("class X"))) 6444 class X {}; 6445 void y(X &x) { x; X z; } 6446 typedef int U; 6447 class Y { friend class X; }; 6448 class Z : public virtual X {}; 6449</pre></td></tr> 6450 6451 6452<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> 6453<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 6454 6455Given 6456 void f(int i); 6457 int y; 6458 f(y); 6459callExpr( 6460 forEachArgumentWithParam( 6461 declRefExpr(to(varDecl(hasName("y")))), 6462 parmVarDecl(hasType(isInteger())) 6463)) 6464 matches f(y); 6465with declRefExpr(...) 6466 matching int y 6467and parmVarDecl(...) 6468 matching int i 6469</pre></td></tr> 6470 6471 6472<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> 6473<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or 6474CXXConstructExpr. It is very similar to forEachArgumentWithParam but 6475it works on calls through function pointers as well. 6476 6477The difference is, that function pointers do not provide access to a 6478ParmVarDecl, but only the QualType for each argument. 6479 6480Given 6481 void f(int i); 6482 int y; 6483 f(y); 6484 void (*f_ptr)(int) = f; 6485 f_ptr(y); 6486callExpr( 6487 forEachArgumentWithParamType( 6488 declRefExpr(to(varDecl(hasName("y")))), 6489 qualType(isInteger()).bind("type) 6490)) 6491 matches f(y) and f_ptr(y) 6492with declRefExpr(...) 6493 matching int y 6494and qualType(...) 6495 matching int 6496</pre></td></tr> 6497 6498 6499<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> 6500<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 6501expression, or an ObjC-message-send expression. 6502 6503Given 6504 void x(int, int, int) { int y; x(1, y, 42); } 6505callExpr(hasAnyArgument(declRefExpr())) 6506 matches x(1, y, 42) 6507with hasAnyArgument(...) 6508 matching y 6509 6510For ObjectiveC, given 6511 @interface I - (void) f:(int) y; @end 6512 void foo(I *i) { [i f:12]; } 6513objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6514 matches [i f:12] 6515</pre></td></tr> 6516 6517 6518<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> 6519<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 6520call expression. 6521 6522Example matches y in x(y) 6523 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6524 void x(int) { int y; x(y); } 6525</pre></td></tr> 6526 6527 6528<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> 6529<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 6530matches the given matcher. 6531 6532The associated declaration is: 6533- for type nodes, the declaration of the underlying type 6534- for CallExpr, the declaration of the callee 6535- for MemberExpr, the declaration of the referenced member 6536- for CXXConstructExpr, the declaration of the constructor 6537- for CXXNewExpr, the declaration of the operator new 6538- for ObjCIvarExpr, the declaration of the ivar 6539 6540For type nodes, hasDeclaration will generally match the declaration of the 6541sugared type. Given 6542 class X {}; 6543 typedef X Y; 6544 Y y; 6545in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6546typedefDecl. A common use case is to match the underlying, desugared type. 6547This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6548 varDecl(hasType(hasUnqualifiedDesugaredType( 6549 recordType(hasDeclaration(decl()))))) 6550In this matcher, the decl will match the CXXRecordDecl of class X. 6551 6552Usable 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>>, 6553 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>>, 6554 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>>, 6555 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>>, 6556 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>>, 6557 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>>, 6558 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6559</pre></td></tr> 6560 6561 6562<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> 6563<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 6564 6565Given 6566 class A { A() : i(42), j(42) {} int i; int j; }; 6567cxxConstructorDecl(forEachConstructorInitializer( 6568 forField(decl().bind("x")) 6569)) 6570 will trigger two matches, binding for 'i' and 'j' respectively. 6571</pre></td></tr> 6572 6573 6574<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> 6575<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 6576 6577Given 6578 struct Foo { 6579 Foo() : foo_(1) { } 6580 int foo_; 6581 }; 6582cxxRecordDecl(has(cxxConstructorDecl( 6583 hasAnyConstructorInitializer(anything()) 6584))) 6585 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 6586</pre></td></tr> 6587 6588 6589<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> 6590<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 6591 6592Given 6593 struct Foo { 6594 Foo() : foo_(1) { } 6595 int foo_; 6596 }; 6597cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6598 forField(hasName("foo_")))))) 6599 matches Foo 6600with forField matching foo_ 6601</pre></td></tr> 6602 6603 6604<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('hasTypeLoc2')"><a name="hasTypeLoc2Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6605<tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher. 6606 6607Examples: 6608 int x; 6609declaratorDecl(hasTypeLoc(loc(asString("int")))) 6610 matches int x 6611 6612auto x = int(3); 6613cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6614 matches int(3) 6615 6616struct Foo { Foo(int, int); }; 6617auto x = Foo(1, 2); 6618cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6619 matches Foo(1, 2) 6620 6621Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6622 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6623 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6624 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6625 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6626 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6627 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6628 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6629</pre></td></tr> 6630 6631 6632<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> 6633<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 6634 6635Given 6636 struct Foo { 6637 Foo() : foo_(1) { } 6638 int foo_; 6639 }; 6640cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6641 withInitializer(integerLiteral(equals(1))))))) 6642 matches Foo 6643with withInitializer matching (1) 6644</pre></td></tr> 6645 6646 6647<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> 6648<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 6649given matcher. Implicit object expressions are included; that is, it matches 6650use of implicit `this`. 6651 6652Given 6653 struct X { 6654 int m; 6655 int f(X x) { x.m; return m; } 6656 }; 6657memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6658 matches `x.m`, but not `m`; however, 6659memberExpr(hasObjectExpression(hasType(pointsTo( 6660 cxxRecordDecl(hasName("X")))))) 6661 matches `m` (aka. `this->m`), but not `x.m`. 6662</pre></td></tr> 6663 6664 6665<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> 6666<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr> 6667 6668 6669<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> 6670<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer. 6671 6672Given: 6673 void foo() { 6674 if (int i = foobar(); i > 0) {} 6675 switch (int i = foobar(); i) {} 6676 for (auto& a = get_range(); auto& x : a) {} 6677 } 6678 void bar() { 6679 if (foobar() > 0) {} 6680 switch (foobar()) {} 6681 for (auto& x : get_range()) {} 6682 } 6683ifStmt(hasInitStatement(anything())) 6684 matches the if statement in foo but not in bar. 6685switchStmt(hasInitStatement(anything())) 6686 matches the switch statement in foo but not in bar. 6687cxxForRangeStmt(hasInitStatement(anything())) 6688 matches the range for statement in foo but not in bar. 6689</pre></td></tr> 6690 6691 6692<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> 6693<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 6694 6695Example: 6696 forStmt(hasLoopVariable(anything())) 6697matches 'int x' in 6698 for (int x : a) { } 6699</pre></td></tr> 6700 6701 6702<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> 6703<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 6704 6705Example: 6706 forStmt(hasRangeInit(anything())) 6707matches 'a' in 6708 for (int x : a) { } 6709</pre></td></tr> 6710 6711 6712<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc3')"><a name="hasTypeLoc3Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6713<tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher. 6714 6715Examples: 6716 int x; 6717declaratorDecl(hasTypeLoc(loc(asString("int")))) 6718 matches int x 6719 6720auto x = int(3); 6721cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6722 matches int(3) 6723 6724struct Foo { Foo(int, int); }; 6725auto x = Foo(1, 2); 6726cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6727 matches Foo(1, 2) 6728 6729Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6730 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6731 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6732 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6733 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6734 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6735 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6736 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6737</pre></td></tr> 6738 6739 6740<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> 6741<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 6742`on`, matches the argument directly without stripping away anything. 6743 6744Given 6745 class Y { public: void m(); }; 6746 Y g(); 6747 class X : public Y { void g(); }; 6748 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 6749cxxMemberCallExpr(onImplicitObjectArgument(hasType( 6750 cxxRecordDecl(hasName("Y"))))) 6751 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 6752cxxMemberCallExpr(on(callExpr())) 6753 does not match `(g()).m()`, because the parens are not ignored. 6754 6755FIXME: Overload to allow directly matching types? 6756</pre></td></tr> 6757 6758 6759<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> 6760<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 6761stripping off any parentheses or implicit casts. 6762 6763Given 6764 class Y { public: void m(); }; 6765 Y g(); 6766 class X : public Y {}; 6767 void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 6768cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 6769 matches `y.m()` and `(g()).m()`. 6770cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 6771 matches `x.m()`. 6772cxxMemberCallExpr(on(callExpr())) 6773 matches `(g()).m()`. 6774 6775FIXME: Overload to allow directly matching types? 6776</pre></td></tr> 6777 6778 6779<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> 6780<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 6781</pre></td></tr> 6782 6783 6784<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> 6785<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 6786matches the InnerMatcher, or is a pointer to a type that matches the 6787InnerMatcher. 6788 6789Given 6790 class Y { public: void m(); }; 6791 class X : public Y { void g(); }; 6792 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 6793cxxMemberCallExpr(thisPointerType(hasDeclaration( 6794 cxxRecordDecl(hasName("Y"))))) 6795 matches `y.m()`, `p->m()` and `x.m()`. 6796cxxMemberCallExpr(thisPointerType(hasDeclaration( 6797 cxxRecordDecl(hasName("X"))))) 6798 matches `x.g()`. 6799</pre></td></tr> 6800 6801 6802<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> 6803<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 6804produce multiple matches. 6805 6806Given 6807 class A { virtual void f(); }; 6808 class B : public A { void f(); }; 6809 class C : public B { void f(); }; 6810cxxMethodDecl(ofClass(hasName("C")), 6811 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6812 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 6813 that B::f is not overridden by C::f). 6814 6815The check can produce multiple matches in case of multiple inheritance, e.g. 6816 class A1 { virtual void f(); }; 6817 class A2 { virtual void f(); }; 6818 class C : public A1, public A2 { void f(); }; 6819cxxMethodDecl(ofClass(hasName("C")), 6820 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6821 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 6822 once with "b" binding "A2::f" and "d" binding "C::f". 6823</pre></td></tr> 6824 6825 6826<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> 6827<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 6828belongs to. 6829 6830FIXME: Generalize this for other kinds of declarations. 6831FIXME: What other kind of declarations would we need to generalize 6832this to? 6833 6834Example matches A() in the last line 6835 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 6836 ofClass(hasName("A")))))) 6837 class A { 6838 public: 6839 A(); 6840 }; 6841 A a = A(); 6842</pre></td></tr> 6843 6844 6845<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> 6846<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments. 6847 6848Given: 6849 MyClass *p1 = new (Storage) MyClass(); 6850cxxNewExpr(hasAnyPlacementArg(anything())) 6851 matches the expression 'new (Storage, 16) MyClass()'. 6852</pre></td></tr> 6853 6854 6855<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> 6856<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 6857 6858Given: 6859 MyClass *p1 = new MyClass[10]; 6860cxxNewExpr(hasArraySize(integerLiteral(equals(10)))) 6861 matches the expression 'new MyClass[10]'. 6862</pre></td></tr> 6863 6864 6865<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> 6866<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 6867matches the given matcher. 6868 6869The associated declaration is: 6870- for type nodes, the declaration of the underlying type 6871- for CallExpr, the declaration of the callee 6872- for MemberExpr, the declaration of the referenced member 6873- for CXXConstructExpr, the declaration of the constructor 6874- for CXXNewExpr, the declaration of the operator new 6875- for ObjCIvarExpr, the declaration of the ivar 6876 6877For type nodes, hasDeclaration will generally match the declaration of the 6878sugared type. Given 6879 class X {}; 6880 typedef X Y; 6881 Y y; 6882in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6883typedefDecl. A common use case is to match the underlying, desugared type. 6884This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6885 varDecl(hasType(hasUnqualifiedDesugaredType( 6886 recordType(hasDeclaration(decl()))))) 6887In this matcher, the decl will match the CXXRecordDecl of class X. 6888 6889Usable 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>>, 6890 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>>, 6891 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>>, 6892 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>>, 6893 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>>, 6894 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>>, 6895 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6896</pre></td></tr> 6897 6898 6899<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> 6900<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments. 6901 6902Given: 6903 MyClass *p1 = new (Storage, 16) MyClass(); 6904cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16)))) 6905 matches the expression 'new (Storage, 16) MyClass()'. 6906</pre></td></tr> 6907 6908 6909<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc4')"><a name="hasTypeLoc4Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6910<tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher. 6911 6912Examples: 6913 int x; 6914declaratorDecl(hasTypeLoc(loc(asString("int")))) 6915 matches int x 6916 6917auto x = int(3); 6918cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6919 matches int(3) 6920 6921struct Foo { Foo(int, int); }; 6922auto x = Foo(1, 2); 6923cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6924 matches Foo(1, 2) 6925 6926Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6927 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6928 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6929 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6930 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6931 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6932 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6933 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6934</pre></td></tr> 6935 6936 6937<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> 6938<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a 6939binary operator matches. 6940</pre></td></tr> 6941 6942 6943<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> 6944<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 6945 6946Example matches a (matcher = binaryOperator(hasLHS())) 6947 a || b 6948</pre></td></tr> 6949 6950 6951<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> 6952<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator. 6953 6954Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6955 integerLiteral(equals(2))) 6956 1 + 2 // Match 6957 2 + 1 // Match 6958 1 + 1 // No match 6959 2 + 2 // No match 6960</pre></td></tr> 6961 6962 6963<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> 6964<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 6965 6966Example matches b (matcher = binaryOperator(hasRHS())) 6967 a || b 6968</pre></td></tr> 6969 6970 6971<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> 6972<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches. 6973 6974Example matches true (matcher = hasUnaryOperand( 6975 cxxBoolLiteral(equals(true)))) 6976 !true 6977</pre></td></tr> 6978 6979 6980<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> 6981<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher. 6982 6983Example: 6984matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6985 class Foo; 6986 class Bar : Foo {}; 6987 class Baz : Bar {}; 6988 class SpecialBase; 6989 class Proxy : SpecialBase {}; // matches Proxy 6990 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived 6991 6992FIXME: Refactor this and isDerivedFrom to reuse implementation. 6993</pre></td></tr> 6994 6995 6996<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> 6997<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher. 6998 6999Example: 7000matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 7001 class Foo; 7002 class Bar : Foo {}; 7003 class Baz : Bar {}; 7004 class SpecialBase; 7005 class Proxy : SpecialBase {}; // matches Proxy 7006 class IndirectlyDerived : Proxy {}; // doesn't match 7007</pre></td></tr> 7008 7009 7010<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> 7011<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 7012 7013Given: 7014 class A { void func(); }; 7015 class B { void member(); }; 7016 7017cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 7018A but not B. 7019</pre></td></tr> 7020 7021 7022<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> 7023<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class 7024matching Base, or Objective-C classes that directly or indirectly 7025subclass a class matching Base. 7026 7027Note that a class is not considered to be derived from itself. 7028 7029Example matches Y, Z, C (Base == hasName("X")) 7030 class X; 7031 class Y : public X {}; // directly derived 7032 class Z : public Y {}; // indirectly derived 7033 typedef X A; 7034 typedef A B; 7035 class C : public B {}; // derived from a typedef of X 7036 7037In the following example, Bar matches isDerivedFrom(hasName("X")): 7038 class Foo; 7039 typedef Foo X; 7040 class Bar : public Foo {}; // derived from a type that X is a typedef of 7041 7042In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 7043 @interface NSObject @end 7044 @interface Bar : NSObject @end 7045 7046Usable 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>> 7047</pre></td></tr> 7048 7049 7050<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> 7051<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class 7052matching Base. 7053 7054Note that a class is not considered to be derived from itself. 7055 7056Example matches Y, C (Base == hasName("X")) 7057 class X; 7058 class Y : public X {}; // directly derived 7059 class Z : public Y {}; // indirectly derived 7060 typedef X A; 7061 typedef A B; 7062 class C : public B {}; // derived from a typedef of X 7063 7064In the following example, Bar matches isDerivedFrom(hasName("X")): 7065 class Foo; 7066 typedef Foo X; 7067 class Bar : public Foo {}; // derived from a type that X is a typedef of 7068</pre></td></tr> 7069 7070 7071<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> 7072<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 7073match Base. 7074</pre></td></tr> 7075 7076 7077<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> 7078<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a 7079binary operator matches. 7080</pre></td></tr> 7081 7082 7083<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> 7084<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions. 7085 7086Example matches a (matcher = binaryOperator(hasLHS())) 7087 a || b 7088</pre></td></tr> 7089 7090 7091<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> 7092<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator. 7093 7094Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 7095 integerLiteral(equals(2))) 7096 1 + 2 // Match 7097 2 + 1 // Match 7098 1 + 1 // No match 7099 2 + 2 // No match 7100</pre></td></tr> 7101 7102 7103<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> 7104<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions. 7105 7106Example matches b (matcher = binaryOperator(hasRHS())) 7107 a || b 7108</pre></td></tr> 7109 7110 7111<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc5')"><a name="hasTypeLoc5Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7112<tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher. 7113 7114Examples: 7115 int x; 7116declaratorDecl(hasTypeLoc(loc(asString("int")))) 7117 matches int x 7118 7119auto x = int(3); 7120cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7121 matches int(3) 7122 7123struct Foo { Foo(int, int); }; 7124auto x = Foo(1, 2); 7125cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7126 matches Foo(1, 2) 7127 7128Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7129 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7130 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7131 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7132 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7133 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7134 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7135 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7136</pre></td></tr> 7137 7138 7139<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> 7140<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 7141expression, or an ObjC-message-send expression. 7142 7143Given 7144 void x(int, int, int) { int y; x(1, y, 42); } 7145callExpr(hasAnyArgument(declRefExpr())) 7146 matches x(1, y, 42) 7147with hasAnyArgument(...) 7148 matching y 7149 7150For ObjectiveC, given 7151 @interface I - (void) f:(int) y; @end 7152 void foo(I *i) { [i f:12]; } 7153objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 7154 matches [i f:12] 7155</pre></td></tr> 7156 7157 7158<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> 7159<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 7160call expression. 7161 7162Example matches y in x(y) 7163 (matcher = callExpr(hasArgument(0, declRefExpr()))) 7164 void x(int) { int y; x(y); } 7165</pre></td></tr> 7166 7167 7168<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc6')"><a name="hasTypeLoc6Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7169<tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher. 7170 7171Examples: 7172 int x; 7173declaratorDecl(hasTypeLoc(loc(asString("int")))) 7174 matches int x 7175 7176auto x = int(3); 7177cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7178 matches int(3) 7179 7180struct Foo { Foo(int, int); }; 7181auto x = Foo(1, 2); 7182cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7183 matches Foo(1, 2) 7184 7185Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7186 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7187 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7188 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7189 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7190 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7191 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7192 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7193</pre></td></tr> 7194 7195 7196<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> 7197<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 7198given matcher. 7199 7200Example matches y.x() (matcher = callExpr(callee( 7201 cxxMethodDecl(hasName("x"))))) 7202 class Y { public: void x(); }; 7203 void z() { Y y; y.x(); } 7204</pre></td></tr> 7205 7206 7207<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> 7208<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 7209 7210Given 7211 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 7212 void f() { f(); } 7213callExpr(callee(expr())) 7214 matches this->x(), x(), y.x(), f() 7215with callee(...) 7216 matching this->x, x, y.x, f respectively 7217 7218Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 7219because this introduces ambiguous overloads with calls to Callee taking a 7220internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 7221implemented in terms of implicit casts. 7222</pre></td></tr> 7223 7224 7225<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> 7226<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 7227 7228Given 7229 void f(int i); 7230 int y; 7231 f(y); 7232callExpr( 7233 forEachArgumentWithParam( 7234 declRefExpr(to(varDecl(hasName("y")))), 7235 parmVarDecl(hasType(isInteger())) 7236)) 7237 matches f(y); 7238with declRefExpr(...) 7239 matching int y 7240and parmVarDecl(...) 7241 matching int i 7242</pre></td></tr> 7243 7244 7245<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> 7246<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or 7247CXXConstructExpr. It is very similar to forEachArgumentWithParam but 7248it works on calls through function pointers as well. 7249 7250The difference is, that function pointers do not provide access to a 7251ParmVarDecl, but only the QualType for each argument. 7252 7253Given 7254 void f(int i); 7255 int y; 7256 f(y); 7257 void (*f_ptr)(int) = f; 7258 f_ptr(y); 7259callExpr( 7260 forEachArgumentWithParamType( 7261 declRefExpr(to(varDecl(hasName("y")))), 7262 qualType(isInteger()).bind("type) 7263)) 7264 matches f(y) and f_ptr(y) 7265with declRefExpr(...) 7266 matching int y 7267and qualType(...) 7268 matching int 7269</pre></td></tr> 7270 7271 7272<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> 7273<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 7274expression, or an ObjC-message-send expression. 7275 7276Given 7277 void x(int, int, int) { int y; x(1, y, 42); } 7278callExpr(hasAnyArgument(declRefExpr())) 7279 matches x(1, y, 42) 7280with hasAnyArgument(...) 7281 matching y 7282 7283For ObjectiveC, given 7284 @interface I - (void) f:(int) y; @end 7285 void foo(I *i) { [i f:12]; } 7286objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 7287 matches [i f:12] 7288</pre></td></tr> 7289 7290 7291<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> 7292<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 7293call expression. 7294 7295Example matches y in x(y) 7296 (matcher = callExpr(hasArgument(0, declRefExpr()))) 7297 void x(int) { int y; x(y); } 7298</pre></td></tr> 7299 7300 7301<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> 7302<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 7303matches the given matcher. 7304 7305The associated declaration is: 7306- for type nodes, the declaration of the underlying type 7307- for CallExpr, the declaration of the callee 7308- for MemberExpr, the declaration of the referenced member 7309- for CXXConstructExpr, the declaration of the constructor 7310- for CXXNewExpr, the declaration of the operator new 7311- for ObjCIvarExpr, the declaration of the ivar 7312 7313For type nodes, hasDeclaration will generally match the declaration of the 7314sugared type. Given 7315 class X {}; 7316 typedef X Y; 7317 Y y; 7318in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7319typedefDecl. A common use case is to match the underlying, desugared type. 7320This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7321 varDecl(hasType(hasUnqualifiedDesugaredType( 7322 recordType(hasDeclaration(decl()))))) 7323In this matcher, the decl will match the CXXRecordDecl of class X. 7324 7325Usable 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>>, 7326 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>>, 7327 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>>, 7328 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>>, 7329 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>>, 7330 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>>, 7331 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7332</pre></td></tr> 7333 7334 7335<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> 7336<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 7337extension, matches the constant given in the statement. 7338 7339Given 7340 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 7341caseStmt(hasCaseConstant(integerLiteral())) 7342 matches "case 1:" 7343</pre></td></tr> 7344 7345 7346<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> 7347<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 7348or opaque value's source expression matches the given matcher. 7349 7350Example 1: matches "a string" 7351(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 7352class URL { URL(string); }; 7353URL url = "a string"; 7354 7355Example 2: matches 'b' (matcher = 7356opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 7357int a = b ?: 1; 7358</pre></td></tr> 7359 7360 7361<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> 7362<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7363functionDecl that have at least one TemplateArgument matching the given 7364InnerMatcher. 7365 7366Given 7367 template<typename T> class A {}; 7368 template<> class A<double> {}; 7369 A<int> a; 7370 7371 template<typename T> f() {}; 7372 void func() { f<int>(); }; 7373 7374classTemplateSpecializationDecl(hasAnyTemplateArgument( 7375 refersToType(asString("int")))) 7376 matches the specialization A<int> 7377 7378functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7379 matches the specialization f<int> 7380</pre></td></tr> 7381 7382 7383<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> 7384<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 7385 7386Given 7387 template<typename T> class A {}; #1 7388 template<> class A<int> {}; #2 7389classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 7390 matches '#2' with classTemplateDecl() matching the class template 7391 declaration of 'A' at #1. 7392</pre></td></tr> 7393 7394 7395<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> 7396<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7397functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7398 7399Given 7400 template<typename T, typename U> class A {}; 7401 A<bool, int> b; 7402 A<int, bool> c; 7403 7404 template<typename T> void f() {} 7405 void func() { f<int>(); }; 7406classTemplateSpecializationDecl(hasTemplateArgument( 7407 1, refersToType(asString("int")))) 7408 matches the specialization A<bool, int> 7409 7410functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7411 matches the specialization f<int> 7412</pre></td></tr> 7413 7414 7415<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc7')"><a name="hasTypeLoc7Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7416<tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher. 7417 7418Examples: 7419 int x; 7420declaratorDecl(hasTypeLoc(loc(asString("int")))) 7421 matches int x 7422 7423auto x = int(3); 7424cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7425 matches int(3) 7426 7427struct Foo { Foo(int, int); }; 7428auto x = Foo(1, 2); 7429cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7430 matches Foo(1, 2) 7431 7432Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7433 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7434 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7435 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7436 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7437 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7438 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7439 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7440</pre></td></tr> 7441 7442 7443<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> 7444<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 7445type. 7446 7447Given 7448 struct A {}; 7449 A a[7]; 7450 int b[7]; 7451arrayType(hasElementType(builtinType())) 7452 matches "int b[7]" 7453 7454Usable 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>> 7455</pre></td></tr> 7456 7457 7458<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc8')"><a name="hasTypeLoc8Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7459<tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher. 7460 7461Examples: 7462 int x; 7463declaratorDecl(hasTypeLoc(loc(asString("int")))) 7464 matches int x 7465 7466auto x = int(3); 7467cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7468 matches int(3) 7469 7470struct Foo { Foo(int, int); }; 7471auto x = Foo(1, 2); 7472cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7473 matches Foo(1, 2) 7474 7475Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7476 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7477 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7478 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7479 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7480 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7481 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7482 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7483</pre></td></tr> 7484 7485 7486<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> 7487<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 7488a given matcher. Also matches StmtExprs that have CompoundStmt as children. 7489 7490Given 7491 { {}; 1+2; } 7492hasAnySubstatement(compoundStmt()) 7493 matches '{ {}; 1+2; }' 7494with compoundStmt() 7495 matching '{}' 7496</pre></td></tr> 7497 7498 7499<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> 7500<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher 7501</pre></td></tr> 7502 7503 7504<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> 7505<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 7506matches the given matcher. 7507 7508The associated declaration is: 7509- for type nodes, the declaration of the underlying type 7510- for CallExpr, the declaration of the callee 7511- for MemberExpr, the declaration of the referenced member 7512- for CXXConstructExpr, the declaration of the constructor 7513- for CXXNewExpr, the declaration of the operator new 7514- for ObjCIvarExpr, the declaration of the ivar 7515 7516For type nodes, hasDeclaration will generally match the declaration of the 7517sugared type. Given 7518 class X {}; 7519 typedef X Y; 7520 Y y; 7521in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7522typedefDecl. A common use case is to match the underlying, desugared type. 7523This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7524 varDecl(hasType(hasUnqualifiedDesugaredType( 7525 recordType(hasDeclaration(decl()))))) 7526In this matcher, the decl will match the CXXRecordDecl of class X. 7527 7528Usable 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>>, 7529 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>>, 7530 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>>, 7531 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>>, 7532 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>>, 7533 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>>, 7534 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7535</pre></td></tr> 7536 7537 7538<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('hasTemplateArgumentLoc0')"><a name="hasTemplateArgumentLoc0Anchor">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>> InnerMatcher</td></tr> 7539<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s where the n'th 7540`TemplateArgumentLoc` matches the given `InnerMatcher`. 7541 7542Given 7543 template<typename T, typename U> class A {}; 7544 A<double, int> b; 7545 A<int, double> c; 7546varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0, 7547 hasTypeLoc(loc(asString("double"))))))) 7548 matches `A<double, int> b`, but not `A<int, double> c`. 7549</pre></td></tr> 7550 7551 7552<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> 7553<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 7554specific using shadow declaration. 7555 7556Given 7557 namespace a { void f() {} } 7558 using a::f; 7559 void g() { 7560 f(); // Matches this .. 7561 a::f(); // .. but not this. 7562 } 7563declRefExpr(throughUsingDecl(anything())) 7564 matches f() 7565</pre></td></tr> 7566 7567 7568<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> 7569<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 7570specified matcher. 7571 7572Example matches x in if(x) 7573 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 7574 bool x; 7575 if (x) {} 7576</pre></td></tr> 7577 7578 7579<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> 7580<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 7581 7582Note that this does not work for global declarations because the AST 7583breaks up multiple-declaration DeclStmt's into multiple single-declaration 7584DeclStmt's. 7585Example: Given non-global declarations 7586 int a, b = 0; 7587 int c; 7588 int d = 2, e; 7589declStmt(containsDeclaration( 7590 0, varDecl(hasInitializer(anything())))) 7591 matches only 'int d = 2, e;', and 7592declStmt(containsDeclaration(1, varDecl())) 7593 matches 'int a, b = 0' as well as 'int d = 2, e;' 7594 but 'int c;' is not matched. 7595</pre></td></tr> 7596 7597 7598<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> 7599<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 7600 7601Given 7602 int a, b; 7603 int c; 7604declStmt(hasSingleDecl(anything())) 7605 matches 'int c;' but not 'int a, b;'. 7606</pre></td></tr> 7607 7608 7609<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc9')"><a name="hasTypeLoc9Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7610<tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher. 7611 7612Examples: 7613 int x; 7614declaratorDecl(hasTypeLoc(loc(asString("int")))) 7615 matches int x 7616 7617auto x = int(3); 7618cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7619 matches int(3) 7620 7621struct Foo { Foo(int, int); }; 7622auto x = Foo(1, 2); 7623cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7624 matches Foo(1, 2) 7625 7626Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7627 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7628 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7629 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7630 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7631 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7632 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7633 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7634</pre></td></tr> 7635 7636 7637<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> 7638<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 7639Decl, matches InnerMatcher. 7640 7641Given 7642 namespace N { 7643 namespace M { 7644 class D {}; 7645 } 7646 } 7647 7648cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 7649declaration of class D. 7650</pre></td></tr> 7651 7652 7653<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> 7654<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type. 7655 7656Given 7657 decltype(1) a = 1; 7658 decltype(2.0) b = 2.0; 7659decltypeType(hasUnderlyingType(isInteger())) 7660 matches the type of "a" 7661 7662Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>> 7663</pre></td></tr> 7664 7665 7666<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> 7667<tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl. 7668 7669For example, in: 7670void foo() 7671{ 7672 int arr[3]; 7673 auto &[f, s, t] = arr; 7674 7675 f = 42; 7676} 7677The matcher: 7678 decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding")))) 7679matches the decomposition decl with 'f' bound to "fBinding". 7680</pre></td></tr> 7681 7682 7683<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> 7684<tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl. 7685 7686For example, in: 7687void foo() 7688{ 7689 int arr[3]; 7690 auto &[f, s, t] = arr; 7691 7692 f = 42; 7693} 7694The matcher: 7695 decompositionDecl(hasBinding(0, 7696 bindingDecl(hasName("f").bind("fBinding")))) 7697matches the decomposition decl with 'f' bound to "fBinding". 7698</pre></td></tr> 7699 7700 7701<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> 7702<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr> 7703 7704 7705<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> 7706<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 7707switch statement or conditional operator. 7708 7709Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7710 if (true) {} 7711</pre></td></tr> 7712 7713 7714<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html">ElaboratedTypeLoc</a>></td><td class="name" onclick="toggle('hasNamedTypeLoc0')"><a name="hasNamedTypeLoc0Anchor">hasNamedTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> InnerMatcher</td></tr> 7715<tr><td colspan="4" class="doc" id="hasNamedTypeLoc0"><pre>Matches elaborated `TypeLoc`s that have a named `TypeLoc` matching 7716`InnerMatcher`. 7717 7718Given 7719 template <typename T> 7720 class C {}; 7721 class C<int> c; 7722 7723 class D {}; 7724 class D d; 7725elaboratedTypeLoc(hasNamedTypeLoc(templateSpecializationTypeLoc())); 7726 matches the `TypeLoc` of the variable declaration of `c`, but not `d`. 7727</pre></td></tr> 7728 7729 7730<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> 7731<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 7732matches InnerMatcher if the qualifier exists. 7733 7734Given 7735 namespace N { 7736 namespace M { 7737 class D {}; 7738 } 7739 } 7740 N::M::D d; 7741 7742elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 7743matches the type of the variable declaration of d. 7744</pre></td></tr> 7745 7746 7747<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> 7748<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 7749 7750Given 7751 namespace N { 7752 namespace M { 7753 class D {}; 7754 } 7755 } 7756 N::M::D d; 7757 7758elaboratedType(namesType(recordType( 7759hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 7760declaration of d. 7761</pre></td></tr> 7762 7763 7764<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> 7765<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 7766matches the given matcher. 7767 7768The associated declaration is: 7769- for type nodes, the declaration of the underlying type 7770- for CallExpr, the declaration of the callee 7771- for MemberExpr, the declaration of the referenced member 7772- for CXXConstructExpr, the declaration of the constructor 7773- for CXXNewExpr, the declaration of the operator new 7774- for ObjCIvarExpr, the declaration of the ivar 7775 7776For type nodes, hasDeclaration will generally match the declaration of the 7777sugared type. Given 7778 class X {}; 7779 typedef X Y; 7780 Y y; 7781in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7782typedefDecl. A common use case is to match the underlying, desugared type. 7783This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7784 varDecl(hasType(hasUnqualifiedDesugaredType( 7785 recordType(hasDeclaration(decl()))))) 7786In this matcher, the decl will match the CXXRecordDecl of class X. 7787 7788Usable 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>>, 7789 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>>, 7790 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>>, 7791 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>>, 7792 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>>, 7793 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>>, 7794 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7795</pre></td></tr> 7796 7797 7798<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> 7799<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 7800 7801(Note: Clang's AST refers to other conversions as "casts" too, and calls 7802actual casts "explicit" casts.) 7803</pre></td></tr> 7804 7805 7806<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc10')"><a name="hasTypeLoc10Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7807<tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher. 7808 7809Examples: 7810 int x; 7811declaratorDecl(hasTypeLoc(loc(asString("int")))) 7812 matches int x 7813 7814auto x = int(3); 7815cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7816 matches int(3) 7817 7818struct Foo { Foo(int, int); }; 7819auto x = Foo(1, 2); 7820cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7821 matches Foo(1, 2) 7822 7823Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7824 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7825 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7826 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7827 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7828 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7829 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7830 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7831</pre></td></tr> 7832 7833 7834<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> 7835<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 7836declaration's type. 7837 7838In case of a value declaration (for example a variable declaration), 7839this resolves one layer of indirection. For example, in the value 7840declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7841X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7842declaration of x. 7843 7844Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7845 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7846 and friend class X (matcher = friendDecl(hasType("X")) 7847 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7848 cxxRecordDecl(hasName("X")))) 7849 class X {}; 7850 void y(X &x) { x; X z; } 7851 class Y { friend class X; }; 7852 class Z : public virtual X {}; 7853 7854Example matches class Derived 7855(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7856class Base {}; 7857class Derived : Base {}; 7858 7859Usable 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>>, 7860Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7861</pre></td></tr> 7862 7863 7864<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> 7865<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 7866matcher. 7867 7868Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7869 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7870 and U (matcher = typedefDecl(hasType(asString("int"))) 7871 and friend class X (matcher = friendDecl(hasType("X")) 7872 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7873 asString("class X"))) 7874 class X {}; 7875 void y(X &x) { x; X z; } 7876 typedef int U; 7877 class Y { friend class X; }; 7878 class Z : public virtual X {}; 7879</pre></td></tr> 7880 7881 7882<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> 7883<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 7884elidable constructor and other corresponding bookkeeping nodes. 7885 7886In C++17, elidable copy constructors are no longer being generated in the 7887AST as it is not permitted by the standard. They are, however, part of the 7888AST in C++14 and earlier. So, a matcher must abstract over these differences 7889to work in all language modes. This matcher skips elidable constructor-call 7890AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 7891various implicit nodes inside the constructor calls, all of which will not 7892appear in the C++17 AST. 7893 7894Given 7895 7896struct H {}; 7897H G(); 7898void f() { 7899 H D = G(); 7900} 7901 7902``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 7903matches ``H D = G()`` in C++11 through C++17 (and beyond). 7904</pre></td></tr> 7905 7906 7907<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> 7908<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 7909are stripped off. 7910 7911Parentheses and explicit casts are not discarded. 7912Given 7913 int arr[5]; 7914 int a = 0; 7915 char b = 0; 7916 const int c = a; 7917 int *d = arr; 7918 long e = (long) 0l; 7919The matchers 7920 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 7921 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 7922would match the declarations for a, b, c, and d, but not e. 7923While 7924 varDecl(hasInitializer(integerLiteral())) 7925 varDecl(hasInitializer(declRefExpr())) 7926only match the declarations for a. 7927</pre></td></tr> 7928 7929 7930<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> 7931<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 7932nodes are stripped off. 7933 7934Parentheses and explicit casts are not discarded. 7935Given 7936 class C {}; 7937 C a = C(); 7938 C b; 7939 C c = b; 7940The matchers 7941 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 7942would match the declarations for a, b, and c. 7943While 7944 varDecl(hasInitializer(cxxConstructExpr())) 7945only match the declarations for b and c. 7946</pre></td></tr> 7947 7948 7949<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> 7950<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 7951casts are stripped off. 7952 7953Implicit and non-C Style casts are also discarded. 7954Given 7955 int a = 0; 7956 char b = (0); 7957 void* c = reinterpret_cast<char*>(0); 7958 char d = char(0); 7959The matcher 7960 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 7961would match the declarations for a, b, c, and d. 7962while 7963 varDecl(hasInitializer(integerLiteral())) 7964only match the declaration for a. 7965</pre></td></tr> 7966 7967 7968<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> 7969<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 7970parentheses are stripped off. 7971 7972Explicit casts are not discarded. 7973Given 7974 int arr[5]; 7975 int a = 0; 7976 char b = (0); 7977 const int c = a; 7978 int *d = (arr); 7979 long e = ((long) 0l); 7980The matchers 7981 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 7982 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 7983would match the declarations for a, b, c, and d, but not e. 7984while 7985 varDecl(hasInitializer(integerLiteral())) 7986 varDecl(hasInitializer(declRefExpr())) 7987would only match the declaration for a. 7988</pre></td></tr> 7989 7990 7991<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> 7992<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 7993 7994Given 7995 const char* str = ("my-string"); 7996The matcher 7997 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 7998would match the implicit cast resulting from the assignment. 7999</pre></td></tr> 8000 8001 8002<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> 8003<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 8004 8005Given 8006 class C { 8007 int a = 2; 8008 int b = 3; 8009 int c; 8010 }; 8011fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 8012 matches 'int a;' but not 'int b;'. 8013fieldDecl(hasInClassInitializer(anything())) 8014 matches 'int a;' and 'int b;' but not 'int c;'. 8015</pre></td></tr> 8016 8017 8018<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> 8019<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr> 8020 8021 8022<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> 8023<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 8024switch statement or conditional operator. 8025 8026Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8027 if (true) {} 8028</pre></td></tr> 8029 8030 8031<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> 8032<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 8033 8034Example: 8035 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 8036matches '++x' in 8037 for (x; x < N; ++x) { } 8038</pre></td></tr> 8039 8040 8041<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> 8042<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 8043 8044Example: 8045 forStmt(hasLoopInit(declStmt())) 8046matches 'int x = 0' in 8047 for (int x = 0; x < N; ++x) { } 8048</pre></td></tr> 8049 8050 8051<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> 8052<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 8053declaration's type. 8054 8055In case of a value declaration (for example a variable declaration), 8056this resolves one layer of indirection. For example, in the value 8057declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 8058X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 8059declaration of x. 8060 8061Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8062 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8063 and friend class X (matcher = friendDecl(hasType("X")) 8064 and public virtual X (matcher = cxxBaseSpecifier(hasType( 8065 cxxRecordDecl(hasName("X")))) 8066 class X {}; 8067 void y(X &x) { x; X z; } 8068 class Y { friend class X; }; 8069 class Z : public virtual X {}; 8070 8071Example matches class Derived 8072(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 8073class Base {}; 8074class Derived : Base {}; 8075 8076Usable 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>>, 8077Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 8078</pre></td></tr> 8079 8080 8081<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> 8082<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 8083matcher. 8084 8085Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8086 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8087 and U (matcher = typedefDecl(hasType(asString("int"))) 8088 and friend class X (matcher = friendDecl(hasType("X")) 8089 and public virtual X (matcher = cxxBaseSpecifier(hasType( 8090 asString("class X"))) 8091 class X {}; 8092 void y(X &x) { x; X z; } 8093 typedef int U; 8094 class Y { friend class X; }; 8095 class Z : public virtual X {}; 8096</pre></td></tr> 8097 8098 8099<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> 8100<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST. 8101Note that this matcher matches all the declarations of a function whose 8102body is present in the AST. 8103 8104Given 8105 void f(); 8106 void f() {} 8107 void g(); 8108functionDecl(hasAnyBody(compoundStmt())) 8109 matches both 'void f();' 8110 and 'void f() {}' 8111with compoundStmt() 8112 matching '{}' 8113 but does not match 'void g();' 8114</pre></td></tr> 8115 8116 8117<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> 8118<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 8119block. 8120 8121Does not match the 'this' parameter of a method. 8122 8123Given 8124 class X { void f(int x, int y, int z) {} }; 8125cxxMethodDecl(hasAnyParameter(hasName("y"))) 8126 matches f(int x, int y, int z) {} 8127with hasAnyParameter(...) 8128 matching int y 8129 8130For ObjectiveC, given 8131 @interface I - (void) f:(int) y; @end 8132 8133the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 8134matches the declaration of method f with hasParameter 8135matching y. 8136 8137For blocks, given 8138 b = ^(int y) { printf("%d", y) }; 8139 8140the matcher blockDecl(hasAnyParameter(hasName("y"))) 8141matches the declaration of the block b with hasParameter 8142matching y. 8143</pre></td></tr> 8144 8145 8146<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> 8147<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8148functionDecl that have at least one TemplateArgument matching the given 8149InnerMatcher. 8150 8151Given 8152 template<typename T> class A {}; 8153 template<> class A<double> {}; 8154 A<int> a; 8155 8156 template<typename T> f() {}; 8157 void func() { f<int>(); }; 8158 8159classTemplateSpecializationDecl(hasAnyTemplateArgument( 8160 refersToType(asString("int")))) 8161 matches the specialization A<int> 8162 8163functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 8164 matches the specialization f<int> 8165</pre></td></tr> 8166 8167 8168<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> 8169<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr> 8170 8171 8172<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> 8173<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 8174declaration. 8175 8176Given 8177 template<bool b> 8178 struct S { 8179 S(int); // #1 8180 explicit S(double); // #2 8181 operator int(); // #3 8182 explicit operator bool(); // #4 8183 explicit(false) S(bool) // # 7 8184 explicit(true) S(char) // # 8 8185 explicit(b) S(S) // # 9 8186 }; 8187 S(int) -> S<true> // #5 8188 explicit S(double) -> S<false> // #6 8189cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 8190cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 8191cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 8192</pre></td></tr> 8193 8194 8195<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> 8196<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 8197declaration or a block. 8198 8199Given 8200 class X { void f(int x) {} }; 8201cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 8202 matches f(int x) {} 8203with hasParameter(...) 8204 matching int x 8205 8206For ObjectiveC, given 8207 @interface I - (void) f:(int) y; @end 8208 8209the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 8210matches the declaration of method f with hasParameter 8211matching y. 8212</pre></td></tr> 8213 8214 8215<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasReturnTypeLoc0')"><a name="hasReturnTypeLoc0Anchor">hasReturnTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> ReturnMatcher</td></tr> 8216<tr><td colspan="4" class="doc" id="hasReturnTypeLoc0"><pre>Matches a function declared with the specified return `TypeLoc`. 8217 8218Given 8219 int f() { return 5; } 8220 void g() {} 8221functionDecl(hasReturnTypeLoc(loc(asString("int")))) 8222 matches the declaration of `f`, but not `g`. 8223</pre></td></tr> 8224 8225 8226<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> 8227<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8228functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 8229 8230Given 8231 template<typename T, typename U> class A {}; 8232 A<bool, int> b; 8233 A<int, bool> c; 8234 8235 template<typename T> void f() {} 8236 void func() { f<int>(); }; 8237classTemplateSpecializationDecl(hasTemplateArgument( 8238 1, refersToType(asString("int")))) 8239 matches the specialization A<bool, int> 8240 8241functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 8242 matches the specialization f<int> 8243</pre></td></tr> 8244 8245 8246<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> 8247<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 8248 8249Given: 8250 class X { int f() { return 1; } }; 8251cxxMethodDecl(returns(asString("int"))) 8252 matches int f() { return 1; } 8253</pre></td></tr> 8254 8255 8256<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> 8257<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 8258switch statement or conditional operator. 8259 8260Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8261 if (true) {} 8262</pre></td></tr> 8263 8264 8265<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> 8266<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 8267 8268Given 8269 if (A* a = GetAPointer()) {} 8270hasConditionVariableStatement(...) 8271 matches 'A* a = GetAPointer()'. 8272</pre></td></tr> 8273 8274 8275<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> 8276<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 8277 8278Examples matches the if statement 8279 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 8280 if (false) false; else true; 8281</pre></td></tr> 8282 8283 8284<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> 8285<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 8286 8287Given: 8288 void foo() { 8289 if (int i = foobar(); i > 0) {} 8290 switch (int i = foobar(); i) {} 8291 for (auto& a = get_range(); auto& x : a) {} 8292 } 8293 void bar() { 8294 if (foobar() > 0) {} 8295 switch (foobar()) {} 8296 for (auto& x : get_range()) {} 8297 } 8298ifStmt(hasInitStatement(anything())) 8299 matches the if statement in foo but not in bar. 8300switchStmt(hasInitStatement(anything())) 8301 matches the switch statement in foo but not in bar. 8302cxxForRangeStmt(hasInitStatement(anything())) 8303 matches the range for statement in foo but not in bar. 8304</pre></td></tr> 8305 8306 8307<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> 8308<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 8309 8310Examples matches the if statement 8311 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 8312 if (false) true; else false; 8313</pre></td></tr> 8314 8315 8316<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> 8317<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 8318matcher. 8319 8320FIXME: Unit test this matcher 8321</pre></td></tr> 8322 8323 8324<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> 8325<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 8326 8327Example matches y. 8328 (matcher = initListExpr(hasInit(0, expr()))) 8329 int x{y}. 8330</pre></td></tr> 8331 8332 8333<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> 8334<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 8335(if expression have it). 8336</pre></td></tr> 8337 8338 8339<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> 8340<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 8341matches the given matcher. 8342 8343The associated declaration is: 8344- for type nodes, the declaration of the underlying type 8345- for CallExpr, the declaration of the callee 8346- for MemberExpr, the declaration of the referenced member 8347- for CXXConstructExpr, the declaration of the constructor 8348- for CXXNewExpr, the declaration of the operator new 8349- for ObjCIvarExpr, the declaration of the ivar 8350 8351For type nodes, hasDeclaration will generally match the declaration of the 8352sugared type. Given 8353 class X {}; 8354 typedef X Y; 8355 Y y; 8356in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8357typedefDecl. A common use case is to match the underlying, desugared type. 8358This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8359 varDecl(hasType(hasUnqualifiedDesugaredType( 8360 recordType(hasDeclaration(decl()))))) 8361In this matcher, the decl will match the CXXRecordDecl of class X. 8362 8363Usable 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>>, 8364 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>>, 8365 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>>, 8366 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>>, 8367 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>>, 8368 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>>, 8369 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8370</pre></td></tr> 8371 8372 8373<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> 8374<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 8375matches the given matcher. 8376 8377The associated declaration is: 8378- for type nodes, the declaration of the underlying type 8379- for CallExpr, the declaration of the callee 8380- for MemberExpr, the declaration of the referenced member 8381- for CXXConstructExpr, the declaration of the constructor 8382- for CXXNewExpr, the declaration of the operator new 8383- for ObjCIvarExpr, the declaration of the ivar 8384 8385For type nodes, hasDeclaration will generally match the declaration of the 8386sugared type. Given 8387 class X {}; 8388 typedef X Y; 8389 Y y; 8390in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8391typedefDecl. A common use case is to match the underlying, desugared type. 8392This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8393 varDecl(hasType(hasUnqualifiedDesugaredType( 8394 recordType(hasDeclaration(decl()))))) 8395In this matcher, the decl will match the CXXRecordDecl of class X. 8396 8397Usable 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>>, 8398 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>>, 8399 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>>, 8400 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>>, 8401 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>>, 8402 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>>, 8403 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8404</pre></td></tr> 8405 8406 8407<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>></td><td class="name" onclick="toggle('capturesVar0')"><a name="capturesVar0Anchor">capturesVar</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>> InnerMatcher</td></tr> 8408<tr><td colspan="4" class="doc" id="capturesVar0"><pre>Matches a `LambdaCapture` that refers to the specified `VarDecl`. The 8409`VarDecl` can be a separate variable that is captured by value or 8410reference, or a synthesized variable if the capture has an initializer. 8411 8412Given 8413 void foo() { 8414 int x; 8415 auto f = [x](){}; 8416 auto g = [x = 1](){}; 8417 } 8418In the matcher 8419lambdaExpr(hasAnyCapture(lambdaCapture(capturesVar(hasName("x")))), 8420capturesVar(hasName("x")) matches `x` and `x = 1`. 8421</pre></td></tr> 8422 8423 8424<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>></td><td class="name" onclick="toggle('forEachLambdaCapture0')"><a name="forEachLambdaCapture0Anchor">forEachLambdaCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>> InnerMatcher</td></tr> 8425<tr><td colspan="4" class="doc" id="forEachLambdaCapture0"><pre>Matches each lambda capture in a lambda expression. 8426 8427Given 8428 int main() { 8429 int x, y; 8430 float z; 8431 auto f = [=]() { return x + y + z; }; 8432 } 8433lambdaExpr(forEachLambdaCapture( 8434 lambdaCapture(capturesVar(varDecl(hasType(isInteger())))))) 8435will trigger two matches, binding for 'x' and 'y' respectively. 8436</pre></td></tr> 8437 8438 8439<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_1LambdaCapture.html">LambdaCapture</a>> InnerMatcher</td></tr> 8440<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture in a lambda expression. 8441 8442Given 8443 void foo() { 8444 int t = 5; 8445 auto f = [=](){ return t; }; 8446 } 8447lambdaExpr(hasAnyCapture(lambdaCapture())) and 8448lambdaExpr(hasAnyCapture(lambdaCapture(refersToVarDecl(hasName("t"))))) 8449 both match `[=](){ return t; }`. 8450</pre></td></tr> 8451 8452 8453<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> 8454<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 8455matches the given matcher. 8456 8457The associated declaration is: 8458- for type nodes, the declaration of the underlying type 8459- for CallExpr, the declaration of the callee 8460- for MemberExpr, the declaration of the referenced member 8461- for CXXConstructExpr, the declaration of the constructor 8462- for CXXNewExpr, the declaration of the operator new 8463- for ObjCIvarExpr, the declaration of the ivar 8464 8465For type nodes, hasDeclaration will generally match the declaration of the 8466sugared type. Given 8467 class X {}; 8468 typedef X Y; 8469 Y y; 8470in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8471typedefDecl. A common use case is to match the underlying, desugared type. 8472This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8473 varDecl(hasType(hasUnqualifiedDesugaredType( 8474 recordType(hasDeclaration(decl()))))) 8475In this matcher, the decl will match the CXXRecordDecl of class X. 8476 8477Usable 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>>, 8478 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>>, 8479 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>>, 8480 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>>, 8481 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>>, 8482 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>>, 8483 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8484</pre></td></tr> 8485 8486 8487<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> 8488<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 8489given matcher. Implicit object expressions are included; that is, it matches 8490use of implicit `this`. 8491 8492Given 8493 struct X { 8494 int m; 8495 int f(X x) { x.m; return m; } 8496 }; 8497memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 8498 matches `x.m`, but not `m`; however, 8499memberExpr(hasObjectExpression(hasType(pointsTo( 8500 cxxRecordDecl(hasName("X")))))) 8501 matches `m` (aka. `this->m`), but not `x.m`. 8502</pre></td></tr> 8503 8504 8505<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> 8506<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 8507given matcher. 8508 8509Given 8510 struct { int first, second; } first, second; 8511 int i(second.first); 8512 int j(first.second); 8513memberExpr(member(hasName("first"))) 8514 matches second.first 8515 but not first.second (because the member name there is "second"). 8516</pre></td></tr> 8517 8518 8519<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> 8520<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 8521pointee matches a given matcher. 8522 8523Given 8524 int *a; 8525 int const *b; 8526 float const *f; 8527pointerType(pointee(isConstQualified(), isInteger())) 8528 matches "int const *b" 8529 8530Usable 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>>, 8531 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>> 8532</pre></td></tr> 8533 8534 8535<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> 8536<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 8537matcher. 8538 8539Given 8540 namespace N { template<class T> void f(T t); } 8541 template <class T> void g() { using N::f; f(T()); } 8542unresolvedLookupExpr(hasAnyDeclaration( 8543 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 8544 matches the use of f in g() . 8545</pre></td></tr> 8546 8547 8548<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> 8549<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 8550 8551Given 8552 struct A { struct B { struct C {}; }; }; 8553 A::B::C c; 8554nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 8555 matches "A::" 8556</pre></td></tr> 8557 8558 8559<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> 8560<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 8561NestedNameSpecifier-matcher matches. 8562</pre></td></tr> 8563 8564 8565<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> 8566<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 8567given TypeLoc. 8568 8569Given 8570 struct A { struct B { struct C {}; }; }; 8571 A::B::C c; 8572nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 8573 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 8574 matches "A::" 8575</pre></td></tr> 8576 8577 8578<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> 8579<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 8580 8581Given 8582 struct A { struct B { struct C {}; }; }; 8583 A::B::C c; 8584nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 8585 matches "A::" 8586</pre></td></tr> 8587 8588 8589<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> 8590<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 8591given namespace matcher. 8592 8593Given 8594 namespace ns { struct A {}; } 8595 ns::A a; 8596nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 8597 matches "ns::" 8598</pre></td></tr> 8599 8600 8601<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> 8602<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 8603given QualType matcher without qualifiers. 8604 8605Given 8606 struct A { struct B { struct C {}; }; }; 8607 A::B::C c; 8608nestedNameSpecifier(specifiesType( 8609 hasDeclaration(cxxRecordDecl(hasName("A"))) 8610)) 8611 matches "A::" 8612</pre></td></tr> 8613 8614 8615<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> 8616<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 8617 8618Given 8619 8620 #pragma omp parallel 8621 #pragma omp parallel default(none) 8622 8623``ompExecutableDirective(hasAnyClause(anything()))`` matches 8624``omp parallel default(none)``. 8625</pre></td></tr> 8626 8627 8628<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> 8629<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 8630 8631Prerequisite: the executable directive must not be standalone directive. 8632If it is, it will never match. 8633 8634Given 8635 8636 #pragma omp parallel 8637 ; 8638 #pragma omp parallel 8639 {} 8640 8641``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 8642</pre></td></tr> 8643 8644 8645<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> 8646<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 8647matching Base, or Objective-C classes that directly or indirectly 8648subclass a class matching Base. 8649 8650Note that a class is not considered to be derived from itself. 8651 8652Example matches Y, Z, C (Base == hasName("X")) 8653 class X; 8654 class Y : public X {}; // directly derived 8655 class Z : public Y {}; // indirectly derived 8656 typedef X A; 8657 typedef A B; 8658 class C : public B {}; // derived from a typedef of X 8659 8660In the following example, Bar matches isDerivedFrom(hasName("X")): 8661 class Foo; 8662 typedef Foo X; 8663 class Bar : public Foo {}; // derived from a type that X is a typedef of 8664 8665In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 8666 @interface NSObject @end 8667 @interface Bar : NSObject @end 8668 8669Usable 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>> 8670</pre></td></tr> 8671 8672 8673<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> 8674<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 8675matching Base. 8676 8677Note that a class is not considered to be derived from itself. 8678 8679Example matches Y, C (Base == hasName("X")) 8680 class X; 8681 class Y : public X {}; // directly derived 8682 class Z : public Y {}; // indirectly derived 8683 typedef X A; 8684 typedef A B; 8685 class C : public B {}; // derived from a typedef of X 8686 8687In the following example, Bar matches isDerivedFrom(hasName("X")): 8688 class Foo; 8689 typedef Foo X; 8690 class Bar : public Foo {}; // derived from a type that X is a typedef of 8691</pre></td></tr> 8692 8693 8694<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> 8695<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 8696match Base. 8697</pre></td></tr> 8698 8699 8700<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> 8701<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 8702expression, or an ObjC-message-send expression. 8703 8704Given 8705 void x(int, int, int) { int y; x(1, y, 42); } 8706callExpr(hasAnyArgument(declRefExpr())) 8707 matches x(1, y, 42) 8708with hasAnyArgument(...) 8709 matching y 8710 8711For ObjectiveC, given 8712 @interface I - (void) f:(int) y; @end 8713 void foo(I *i) { [i f:12]; } 8714objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 8715 matches [i f:12] 8716</pre></td></tr> 8717 8718 8719<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> 8720<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor 8721call expression. 8722 8723Example matches y in x(y) 8724 (matcher = callExpr(hasArgument(0, declRefExpr()))) 8725 void x(int) { int y; x(y); } 8726</pre></td></tr> 8727 8728 8729<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> 8730<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 8731and the inner matcher matches on that instance. 8732 8733For example the method call in 8734 NSString *x = @"hello"; 8735 [x containsString:@"h"]; 8736is matched by 8737objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 8738</pre></td></tr> 8739 8740 8741<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> 8742<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 8743 8744Example 8745matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 8746matches the [webView ...] message invocation. 8747 NSString *webViewJavaScript = ... 8748 UIWebView *webView = ... 8749 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 8750</pre></td></tr> 8751 8752 8753<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> 8754<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 8755block. 8756 8757Does not match the 'this' parameter of a method. 8758 8759Given 8760 class X { void f(int x, int y, int z) {} }; 8761cxxMethodDecl(hasAnyParameter(hasName("y"))) 8762 matches f(int x, int y, int z) {} 8763with hasAnyParameter(...) 8764 matching int y 8765 8766For ObjectiveC, given 8767 @interface I - (void) f:(int) y; @end 8768 8769the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 8770matches the declaration of method f with hasParameter 8771matching y. 8772 8773For blocks, given 8774 b = ^(int y) { printf("%d", y) }; 8775 8776the matcher blockDecl(hasAnyParameter(hasName("y"))) 8777matches the declaration of the block b with hasParameter 8778matching y. 8779</pre></td></tr> 8780 8781 8782<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> 8783<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 8784declaration or a block. 8785 8786Given 8787 class X { void f(int x) {} }; 8788cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 8789 matches f(int x) {} 8790with hasParameter(...) 8791 matching int x 8792 8793For ObjectiveC, given 8794 @interface I - (void) f:(int) y; @end 8795 8796the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 8797matches the declaration of method f with hasParameter 8798matching y. 8799</pre></td></tr> 8800 8801 8802<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc11')"><a name="hasTypeLoc11Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 8803<tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher. 8804 8805Examples: 8806 int x; 8807declaratorDecl(hasTypeLoc(loc(asString("int")))) 8808 matches int x 8809 8810auto x = int(3); 8811cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 8812 matches int(3) 8813 8814struct Foo { Foo(int, int); }; 8815auto x = Foo(1, 2); 8816cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 8817 matches Foo(1, 2) 8818 8819Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 8820 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 8821 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 8822 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 8823 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 8824 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 8825 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 8826 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 8827</pre></td></tr> 8828 8829 8830<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> 8831<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 8832or opaque value's source expression matches the given matcher. 8833 8834Example 1: matches "a string" 8835(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 8836class URL { URL(string); }; 8837URL url = "a string"; 8838 8839Example 2: matches 'b' (matcher = 8840opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 8841int a = b ?: 1; 8842</pre></td></tr> 8843 8844 8845<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> 8846<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 8847overloads matches the given matcher. 8848 8849Given 8850 template <typename T> void foo(T); 8851 template <typename T> void bar(T); 8852 template <typename T> void baz(T t) { 8853 foo(t); 8854 bar(t); 8855 } 8856unresolvedLookupExpr(hasAnyDeclaration( 8857 functionTemplateDecl(hasName("foo")))) 8858 matches foo in foo(t); but not bar in bar(t); 8859</pre></td></tr> 8860 8861 8862<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> 8863<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 8864 8865Given 8866 int (*ptr_to_array)[4]; 8867 int (*ptr_to_func)(int); 8868 8869varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 8870ptr_to_func but not ptr_to_array. 8871 8872Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 8873</pre></td></tr> 8874 8875 8876<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>></td><td class="name" onclick="toggle('hasPointeeLoc0')"><a name="hasPointeeLoc0Anchor">hasPointeeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> PointeeMatcher</td></tr> 8877<tr><td colspan="4" class="doc" id="hasPointeeLoc0"><pre>Matches pointer `TypeLoc`s that have a pointee `TypeLoc` matching 8878`PointeeMatcher`. 8879 8880Given 8881 int* x; 8882pointerTypeLoc(hasPointeeLoc(loc(asString("int")))) 8883 matches `int*`. 8884</pre></td></tr> 8885 8886 8887<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> 8888<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 8889pointee matches a given matcher. 8890 8891Given 8892 int *a; 8893 int const *b; 8894 float const *f; 8895pointerType(pointee(isConstQualified(), isInteger())) 8896 matches "int const *b" 8897 8898Usable 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>>, 8899 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>> 8900</pre></td></tr> 8901 8902 8903<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> 8904<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 8905 8906Given: 8907 typedef int &int_ref; 8908 int a; 8909 int_ref b = a; 8910 8911varDecl(hasType(qualType(referenceType()))))) will not match the 8912declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 8913</pre></td></tr> 8914 8915 8916<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> 8917<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 8918matches the given matcher. 8919 8920The associated declaration is: 8921- for type nodes, the declaration of the underlying type 8922- for CallExpr, the declaration of the callee 8923- for MemberExpr, the declaration of the referenced member 8924- for CXXConstructExpr, the declaration of the constructor 8925- for CXXNewExpr, the declaration of the operator new 8926- for ObjCIvarExpr, the declaration of the ivar 8927 8928For type nodes, hasDeclaration will generally match the declaration of the 8929sugared type. Given 8930 class X {}; 8931 typedef X Y; 8932 Y y; 8933in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8934typedefDecl. A common use case is to match the underlying, desugared type. 8935This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8936 varDecl(hasType(hasUnqualifiedDesugaredType( 8937 recordType(hasDeclaration(decl()))))) 8938In this matcher, the decl will match the CXXRecordDecl of class X. 8939 8940Usable 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>>, 8941 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>>, 8942 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>>, 8943 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>>, 8944 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>>, 8945 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>>, 8946 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8947</pre></td></tr> 8948 8949 8950<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> 8951<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 8952 8953Given 8954 void (*fp)(void); 8955The matcher 8956 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 8957would match the declaration for fp. 8958</pre></td></tr> 8959 8960 8961<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> 8962<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 8963</pre></td></tr> 8964 8965 8966<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> 8967<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 8968matches the specified matcher. 8969 8970Example matches y->x() 8971 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 8972 cxxRecordDecl(hasName("Y"))))))) 8973 class Y { public: void x(); }; 8974 void z() { Y *y; y->x(); } 8975</pre></td></tr> 8976 8977 8978<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> 8979<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 8980</pre></td></tr> 8981 8982 8983<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> 8984<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 8985type matches the specified matcher. 8986 8987Example matches X &x and const X &y 8988 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 8989 class X { 8990 void a(X b) { 8991 X &x = b; 8992 const X &y = b; 8993 } 8994 }; 8995</pre></td></tr> 8996 8997 8998<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualifiedTypeLoc.html">QualifiedTypeLoc</a>></td><td class="name" onclick="toggle('hasUnqualifiedLoc0')"><a name="hasUnqualifiedLoc0Anchor">hasUnqualifiedLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> InnerMatcher</td></tr> 8999<tr><td colspan="4" class="doc" id="hasUnqualifiedLoc0"><pre>Matches `QualifiedTypeLoc`s that have an unqualified `TypeLoc` matching 9000`InnerMatcher`. 9001 9002Given 9003 int* const x; 9004 const int y; 9005qualifiedTypeLoc(hasUnqualifiedLoc(pointerTypeLoc())) 9006 matches the `TypeLoc` of the variable declaration of `x`, but not `y`. 9007</pre></td></tr> 9008 9009 9010<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> 9011<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 9012matches the given matcher. 9013 9014The associated declaration is: 9015- for type nodes, the declaration of the underlying type 9016- for CallExpr, the declaration of the callee 9017- for MemberExpr, the declaration of the referenced member 9018- for CXXConstructExpr, the declaration of the constructor 9019- for CXXNewExpr, the declaration of the operator new 9020- for ObjCIvarExpr, the declaration of the ivar 9021 9022For type nodes, hasDeclaration will generally match the declaration of the 9023sugared type. Given 9024 class X {}; 9025 typedef X Y; 9026 Y y; 9027in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9028typedefDecl. A common use case is to match the underlying, desugared type. 9029This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9030 varDecl(hasType(hasUnqualifiedDesugaredType( 9031 recordType(hasDeclaration(decl()))))) 9032In this matcher, the decl will match the CXXRecordDecl of class X. 9033 9034Usable 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>>, 9035 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>>, 9036 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>>, 9037 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>>, 9038 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>>, 9039 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>>, 9040 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9041</pre></td></tr> 9042 9043 9044<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>></td><td class="name" onclick="toggle('hasReferentLoc0')"><a name="hasReferentLoc0Anchor">hasReferentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> ReferentMatcher</td></tr> 9045<tr><td colspan="4" class="doc" id="hasReferentLoc0"><pre>Matches reference `TypeLoc`s that have a referent `TypeLoc` matching 9046`ReferentMatcher`. 9047 9048Given 9049 int x = 3; 9050 int& xx = x; 9051referenceTypeLoc(hasReferentLoc(loc(asString("int")))) 9052 matches `int&`. 9053</pre></td></tr> 9054 9055 9056<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> 9057<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 9058pointee matches a given matcher. 9059 9060Given 9061 int *a; 9062 int const *b; 9063 float const *f; 9064pointerType(pointee(isConstQualified(), isInteger())) 9065 matches "int const *b" 9066 9067Usable 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>>, 9068 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>> 9069</pre></td></tr> 9070 9071 9072<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> 9073<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 9074 9075Given 9076 return a + b; 9077hasReturnValue(binaryOperator()) 9078 matches 'return a + b' 9079with binaryOperator() 9080 matching 'a + b' 9081</pre></td></tr> 9082 9083 9084<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> 9085<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 9086a given matcher. Also matches StmtExprs that have CompoundStmt as children. 9087 9088Given 9089 { {}; 1+2; } 9090hasAnySubstatement(compoundStmt()) 9091 matches '{ {}; 1+2; }' 9092with compoundStmt() 9093 matching '{}' 9094</pre></td></tr> 9095 9096 9097<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> 9098<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 9099alignof. 9100</pre></td></tr> 9101 9102 9103<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forCallable0')"><a name="forCallable0Anchor">forCallable</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 9104<tr><td colspan="4" class="doc" id="forCallable0"><pre>Matches declaration of the function, method, or block the statement 9105belongs to. 9106 9107Given: 9108F& operator=(const F& o) { 9109 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 9110 return *this; 9111} 9112returnStmt(forCallable(functionDecl(hasName("operator=")))) 9113 matches 'return *this' 9114 but does not match 'return v > 0' 9115 9116Given: 9117-(void) foo { 9118 int x = 1; 9119 dispatch_sync(queue, ^{ int y = 2; }); 9120} 9121declStmt(forCallable(objcMethodDecl())) 9122 matches 'int x = 1' 9123 but does not match 'int y = 2'. 9124whereas declStmt(forCallable(blockDecl())) 9125 matches 'int y = 2' 9126 but does not match 'int x = 1'. 9127</pre></td></tr> 9128 9129 9130<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> 9131<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to. 9132 9133Deprecated. Use forCallable() to correctly handle the situation when 9134the declaration is not a function (but a block or an Objective-C method). 9135forFunction() not only fails to take non-functions into account but also 9136may match the wrong declaration in their presence. 9137 9138Given: 9139F& operator=(const F& o) { 9140 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 9141 return *this; 9142} 9143returnStmt(forFunction(hasName("operator="))) 9144 matches 'return *this' 9145 but does not match 'return v > 0' 9146</pre></td></tr> 9147 9148 9149<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> 9150<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 9151sizeof. 9152</pre></td></tr> 9153 9154 9155<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> 9156<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 9157type that matches the provided matcher. 9158 9159Given 9160 template <typename T> 9161 double F(T t); 9162 int i; 9163 double j = F(i); 9164 9165substTemplateTypeParmType(hasReplacementType(type())) matches int 9166</pre></td></tr> 9167 9168 9169<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> 9170<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 9171statement. This matcher may produce multiple matches. 9172 9173Given 9174 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 9175switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 9176 matches four times, with "c" binding each of "case 1:", "case 2:", 9177"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 9178"switch (1)", "switch (2)" and "switch (2)". 9179</pre></td></tr> 9180 9181 9182<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> 9183<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 9184switch statement or conditional operator. 9185 9186Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 9187 if (true) {} 9188</pre></td></tr> 9189 9190 9191<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> 9192<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 9193 9194Given: 9195 void foo() { 9196 if (int i = foobar(); i > 0) {} 9197 switch (int i = foobar(); i) {} 9198 for (auto& a = get_range(); auto& x : a) {} 9199 } 9200 void bar() { 9201 if (foobar() > 0) {} 9202 switch (foobar()) {} 9203 for (auto& x : get_range()) {} 9204 } 9205ifStmt(hasInitStatement(anything())) 9206 matches the if statement in foo but not in bar. 9207switchStmt(hasInitStatement(anything())) 9208 matches the switch statement in foo but not in bar. 9209cxxForRangeStmt(hasInitStatement(anything())) 9210 matches the range for statement in foo but not in bar. 9211</pre></td></tr> 9212 9213 9214<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> 9215<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 9216matches the given matcher. 9217 9218The associated declaration is: 9219- for type nodes, the declaration of the underlying type 9220- for CallExpr, the declaration of the callee 9221- for MemberExpr, the declaration of the referenced member 9222- for CXXConstructExpr, the declaration of the constructor 9223- for CXXNewExpr, the declaration of the operator new 9224- for ObjCIvarExpr, the declaration of the ivar 9225 9226For type nodes, hasDeclaration will generally match the declaration of the 9227sugared type. Given 9228 class X {}; 9229 typedef X Y; 9230 Y y; 9231in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9232typedefDecl. A common use case is to match the underlying, desugared type. 9233This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9234 varDecl(hasType(hasUnqualifiedDesugaredType( 9235 recordType(hasDeclaration(decl()))))) 9236In this matcher, the decl will match the CXXRecordDecl of class X. 9237 9238Usable 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>>, 9239 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>>, 9240 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>>, 9241 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>>, 9242 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>>, 9243 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>>, 9244 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9245</pre></td></tr> 9246 9247 9248<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>></td><td class="name" onclick="toggle('hasTypeLoc12')"><a name="hasTypeLoc12Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 9249<tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher. 9250 9251Examples: 9252 int x; 9253declaratorDecl(hasTypeLoc(loc(asString("int")))) 9254 matches int x 9255 9256auto x = int(3); 9257cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 9258 matches int(3) 9259 9260struct Foo { Foo(int, int); }; 9261auto x = Foo(1, 2); 9262cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 9263 matches Foo(1, 2) 9264 9265Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 9266 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 9267 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 9268 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 9269 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 9270 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 9271 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 9272 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 9273</pre></td></tr> 9274 9275 9276<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> 9277<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 9278 9279Given 9280 struct B { int next; }; 9281 template<int(B::*next_ptr)> struct A {}; 9282 A<&B::next> a; 9283templateSpecializationType(hasAnyTemplateArgument( 9284 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 9285 matches the specialization A<&B::next> with fieldDecl(...) matching 9286 B::next 9287</pre></td></tr> 9288 9289 9290<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> 9291<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 9292declaration. 9293 9294Given 9295 struct B { int next; }; 9296 template<int(B::*next_ptr)> struct A {}; 9297 A<&B::next> a; 9298classTemplateSpecializationDecl(hasAnyTemplateArgument( 9299 refersToDeclaration(fieldDecl(hasName("next"))))) 9300 matches the specialization A<&B::next> with fieldDecl(...) matching 9301 B::next 9302</pre></td></tr> 9303 9304 9305<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> 9306<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type. 9307 9308Given 9309 template<int T> struct C {}; 9310 C<42> c; 9311classTemplateSpecializationDecl( 9312 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 9313 matches the implicit instantiation of C in C<42>. 9314</pre></td></tr> 9315 9316 9317<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> 9318<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 9319 9320Given 9321 template<template <typename> class S> class X {}; 9322 template<typename T> class Y {}; 9323 X<Y> xi; 9324classTemplateSpecializationDecl(hasAnyTemplateArgument( 9325 refersToTemplate(templateName()))) 9326 matches the specialization X<Y> 9327</pre></td></tr> 9328 9329 9330<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> 9331<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 9332 9333Given 9334 struct X {}; 9335 template<typename T> struct A {}; 9336 A<X> a; 9337classTemplateSpecializationDecl(hasAnyTemplateArgument( 9338 refersToType(class(hasName("X"))))) 9339 matches the specialization A<X> 9340</pre></td></tr> 9341 9342 9343<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgumentLoc0')"><a name="hasAnyTemplateArgumentLoc0Anchor">hasAnyTemplateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>> InnerMatcher</td></tr> 9344<tr><td colspan="4" class="doc" id="hasAnyTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s that have at least one 9345`TemplateArgumentLoc` matching the given `InnerMatcher`. 9346 9347Given 9348 template<typename T> class A {}; 9349 A<int> a; 9350varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc( 9351 hasTypeLoc(loc(asString("int"))))))) 9352 matches `A<int> a`. 9353</pre></td></tr> 9354 9355 9356<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>></td><td class="name" onclick="toggle('hasTemplateArgumentLoc1')"><a name="hasTemplateArgumentLoc1Anchor">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>> InnerMatcher</td></tr> 9357<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc1"><pre>Matches template specialization `TypeLoc`s where the n'th 9358`TemplateArgumentLoc` matches the given `InnerMatcher`. 9359 9360Given 9361 template<typename T, typename U> class A {}; 9362 A<double, int> b; 9363 A<int, double> c; 9364varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0, 9365 hasTypeLoc(loc(asString("double"))))))) 9366 matches `A<double, int> b`, but not `A<int, double> c`. 9367</pre></td></tr> 9368 9369 9370<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> 9371<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 9372functionDecl that have at least one TemplateArgument matching the given 9373InnerMatcher. 9374 9375Given 9376 template<typename T> class A {}; 9377 template<> class A<double> {}; 9378 A<int> a; 9379 9380 template<typename T> f() {}; 9381 void func() { f<int>(); }; 9382 9383classTemplateSpecializationDecl(hasAnyTemplateArgument( 9384 refersToType(asString("int")))) 9385 matches the specialization A<int> 9386 9387functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 9388 matches the specialization f<int> 9389</pre></td></tr> 9390 9391 9392<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> 9393<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 9394matches the given matcher. 9395 9396The associated declaration is: 9397- for type nodes, the declaration of the underlying type 9398- for CallExpr, the declaration of the callee 9399- for MemberExpr, the declaration of the referenced member 9400- for CXXConstructExpr, the declaration of the constructor 9401- for CXXNewExpr, the declaration of the operator new 9402- for ObjCIvarExpr, the declaration of the ivar 9403 9404For type nodes, hasDeclaration will generally match the declaration of the 9405sugared type. Given 9406 class X {}; 9407 typedef X Y; 9408 Y y; 9409in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9410typedefDecl. A common use case is to match the underlying, desugared type. 9411This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9412 varDecl(hasType(hasUnqualifiedDesugaredType( 9413 recordType(hasDeclaration(decl()))))) 9414In this matcher, the decl will match the CXXRecordDecl of class X. 9415 9416Usable 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>>, 9417 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>>, 9418 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>>, 9419 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>>, 9420 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>>, 9421 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>>, 9422 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9423</pre></td></tr> 9424 9425 9426<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> 9427<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 9428functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 9429 9430Given 9431 template<typename T, typename U> class A {}; 9432 A<bool, int> b; 9433 A<int, bool> c; 9434 9435 template<typename T> void f() {} 9436 void func() { f<int>(); }; 9437classTemplateSpecializationDecl(hasTemplateArgument( 9438 1, refersToType(asString("int")))) 9439 matches the specialization A<bool, int> 9440 9441functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 9442 matches the specialization f<int> 9443</pre></td></tr> 9444 9445 9446<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> 9447<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 9448matches the given matcher. 9449 9450The associated declaration is: 9451- for type nodes, the declaration of the underlying type 9452- for CallExpr, the declaration of the callee 9453- for MemberExpr, the declaration of the referenced member 9454- for CXXConstructExpr, the declaration of the constructor 9455- for CXXNewExpr, the declaration of the operator new 9456- for ObjCIvarExpr, the declaration of the ivar 9457 9458For type nodes, hasDeclaration will generally match the declaration of the 9459sugared type. Given 9460 class X {}; 9461 typedef X Y; 9462 Y y; 9463in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9464typedefDecl. A common use case is to match the underlying, desugared type. 9465This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9466 varDecl(hasType(hasUnqualifiedDesugaredType( 9467 recordType(hasDeclaration(decl()))))) 9468In this matcher, the decl will match the CXXRecordDecl of class X. 9469 9470Usable 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>>, 9471 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>>, 9472 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>>, 9473 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>>, 9474 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>>, 9475 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>>, 9476 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9477</pre></td></tr> 9478 9479 9480<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> 9481<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 9482QualType-matcher matches. 9483</pre></td></tr> 9484 9485 9486<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc13')"><a name="hasTypeLoc13Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 9487<tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher. 9488 9489Examples: 9490 int x; 9491declaratorDecl(hasTypeLoc(loc(asString("int")))) 9492 matches int x 9493 9494auto x = int(3); 9495cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 9496 matches int(3) 9497 9498struct Foo { Foo(int, int); }; 9499auto x = Foo(1, 2); 9500cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 9501 matches Foo(1, 2) 9502 9503Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 9504 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 9505 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 9506 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 9507 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 9508 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 9509 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 9510 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 9511</pre></td></tr> 9512 9513 9514<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> 9515<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 9516matcher. 9517 9518Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9519 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9520 and U (matcher = typedefDecl(hasType(asString("int"))) 9521 and friend class X (matcher = friendDecl(hasType("X")) 9522 and public virtual X (matcher = cxxBaseSpecifier(hasType( 9523 asString("class X"))) 9524 class X {}; 9525 void y(X &x) { x; X z; } 9526 typedef int U; 9527 class Y { friend class X; }; 9528 class Z : public virtual X {}; 9529</pre></td></tr> 9530 9531 9532<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> 9533<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 9534matches the given matcher. 9535 9536The associated declaration is: 9537- for type nodes, the declaration of the underlying type 9538- for CallExpr, the declaration of the callee 9539- for MemberExpr, the declaration of the referenced member 9540- for CXXConstructExpr, the declaration of the constructor 9541- for CXXNewExpr, the declaration of the operator new 9542- for ObjCIvarExpr, the declaration of the ivar 9543 9544For type nodes, hasDeclaration will generally match the declaration of the 9545sugared type. Given 9546 class X {}; 9547 typedef X Y; 9548 Y y; 9549in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9550typedefDecl. A common use case is to match the underlying, desugared type. 9551This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9552 varDecl(hasType(hasUnqualifiedDesugaredType( 9553 recordType(hasDeclaration(decl()))))) 9554In this matcher, the decl will match the CXXRecordDecl of class X. 9555 9556Usable 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>>, 9557 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>>, 9558 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>>, 9559 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>>, 9560 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>>, 9561 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>>, 9562 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9563</pre></td></tr> 9564 9565 9566<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> 9567<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 9568type of the matched node. 9569 9570For example, in: 9571 class A {}; 9572 using B = A; 9573The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 9574both B and A. 9575</pre></td></tr> 9576 9577 9578<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> 9579<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 9580 9581Given 9582 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 9583unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 9584 matches sizeof(a) and alignof(c) 9585</pre></td></tr> 9586 9587 9588<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> 9589<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 9590 9591Example matches true (matcher = hasUnaryOperand( 9592 cxxBoolLiteral(equals(true)))) 9593 !true 9594</pre></td></tr> 9595 9596 9597<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> 9598<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 9599given matcher. Implicit object expressions are included; that is, it matches 9600use of implicit `this`. 9601 9602Given 9603 struct X { 9604 int m; 9605 int f(X x) { x.m; return m; } 9606 }; 9607memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 9608 matches `x.m`, but not `m`; however, 9609memberExpr(hasObjectExpression(hasType(pointsTo( 9610 cxxRecordDecl(hasName("X")))))) 9611 matches `m` (aka. `this->m`), but not `x.m`. 9612</pre></td></tr> 9613 9614 9615<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> 9616<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 9617matches the given matcher. 9618 9619The associated declaration is: 9620- for type nodes, the declaration of the underlying type 9621- for CallExpr, the declaration of the callee 9622- for MemberExpr, the declaration of the referenced member 9623- for CXXConstructExpr, the declaration of the constructor 9624- for CXXNewExpr, the declaration of the operator new 9625- for ObjCIvarExpr, the declaration of the ivar 9626 9627For type nodes, hasDeclaration will generally match the declaration of the 9628sugared type. Given 9629 class X {}; 9630 typedef X Y; 9631 Y y; 9632in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9633typedefDecl. A common use case is to match the underlying, desugared type. 9634This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9635 varDecl(hasType(hasUnqualifiedDesugaredType( 9636 recordType(hasDeclaration(decl()))))) 9637In this matcher, the decl will match the CXXRecordDecl of class X. 9638 9639Usable 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>>, 9640 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>>, 9641 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>>, 9642 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>>, 9643 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>>, 9644 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>>, 9645 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9646</pre></td></tr> 9647 9648 9649<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> 9650<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 9651matched by the given matcher. 9652 9653Given 9654 namespace X { int a; void b(); } 9655 using X::a; 9656 using X::b; 9657usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 9658 matches using X::b but not using X::a </pre></td></tr> 9659 9660 9661<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> 9662<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value 9663declaration's type. 9664 9665In case of a value declaration (for example a variable declaration), 9666this resolves one layer of indirection. For example, in the value 9667declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 9668X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 9669declaration of x. 9670 9671Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9672 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9673 and friend class X (matcher = friendDecl(hasType("X")) 9674 and public virtual X (matcher = cxxBaseSpecifier(hasType( 9675 cxxRecordDecl(hasName("X")))) 9676 class X {}; 9677 void y(X &x) { x; X z; } 9678 class Y { friend class X; }; 9679 class Z : public virtual X {}; 9680 9681Example matches class Derived 9682(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 9683class Base {}; 9684class Derived : Base {}; 9685 9686Usable 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>>, 9687Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 9688</pre></td></tr> 9689 9690 9691<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> 9692<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 9693matcher. 9694 9695Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9696 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9697 and U (matcher = typedefDecl(hasType(asString("int"))) 9698 and friend class X (matcher = friendDecl(hasType("X")) 9699 and public virtual X (matcher = cxxBaseSpecifier(hasType( 9700 asString("class X"))) 9701 class X {}; 9702 void y(X &x) { x; X z; } 9703 typedef int U; 9704 class Y { friend class X; }; 9705 class Z : public virtual X {}; 9706</pre></td></tr> 9707 9708 9709<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> 9710<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 9711that matches the given matcher. 9712 9713Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 9714 bool y() { return true; } 9715 bool x = y(); 9716</pre></td></tr> 9717 9718 9719<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> 9720<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 9721expression. 9722 9723Given 9724 void f(int b) { 9725 int a[b]; 9726 } 9727variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 9728 varDecl(hasName("b"))))))) 9729 matches "int a[b]" 9730</pre></td></tr> 9731 9732 9733<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> 9734<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr> 9735 9736 9737<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> 9738<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 9739switch statement or conditional operator. 9740 9741Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 9742 if (true) {} 9743</pre></td></tr> 9744 9745<!--END_TRAVERSAL_MATCHERS --> 9746</table> 9747 9748</div> 9749</body> 9750</html> 9751 9752 9753