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 staticAssertDecl() 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('usingType0')"><a name="usingType0Anchor">usingType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>>...</td></tr> 2749<tr><td colspan="4" class="doc" id="usingType0"><pre>Matches types specified through a using declaration. 2750 2751Given 2752 namespace a { struct S {}; } 2753 using a::S; 2754 S s; 2755 2756usingType() matches the type of the variable declaration of s. 2757</pre></td></tr> 2758 2759 2760<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> 2761<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 2762integer-constant-expression. 2763 2764Given 2765 void f() { 2766 int a[] = { 2, 3 } 2767 int b[42]; 2768 int c[a[0]]; 2769 } 2770variableArrayType() 2771 matches "int c[a[0]]" 2772</pre></td></tr> 2773 2774<!--END_DECL_MATCHERS --> 2775</table> 2776 2777<!-- ======================================================================= --> 2778<h2 id="narrowing-matchers">Narrowing Matchers</h2> 2779<!-- ======================================================================= --> 2780 2781<p>Narrowing matchers match certain attributes on the current node, thus 2782narrowing down the set of nodes of the current type to match on.</p> 2783 2784<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 2785which allow users to create more powerful match expressions.</p> 2786 2787<table> 2788<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 2789<!-- START_NARROWING_MATCHERS --> 2790 2791<tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2792<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 2793 2794Usable as: Any Matcher 2795</pre></td></tr> 2796 2797 2798<tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2799<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 2800 2801Usable as: Any Matcher 2802</pre></td></tr> 2803 2804 2805<tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 2806<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 2807 2808Useful when another matcher requires a child matcher, but there's no 2809additional constraint. This will often be used with an explicit conversion 2810to an internal::Matcher<> type such as TypeMatcher. 2811 2812Example: DeclarationMatcher(anything()) matches all declarations, e.g., 2813"int* p" and "void f()" in 2814 int* p; 2815 void f(); 2816 2817Usable as: Any Matcher 2818</pre></td></tr> 2819 2820 2821<tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr> 2822<tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within 2823 2824Given 2825 if (true); 2826 for (; true; ); 2827with the matcher 2828 mapAnyOf(ifStmt, forStmt).with( 2829 hasCondition(cxxBoolLiteralExpr(equals(true))) 2830 ).bind("trueCond") 2831matches the if and the for. It is equivalent to: 2832 auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true))); 2833 anyOf( 2834 ifStmt(trueCond).bind("trueCond"), 2835 forStmt(trueCond).bind("trueCond") 2836 ); 2837 2838The with() chain-call accepts zero or more matchers which are combined 2839as-if with allOf() in each of the node matchers. 2840Usable as: Any Matcher 2841</pre></td></tr> 2842 2843 2844<tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 2845<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 2846 2847Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 2848 class X {}; 2849 class Y {}; 2850 2851Usable as: Any Matcher 2852</pre></td></tr> 2853 2854 2855<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> 2856<tr><td colspan="4" class="doc" id="isImplicit1"><pre>Matches an entity that has been implicitly added by the compiler (e.g. 2857implicit default/copy constructors). 2858</pre></td></tr> 2859 2860 2861<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> 2862<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the 2863specified names. 2864 2865 hasAnyOperatorName("+", "-") 2866 Is equivalent to 2867 anyOf(hasOperatorName("+"), hasOperatorName("-")) 2868</pre></td></tr> 2869 2870 2871<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> 2872<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 2873unary). 2874 2875Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 2876 !(a || b) 2877</pre></td></tr> 2878 2879 2880<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> 2881<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators. 2882 2883Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2884 if (a == b) 2885 a += b; 2886 2887Example 2: matches s1 = s2 2888 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2889 struct S { S& operator=(const S&); }; 2890 void x() { S s1, s2; s1 = s2; } 2891</pre></td></tr> 2892 2893 2894<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> 2895<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators. 2896 2897Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 2898 if (a == b) 2899 a += b; 2900 2901Example 2: matches s1 < s2 2902 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 2903 struct S { bool operator<(const S& other); }; 2904 void x(S s1, S s2) { bool b1 = s1 < s2; } 2905</pre></td></tr> 2906 2907 2908<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> 2909<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private 2910inheritance. 2911 2912Examples: 2913 class C { 2914 public: int a; 2915 protected: int b; 2916 private: int c; // fieldDecl(isPrivate()) matches 'c' 2917 }; 2918 2919 struct Base {}; 2920 struct Derived1 : private Base {}; // matches 'Base' 2921 class Derived2 : Base {}; // matches 'Base' 2922</pre></td></tr> 2923 2924 2925<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> 2926<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify 2927protected inheritance. 2928 2929Examples: 2930 class C { 2931 public: int a; 2932 protected: int b; // fieldDecl(isProtected()) matches 'b' 2933 private: int c; 2934 }; 2935 2936 class Base {}; 2937 class Derived : protected Base {}; // matches 'Base' 2938</pre></td></tr> 2939 2940 2941<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> 2942<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public 2943inheritance. 2944 2945Examples: 2946 class C { 2947 public: int a; // fieldDecl(isPublic()) matches 'a' 2948 protected: int b; 2949 private: int c; 2950 }; 2951 2952 class Base {}; 2953 class Derived1 : public Base {}; // matches 'Base' 2954 struct Derived2 : Base {}; // matches 'Base' 2955</pre></td></tr> 2956 2957 2958<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> 2959<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify 2960virtual inheritance. 2961 2962Example: 2963 class A { 2964 public: 2965 virtual void x(); // matches x 2966 }; 2967 2968Example: 2969 class Base {}; 2970 class DirectlyDerived : virtual Base {}; // matches Base 2971 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 2972 2973Usable 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>> 2974</pre></td></tr> 2975 2976 2977<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> 2978<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr> 2979 2980 2981<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> 2982<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT. 2983 2984Given 2985 f('false, 3.14, 42); 2986characterLiteral(equals(0)) 2987 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2988 match false 2989floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2990 match 3.14 2991integerLiteral(equals(42)) 2992 matches 42 2993 2994Note that you cannot directly match a negative numeric literal because the 2995minus sign is not part of the literal: It is a unary operator whose operand 2996is the positive numeric literal. Instead, you must use a unaryOperator() 2997matcher to match the minus sign: 2998 2999unaryOperator(hasOperatorName("-"), 3000 hasUnaryOperand(integerLiteral(equals(13)))) 3001 3002Usable 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>>, 3003 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>> 3004</pre></td></tr> 3005 3006 3007<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> 3008<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr> 3009 3010 3011<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> 3012<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr> 3013 3014 3015<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> 3016<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 3017 3018Given 3019 try { 3020 // ... 3021 } catch (int) { 3022 // ... 3023 } catch (...) { 3024 // ... 3025 } 3026cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 3027</pre></td></tr> 3028 3029 3030<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> 3031<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 3032a specific number of arguments (including absent default arguments). 3033 3034Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3035 void f(int x, int y); 3036 f(0, 0); 3037</pre></td></tr> 3038 3039 3040<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> 3041<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 3042</pre></td></tr> 3043 3044 3045<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> 3046<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 3047zero initialization. 3048 3049Given 3050void foo() { 3051 struct point { double x; double y; }; 3052 point pt[2] = { { 1.0, 2.0 } }; 3053} 3054initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 3055will match the implicit array filler for pt[1]. 3056</pre></td></tr> 3057 3058 3059<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> 3060<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 3061 3062Given 3063 struct S { 3064 S(); // #1 3065 S(const S &); // #2 3066 S(S &&); // #3 3067 }; 3068cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 3069</pre></td></tr> 3070 3071 3072<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> 3073<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 3074 3075Given 3076 struct S { 3077 S(); // #1 3078 S(const S &); // #2 3079 S(S &&); // #3 3080 }; 3081cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 3082</pre></td></tr> 3083 3084 3085<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> 3086<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 3087 3088Given 3089 struct S { 3090 S(); // #1 3091 S(int) {} // #2 3092 S(S &&) : S() {} // #3 3093 }; 3094 S::S() : S(0) {} // #4 3095cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 3096#1 or #2. 3097</pre></td></tr> 3098 3099 3100<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> 3101<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations 3102that have an explicit specifier if this explicit specifier is resolved to 3103true. 3104 3105Given 3106 template<bool b> 3107 struct S { 3108 S(int); // #1 3109 explicit S(double); // #2 3110 operator int(); // #3 3111 explicit operator bool(); // #4 3112 explicit(false) S(bool) // # 7 3113 explicit(true) S(char) // # 8 3114 explicit(b) S(S) // # 9 3115 }; 3116 S(int) -> S<true> // #5 3117 explicit S(double) -> S<false> // #6 3118cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3119cxxConversionDecl(isExplicit()) will match #4, but not #3. 3120cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3121</pre></td></tr> 3122 3123 3124<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> 3125<tr><td colspan="4" class="doc" id="isInheritingConstructor0"><pre></pre></td></tr> 3126 3127 3128<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> 3129<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 3130 3131Given 3132 struct S { 3133 S(); // #1 3134 S(const S &); // #2 3135 S(S &&); // #3 3136 }; 3137cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 3138</pre></td></tr> 3139 3140 3141<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> 3142<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations 3143that have an explicit specifier if this explicit specifier is resolved to 3144true. 3145 3146Given 3147 template<bool b> 3148 struct S { 3149 S(int); // #1 3150 explicit S(double); // #2 3151 operator int(); // #3 3152 explicit operator bool(); // #4 3153 explicit(false) S(bool) // # 7 3154 explicit(true) S(char) // # 8 3155 explicit(b) S(S) // # 9 3156 }; 3157 S(int) -> S<true> // #5 3158 explicit S(double) -> S<false> // #6 3159cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3160cxxConversionDecl(isExplicit()) will match #4, but not #3. 3161cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3162</pre></td></tr> 3163 3164 3165<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> 3166<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 3167opposed to a member. 3168 3169Given 3170 struct B {}; 3171 struct D : B { 3172 int I; 3173 D(int i) : I(i) {} 3174 }; 3175 struct E : B { 3176 E() : B() {} 3177 }; 3178cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 3179 will match E(), but not match D(int). 3180</pre></td></tr> 3181 3182 3183<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> 3184<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 3185opposed to a base. 3186 3187Given 3188 struct B {}; 3189 struct D : B { 3190 int I; 3191 D(int i) : I(i) {} 3192 }; 3193 struct E : B { 3194 E() : B() {} 3195 }; 3196cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 3197 will match D(int), but not match E(). 3198</pre></td></tr> 3199 3200 3201<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> 3202<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 3203code (as opposed to implicitly added by the compiler). 3204 3205Given 3206 struct Foo { 3207 Foo() { } 3208 Foo(int) : foo_("A") { } 3209 string foo_; 3210 }; 3211cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 3212 will match Foo(int), but not Foo() 3213</pre></td></tr> 3214 3215 3216<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> 3217<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations 3218that have an explicit specifier if this explicit specifier is resolved to 3219true. 3220 3221Given 3222 template<bool b> 3223 struct S { 3224 S(int); // #1 3225 explicit S(double); // #2 3226 operator int(); // #3 3227 explicit operator bool(); // #4 3228 explicit(false) S(bool) // # 7 3229 explicit(true) S(char) // # 8 3230 explicit(b) S(S) // # 9 3231 }; 3232 S(int) -> S<true> // #5 3233 explicit S(double) -> S<false> // #6 3234cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3235cxxConversionDecl(isExplicit()) will match #4, but not #3. 3236cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3237</pre></td></tr> 3238 3239 3240<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> 3241<tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names. 3242 3243In template declarations, dependent members are not resolved and so can 3244not be matched to particular named declarations. 3245 3246This matcher allows to match on the known name of members. 3247 3248Given 3249 template <typename T> 3250 struct S { 3251 void mem(); 3252 }; 3253 template <typename T> 3254 void x() { 3255 S<T> s; 3256 s.mem(); 3257 } 3258cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()` 3259</pre></td></tr> 3260 3261 3262<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> 3263<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed 3264to '.'. 3265 3266Member calls on the implicit this pointer match as called with '->'. 3267 3268Given 3269 class Y { 3270 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3271 template <class T> void f() { this->f<T>(); f<T>(); } 3272 int a; 3273 static int b; 3274 }; 3275 template <class T> 3276 class Z { 3277 void x() { this->m; } 3278 }; 3279memberExpr(isArrow()) 3280 matches this->x, x, y.x, a, this->b 3281cxxDependentScopeMemberExpr(isArrow()) 3282 matches this->m 3283unresolvedMemberExpr(isArrow()) 3284 matches this->f<T>, f<T> 3285</pre></td></tr> 3286 3287 3288<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> 3289<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound 3290node 3291 3292In template declarations, dependent members are not resolved and so can 3293not be matched to particular named declarations. 3294 3295This matcher allows to match on the name of already-bound VarDecl, FieldDecl 3296and CXXMethodDecl nodes. 3297 3298Given 3299 template <typename T> 3300 struct S { 3301 void mem(); 3302 }; 3303 template <typename T> 3304 void x() { 3305 S<T> s; 3306 s.mem(); 3307 } 3308The matcher 3309@code 3310cxxDependentScopeMemberExpr( 3311 hasObjectExpression(declRefExpr(hasType(templateSpecializationType( 3312 hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has( 3313 cxxMethodDecl(hasName("mem")).bind("templMem") 3314 ))))) 3315 )))), 3316 memberHasSameNameAsBoundNode("templMem") 3317 ) 3318@endcode 3319first matches and binds the @c mem member of the @c S template, then 3320compares its name to the usage in @c s.mem() in the @c x function template 3321</pre></td></tr> 3322 3323 3324<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> 3325<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 3326 3327Given 3328struct A { 3329 void foo() const; 3330 void bar(); 3331}; 3332 3333cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 3334</pre></td></tr> 3335 3336 3337<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> 3338<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 3339operator. 3340 3341Given 3342struct A { 3343 A &operator=(const A &); 3344 A &operator=(A &&); 3345}; 3346 3347cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 3348the second one. 3349</pre></td></tr> 3350 3351 3352<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> 3353<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 3354 3355Given: 3356 class A final {}; 3357 3358 struct B { 3359 virtual void f(); 3360 }; 3361 3362 struct C : B { 3363 void f() final; 3364 }; 3365matches A and C::f, but not B, C, or B::f 3366</pre></td></tr> 3367 3368 3369<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> 3370<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 3371operator. 3372 3373Given 3374struct A { 3375 A &operator=(const A &); 3376 A &operator=(A &&); 3377}; 3378 3379cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 3380the first one. 3381</pre></td></tr> 3382 3383 3384<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> 3385<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 3386 3387Given 3388 class A { 3389 public: 3390 virtual void x(); 3391 }; 3392 class B : public A { 3393 public: 3394 virtual void x(); 3395 }; 3396 matches B::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('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr> 3401<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 3402 3403Given 3404 class A { 3405 public: 3406 virtual void x() = 0; 3407 }; 3408 matches A::x 3409</pre></td></tr> 3410 3411 3412<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> 3413<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 3414 3415Given 3416 struct S { 3417 S(); // #1 3418 S(const S &) = default; // #2 3419 S(S &&) = delete; // #3 3420 }; 3421cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 3422</pre></td></tr> 3423 3424 3425<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> 3426<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify 3427virtual inheritance. 3428 3429Example: 3430 class A { 3431 public: 3432 virtual void x(); // matches x 3433 }; 3434 3435Example: 3436 class Base {}; 3437 class DirectlyDerived : virtual Base {}; // matches Base 3438 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 3439 3440Usable 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>> 3441</pre></td></tr> 3442 3443 3444<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> 3445<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 3446 3447Given 3448 class A { 3449 public: 3450 virtual void x(); 3451 }; 3452 class B : public A { 3453 public: 3454 void x(); 3455 }; 3456 matches A::x but not B::x 3457</pre></td></tr> 3458 3459 3460<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> 3461<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions. 3462 3463Given: 3464 MyClass *p1 = new MyClass[10]; 3465cxxNewExpr(isArray()) 3466 matches the expression 'new MyClass[10]'. 3467</pre></td></tr> 3468 3469 3470<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> 3471<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the 3472specified names. 3473 3474 hasAnyOperatorName("+", "-") 3475 Is equivalent to 3476 anyOf(hasOperatorName("+"), hasOperatorName("-")) 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('hasAnyOverloadedOperatorName0')"><a name="hasAnyOverloadedOperatorName0Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 3481<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names. 3482 3483Matches overloaded operator names specified in strings without the 3484"operator" prefix: e.g. "<<". 3485 3486 hasAnyOverloadedOperatorName("+", "-") 3487Is equivalent to 3488 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3489</pre></td></tr> 3490 3491 3492<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> 3493<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 3494unary). 3495 3496Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3497 !(a || b) 3498</pre></td></tr> 3499 3500 3501<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> 3502<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 3503 3504Matches overloaded operator names specified in strings without the 3505"operator" prefix: e.g. "<<". 3506 3507Given: 3508 class A { int operator*(); }; 3509 const A &operator<<(const A &a, const A &b); 3510 A a; 3511 a << a; // <-- This matches 3512 3513cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3514specified line and 3515cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3516matches the declaration of A. 3517 3518Usable 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>> 3519</pre></td></tr> 3520 3521 3522<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> 3523<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators. 3524 3525Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3526 if (a == b) 3527 a += b; 3528 3529Example 2: matches s1 = s2 3530 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3531 struct S { S& operator=(const S&); }; 3532 void x() { S s1, s2; s1 = s2; } 3533</pre></td></tr> 3534 3535 3536<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> 3537<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators. 3538 3539Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3540 if (a == b) 3541 a += b; 3542 3543Example 2: matches s1 < s2 3544 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3545 struct S { bool operator<(const S& other); }; 3546 void x(S s1, S s2) { bool b1 = s1 < s2; } 3547</pre></td></tr> 3548 3549 3550<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> 3551<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined. 3552 3553Example matches x (matcher = cxxRecordDecl(hasDefinition())) 3554class x {}; 3555class y; 3556</pre></td></tr> 3557 3558 3559<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> 3560<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 3561</pre></td></tr> 3562 3563 3564<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> 3565<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 3566</pre></td></tr> 3567 3568 3569<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> 3570<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 3571static member variable template instantiations. 3572 3573Given 3574 template<typename T> void A(T t) { } 3575 template<> void A(int N) { } 3576functionDecl(isExplicitTemplateSpecialization()) 3577 matches the specialization A<int>(). 3578 3579Usable 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>> 3580</pre></td></tr> 3581 3582 3583<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> 3584<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 3585 3586Given: 3587 class A final {}; 3588 3589 struct B { 3590 virtual void f(); 3591 }; 3592 3593 struct C : B { 3594 void f() final; 3595 }; 3596matches A and C::f, but not B, C, or B::f 3597</pre></td></tr> 3598 3599 3600<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> 3601<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 3602 3603Given: 3604 auto x = []{}; 3605 3606cxxRecordDecl(isLambda()) matches the implicit class declaration of 3607decltype(x) 3608</pre></td></tr> 3609 3610 3611<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> 3612<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for 3613isSameOrDerivedFrom(hasName(...)). 3614</pre></td></tr> 3615 3616 3617<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> 3618<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 3619member variable template instantiations. 3620 3621Given 3622 template <typename T> class X {}; class A {}; X<A> x; 3623or 3624 template <typename T> class X {}; class A {}; template class X<A>; 3625or 3626 template <typename T> class X {}; class A {}; extern template class X<A>; 3627cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3628 matches the template instantiation of X<A>. 3629 3630But given 3631 template <typename T> class X {}; class A {}; 3632 template <> class X<A> {}; X<A> x; 3633cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3634 does not match, as X<A> is an explicit template specialization. 3635 3636Usable 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>> 3637</pre></td></tr> 3638 3639 3640<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> 3641<tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the 3642specified names. 3643 3644 hasAnyOperatorName("+", "-") 3645 Is equivalent to 3646 anyOf(hasOperatorName("+"), hasOperatorName("-")) 3647</pre></td></tr> 3648 3649 3650<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> 3651<tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or 3652unary). 3653 3654Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3655 !(a || b) 3656</pre></td></tr> 3657 3658 3659<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> 3660<tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators. 3661 3662Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3663 if (a == b) 3664 a += b; 3665 3666Example 2: matches s1 = s2 3667 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3668 struct S { S& operator=(const S&); }; 3669 void x() { S s1, s2; s1 = s2; } 3670</pre></td></tr> 3671 3672 3673<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> 3674<tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators. 3675 3676Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3677 if (a == b) 3678 a += b; 3679 3680Example 2: matches s1 < s2 3681 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3682 struct S { bool operator<(const S& other); }; 3683 void x(S s1, S s2) { bool b1 = s1 < s2; } 3684</pre></td></tr> 3685 3686 3687<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> 3688<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3689a specific number of arguments (including absent default arguments). 3690 3691Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3692 void f(int x, int y); 3693 f(0, 0); 3694</pre></td></tr> 3695 3696 3697<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> 3698<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 3699a specific number of arguments (including absent default arguments). 3700 3701Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3702 void f(int x, int y); 3703 f(0, 0); 3704</pre></td></tr> 3705 3706 3707<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> 3708<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL. 3709 3710Example matches y(x) but not y(42) or NS::y(x). 3711 namespace NS { 3712 struct X {}; 3713 void y(X); 3714 } 3715 3716 void y(...); 3717 3718 void test() { 3719 NS::X x; 3720 y(x); // Matches 3721 NS::y(x); // Doesn't match 3722 y(42); // Doesn't match 3723 using NS::y; 3724 y(x); // Found by both unqualified lookup and ADL, doesn't match 3725 } 3726</pre></td></tr> 3727 3728 3729<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> 3730<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 3731 3732Example: matches the implicit cast around 0 3733(matcher = castExpr(hasCastKind(CK_NullToPointer))) 3734 int *p = 0; 3735 3736If the matcher is use from clang-query, CastKind parameter 3737should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer"). 3738</pre></td></tr> 3739 3740 3741<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> 3742<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr> 3743 3744 3745<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> 3746<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT. 3747 3748Given 3749 f('false, 3.14, 42); 3750characterLiteral(equals(0)) 3751 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3752 match false 3753floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3754 match 3.14 3755integerLiteral(equals(42)) 3756 matches 42 3757 3758Note that you cannot directly match a negative numeric literal because the 3759minus sign is not part of the literal: It is a unary operator whose operand 3760is the positive numeric literal. Instead, you must use a unaryOperator() 3761matcher to match the minus sign: 3762 3763unaryOperator(hasOperatorName("-"), 3764 hasUnaryOperand(integerLiteral(equals(13)))) 3765 3766Usable 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>>, 3767 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>> 3768</pre></td></tr> 3769 3770 3771<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> 3772<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr> 3773 3774 3775<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> 3776<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr> 3777 3778 3779<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> 3780<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 3781 3782Given 3783 template<typename T> struct C {}; 3784 C<int> c; 3785classTemplateSpecializationDecl(templateArgumentCountIs(1)) 3786 matches C<int>. 3787</pre></td></tr> 3788 3789 3790<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> 3791<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 3792child statements. 3793 3794Example: Given 3795 { for (;;) {} } 3796compoundStmt(statementCountIs(0))) 3797 matches '{}' 3798 but does not match the outer compound statement. 3799</pre></td></tr> 3800 3801 3802<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> 3803<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 3804 3805Given 3806 int a[42]; 3807 int b[2 * 21]; 3808 int c[41], d[43]; 3809 char *s = "abcd"; 3810 wchar_t *ws = L"abcd"; 3811 char *w = "a"; 3812constantArrayType(hasSize(42)) 3813 matches "int a[42]" and "int b[2 * 21]" 3814stringLiteral(hasSize(4)) 3815 matches "abcd", L"abcd" 3816</pre></td></tr> 3817 3818 3819<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> 3820<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 3821declarations. 3822 3823Example: Given 3824 int a, b; 3825 int c; 3826 int d = 2, e; 3827declCountIs(2) 3828 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 3829</pre></td></tr> 3830 3831 3832<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> 3833<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 3834 3835Matches a node if it equals the node previously bound to ID. 3836 3837Given 3838 class X { int a; int b; }; 3839cxxRecordDecl( 3840 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3841 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3842 matches the class X, as a and b have the same type. 3843 3844Note that when multiple matches are involved via forEach* matchers, 3845equalsBoundNodes acts as a filter. 3846For example: 3847compoundStmt( 3848 forEachDescendant(varDecl().bind("d")), 3849 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3850will trigger a match for each combination of variable declaration 3851and reference to that variable declaration within a compound statement. 3852</pre></td></tr> 3853 3854 3855<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> 3856<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 3857 3858Decl has pointer identity in the AST. 3859</pre></td></tr> 3860 3861 3862<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> 3863<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 3864 3865Given 3866 __attribute__((device)) void f() { ... } 3867decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 3868f. If the matcher is used from clang-query, attr::Kind parameter should be 3869passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 3870</pre></td></tr> 3871 3872 3873<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> 3874<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro. 3875Does not match if only part of the statement is expanded from that macro or 3876if different parts of the statement are expanded from different 3877appearances of the macro. 3878</pre></td></tr> 3879 3880 3881<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> 3882<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 3883partially matching a given regex. 3884 3885Example matches Y but not X 3886 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3887 #include "ASTMatcher.h" 3888 class X {}; 3889ASTMatcher.h: 3890 class Y {}; 3891 3892Usable 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>> 3893 3894If the matcher is used in clang-query, RegexFlags parameter 3895should be passed as a quoted string. e.g: "NoFlags". 3896Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3897</pre></td></tr> 3898 3899 3900<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> 3901<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 3902 3903Example matches X but not Y 3904 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3905 #include <Y.h> 3906 class X {}; 3907Y.h: 3908 class Y {}; 3909 3910Usable 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>> 3911</pre></td></tr> 3912 3913 3914<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> 3915<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 3916 3917Example matches Y but not X 3918 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3919 #include <SystemHeader.h> 3920 class X {}; 3921SystemHeader.h: 3922 class Y {}; 3923 3924Usable 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>> 3925</pre></td></tr> 3926 3927 3928<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> 3929<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches an entity that has been implicitly added by the compiler (e.g. 3930implicit default/copy constructors). 3931</pre></td></tr> 3932 3933 3934<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> 3935<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces. 3936 3937Given 3938 class vector {}; 3939 namespace foo { 3940 class vector {}; 3941 namespace std { 3942 class vector {}; 3943 } 3944 } 3945 namespace std { 3946 inline namespace __1 { 3947 class vector {}; // #1 3948 namespace experimental { 3949 class vector {}; 3950 } 3951 } 3952 } 3953cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1. 3954</pre></td></tr> 3955 3956 3957<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> 3958<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3959template instantiations. 3960 3961Given 3962 template<typename T> void A(T t) { T i; } 3963 A(0); 3964 A(0U); 3965functionDecl(isInstantiated()) 3966 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3967</pre></td></tr> 3968 3969 3970<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> 3971<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private 3972inheritance. 3973 3974Examples: 3975 class C { 3976 public: int a; 3977 protected: int b; 3978 private: int c; // fieldDecl(isPrivate()) matches 'c' 3979 }; 3980 3981 struct Base {}; 3982 struct Derived1 : private Base {}; // matches 'Base' 3983 class Derived2 : Base {}; // matches 'Base' 3984</pre></td></tr> 3985 3986 3987<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> 3988<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify 3989protected inheritance. 3990 3991Examples: 3992 class C { 3993 public: int a; 3994 protected: int b; // fieldDecl(isProtected()) matches 'b' 3995 private: int c; 3996 }; 3997 3998 class Base {}; 3999 class Derived : protected Base {}; // matches 'Base' 4000</pre></td></tr> 4001 4002 4003<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> 4004<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public 4005inheritance. 4006 4007Examples: 4008 class C { 4009 public: int a; // fieldDecl(isPublic()) matches 'a' 4010 protected: int b; 4011 private: int c; 4012 }; 4013 4014 class Base {}; 4015 class Derived1 : public Base {}; // matches 'Base' 4016 struct Derived2 : Base {}; // matches 'Base' 4017</pre></td></tr> 4018 4019 4020<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> 4021<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 4022a specific number of designators. 4023 4024Example: Given 4025 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 4026 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 4027designatorCountIs(2) 4028 matches '{ [2].y = 1.0, [0].x = 1.0 }', 4029 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 4030</pre></td></tr> 4031 4032 4033<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> 4034<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration. 4035 4036Example matches Y (matcher = enumDecl(isScoped())) 4037enum X {}; 4038enum class Y {}; 4039</pre></td></tr> 4040 4041 4042<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> 4043<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is 4044neither type- nor value-dependent. 4045 4046In the following example, the expression sizeof(sizeof(T() + T())) 4047is instantiation-dependent (since it involves a template parameter T), 4048but is neither type- nor value-dependent, since the type of the inner 4049sizeof is known (std::size_t) and therefore the size of the outer 4050sizeof is known. 4051 template<typename T> 4052 void f(T x, T y) { sizeof(sizeof(T() + T()); } 4053expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T()) 4054</pre></td></tr> 4055 4056 4057<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> 4058<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type 4059is not yet instantiated. 4060 4061For example, the expressions "x" and "x + y" are type-dependent in 4062the following code, but "y" is not type-dependent: 4063 template<typename T> 4064 void add(T x, int y) { 4065 x + y; 4066 } 4067expr(isTypeDependent()) matches x + y 4068</pre></td></tr> 4069 4070 4071<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> 4072<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a 4073non-type template parameter. 4074 4075For example, the array bound of "Chars" in the following example is 4076value-dependent. 4077 template<int Size> int f() { return Size; } 4078expr(isValueDependent()) matches return Size 4079</pre></td></tr> 4080 4081 4082<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> 4083<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 4084GNU's __null, C++11's nullptr, or C's NULL macro. 4085 4086Given: 4087 void *v1 = NULL; 4088 void *v2 = nullptr; 4089 void *v3 = __null; // GNU extension 4090 char *cp = (char *)0; 4091 int *ip = 0; 4092 int i = 0; 4093expr(nullPointerConstant()) 4094 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 4095 initializer for i. 4096</pre></td></tr> 4097 4098 4099<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> 4100<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 4101bit width. 4102 4103Given 4104 class C { 4105 int a : 2; 4106 int b : 4; 4107 int c : 2; 4108 }; 4109fieldDecl(hasBitWidth(2)) 4110 matches 'int a;' and 'int c;' but not 'int b;'. 4111</pre></td></tr> 4112 4113 4114<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> 4115<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 4116 4117Given 4118 class C { 4119 int a : 2; 4120 int b; 4121 }; 4122fieldDecl(isBitField()) 4123 matches 'int a;' but not 'int b;'. 4124</pre></td></tr> 4125 4126 4127<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> 4128<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 4129 4130Given 4131 f('false, 3.14, 42); 4132characterLiteral(equals(0)) 4133 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4134 match false 4135floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4136 match 3.14 4137integerLiteral(equals(42)) 4138 matches 42 4139 4140Note that you cannot directly match a negative numeric literal because the 4141minus sign is not part of the literal: It is a unary operator whose operand 4142is the positive numeric literal. Instead, you must use a unaryOperator() 4143matcher to match the minus sign: 4144 4145unaryOperator(hasOperatorName("-"), 4146 hasUnaryOperand(integerLiteral(equals(13)))) 4147 4148Usable 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>>, 4149 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>> 4150</pre></td></tr> 4151 4152 4153<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> 4154<tr><td colspan="4" class="doc" id="equals12"><pre></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('hasAnyOverloadedOperatorName1')"><a name="hasAnyOverloadedOperatorName1Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 4158<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names. 4159 4160Matches overloaded operator names specified in strings without the 4161"operator" prefix: e.g. "<<". 4162 4163 hasAnyOverloadedOperatorName("+", "-") 4164Is equivalent to 4165 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 4166</pre></td></tr> 4167 4168 4169<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> 4170<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 4171 4172Given: 4173 void f(); 4174 void g() noexcept; 4175 void h() noexcept(true); 4176 void i() noexcept(false); 4177 void j() throw(); 4178 void k() throw(int); 4179 void l() throw(...); 4180functionDecl(hasDynamicExceptionSpec()) and 4181 functionProtoType(hasDynamicExceptionSpec()) 4182 match the declarations of j, k, and l, but not f, g, h, or i. 4183</pre></td></tr> 4184 4185 4186<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> 4187<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 4188 4189Matches overloaded operator names specified in strings without the 4190"operator" prefix: e.g. "<<". 4191 4192Given: 4193 class A { int operator*(); }; 4194 const A &operator<<(const A &a, const A &b); 4195 A a; 4196 a << a; // <-- This matches 4197 4198cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 4199specified line and 4200cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 4201matches the declaration of A. 4202 4203Usable 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>> 4204</pre></td></tr> 4205 4206 4207<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> 4208<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 4209 4210Example matches Y (matcher = functionDecl(hasTrailingReturn())) 4211int X() {} 4212auto Y() -> int {} 4213</pre></td></tr> 4214 4215 4216<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isConsteval0')"><a name="isConsteval0Anchor">isConsteval</a></td><td></td></tr> 4217<tr><td colspan="4" class="doc" id="isConsteval0"><pre>Matches consteval function declarations and if consteval/if ! consteval 4218statements. 4219 4220Given: 4221 consteval int a(); 4222 void b() { if consteval {} } 4223 void c() { if ! consteval {} } 4224 void d() { if ! consteval {} else {} } 4225functionDecl(isConsteval()) 4226 matches the declaration of "int a()". 4227ifStmt(isConsteval()) 4228 matches the if statement in "void b()", "void c()", "void d()". 4229</pre></td></tr> 4230 4231 4232<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> 4233<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations, 4234 and if constexpr. 4235 4236Given: 4237 constexpr int foo = 42; 4238 constexpr int bar(); 4239 void baz() { if constexpr(1 > 0) {} } 4240varDecl(isConstexpr()) 4241 matches the declaration of foo. 4242functionDecl(isConstexpr()) 4243 matches the declaration of bar. 4244ifStmt(isConstexpr()) 4245 matches the if statement in baz. 4246</pre></td></tr> 4247 4248 4249<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> 4250<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 4251 4252Given: 4253 class A { ~A(); }; 4254 class B { ~B() = default; }; 4255functionDecl(isDefaulted()) 4256 matches the declaration of ~B, but not ~A. 4257</pre></td></tr> 4258 4259 4260<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> 4261<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 4262 4263Example matches A, va, fa 4264 class A {}; 4265 class B; // Doesn't match, as it has no body. 4266 int va; 4267 extern int vb; // Doesn't match, as it doesn't define the variable. 4268 void fa() {} 4269 void fb(); // Doesn't match, as it has no body. 4270 @interface X 4271 - (void)ma; // Doesn't match, interface is declaration. 4272 @end 4273 @implementation X 4274 - (void)ma {} 4275 @end 4276 4277Usable 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>>, 4278 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4279</pre></td></tr> 4280 4281 4282<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> 4283<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 4284 4285Given: 4286 void Func(); 4287 void DeletedFunc() = delete; 4288functionDecl(isDeleted()) 4289 matches the declaration of DeletedFunc, but not Func. 4290</pre></td></tr> 4291 4292 4293<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> 4294<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 4295static member variable template instantiations. 4296 4297Given 4298 template<typename T> void A(T t) { } 4299 template<> void A(int N) { } 4300functionDecl(isExplicitTemplateSpecialization()) 4301 matches the specialization A<int>(). 4302 4303Usable 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>> 4304</pre></td></tr> 4305 4306 4307<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> 4308<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 4309 4310Given: 4311 extern "C" void f() {} 4312 extern "C" { void g() {} } 4313 void h() {} 4314 extern "C" int x = 1; 4315 extern "C" int y = 2; 4316 int z = 3; 4317functionDecl(isExternC()) 4318 matches the declaration of f and g, but not the declaration of h. 4319varDecl(isExternC()) 4320 matches the declaration of x and y, but not the declaration of z. 4321</pre></td></tr> 4322 4323 4324<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> 4325<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches functions, variables and namespace declarations that are marked with 4326the inline keyword. 4327 4328Given 4329 inline void f(); 4330 void g(); 4331 namespace n { 4332 inline namespace m {} 4333 } 4334 inline int Foo = 5; 4335functionDecl(isInline()) will match ::f(). 4336namespaceDecl(isInline()) will match n::m. 4337varDecl(isInline()) will match Foo; 4338</pre></td></tr> 4339 4340 4341<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> 4342<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point 4343into an executable program. 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('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr> 4348<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 4349 4350Given 4351 void nope(); 4352 [[noreturn]] void a(); 4353 __attribute__((noreturn)) void b(); 4354 struct c { [[noreturn]] c(); }; 4355functionDecl(isNoReturn()) 4356 matches all of those except 4357 void nope(); 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('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr> 4362<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 4363 4364Given: 4365 void f(); 4366 void g() noexcept; 4367 void h() throw(); 4368 void i() throw(int); 4369 void j() noexcept(false); 4370functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4371 match the declarations of g, and h, but not f, i or j. 4372</pre></td></tr> 4373 4374 4375<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> 4376<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage 4377class specifier ("static" keyword) written in the source. 4378 4379Given: 4380 static void f() {} 4381 static int i = 0; 4382 extern int j; 4383 int k; 4384functionDecl(isStaticStorageClass()) 4385 matches the function declaration f. 4386varDecl(isStaticStorageClass()) 4387 matches the variable declaration i. 4388</pre></td></tr> 4389 4390 4391<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> 4392<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 4393member variable template instantiations. 4394 4395Given 4396 template <typename T> class X {}; class A {}; X<A> x; 4397or 4398 template <typename T> class X {}; class A {}; template class X<A>; 4399or 4400 template <typename T> class X {}; class A {}; extern template class X<A>; 4401cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4402 matches the template instantiation of X<A>. 4403 4404But given 4405 template <typename T> class X {}; class A {}; 4406 template <> class X<A> {}; X<A> x; 4407cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4408 does not match, as X<A> is an explicit template specialization. 4409 4410Usable 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>> 4411</pre></td></tr> 4412 4413 4414<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> 4415<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 4416 4417Example matches f, but not g or h. The function i will not match, even when 4418compiled in C mode. 4419 void f(...); 4420 void g(int); 4421 template <typename... Ts> void h(Ts...); 4422 void i(); 4423</pre></td></tr> 4424 4425 4426<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> 4427<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations. 4428 4429Given: 4430 void foo() __attribute__((__weakref__("__foo"))); 4431 void bar(); 4432functionDecl(isWeak()) 4433 matches the weak declaration "foo", but not "bar". 4434</pre></td></tr> 4435 4436 4437<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> 4438<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4439specific parameter count. 4440 4441Given 4442 void f(int i) {} 4443 void g(int i, int j) {} 4444 void h(int i, int j); 4445 void j(int i); 4446 void k(int x, int y, int z, ...); 4447functionDecl(parameterCountIs(2)) 4448 matches g and h 4449functionProtoType(parameterCountIs(2)) 4450 matches g and h 4451functionProtoType(parameterCountIs(3)) 4452 matches k 4453</pre></td></tr> 4454 4455 4456<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> 4457<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 4458 4459Given: 4460 void f(); 4461 void g() noexcept; 4462 void h() noexcept(true); 4463 void i() noexcept(false); 4464 void j() throw(); 4465 void k() throw(int); 4466 void l() throw(...); 4467functionDecl(hasDynamicExceptionSpec()) and 4468 functionProtoType(hasDynamicExceptionSpec()) 4469 match the declarations of j, k, and l, but not f, g, h, or i. 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('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr> 4474<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 4475 4476Given: 4477 void f(); 4478 void g() noexcept; 4479 void h() throw(); 4480 void i() throw(int); 4481 void j() noexcept(false); 4482functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4483 match the declarations of g, and h, but not f, i or j. 4484</pre></td></tr> 4485 4486 4487<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> 4488<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4489specific parameter count. 4490 4491Given 4492 void f(int i) {} 4493 void g(int i, int j) {} 4494 void h(int i, int j); 4495 void j(int i); 4496 void k(int x, int y, int z, ...); 4497functionDecl(parameterCountIs(2)) 4498 matches g and h 4499functionProtoType(parameterCountIs(2)) 4500 matches g and h 4501functionProtoType(parameterCountIs(3)) 4502 matches k 4503</pre></td></tr> 4504 4505 4506<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('isConsteval1')"><a name="isConsteval1Anchor">isConsteval</a></td><td></td></tr> 4507<tr><td colspan="4" class="doc" id="isConsteval1"><pre>Matches consteval function declarations and if consteval/if ! consteval 4508statements. 4509 4510Given: 4511 consteval int a(); 4512 void b() { if consteval {} } 4513 void c() { if ! consteval {} } 4514 void d() { if ! consteval {} else {} } 4515functionDecl(isConsteval()) 4516 matches the declaration of "int a()". 4517ifStmt(isConsteval()) 4518 matches the if statement in "void b()", "void c()", "void d()". 4519</pre></td></tr> 4520 4521 4522<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> 4523<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations, 4524 and if constexpr. 4525 4526Given: 4527 constexpr int foo = 42; 4528 constexpr int bar(); 4529 void baz() { if constexpr(1 > 0) {} } 4530varDecl(isConstexpr()) 4531 matches the declaration of foo. 4532functionDecl(isConstexpr()) 4533 matches the declaration of bar. 4534ifStmt(isConstexpr()) 4535 matches the if statement in baz. 4536</pre></td></tr> 4537 4538 4539<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> 4540<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 4541 4542 4543<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> 4544<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 4545 4546Given 4547 f('false, 3.14, 42); 4548characterLiteral(equals(0)) 4549 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4550 match false 4551floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4552 match 3.14 4553integerLiteral(equals(42)) 4554 matches 42 4555 4556Note that you cannot directly match a negative numeric literal because the 4557minus sign is not part of the literal: It is a unary operator whose operand 4558is the positive numeric literal. Instead, you must use a unaryOperator() 4559matcher to match the minus sign: 4560 4561unaryOperator(hasOperatorName("-"), 4562 hasUnaryOperand(integerLiteral(equals(13)))) 4563 4564Usable 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>>, 4565 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>> 4566</pre></td></tr> 4567 4568 4569<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> 4570<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 4571 4572 4573<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> 4574<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 4575 4576 4577<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> 4578<tr><td colspan="4" class="doc" id="capturesThis0"><pre>Matches a `LambdaCapture` that refers to 'this'. 4579 4580Given 4581class C { 4582 int cc; 4583 int f() { 4584 auto l = [this]() { return cc; }; 4585 return l(); 4586 } 4587}; 4588lambdaExpr(hasAnyCapture(lambdaCapture(capturesThis()))) 4589 matches `[this]() { return cc; }`. 4590</pre></td></tr> 4591 4592 4593<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> 4594<tr><td colspan="4" class="doc" id="isImplicit2"><pre>Matches an entity that has been implicitly added by the compiler (e.g. 4595implicit default/copy constructors). 4596</pre></td></tr> 4597 4598 4599<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> 4600<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 4601to '.'. 4602 4603Member calls on the implicit this pointer match as called with '->'. 4604 4605Given 4606 class Y { 4607 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 4608 template <class T> void f() { this->f<T>(); f<T>(); } 4609 int a; 4610 static int b; 4611 }; 4612 template <class T> 4613 class Z { 4614 void x() { this->m; } 4615 }; 4616memberExpr(isArrow()) 4617 matches this->x, x, y.x, a, this->b 4618cxxDependentScopeMemberExpr(isArrow()) 4619 matches this->m 4620unresolvedMemberExpr(isArrow()) 4621 matches this->f<T>, f<T> 4622</pre></td></tr> 4623 4624 4625<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> 4626<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 4627 4628This matcher is only provided as a performance optimization of hasName. 4629 hasAnyName(a, b, c) 4630 is equivalent to, but faster than 4631 anyOf(hasName(a), hasName(b), hasName(c)) 4632</pre></td></tr> 4633 4634 4635<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> 4636<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 4637 4638Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 4639void f() { 4640 int x; 4641 static int y; 4642} 4643int z; 4644 4645Example matches f() because it has external formal linkage despite being 4646unique to the translation unit as though it has internal likage 4647(matcher = functionDecl(hasExternalFormalLinkage())) 4648 4649namespace { 4650void f() {} 4651} 4652</pre></td></tr> 4653 4654 4655<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> 4656<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 4657 4658Supports specifying enclosing namespaces or classes by prefixing the name 4659with '<enclosing>::'. 4660Does not match typedefs of an underlying type with the given name. 4661 4662Example matches X (Name == "X") 4663 class X; 4664 4665Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 4666 namespace a { namespace b { class X; } } 4667</pre></td></tr> 4668 4669 4670<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> 4671<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 4672a substring matched by the given RegExp. 4673 4674Supports specifying enclosing namespaces or classes by 4675prefixing the name with '<enclosing>::'. Does not match typedefs 4676of an underlying type with the given name. 4677 4678Example matches X (regexp == "::X") 4679 class X; 4680 4681Example matches X (regexp is one of "::X", "^foo::.*X", among others) 4682 namespace foo { namespace bar { class X; } } 4683 4684If the matcher is used in clang-query, RegexFlags parameter 4685should be passed as a quoted string. e.g: "NoFlags". 4686Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4687</pre></td></tr> 4688 4689 4690<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> 4691<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 4692 4693Given 4694 namespace n { 4695 namespace {} // #1 4696 } 4697namespaceDecl(isAnonymous()) will match #1 but not ::n. 4698</pre></td></tr> 4699 4700 4701<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> 4702<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches functions, variables and namespace declarations that are marked with 4703the inline keyword. 4704 4705Given 4706 inline void f(); 4707 void g(); 4708 namespace n { 4709 inline namespace m {} 4710 } 4711 inline int Foo = 5; 4712functionDecl(isInline()) will match ::f(). 4713namespaceDecl(isInline()) will match n::m. 4714varDecl(isInline()) will match Foo; 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('isFirstPrivateKind0')"><a name="isFirstPrivateKind0Anchor">isFirstPrivateKind</a></td><td></td></tr> 4719<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind 4720specified. 4721 4722Given 4723 4724 #pragma omp parallel 4725 #pragma omp parallel default(none) 4726 #pragma omp parallel default(shared) 4727 #pragma omp parallel default(firstprivate) 4728 4729``ompDefaultClause(isFirstPrivateKind())`` matches only 4730``default(firstprivate)``. 4731</pre></td></tr> 4732 4733 4734<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> 4735<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified. 4736 4737Given 4738 4739 #pragma omp parallel 4740 #pragma omp parallel default(none) 4741 #pragma omp parallel default(shared) 4742 #pragma omp parallel default(firstprivate) 4743 4744``ompDefaultClause(isNoneKind())`` matches only ``default(none)``. 4745</pre></td></tr> 4746 4747 4748<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> 4749<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified. 4750 4751Given 4752 4753 #pragma omp parallel 4754 #pragma omp parallel default(none) 4755 #pragma omp parallel default(shared) 4756 #pragma omp parallel default(firstprivate) 4757 4758``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``. 4759</pre></td></tr> 4760 4761 4762<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> 4763<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP 4764clause kind. 4765 4766Given 4767 4768 #pragma omp parallel 4769 #pragma omp parallel for 4770 #pragma omp for 4771 4772`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches 4773``omp parallel`` and ``omp parallel for``. 4774 4775If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter 4776should be passed as a quoted string. e.g., 4777``isAllowedToContainClauseKind("OMPC_default").`` 4778</pre></td></tr> 4779 4780 4781<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> 4782<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives, 4783i.e., directives that can't have a structured block. 4784 4785Given 4786 4787 #pragma omp parallel 4788 {} 4789 #pragma omp taskyield 4790 4791``ompExecutableDirective(isStandaloneDirective()))`` matches 4792``omp taskyield``. 4793</pre></td></tr> 4794 4795 4796<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> 4797<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 4798</pre></td></tr> 4799 4800 4801<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> 4802<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 4803</pre></td></tr> 4804 4805 4806<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> 4807<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for 4808isSameOrDerivedFrom(hasName(...)). 4809</pre></td></tr> 4810 4811 4812<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> 4813<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has 4814a specific number of arguments (including absent default arguments). 4815 4816Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 4817 void f(int x, int y); 4818 f(0, 0); 4819</pre></td></tr> 4820 4821 4822<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> 4823<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 4824Selector.getAsString() 4825 4826 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 4827 matches both of the expressions below: 4828 [myObj methodA:argA]; 4829 [myObj methodB:argB]; 4830</pre></td></tr> 4831 4832 4833<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> 4834<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 4835 4836objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 4837message expression in 4838 4839 UIWebView *webView = ...; 4840 CGRect bodyFrame = webView.frame; 4841 bodyFrame.size.height = self.bodyContentHeight; 4842 webView.frame = bodyFrame; 4843 // ^---- matches here 4844</pre></td></tr> 4845 4846 4847<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> 4848<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 4849 4850Matches only when the selector of the objCMessageExpr is NULL. This may 4851represent an error condition in the tree! 4852</pre></td></tr> 4853 4854 4855<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> 4856<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 4857 4858 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 4859 matches the outer message expr in the code below, but NOT the message 4860 invocation for self.bodyView. 4861 [self.bodyView loadHTMLString:html baseURL:NULL]; 4862</pre></td></tr> 4863 4864 4865<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> 4866<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 4867 4868 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 4869 matches self.bodyView in the code below, but NOT the outer message 4870 invocation of "loadHTMLString:baseURL:". 4871 [self.bodyView loadHTMLString:html baseURL:NULL]; 4872</pre></td></tr> 4873 4874 4875<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> 4876<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class. 4877 4878Example 4879matcher = objcMessageExpr(isClassMessage()) 4880matches 4881 [NSString stringWithFormat:@"format"]; 4882but not 4883 NSString *x = @"hello"; 4884 [x containsString:@"h"]; 4885</pre></td></tr> 4886 4887 4888<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> 4889<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance. 4890 4891Example 4892matcher = objcMessageExpr(isInstanceMessage()) 4893matches 4894 NSString *x = @"hello"; 4895 [x containsString:@"h"]; 4896but not 4897 [NSString stringWithFormat:@"format"]; 4898</pre></td></tr> 4899 4900 4901<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> 4902<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 4903a substring matched by the given RegExp. 4904 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 4905 invocation for self.bodyView. 4906 [self.bodyView loadHTMLString:html baseURL:NULL]; 4907 4908If the matcher is used in clang-query, RegexFlags parameter 4909should be passed as a quoted string. e.g: "NoFlags". 4910Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4911</pre></td></tr> 4912 4913 4914<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> 4915<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 4916 4917 matcher = objCMessageExpr(numSelectorArgs(0)); 4918 matches self.bodyView in the code below 4919 4920 matcher = objCMessageExpr(numSelectorArgs(2)); 4921 matches the invocation of "loadHTMLString:baseURL:" but not that 4922 of self.bodyView 4923 [self.bodyView loadHTMLString:html baseURL:NULL]; 4924</pre></td></tr> 4925 4926 4927<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> 4928<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method. 4929 4930Example 4931matcher = objcMethodDecl(isClassMethod()) 4932matches 4933@interface I + (void)foo; @end 4934but not 4935@interface I - (void)bar; @end 4936</pre></td></tr> 4937 4938 4939<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> 4940<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 4941 4942Example matches A, va, fa 4943 class A {}; 4944 class B; // Doesn't match, as it has no body. 4945 int va; 4946 extern int vb; // Doesn't match, as it doesn't define the variable. 4947 void fa() {} 4948 void fb(); // Doesn't match, as it has no body. 4949 @interface X 4950 - (void)ma; // Doesn't match, interface is declaration. 4951 @end 4952 @implementation X 4953 - (void)ma {} 4954 @end 4955 4956Usable 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>>, 4957 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4958</pre></td></tr> 4959 4960 4961<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> 4962<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method. 4963 4964Example 4965matcher = objcMethodDecl(isInstanceMethod()) 4966matches 4967@interface I - (void)bar; @end 4968but not 4969@interface I + (void)foo; @end 4970</pre></td></tr> 4971 4972 4973<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> 4974<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 4975 4976Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 4977void x(int val) {} 4978void y(int val = 0) {} 4979 4980Deprecated. Use hasInitializer() instead to be able to 4981match on the contents of the default argument. For example: 4982 4983void x(int val = 7) {} 4984void y(int val = 42) {} 4985parmVarDecl(hasInitializer(integerLiteral(equals(42)))) 4986 matches the parameter of y 4987 4988A matcher such as 4989 parmVarDecl(hasInitializer(anything())) 4990is equivalent to parmVarDecl(hasDefaultArgument()). 4991</pre></td></tr> 4992 4993 4994<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> 4995<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter 4996list. The parameter list could be that of either a block, function, or 4997objc-method. 4998 4999 5000Given 5001 5002void f(int a, int b, int c) { 5003} 5004 5005``parmVarDecl(isAtPosition(0))`` matches ``int a``. 5006 5007``parmVarDecl(isAtPosition(1))`` matches ``int b``. 5008</pre></td></tr> 5009 5010 5011<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> 5012<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 5013 5014Given 5015 class Y { public: void x(); }; 5016 void z() { Y* y; y->x(); } 5017cxxMemberCallExpr(on(hasType(asString("class Y *")))) 5018 matches y->x() 5019</pre></td></tr> 5020 5021 5022<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> 5023<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 5024 5025Matches a node if it equals the node previously bound to ID. 5026 5027Given 5028 class X { int a; int b; }; 5029cxxRecordDecl( 5030 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5031 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5032 matches the class X, as a and b have the same type. 5033 5034Note that when multiple matches are involved via forEach* matchers, 5035equalsBoundNodes acts as a filter. 5036For example: 5037compoundStmt( 5038 forEachDescendant(varDecl().bind("d")), 5039 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5040will trigger a match for each combination of variable declaration 5041and reference to that variable declaration within a compound statement. 5042</pre></td></tr> 5043 5044 5045<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> 5046<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 5047the node, not hidden within a typedef. 5048 5049Given 5050 typedef const int const_int; 5051 const_int i; 5052 int *const j; 5053 int *volatile k; 5054 int m; 5055varDecl(hasType(hasLocalQualifiers())) matches only j and k. 5056i is const-qualified but the qualifier is not local. 5057</pre></td></tr> 5058 5059 5060<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> 5061<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 5062 5063Given 5064 void a(char); 5065 void b(wchar_t); 5066 void c(double); 5067functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 5068matches "a(char)", "b(wchar_t)", but not "c(double)". 5069</pre></td></tr> 5070 5071 5072<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> 5073<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 5074the Objective-C object pointer type, which is different despite being 5075syntactically similar. 5076 5077Given 5078 int *i = nullptr; 5079 5080 @interface Foo 5081 @end 5082 Foo *f; 5083 5084 int j; 5085varDecl(hasType(isAnyPointer())) 5086 matches "int *i" and "Foo *f", but not "int j". 5087</pre></td></tr> 5088 5089 5090<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> 5091<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 5092include "top-level" const. 5093 5094Given 5095 void a(int); 5096 void b(int const); 5097 void c(const int); 5098 void d(const int*); 5099 void e(int const) {}; 5100functionDecl(hasAnyParameter(hasType(isConstQualified()))) 5101 matches "void b(int const)", "void c(const int)" and 5102 "void e(int const) {}". It does not match d as there 5103 is no top-level const on the parameter type "const int *". 5104</pre></td></tr> 5105 5106 5107<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> 5108<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 5109 5110Given 5111 void a(int); 5112 void b(long); 5113 void c(double); 5114functionDecl(hasAnyParameter(hasType(isInteger()))) 5115matches "a(int)", "b(long)", but not "c(double)". 5116</pre></td></tr> 5117 5118 5119<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> 5120<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 5121 5122Given 5123 void a(int); 5124 void b(unsigned long); 5125 void c(double); 5126functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 5127matches "a(int)", but not "b(unsigned long)" and "c(double)". 5128</pre></td></tr> 5129 5130 5131<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> 5132<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 5133 5134Given 5135 void a(int); 5136 void b(unsigned long); 5137 void c(double); 5138functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 5139matches "b(unsigned long)", but not "a(int)" and "c(double)". 5140</pre></td></tr> 5141 5142 5143<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> 5144<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 5145include "top-level" volatile. 5146 5147Given 5148 void a(int); 5149 void b(int volatile); 5150 void c(volatile int); 5151 void d(volatile int*); 5152 void e(int volatile) {}; 5153functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 5154 matches "void b(int volatile)", "void c(volatile int)" and 5155 "void e(int volatile) {}". It does not match d as there 5156 is no top-level volatile on the parameter type "volatile int *". 5157</pre></td></tr> 5158 5159 5160<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> 5161<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 5162 5163Matches a node if it equals the node previously bound to ID. 5164 5165Given 5166 class X { int a; int b; }; 5167cxxRecordDecl( 5168 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5169 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5170 matches the class X, as a and b have the same type. 5171 5172Note that when multiple matches are involved via forEach* matchers, 5173equalsBoundNodes acts as a filter. 5174For example: 5175compoundStmt( 5176 forEachDescendant(varDecl().bind("d")), 5177 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5178will trigger a match for each combination of variable declaration 5179and reference to that variable declaration within a compound statement. 5180</pre></td></tr> 5181 5182 5183<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> 5184<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 5185 5186Stmt has pointer identity in the AST. 5187</pre></td></tr> 5188 5189 5190<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> 5191<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro. 5192Does not match if only part of the statement is expanded from that macro or 5193if different parts of the statement are expanded from different 5194appearances of the macro. 5195</pre></td></tr> 5196 5197 5198<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> 5199<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 5200partially matching a given regex. 5201 5202Example matches Y but not X 5203 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5204 #include "ASTMatcher.h" 5205 class X {}; 5206ASTMatcher.h: 5207 class Y {}; 5208 5209Usable 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>> 5210 5211If the matcher is used in clang-query, RegexFlags parameter 5212should be passed as a quoted string. e.g: "NoFlags". 5213Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5214</pre></td></tr> 5215 5216 5217<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> 5218<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 5219 5220Example matches X but not Y 5221 (matcher = cxxRecordDecl(isExpansionInMainFile()) 5222 #include <Y.h> 5223 class X {}; 5224Y.h: 5225 class Y {}; 5226 5227Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5228</pre></td></tr> 5229 5230 5231<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> 5232<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 5233 5234Example matches Y but not X 5235 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5236 #include <SystemHeader.h> 5237 class X {}; 5238SystemHeader.h: 5239 class Y {}; 5240 5241Usable 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>> 5242</pre></td></tr> 5243 5244 5245<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> 5246<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 5247 5248Given 5249 int j; 5250 template<typename T> void A(T t) { T i; j += 42;} 5251 A(0); 5252 A(0U); 5253declStmt(isInTemplateInstantiation()) 5254 matches 'int i;' and 'unsigned i'. 5255unless(stmt(isInTemplateInstantiation())) 5256 will NOT match j += 42; as it's shared between the template definition and 5257 instantiation. 5258</pre></td></tr> 5259 5260 5261<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> 5262<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 5263 5264Given 5265 int a[42]; 5266 int b[2 * 21]; 5267 int c[41], d[43]; 5268 char *s = "abcd"; 5269 wchar_t *ws = L"abcd"; 5270 char *w = "a"; 5271constantArrayType(hasSize(42)) 5272 matches "int a[42]" and "int b[2 * 21]" 5273stringLiteral(hasSize(4)) 5274 matches "abcd", L"abcd" 5275</pre></td></tr> 5276 5277 5278<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> 5279<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class." 5280 5281Example matches C, but not S, U or E. 5282 struct S {}; 5283 class C {}; 5284 union U {}; 5285 enum E {}; 5286</pre></td></tr> 5287 5288 5289<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> 5290<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 5291 5292Example matches A, va, fa 5293 class A {}; 5294 class B; // Doesn't match, as it has no body. 5295 int va; 5296 extern int vb; // Doesn't match, as it doesn't define the variable. 5297 void fa() {} 5298 void fb(); // Doesn't match, as it has no body. 5299 @interface X 5300 - (void)ma; // Doesn't match, interface is declaration. 5301 @end 5302 @implementation X 5303 - (void)ma {} 5304 @end 5305 5306Usable 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>>, 5307 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5308</pre></td></tr> 5309 5310 5311<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> 5312<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum." 5313 5314Example matches E, but not C, S or U. 5315 struct S {}; 5316 class C {}; 5317 union U {}; 5318 enum E {}; 5319</pre></td></tr> 5320 5321 5322<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> 5323<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct." 5324 5325Example matches S, but not C, U or E. 5326 struct S {}; 5327 class C {}; 5328 union U {}; 5329 enum E {}; 5330</pre></td></tr> 5331 5332 5333<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> 5334<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union." 5335 5336Example matches U, but not C, S or E. 5337 struct S {}; 5338 class C {}; 5339 union U {}; 5340 enum E {}; 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('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr> 5345<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 5346 5347Note that 'Value' is a string as the template argument's value is 5348an arbitrary precision integer. 'Value' must be euqal to the canonical 5349representation of that integral value in base 10. 5350 5351Given 5352 template<int T> struct C {}; 5353 C<42> c; 5354classTemplateSpecializationDecl( 5355 hasAnyTemplateArgument(equalsIntegralValue("42"))) 5356 matches the implicit instantiation of C in C<42>. 5357</pre></td></tr> 5358 5359 5360<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> 5361<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 5362 5363Given 5364 template<int T> struct C {}; 5365 C<42> c; 5366classTemplateSpecializationDecl( 5367 hasAnyTemplateArgument(isIntegral())) 5368 matches the implicit instantiation of C in C<42> 5369 with isIntegral() matching 42. 5370</pre></td></tr> 5371 5372 5373<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> 5374<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 5375 5376Given 5377 template<typename T> struct C {}; 5378 C<int> c; 5379classTemplateSpecializationDecl(templateArgumentCountIs(1)) 5380 matches C<int>. 5381</pre></td></tr> 5382 5383 5384<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> 5385<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro. 5386Does not match if only part of the statement is expanded from that macro or 5387if different parts of the statement are expanded from different 5388appearances of the macro. 5389</pre></td></tr> 5390 5391 5392<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> 5393<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 5394partially matching a given regex. 5395 5396Example matches Y but not X 5397 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5398 #include "ASTMatcher.h" 5399 class X {}; 5400ASTMatcher.h: 5401 class Y {}; 5402 5403Usable 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>> 5404 5405If the matcher is used in clang-query, RegexFlags parameter 5406should be passed as a quoted string. e.g: "NoFlags". 5407Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5408</pre></td></tr> 5409 5410 5411<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> 5412<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 5413 5414Example matches X but not Y 5415 (matcher = cxxRecordDecl(isExpansionInMainFile()) 5416 #include <Y.h> 5417 class X {}; 5418Y.h: 5419 class Y {}; 5420 5421Usable 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>> 5422</pre></td></tr> 5423 5424 5425<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> 5426<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 5427 5428Example matches Y but not X 5429 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5430 #include <SystemHeader.h> 5431 class X {}; 5432SystemHeader.h: 5433 class Y {}; 5434 5435Usable 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>> 5436</pre></td></tr> 5437 5438 5439<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> 5440<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 5441 5442Given 5443 struct S { bool func(); }; 5444functionDecl(returns(booleanType())) 5445 matches "bool func();" 5446</pre></td></tr> 5447 5448 5449<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> 5450<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 5451 5452Matches a node if it equals the node previously bound to ID. 5453 5454Given 5455 class X { int a; int b; }; 5456cxxRecordDecl( 5457 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5458 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5459 matches the class X, as a and b have the same type. 5460 5461Note that when multiple matches are involved via forEach* matchers, 5462equalsBoundNodes acts as a filter. 5463For example: 5464compoundStmt( 5465 forEachDescendant(varDecl().bind("d")), 5466 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5467will trigger a match for each combination of variable declaration 5468and reference to that variable declaration within a compound statement. 5469</pre></td></tr> 5470 5471 5472<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> 5473<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 5474 5475Type has pointer identity in the AST. 5476</pre></td></tr> 5477 5478 5479<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> 5480<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 5481 5482Given 5483 int i; 5484 float f; 5485realFloatingPointType() 5486 matches "float f" but not "int i" 5487</pre></td></tr> 5488 5489 5490<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> 5491<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 5492 5493Given 5494 struct S { void func(); }; 5495functionDecl(returns(voidType())) 5496 matches "void func();" 5497</pre></td></tr> 5498 5499 5500<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> 5501<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 5502 5503Given 5504 int x; 5505 int s = sizeof(x) + alignof(x) 5506unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 5507 matches sizeof(x) 5508 5509If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter 5510should be passed as a quoted string. e.g., ofKind("UETT_SizeOf"). 5511</pre></td></tr> 5512 5513 5514<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> 5515<tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the 5516specified names. 5517 5518 hasAnyOperatorName("+", "-") 5519 Is equivalent to 5520 anyOf(hasOperatorName("+"), hasOperatorName("-")) 5521</pre></td></tr> 5522 5523 5524<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> 5525<tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or 5526unary). 5527 5528Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 5529 !(a || b) 5530</pre></td></tr> 5531 5532 5533<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> 5534<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed 5535to '.'. 5536 5537Member calls on the implicit this pointer match as called with '->'. 5538 5539Given 5540 class Y { 5541 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 5542 template <class T> void f() { this->f<T>(); f<T>(); } 5543 int a; 5544 static int b; 5545 }; 5546 template <class T> 5547 class Z { 5548 void x() { this->m; } 5549 }; 5550memberExpr(isArrow()) 5551 matches this->x, x, y.x, a, this->b 5552cxxDependentScopeMemberExpr(isArrow()) 5553 matches this->m 5554unresolvedMemberExpr(isArrow()) 5555 matches this->f<T>, f<T> 5556</pre></td></tr> 5557 5558 5559<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> 5560<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 5561 5562Example matches x, but not y, z, or a. 5563(matcher = varDecl(hasAutomaticStorageDuration()) 5564void f() { 5565 int x; 5566 static int y; 5567 thread_local int z; 5568} 5569int a; 5570</pre></td></tr> 5571 5572 5573<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> 5574<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 5575 5576Example matches y and z (matcher = varDecl(hasGlobalStorage()) 5577void f() { 5578 int x; 5579 static int y; 5580} 5581int z; 5582</pre></td></tr> 5583 5584 5585<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> 5586<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 5587non-static local variable. 5588 5589Example matches x (matcher = varDecl(hasLocalStorage()) 5590void f() { 5591 int x; 5592 static int y; 5593} 5594int z; 5595</pre></td></tr> 5596 5597 5598<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> 5599<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 5600It includes the variable declared at namespace scope and those declared 5601with "static" and "extern" storage class specifiers. 5602 5603void f() { 5604 int x; 5605 static int y; 5606 thread_local int z; 5607} 5608int a; 5609static int b; 5610extern int c; 5611varDecl(hasStaticStorageDuration()) 5612 matches the function declaration y, a, b and c. 5613</pre></td></tr> 5614 5615 5616<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> 5617<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 5618 5619Example matches z, but not x, z, or a. 5620(matcher = varDecl(hasThreadStorageDuration()) 5621void f() { 5622 int x; 5623 static int y; 5624 thread_local int z; 5625} 5626int a; 5627</pre></td></tr> 5628 5629 5630<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> 5631<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations, 5632 and if constexpr. 5633 5634Given: 5635 constexpr int foo = 42; 5636 constexpr int bar(); 5637 void baz() { if constexpr(1 > 0) {} } 5638varDecl(isConstexpr()) 5639 matches the declaration of foo. 5640functionDecl(isConstexpr()) 5641 matches the declaration of bar. 5642ifStmt(isConstexpr()) 5643 matches the if statement in baz. 5644</pre></td></tr> 5645 5646 5647<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> 5648<tr><td colspan="4" class="doc" id="isConstinit0"><pre>Matches constinit variable declarations. 5649 5650Given: 5651 constinit int foo = 42; 5652 constinit const char* bar = "bar"; 5653 int baz = 42; 5654 [[clang::require_constant_initialization]] int xyz = 42; 5655varDecl(isConstinit()) 5656 matches the declaration of `foo` and `bar`, but not `baz` and `xyz`. 5657</pre></td></tr> 5658 5659 5660<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> 5661<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 5662 5663Example matches A, va, fa 5664 class A {}; 5665 class B; // Doesn't match, as it has no body. 5666 int va; 5667 extern int vb; // Doesn't match, as it doesn't define the variable. 5668 void fa() {} 5669 void fb(); // Doesn't match, as it has no body. 5670 @interface X 5671 - (void)ma; // Doesn't match, interface is declaration. 5672 @end 5673 @implementation X 5674 - (void)ma {} 5675 @end 5676 5677Usable 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>>, 5678 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5679</pre></td></tr> 5680 5681 5682<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> 5683<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 5684a C++ catch block, or an Objective-C statement. 5685 5686Example matches x (matcher = varDecl(isExceptionVariable()) 5687void f(int y) { 5688 try { 5689 } catch (int x) { 5690 } 5691} 5692</pre></td></tr> 5693 5694 5695<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> 5696<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 5697static member variable template instantiations. 5698 5699Given 5700 template<typename T> void A(T t) { } 5701 template<> void A(int N) { } 5702functionDecl(isExplicitTemplateSpecialization()) 5703 matches the specialization A<int>(). 5704 5705Usable 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>> 5706</pre></td></tr> 5707 5708 5709<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> 5710<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 5711 5712Given: 5713 extern "C" void f() {} 5714 extern "C" { void g() {} } 5715 void h() {} 5716 extern "C" int x = 1; 5717 extern "C" int y = 2; 5718 int z = 3; 5719functionDecl(isExternC()) 5720 matches the declaration of f and g, but not the declaration of h. 5721varDecl(isExternC()) 5722 matches the declaration of x and y, but not the declaration of z. 5723</pre></td></tr> 5724 5725 5726<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> 5727<tr><td colspan="4" class="doc" id="isInitCapture0"><pre>Matches a variable serving as the implicit variable for a lambda init- 5728capture. 5729 5730Example matches x (matcher = varDecl(isInitCapture())) 5731auto f = [x=3]() { return x; }; 5732</pre></td></tr> 5733 5734 5735<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isInline2')"><a name="isInline2Anchor">isInline</a></td><td></td></tr> 5736<tr><td colspan="4" class="doc" id="isInline2"><pre>Matches functions, variables and namespace declarations that are marked with 5737the inline keyword. 5738 5739Given 5740 inline void f(); 5741 void g(); 5742 namespace n { 5743 inline namespace m {} 5744 } 5745 inline int Foo = 5; 5746functionDecl(isInline()) will match ::f(). 5747namespaceDecl(isInline()) will match n::m. 5748varDecl(isInline()) will match Foo; 5749</pre></td></tr> 5750 5751 5752<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> 5753<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope. 5754 5755Example matches y (matcher = varDecl(isStaticLocal())) 5756void f() { 5757 int x; 5758 static int y; 5759} 5760static int z; 5761</pre></td></tr> 5762 5763 5764<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> 5765<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage 5766class specifier ("static" keyword) written in the source. 5767 5768Given: 5769 static void f() {} 5770 static int i = 0; 5771 extern int j; 5772 int k; 5773functionDecl(isStaticStorageClass()) 5774 matches the function declaration f. 5775varDecl(isStaticStorageClass()) 5776 matches the variable declaration i. 5777</pre></td></tr> 5778 5779 5780<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> 5781<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 5782member variable template instantiations. 5783 5784Given 5785 template <typename T> class X {}; class A {}; X<A> x; 5786or 5787 template <typename T> class X {}; class A {}; template class X<A>; 5788or 5789 template <typename T> class X {}; class A {}; extern template class X<A>; 5790cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5791 matches the template instantiation of X<A>. 5792 5793But given 5794 template <typename T> class X {}; class A {}; 5795 template <> class X<A> {}; X<A> x; 5796cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5797 does not match, as X<A> is an explicit template specialization. 5798 5799Usable 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>> 5800</pre></td></tr> 5801 5802<!--END_NARROWING_MATCHERS --> 5803</table> 5804 5805<!-- ======================================================================= --> 5806<h2 id="traversal-matchers">AST Traversal Matchers</h2> 5807<!-- ======================================================================= --> 5808 5809<p>Traversal matchers specify the relationship to other nodes that are 5810reachable from the current node.</p> 5811 5812<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 5813forEachDescendant) which work on all nodes and allow users to write more generic 5814match expressions.</p> 5815 5816<table> 5817<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 5818<!-- START_TRAVERSAL_MATCHERS --> 5819 5820<tr><td>Matcher<*></td><td class="name" onclick="toggle('binaryOperation0')"><a name="binaryOperation0Anchor">binaryOperation</a></td><td>Matcher<*>...Matcher<*></td></tr> 5821<tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators. 5822 5823The code 5824 var1 != var2; 5825might be represented in the clang AST as a binaryOperator, a 5826cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on 5827 5828* whether the types of var1 and var2 are fundamental (binaryOperator) or at 5829 least one is a class type (cxxOperatorCallExpr) 5830* whether the code appears in a template declaration, if at least one of the 5831 vars is a dependent-type (binaryOperator) 5832* whether the code relies on a rewritten binary operator, such as a 5833spaceship operator or an inverted equality operator 5834(cxxRewrittenBinaryOperator) 5835 5836This matcher elides details in places where the matchers for the nodes are 5837compatible. 5838 5839Given 5840 binaryOperation( 5841 hasOperatorName("!="), 5842 hasLHS(expr().bind("lhs")), 5843 hasRHS(expr().bind("rhs")) 5844 ) 5845matches each use of "!=" in: 5846 struct S{ 5847 bool operator!=(const S&) const; 5848 }; 5849 5850 void foo() 5851 { 5852 1 != 2; 5853 S() != S(); 5854 } 5855 5856 template<typename T> 5857 void templ() 5858 { 5859 1 != 2; 5860 T() != S(); 5861 } 5862 struct HasOpEq 5863 { 5864 bool operator==(const HasOpEq &) const; 5865 }; 5866 5867 void inverse() 5868 { 5869 HasOpEq s1; 5870 HasOpEq s2; 5871 if (s1 != s2) 5872 return; 5873 } 5874 5875 struct HasSpaceship 5876 { 5877 bool operator<=>(const HasOpEq &) const; 5878 }; 5879 5880 void use_spaceship() 5881 { 5882 HasSpaceship s1; 5883 HasSpaceship s2; 5884 if (s1 != s2) 5885 return; 5886 } 5887</pre></td></tr> 5888 5889 5890<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 5891<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 5892 5893Unlike anyOf, eachOf will generate a match result for each 5894matching submatcher. 5895 5896For example, in: 5897 class A { int a; int b; }; 5898The matcher: 5899 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 5900 has(fieldDecl(hasName("b")).bind("v")))) 5901will generate two results binding "v", the first of which binds 5902the field declaration of a, the second the field declaration of 5903b. 5904 5905Usable as: Any Matcher 5906</pre></td></tr> 5907 5908 5909<tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr> 5910<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 5911 5912Generates results for each match. 5913 5914For example, in: 5915 class A { class B {}; class C {}; }; 5916The matcher: 5917 cxxRecordDecl(hasName("::A"), 5918 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 5919will generate results for A, B and C. 5920 5921Usable as: Any Matcher 5922</pre></td></tr> 5923 5924 5925<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 5926<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5927provided matcher. 5928 5929Example matches X, A, A::X, B, B::C, B::C::X 5930 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 5931 class X {}; 5932 class A { class X {}; }; // Matches A, because A::X is a class of name 5933 // X inside A. 5934 class B { class C { class X {}; }; }; 5935 5936DescendantT must be an AST base type. 5937 5938As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 5939each result that matches instead of only on the first one. 5940 5941Note: Recursively combined ForEachDescendant can cause many matches: 5942 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 5943 forEachDescendant(cxxRecordDecl()) 5944 ))) 5945will match 10 times (plus injected class name matches) on: 5946 class A { class B { class C { class D { class E {}; }; }; }; }; 5947 5948Usable as: Any Matcher 5949</pre></td></tr> 5950 5951 5952<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 5953<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 5954provided matcher. 5955 5956Example matches X, Y, Y::X, Z::Y, Z::Y::X 5957 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 5958 class X {}; 5959 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X 5960 // inside Y. 5961 class Z { class Y { class X {}; }; }; // Does not match Z. 5962 5963ChildT must be an AST base type. 5964 5965As opposed to 'has', 'forEach' will cause a match for each result that 5966matches instead of only on the first one. 5967 5968Usable as: Any Matcher 5969</pre></td></tr> 5970 5971 5972<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 5973<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 5974matcher. 5975 5976Given 5977void f() { if (true) { int x = 42; } } 5978void g() { for (;;) { int x = 43; } } 5979expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 5980 5981Usable as: Any Matcher 5982</pre></td></tr> 5983 5984 5985<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 5986<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5987provided matcher. 5988 5989Example matches X, Y, Z 5990 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 5991 class X {}; // Matches X, because X::X is a class of name X inside X. 5992 class Y { class X {}; }; 5993 class Z { class Y { class X {}; }; }; 5994 5995DescendantT must be an AST base type. 5996 5997Usable as: Any Matcher 5998</pre></td></tr> 5999 6000 6001<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 6002<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 6003provided matcher. 6004 6005Example matches X, Y 6006 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 6007 class X {}; // Matches X, because X::X is a class of name X inside X. 6008 class Y { class X {}; }; 6009 class Z { class Y { class X {}; }; }; // Does not match Z. 6010 6011ChildT must be an AST base type. 6012 6013Usable as: Any Matcher 6014Note that has is direct matcher, so it also matches things like implicit 6015casts and paren casts. If you are matching with expr then you should 6016probably consider using ignoringParenImpCasts like: 6017has(ignoringParenImpCasts(expr())). 6018</pre></td></tr> 6019 6020 6021<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 6022<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 6023matcher. 6024 6025Given 6026void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 6027compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 6028 6029Usable as: Any Matcher 6030</pre></td></tr> 6031 6032 6033<tr><td>Matcher<*></td><td class="name" onclick="toggle('invocation0')"><a name="invocation0Anchor">invocation</a></td><td>Matcher<*>...Matcher<*></td></tr> 6034<tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls 6035 6036Because CallExpr and CXXConstructExpr do not share a common 6037base class with API accessing arguments etc, AST Matchers for code 6038which should match both are typically duplicated. This matcher 6039removes the need for duplication. 6040 6041Given code 6042struct ConstructorTakesInt 6043{ 6044 ConstructorTakesInt(int i) {} 6045}; 6046 6047void callTakesInt(int i) 6048{ 6049} 6050 6051void doCall() 6052{ 6053 callTakesInt(42); 6054} 6055 6056void doConstruct() 6057{ 6058 ConstructorTakesInt cti(42); 6059} 6060 6061The matcher 6062invocation(hasArgument(0, integerLiteral(equals(42)))) 6063matches the expression in both doCall and doConstruct 6064</pre></td></tr> 6065 6066 6067<tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr> 6068<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher. 6069 6070However, optionally will retain any bindings generated by the submatcher. 6071Useful when additional information which may or may not present about a main 6072matching node is desired. 6073 6074For example, in: 6075 class Foo { 6076 int bar; 6077 } 6078The matcher: 6079 cxxRecordDecl( 6080 optionally(has( 6081 fieldDecl(hasName("bar")).bind("var") 6082 ))).bind("record") 6083will produce a result binding for both "record" and "var". 6084The matcher will produce a "record" binding for even if there is no data 6085member named "bar" in that class. 6086 6087Usable as: Any Matcher 6088</pre></td></tr> 6089 6090 6091<tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr> 6092<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind. 6093 6094Given 6095 void foo() 6096 { 6097 int i = 3.0; 6098 } 6099The matcher 6100 traverse(TK_IgnoreUnlessSpelledInSource, 6101 varDecl(hasInitializer(floatLiteral().bind("init"))) 6102 ) 6103matches the variable declaration with "init" bound to the "3.0". 6104</pre></td></tr> 6105 6106 6107<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> 6108<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 6109switch statement or conditional operator. 6110 6111Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 6112 if (true) {} 6113</pre></td></tr> 6114 6115 6116<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> 6117<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 6118(binary or ternary). 6119 6120Example matches b 6121 condition ? a : b 6122 condition ?: b 6123</pre></td></tr> 6124 6125 6126<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> 6127<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 6128 6129Example 1 (conditional ternary operator): matches a 6130 condition ? a : b 6131 6132Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 6133 condition ?: b 6134</pre></td></tr> 6135 6136 6137<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> 6138<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 6139matches the given matcher. 6140 6141The associated declaration is: 6142- for type nodes, the declaration of the underlying type 6143- for CallExpr, the declaration of the callee 6144- for MemberExpr, the declaration of the referenced member 6145- for CXXConstructExpr, the declaration of the constructor 6146- for CXXNewExpr, the declaration of the operator new 6147- for ObjCIvarExpr, the declaration of the ivar 6148 6149For type nodes, hasDeclaration will generally match the declaration of the 6150sugared type. Given 6151 class X {}; 6152 typedef X Y; 6153 Y y; 6154in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6155typedefDecl. A common use case is to match the underlying, desugared type. 6156This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6157 varDecl(hasType(hasUnqualifiedDesugaredType( 6158 recordType(hasDeclaration(decl()))))) 6159In this matcher, the decl will match the CXXRecordDecl of class X. 6160 6161Usable 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>>, 6162 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>>, 6163 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>>, 6164 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>>, 6165 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>>, 6166 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>>, 6167 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6168</pre></td></tr> 6169 6170 6171<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> 6172<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 6173 6174Given 6175 int i[5]; 6176 void f() { i[1] = 42; } 6177arraySubscriptExpression(hasBase(implicitCastExpr( 6178 hasSourceExpression(declRefExpr())))) 6179 matches i[1] with the declRefExpr() matching i 6180</pre></td></tr> 6181 6182 6183<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> 6184<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 6185 6186Given 6187 int i[5]; 6188 void f() { i[1] = 42; } 6189arraySubscriptExpression(hasIndex(integerLiteral())) 6190 matches i[1] with the integerLiteral() matching 1 6191</pre></td></tr> 6192 6193 6194<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> 6195<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions. 6196 6197Example matches a (matcher = binaryOperator(hasLHS())) 6198 a || b 6199</pre></td></tr> 6200 6201 6202<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> 6203<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions. 6204 6205Example matches b (matcher = binaryOperator(hasRHS())) 6206 a || b 6207</pre></td></tr> 6208 6209 6210<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> 6211<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 6212type. 6213 6214Given 6215 struct A {}; 6216 A a[7]; 6217 int b[7]; 6218arrayType(hasElementType(builtinType())) 6219 matches "int b[7]" 6220 6221Usable 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>> 6222</pre></td></tr> 6223 6224 6225<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> 6226<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 6227 6228Given 6229 _Atomic(int) i; 6230 _Atomic(float) f; 6231atomicType(hasValueType(isInteger())) 6232 matches "_Atomic(int) i" 6233 6234Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 6235</pre></td></tr> 6236 6237 6238<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> 6239<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 6240 6241Note: There is no TypeLoc for the deduced type and thus no 6242getDeducedLoc() matcher. 6243 6244Given 6245 auto a = 1; 6246 auto b = 2.0; 6247autoType(hasDeducedType(isInteger())) 6248 matches "auto a" 6249 6250Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 6251</pre></td></tr> 6252 6253 6254<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> 6255<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 6256 6257Given 6258 namespace X { void b(); } 6259 using X::b; 6260usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 6261 matches using X::b </pre></td></tr> 6262 6263 6264<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> 6265<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 6266binary operator matches. 6267</pre></td></tr> 6268 6269 6270<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> 6271<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 6272 6273Example matches a (matcher = binaryOperator(hasLHS())) 6274 a || b 6275</pre></td></tr> 6276 6277 6278<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> 6279<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator. 6280 6281Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6282 integerLiteral(equals(2))) 6283 1 + 2 // Match 6284 2 + 1 // Match 6285 1 + 1 // No match 6286 2 + 2 // No match 6287</pre></td></tr> 6288 6289 6290<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> 6291<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 6292 6293Example matches b (matcher = binaryOperator(hasRHS())) 6294 a || b 6295</pre></td></tr> 6296 6297 6298<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> 6299<tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to. 6300 6301For example, in: 6302void foo() 6303{ 6304 int arr[3]; 6305 auto &[f, s, t] = arr; 6306 6307 f = 42; 6308} 6309The matcher: 6310 bindingDecl(hasName("f"), 6311 forDecomposition(decompositionDecl()) 6312matches 'f' in 'auto &[f, s, t]'. 6313</pre></td></tr> 6314 6315 6316<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> 6317<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 6318block. 6319 6320Does not match the 'this' parameter of a method. 6321 6322Given 6323 class X { void f(int x, int y, int z) {} }; 6324cxxMethodDecl(hasAnyParameter(hasName("y"))) 6325 matches f(int x, int y, int z) {} 6326with hasAnyParameter(...) 6327 matching int y 6328 6329For ObjectiveC, given 6330 @interface I - (void) f:(int) y; @end 6331 6332the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 6333matches the declaration of method f with hasParameter 6334matching y. 6335 6336For blocks, given 6337 b = ^(int y) { printf("%d", y) }; 6338 6339the matcher blockDecl(hasAnyParameter(hasName("y"))) 6340matches the declaration of the block b with hasParameter 6341matching y. 6342</pre></td></tr> 6343 6344 6345<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> 6346<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 6347declaration or a block. 6348 6349Given 6350 class X { void f(int x) {} }; 6351cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6352 matches f(int x) {} 6353with hasParameter(...) 6354 matching int x 6355 6356For ObjectiveC, given 6357 @interface I - (void) f:(int) y; @end 6358 6359the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6360matches the declaration of method f with hasParameter 6361matching y. 6362</pre></td></tr> 6363 6364 6365<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> 6366<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher. 6367 6368Examples: 6369 int x; 6370declaratorDecl(hasTypeLoc(loc(asString("int")))) 6371 matches int x 6372 6373auto x = int(3); 6374cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6375 matches int(3) 6376 6377struct Foo { Foo(int, int); }; 6378auto x = Foo(1, 2); 6379cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6380 matches Foo(1, 2) 6381 6382Usable 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>>, 6383 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>>, 6384 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>>, 6385 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6386 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>>, 6387 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>>, 6388 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>>, 6389 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6390</pre></td></tr> 6391 6392 6393<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> 6394<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 6395pointee matches a given matcher. 6396 6397Given 6398 int *a; 6399 int const *b; 6400 float const *f; 6401pointerType(pointee(isConstQualified(), isInteger())) 6402 matches "int const *b" 6403 6404Usable 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>>, 6405 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>> 6406</pre></td></tr> 6407 6408 6409<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> 6410<tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher. 6411 6412Examples: 6413 int x; 6414declaratorDecl(hasTypeLoc(loc(asString("int")))) 6415 matches int x 6416 6417auto x = int(3); 6418cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6419 matches int(3) 6420 6421struct Foo { Foo(int, int); }; 6422auto x = Foo(1, 2); 6423cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6424 matches Foo(1, 2) 6425 6426Usable 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>>, 6427 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>>, 6428 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>>, 6429 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6430 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>>, 6431 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>>, 6432 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>>, 6433 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6434</pre></td></tr> 6435 6436 6437<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> 6438<tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value 6439declaration's type. 6440 6441In case of a value declaration (for example a variable declaration), 6442this resolves one layer of indirection. For example, in the value 6443declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6444X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6445declaration of x. 6446 6447Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6448 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6449 and friend class X (matcher = friendDecl(hasType("X")) 6450 and public virtual X (matcher = cxxBaseSpecifier(hasType( 6451 cxxRecordDecl(hasName("X")))) 6452 class X {}; 6453 void y(X &x) { x; X z; } 6454 class Y { friend class X; }; 6455 class Z : public virtual X {}; 6456 6457Example matches class Derived 6458(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6459class Base {}; 6460class Derived : Base {}; 6461 6462Usable 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>>, 6463Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6464</pre></td></tr> 6465 6466 6467<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> 6468<tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type 6469matcher. 6470 6471Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6472 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6473 and U (matcher = typedefDecl(hasType(asString("int"))) 6474 and friend class X (matcher = friendDecl(hasType("X")) 6475 and public virtual X (matcher = cxxBaseSpecifier(hasType( 6476 asString("class X"))) 6477 class X {}; 6478 void y(X &x) { x; X z; } 6479 typedef int U; 6480 class Y { friend class X; }; 6481 class Z : public virtual X {}; 6482</pre></td></tr> 6483 6484 6485<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> 6486<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 6487 6488Given 6489 void f(int i); 6490 int y; 6491 f(y); 6492callExpr( 6493 forEachArgumentWithParam( 6494 declRefExpr(to(varDecl(hasName("y")))), 6495 parmVarDecl(hasType(isInteger())) 6496)) 6497 matches f(y); 6498with declRefExpr(...) 6499 matching int y 6500and parmVarDecl(...) 6501 matching int i 6502</pre></td></tr> 6503 6504 6505<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> 6506<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or 6507CXXConstructExpr. It is very similar to forEachArgumentWithParam but 6508it works on calls through function pointers as well. 6509 6510The difference is, that function pointers do not provide access to a 6511ParmVarDecl, but only the QualType for each argument. 6512 6513Given 6514 void f(int i); 6515 int y; 6516 f(y); 6517 void (*f_ptr)(int) = f; 6518 f_ptr(y); 6519callExpr( 6520 forEachArgumentWithParamType( 6521 declRefExpr(to(varDecl(hasName("y")))), 6522 qualType(isInteger()).bind("type) 6523)) 6524 matches f(y) and f_ptr(y) 6525with declRefExpr(...) 6526 matching int y 6527and qualType(...) 6528 matching int 6529</pre></td></tr> 6530 6531 6532<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> 6533<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 6534expression, or an ObjC-message-send expression. 6535 6536Given 6537 void x(int, int, int) { int y; x(1, y, 42); } 6538callExpr(hasAnyArgument(declRefExpr())) 6539 matches x(1, y, 42) 6540with hasAnyArgument(...) 6541 matching y 6542 6543For ObjectiveC, given 6544 @interface I - (void) f:(int) y; @end 6545 void foo(I *i) { [i f:12]; } 6546objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6547 matches [i f:12] 6548</pre></td></tr> 6549 6550 6551<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> 6552<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 6553call expression. 6554 6555Example matches y in x(y) 6556 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6557 void x(int) { int y; x(y); } 6558</pre></td></tr> 6559 6560 6561<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> 6562<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 6563matches the given matcher. 6564 6565The associated declaration is: 6566- for type nodes, the declaration of the underlying type 6567- for CallExpr, the declaration of the callee 6568- for MemberExpr, the declaration of the referenced member 6569- for CXXConstructExpr, the declaration of the constructor 6570- for CXXNewExpr, the declaration of the operator new 6571- for ObjCIvarExpr, the declaration of the ivar 6572 6573For type nodes, hasDeclaration will generally match the declaration of the 6574sugared type. Given 6575 class X {}; 6576 typedef X Y; 6577 Y y; 6578in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6579typedefDecl. A common use case is to match the underlying, desugared type. 6580This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6581 varDecl(hasType(hasUnqualifiedDesugaredType( 6582 recordType(hasDeclaration(decl()))))) 6583In this matcher, the decl will match the CXXRecordDecl of class X. 6584 6585Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 6586 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 6587 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 6588 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 6589 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 6590 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 6591 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6592</pre></td></tr> 6593 6594 6595<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_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> 6596<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 6597 6598Given 6599 class A { A() : i(42), j(42) {} int i; int j; }; 6600cxxConstructorDecl(forEachConstructorInitializer( 6601 forField(decl().bind("x")) 6602)) 6603 will trigger two matches, binding for 'i' and 'j' respectively. 6604</pre></td></tr> 6605 6606 6607<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> 6608<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 6609 6610Given 6611 struct Foo { 6612 Foo() : foo_(1) { } 6613 int foo_; 6614 }; 6615cxxRecordDecl(has(cxxConstructorDecl( 6616 hasAnyConstructorInitializer(anything()) 6617))) 6618 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 6619</pre></td></tr> 6620 6621 6622<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> 6623<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 6624 6625Given 6626 struct Foo { 6627 Foo() : foo_(1) { } 6628 int foo_; 6629 }; 6630cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6631 forField(hasName("foo_")))))) 6632 matches Foo 6633with forField matching foo_ 6634</pre></td></tr> 6635 6636 6637<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> 6638<tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher. 6639 6640Examples: 6641 int x; 6642declaratorDecl(hasTypeLoc(loc(asString("int")))) 6643 matches int x 6644 6645auto x = int(3); 6646cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6647 matches int(3) 6648 6649struct Foo { Foo(int, int); }; 6650auto x = Foo(1, 2); 6651cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6652 matches Foo(1, 2) 6653 6654Usable 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>>, 6655 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>>, 6656 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>>, 6657 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6658 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>>, 6659 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>>, 6660 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>>, 6661 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6662</pre></td></tr> 6663 6664 6665<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> 6666<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 6667 6668Given 6669 struct Foo { 6670 Foo() : foo_(1) { } 6671 int foo_; 6672 }; 6673cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6674 withInitializer(integerLiteral(equals(1))))))) 6675 matches Foo 6676with withInitializer matching (1) 6677</pre></td></tr> 6678 6679 6680<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> 6681<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 6682given matcher. Implicit object expressions are included; that is, it matches 6683use of implicit `this`. 6684 6685Given 6686 struct X { 6687 int m; 6688 int f(X x) { x.m; return m; } 6689 }; 6690memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6691 matches `x.m`, but not `m`; however, 6692memberExpr(hasObjectExpression(hasType(pointsTo( 6693 cxxRecordDecl(hasName("X")))))) 6694 matches `m` (aka. `this->m`), but not `x.m`. 6695</pre></td></tr> 6696 6697 6698<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> 6699<tr><td colspan="4" class="doc" id="hasBody3"><pre></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('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> 6703<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer. 6704 6705Given: 6706 void foo() { 6707 if (int i = foobar(); i > 0) {} 6708 switch (int i = foobar(); i) {} 6709 for (auto& a = get_range(); auto& x : a) {} 6710 } 6711 void bar() { 6712 if (foobar() > 0) {} 6713 switch (foobar()) {} 6714 for (auto& x : get_range()) {} 6715 } 6716ifStmt(hasInitStatement(anything())) 6717 matches the if statement in foo but not in bar. 6718switchStmt(hasInitStatement(anything())) 6719 matches the switch statement in foo but not in bar. 6720cxxForRangeStmt(hasInitStatement(anything())) 6721 matches the range for statement in foo but not in bar. 6722</pre></td></tr> 6723 6724 6725<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> 6726<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 6727 6728Example: 6729 forStmt(hasLoopVariable(anything())) 6730matches 'int x' in 6731 for (int x : a) { } 6732</pre></td></tr> 6733 6734 6735<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> 6736<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 6737 6738Example: 6739 forStmt(hasRangeInit(anything())) 6740matches 'a' in 6741 for (int x : a) { } 6742</pre></td></tr> 6743 6744 6745<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> 6746<tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher. 6747 6748Examples: 6749 int x; 6750declaratorDecl(hasTypeLoc(loc(asString("int")))) 6751 matches int x 6752 6753auto x = int(3); 6754cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6755 matches int(3) 6756 6757struct Foo { Foo(int, int); }; 6758auto x = Foo(1, 2); 6759cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6760 matches Foo(1, 2) 6761 6762Usable 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>>, 6763 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>>, 6764 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>>, 6765 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6766 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>>, 6767 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>>, 6768 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>>, 6769 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6770</pre></td></tr> 6771 6772 6773<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> 6774<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 6775`on`, matches the argument directly without stripping away anything. 6776 6777Given 6778 class Y { public: void m(); }; 6779 Y g(); 6780 class X : public Y { void g(); }; 6781 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 6782cxxMemberCallExpr(onImplicitObjectArgument(hasType( 6783 cxxRecordDecl(hasName("Y"))))) 6784 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 6785cxxMemberCallExpr(on(callExpr())) 6786 does not match `(g()).m()`, because the parens are not ignored. 6787 6788FIXME: Overload to allow directly matching types? 6789</pre></td></tr> 6790 6791 6792<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> 6793<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 6794stripping off any parentheses or implicit casts. 6795 6796Given 6797 class Y { public: void m(); }; 6798 Y g(); 6799 class X : public Y {}; 6800 void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 6801cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 6802 matches `y.m()` and `(g()).m()`. 6803cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 6804 matches `x.m()`. 6805cxxMemberCallExpr(on(callExpr())) 6806 matches `(g()).m()`. 6807 6808FIXME: Overload to allow directly matching types? 6809</pre></td></tr> 6810 6811 6812<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> 6813<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 6814</pre></td></tr> 6815 6816 6817<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> 6818<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 6819matches the InnerMatcher, or is a pointer to a type that matches the 6820InnerMatcher. 6821 6822Given 6823 class Y { public: void m(); }; 6824 class X : public Y { void g(); }; 6825 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 6826cxxMemberCallExpr(thisPointerType(hasDeclaration( 6827 cxxRecordDecl(hasName("Y"))))) 6828 matches `y.m()`, `p->m()` and `x.m()`. 6829cxxMemberCallExpr(thisPointerType(hasDeclaration( 6830 cxxRecordDecl(hasName("X"))))) 6831 matches `x.g()`. 6832</pre></td></tr> 6833 6834 6835<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> 6836<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 6837produce multiple matches. 6838 6839Given 6840 class A { virtual void f(); }; 6841 class B : public A { void f(); }; 6842 class C : public B { void f(); }; 6843cxxMethodDecl(ofClass(hasName("C")), 6844 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6845 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 6846 that B::f is not overridden by C::f). 6847 6848The check can produce multiple matches in case of multiple inheritance, e.g. 6849 class A1 { virtual void f(); }; 6850 class A2 { virtual void f(); }; 6851 class C : public A1, public A2 { void f(); }; 6852cxxMethodDecl(ofClass(hasName("C")), 6853 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6854 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 6855 once with "b" binding "A2::f" and "d" binding "C::f". 6856</pre></td></tr> 6857 6858 6859<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> 6860<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 6861belongs to. 6862 6863FIXME: Generalize this for other kinds of declarations. 6864FIXME: What other kind of declarations would we need to generalize 6865this to? 6866 6867Example matches A() in the last line 6868 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 6869 ofClass(hasName("A")))))) 6870 class A { 6871 public: 6872 A(); 6873 }; 6874 A a = A(); 6875</pre></td></tr> 6876 6877 6878<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> 6879<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments. 6880 6881Given: 6882 MyClass *p1 = new (Storage) MyClass(); 6883cxxNewExpr(hasAnyPlacementArg(anything())) 6884 matches the expression 'new (Storage, 16) MyClass()'. 6885</pre></td></tr> 6886 6887 6888<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> 6889<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 6890 6891Given: 6892 MyClass *p1 = new MyClass[10]; 6893cxxNewExpr(hasArraySize(integerLiteral(equals(10)))) 6894 matches the expression 'new MyClass[10]'. 6895</pre></td></tr> 6896 6897 6898<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> 6899<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 6900matches the given matcher. 6901 6902The associated declaration is: 6903- for type nodes, the declaration of the underlying type 6904- for CallExpr, the declaration of the callee 6905- for MemberExpr, the declaration of the referenced member 6906- for CXXConstructExpr, the declaration of the constructor 6907- for CXXNewExpr, the declaration of the operator new 6908- for ObjCIvarExpr, the declaration of the ivar 6909 6910For type nodes, hasDeclaration will generally match the declaration of the 6911sugared type. Given 6912 class X {}; 6913 typedef X Y; 6914 Y y; 6915in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6916typedefDecl. A common use case is to match the underlying, desugared type. 6917This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6918 varDecl(hasType(hasUnqualifiedDesugaredType( 6919 recordType(hasDeclaration(decl()))))) 6920In this matcher, the decl will match the CXXRecordDecl of class X. 6921 6922Usable 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>>, 6923 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>>, 6924 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>>, 6925 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>>, 6926 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>>, 6927 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>>, 6928 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6929</pre></td></tr> 6930 6931 6932<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> 6933<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments. 6934 6935Given: 6936 MyClass *p1 = new (Storage, 16) MyClass(); 6937cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16)))) 6938 matches the expression 'new (Storage, 16) MyClass()'. 6939</pre></td></tr> 6940 6941 6942<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> 6943<tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher. 6944 6945Examples: 6946 int x; 6947declaratorDecl(hasTypeLoc(loc(asString("int")))) 6948 matches int x 6949 6950auto x = int(3); 6951cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6952 matches int(3) 6953 6954struct Foo { Foo(int, int); }; 6955auto x = Foo(1, 2); 6956cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6957 matches Foo(1, 2) 6958 6959Usable 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>>, 6960 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>>, 6961 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>>, 6962 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6963 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>>, 6964 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>>, 6965 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>>, 6966 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6967</pre></td></tr> 6968 6969 6970<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> 6971<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a 6972binary operator matches. 6973</pre></td></tr> 6974 6975 6976<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> 6977<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 6978 6979Example matches a (matcher = binaryOperator(hasLHS())) 6980 a || b 6981</pre></td></tr> 6982 6983 6984<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> 6985<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator. 6986 6987Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6988 integerLiteral(equals(2))) 6989 1 + 2 // Match 6990 2 + 1 // Match 6991 1 + 1 // No match 6992 2 + 2 // No match 6993</pre></td></tr> 6994 6995 6996<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> 6997<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 6998 6999Example matches b (matcher = binaryOperator(hasRHS())) 7000 a || b 7001</pre></td></tr> 7002 7003 7004<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> 7005<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches. 7006 7007Example matches true (matcher = hasUnaryOperand( 7008 cxxBoolLiteral(equals(true)))) 7009 !true 7010</pre></td></tr> 7011 7012 7013<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> 7014<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher. 7015 7016Example: 7017matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 7018 class Foo; 7019 class Bar : Foo {}; 7020 class Baz : Bar {}; 7021 class SpecialBase; 7022 class Proxy : SpecialBase {}; // matches Proxy 7023 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived 7024 7025FIXME: Refactor this and isDerivedFrom to reuse implementation. 7026</pre></td></tr> 7027 7028 7029<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> 7030<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher. 7031 7032Example: 7033matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 7034 class Foo; 7035 class Bar : Foo {}; 7036 class Baz : Bar {}; 7037 class SpecialBase; 7038 class Proxy : SpecialBase {}; // matches Proxy 7039 class IndirectlyDerived : Proxy {}; // doesn't match 7040</pre></td></tr> 7041 7042 7043<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> 7044<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 7045 7046Given: 7047 class A { void func(); }; 7048 class B { void member(); }; 7049 7050cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 7051A but not B. 7052</pre></td></tr> 7053 7054 7055<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> 7056<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class 7057matching Base, or Objective-C classes that directly or indirectly 7058subclass a class matching Base. 7059 7060Note that a class is not considered to be derived from itself. 7061 7062Example matches Y, Z, C (Base == hasName("X")) 7063 class X; 7064 class Y : public X {}; // directly derived 7065 class Z : public Y {}; // indirectly derived 7066 typedef X A; 7067 typedef A B; 7068 class C : public B {}; // derived from a typedef of X 7069 7070In the following example, Bar matches isDerivedFrom(hasName("X")): 7071 class Foo; 7072 typedef Foo X; 7073 class Bar : public Foo {}; // derived from a type that X is a typedef of 7074 7075In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 7076 @interface NSObject @end 7077 @interface Bar : NSObject @end 7078 7079Usable 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>> 7080</pre></td></tr> 7081 7082 7083<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> 7084<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class 7085matching Base. 7086 7087Note that a class is not considered to be derived from itself. 7088 7089Example matches Y, C (Base == hasName("X")) 7090 class X; 7091 class Y : public X {}; // directly derived 7092 class Z : public Y {}; // indirectly derived 7093 typedef X A; 7094 typedef A B; 7095 class C : public B {}; // derived from a typedef of X 7096 7097In the following example, Bar matches isDerivedFrom(hasName("X")): 7098 class Foo; 7099 typedef Foo X; 7100 class Bar : public Foo {}; // derived from a type that X is a typedef of 7101</pre></td></tr> 7102 7103 7104<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> 7105<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 7106match Base. 7107</pre></td></tr> 7108 7109 7110<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> 7111<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a 7112binary operator matches. 7113</pre></td></tr> 7114 7115 7116<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> 7117<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions. 7118 7119Example matches a (matcher = binaryOperator(hasLHS())) 7120 a || b 7121</pre></td></tr> 7122 7123 7124<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> 7125<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator. 7126 7127Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 7128 integerLiteral(equals(2))) 7129 1 + 2 // Match 7130 2 + 1 // Match 7131 1 + 1 // No match 7132 2 + 2 // No match 7133</pre></td></tr> 7134 7135 7136<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> 7137<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions. 7138 7139Example matches b (matcher = binaryOperator(hasRHS())) 7140 a || b 7141</pre></td></tr> 7142 7143 7144<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> 7145<tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher. 7146 7147Examples: 7148 int x; 7149declaratorDecl(hasTypeLoc(loc(asString("int")))) 7150 matches int x 7151 7152auto x = int(3); 7153cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7154 matches int(3) 7155 7156struct Foo { Foo(int, int); }; 7157auto x = Foo(1, 2); 7158cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7159 matches Foo(1, 2) 7160 7161Usable 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>>, 7162 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>>, 7163 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>>, 7164 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7165 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>>, 7166 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>>, 7167 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>>, 7168 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7169</pre></td></tr> 7170 7171 7172<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> 7173<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 7174expression, or an ObjC-message-send expression. 7175 7176Given 7177 void x(int, int, int) { int y; x(1, y, 42); } 7178callExpr(hasAnyArgument(declRefExpr())) 7179 matches x(1, y, 42) 7180with hasAnyArgument(...) 7181 matching y 7182 7183For ObjectiveC, given 7184 @interface I - (void) f:(int) y; @end 7185 void foo(I *i) { [i f:12]; } 7186objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 7187 matches [i f:12] 7188</pre></td></tr> 7189 7190 7191<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> 7192<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 7193call expression. 7194 7195Example matches y in x(y) 7196 (matcher = callExpr(hasArgument(0, declRefExpr()))) 7197 void x(int) { int y; x(y); } 7198</pre></td></tr> 7199 7200 7201<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> 7202<tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher. 7203 7204Examples: 7205 int x; 7206declaratorDecl(hasTypeLoc(loc(asString("int")))) 7207 matches int x 7208 7209auto x = int(3); 7210cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7211 matches int(3) 7212 7213struct Foo { Foo(int, int); }; 7214auto x = Foo(1, 2); 7215cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7216 matches Foo(1, 2) 7217 7218Usable 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>>, 7219 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>>, 7220 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>>, 7221 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7222 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>>, 7223 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>>, 7224 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>>, 7225 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7226</pre></td></tr> 7227 7228 7229<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> 7230<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 7231given matcher. 7232 7233Example matches y.x() (matcher = callExpr(callee( 7234 cxxMethodDecl(hasName("x"))))) 7235 class Y { public: void x(); }; 7236 void z() { Y y; y.x(); } 7237</pre></td></tr> 7238 7239 7240<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> 7241<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 7242 7243Given 7244 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 7245 void f() { f(); } 7246callExpr(callee(expr())) 7247 matches this->x(), x(), y.x(), f() 7248with callee(...) 7249 matching this->x, x, y.x, f respectively 7250 7251Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 7252because this introduces ambiguous overloads with calls to Callee taking a 7253internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 7254implemented in terms of implicit casts. 7255</pre></td></tr> 7256 7257 7258<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> 7259<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 7260 7261Given 7262 void f(int i); 7263 int y; 7264 f(y); 7265callExpr( 7266 forEachArgumentWithParam( 7267 declRefExpr(to(varDecl(hasName("y")))), 7268 parmVarDecl(hasType(isInteger())) 7269)) 7270 matches f(y); 7271with declRefExpr(...) 7272 matching int y 7273and parmVarDecl(...) 7274 matching int i 7275</pre></td></tr> 7276 7277 7278<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> 7279<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or 7280CXXConstructExpr. It is very similar to forEachArgumentWithParam but 7281it works on calls through function pointers as well. 7282 7283The difference is, that function pointers do not provide access to a 7284ParmVarDecl, but only the QualType for each argument. 7285 7286Given 7287 void f(int i); 7288 int y; 7289 f(y); 7290 void (*f_ptr)(int) = f; 7291 f_ptr(y); 7292callExpr( 7293 forEachArgumentWithParamType( 7294 declRefExpr(to(varDecl(hasName("y")))), 7295 qualType(isInteger()).bind("type) 7296)) 7297 matches f(y) and f_ptr(y) 7298with declRefExpr(...) 7299 matching int y 7300and qualType(...) 7301 matching int 7302</pre></td></tr> 7303 7304 7305<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> 7306<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 7307expression, or an ObjC-message-send expression. 7308 7309Given 7310 void x(int, int, int) { int y; x(1, y, 42); } 7311callExpr(hasAnyArgument(declRefExpr())) 7312 matches x(1, y, 42) 7313with hasAnyArgument(...) 7314 matching y 7315 7316For ObjectiveC, given 7317 @interface I - (void) f:(int) y; @end 7318 void foo(I *i) { [i f:12]; } 7319objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 7320 matches [i f:12] 7321</pre></td></tr> 7322 7323 7324<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> 7325<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 7326call expression. 7327 7328Example matches y in x(y) 7329 (matcher = callExpr(hasArgument(0, declRefExpr()))) 7330 void x(int) { int y; x(y); } 7331</pre></td></tr> 7332 7333 7334<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> 7335<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 7336matches the given matcher. 7337 7338The associated declaration is: 7339- for type nodes, the declaration of the underlying type 7340- for CallExpr, the declaration of the callee 7341- for MemberExpr, the declaration of the referenced member 7342- for CXXConstructExpr, the declaration of the constructor 7343- for CXXNewExpr, the declaration of the operator new 7344- for ObjCIvarExpr, the declaration of the ivar 7345 7346For type nodes, hasDeclaration will generally match the declaration of the 7347sugared type. Given 7348 class X {}; 7349 typedef X Y; 7350 Y y; 7351in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7352typedefDecl. A common use case is to match the underlying, desugared type. 7353This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7354 varDecl(hasType(hasUnqualifiedDesugaredType( 7355 recordType(hasDeclaration(decl()))))) 7356In this matcher, the decl will match the CXXRecordDecl of class X. 7357 7358Usable 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>>, 7359 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>>, 7360 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>>, 7361 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>>, 7362 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>>, 7363 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>>, 7364 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7365</pre></td></tr> 7366 7367 7368<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> 7369<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 7370extension, matches the constant given in the statement. 7371 7372Given 7373 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 7374caseStmt(hasCaseConstant(integerLiteral())) 7375 matches "case 1:" 7376</pre></td></tr> 7377 7378 7379<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> 7380<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 7381or opaque value's source expression matches the given matcher. 7382 7383Example 1: matches "a string" 7384(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 7385class URL { URL(string); }; 7386URL url = "a string"; 7387 7388Example 2: matches 'b' (matcher = 7389opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 7390int a = b ?: 1; 7391</pre></td></tr> 7392 7393 7394<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('forEachTemplateArgument0')"><a name="forEachTemplateArgument0Anchor">forEachTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 7395<tr><td colspan="4" class="doc" id="forEachTemplateArgument0"><pre>Matches classTemplateSpecialization, templateSpecializationType and functionDecl nodes where the template argument matches the inner matcher. 7396This matcher may produce multiple matches. 7397 7398Given 7399 template <typename T, unsigned N, unsigned M> 7400 struct Matrix {}; 7401 7402 constexpr unsigned R = 2; 7403 Matrix<int, R * 2, R * 4> M; 7404 7405 template <typename T, typename U> 7406 void f(T&& t, U&& u) {} 7407 7408 bool B = false; 7409 f(R, B); 7410 7411templateSpecializationType(forEachTemplateArgument(isExpr(expr()))) 7412 matches twice, with expr() matching 'R * 2' and 'R * 4' 7413 7414functionDecl(forEachTemplateArgument(refersToType(builtinType()))) 7415 matches the specialization f<unsigned, bool> twice, for 'unsigned' 7416 and 'bool' 7417</pre></td></tr> 7418 7419 7420<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> 7421<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7422functionDecl that have at least one TemplateArgument matching the given 7423InnerMatcher. 7424 7425Given 7426 template<typename T> class A {}; 7427 template<> class A<double> {}; 7428 A<int> a; 7429 7430 template<typename T> f() {}; 7431 void func() { f<int>(); }; 7432 7433classTemplateSpecializationDecl(hasAnyTemplateArgument( 7434 refersToType(asString("int")))) 7435 matches the specialization A<int> 7436 7437functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7438 matches the specialization f<int> 7439</pre></td></tr> 7440 7441 7442<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> 7443<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 7444 7445Given 7446 template<typename T> class A {}; #1 7447 template<> class A<int> {}; #2 7448classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 7449 matches '#2' with classTemplateDecl() matching the class template 7450 declaration of 'A' at #1. 7451</pre></td></tr> 7452 7453 7454<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> 7455<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7456functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7457 7458Given 7459 template<typename T, typename U> class A {}; 7460 A<bool, int> b; 7461 A<int, bool> c; 7462 7463 template<typename T> void f() {} 7464 void func() { f<int>(); }; 7465classTemplateSpecializationDecl(hasTemplateArgument( 7466 1, refersToType(asString("int")))) 7467 matches the specialization A<bool, int> 7468 7469functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7470 matches the specialization f<int> 7471</pre></td></tr> 7472 7473 7474<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> 7475<tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher. 7476 7477Examples: 7478 int x; 7479declaratorDecl(hasTypeLoc(loc(asString("int")))) 7480 matches int x 7481 7482auto x = int(3); 7483cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7484 matches int(3) 7485 7486struct Foo { Foo(int, int); }; 7487auto x = Foo(1, 2); 7488cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7489 matches Foo(1, 2) 7490 7491Usable 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>>, 7492 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>>, 7493 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>>, 7494 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7495 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>>, 7496 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>>, 7497 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>>, 7498 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7499</pre></td></tr> 7500 7501 7502<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> 7503<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 7504type. 7505 7506Given 7507 struct A {}; 7508 A a[7]; 7509 int b[7]; 7510arrayType(hasElementType(builtinType())) 7511 matches "int b[7]" 7512 7513Usable 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>> 7514</pre></td></tr> 7515 7516 7517<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> 7518<tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher. 7519 7520Examples: 7521 int x; 7522declaratorDecl(hasTypeLoc(loc(asString("int")))) 7523 matches int x 7524 7525auto x = int(3); 7526cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7527 matches int(3) 7528 7529struct Foo { Foo(int, int); }; 7530auto x = Foo(1, 2); 7531cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7532 matches Foo(1, 2) 7533 7534Usable 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>>, 7535 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>>, 7536 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>>, 7537 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7538 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>>, 7539 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>>, 7540 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>>, 7541 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7542</pre></td></tr> 7543 7544 7545<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> 7546<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 7547a given matcher. Also matches StmtExprs that have CompoundStmt as children. 7548 7549Given 7550 { {}; 1+2; } 7551hasAnySubstatement(compoundStmt()) 7552 matches '{ {}; 1+2; }' 7553with compoundStmt() 7554 matching '{}' 7555</pre></td></tr> 7556 7557 7558<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> 7559<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher 7560</pre></td></tr> 7561 7562 7563<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> 7564<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 7565matches the given matcher. 7566 7567The associated declaration is: 7568- for type nodes, the declaration of the underlying type 7569- for CallExpr, the declaration of the callee 7570- for MemberExpr, the declaration of the referenced member 7571- for CXXConstructExpr, the declaration of the constructor 7572- for CXXNewExpr, the declaration of the operator new 7573- for ObjCIvarExpr, the declaration of the ivar 7574 7575For type nodes, hasDeclaration will generally match the declaration of the 7576sugared type. Given 7577 class X {}; 7578 typedef X Y; 7579 Y y; 7580in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7581typedefDecl. A common use case is to match the underlying, desugared type. 7582This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7583 varDecl(hasType(hasUnqualifiedDesugaredType( 7584 recordType(hasDeclaration(decl()))))) 7585In this matcher, the decl will match the CXXRecordDecl of class X. 7586 7587Usable 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>>, 7588 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>>, 7589 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>>, 7590 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>>, 7591 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>>, 7592 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>>, 7593 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7594</pre></td></tr> 7595 7596 7597<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> 7598<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s where the n'th 7599`TemplateArgumentLoc` matches the given `InnerMatcher`. 7600 7601Given 7602 template<typename T, typename U> class A {}; 7603 A<double, int> b; 7604 A<int, double> c; 7605varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0, 7606 hasTypeLoc(loc(asString("double"))))))) 7607 matches `A<double, int> b`, but not `A<int, double> c`. 7608</pre></td></tr> 7609 7610 7611<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>> Inner</td></tr> 7612<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches if a node refers to a declaration through a specific 7613using shadow declaration. 7614 7615Examples: 7616 namespace a { int f(); } 7617 using a::f; 7618 int x = f(); 7619declRefExpr(throughUsingDecl(anything())) 7620 matches f 7621 7622 namespace a { class X{}; } 7623 using a::X; 7624 X x; 7625typeLoc(loc(usingType(throughUsingDecl(anything())))) 7626 matches X 7627 7628Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>> 7629</pre></td></tr> 7630 7631 7632<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> 7633<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 7634specified matcher. 7635 7636Example matches x in if(x) 7637 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 7638 bool x; 7639 if (x) {} 7640</pre></td></tr> 7641 7642 7643<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> 7644<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 7645 7646Note that this does not work for global declarations because the AST 7647breaks up multiple-declaration DeclStmt's into multiple single-declaration 7648DeclStmt's. 7649Example: Given non-global declarations 7650 int a, b = 0; 7651 int c; 7652 int d = 2, e; 7653declStmt(containsDeclaration( 7654 0, varDecl(hasInitializer(anything())))) 7655 matches only 'int d = 2, e;', and 7656declStmt(containsDeclaration(1, varDecl())) 7657 matches 'int a, b = 0' as well as 'int d = 2, e;' 7658 but 'int c;' is not matched. 7659</pre></td></tr> 7660 7661 7662<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> 7663<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 7664 7665Given 7666 int a, b; 7667 int c; 7668declStmt(hasSingleDecl(anything())) 7669 matches 'int c;' but not 'int a, b;'. 7670</pre></td></tr> 7671 7672 7673<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> 7674<tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher. 7675 7676Examples: 7677 int x; 7678declaratorDecl(hasTypeLoc(loc(asString("int")))) 7679 matches int x 7680 7681auto x = int(3); 7682cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7683 matches int(3) 7684 7685struct Foo { Foo(int, int); }; 7686auto x = Foo(1, 2); 7687cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7688 matches Foo(1, 2) 7689 7690Usable 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>>, 7691 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>>, 7692 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>>, 7693 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7694 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>>, 7695 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>>, 7696 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>>, 7697 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7698</pre></td></tr> 7699 7700 7701<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> 7702<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 7703Decl, matches InnerMatcher. 7704 7705Given 7706 namespace N { 7707 namespace M { 7708 class D {}; 7709 } 7710 } 7711 7712cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 7713declaration of class D. 7714</pre></td></tr> 7715 7716 7717<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> 7718<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType or UsingType nodes to find the underlying type. 7719 7720Given 7721 decltype(1) a = 1; 7722 decltype(2.0) b = 2.0; 7723decltypeType(hasUnderlyingType(isInteger())) 7724 matches the type of "a" 7725 7726Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>> 7727</pre></td></tr> 7728 7729 7730<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> 7731<tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl. 7732 7733For example, in: 7734void foo() 7735{ 7736 int arr[3]; 7737 auto &[f, s, t] = arr; 7738 7739 f = 42; 7740} 7741The matcher: 7742 decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding")))) 7743matches the decomposition decl with 'f' bound to "fBinding". 7744</pre></td></tr> 7745 7746 7747<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> 7748<tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl. 7749 7750For example, in: 7751void foo() 7752{ 7753 int arr[3]; 7754 auto &[f, s, t] = arr; 7755 7756 f = 42; 7757} 7758The matcher: 7759 decompositionDecl(hasBinding(0, 7760 bindingDecl(hasName("f").bind("fBinding")))) 7761matches the decomposition decl with 'f' bound to "fBinding". 7762</pre></td></tr> 7763 7764 7765<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> 7766<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr> 7767 7768 7769<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> 7770<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 7771switch statement or conditional operator. 7772 7773Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7774 if (true) {} 7775</pre></td></tr> 7776 7777 7778<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> 7779<tr><td colspan="4" class="doc" id="hasNamedTypeLoc0"><pre>Matches elaborated `TypeLoc`s that have a named `TypeLoc` matching 7780`InnerMatcher`. 7781 7782Given 7783 template <typename T> 7784 class C {}; 7785 class C<int> c; 7786 7787 class D {}; 7788 class D d; 7789elaboratedTypeLoc(hasNamedTypeLoc(templateSpecializationTypeLoc())); 7790 matches the `TypeLoc` of the variable declaration of `c`, but not `d`. 7791</pre></td></tr> 7792 7793 7794<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> 7795<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 7796matches InnerMatcher if the qualifier exists. 7797 7798Given 7799 namespace N { 7800 namespace M { 7801 class D {}; 7802 } 7803 } 7804 N::M::D d; 7805 7806elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 7807matches the type of the variable declaration of d. 7808</pre></td></tr> 7809 7810 7811<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> 7812<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 7813 7814Given 7815 namespace N { 7816 namespace M { 7817 class D {}; 7818 } 7819 } 7820 N::M::D d; 7821 7822elaboratedType(namesType(recordType( 7823hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 7824declaration of d. 7825</pre></td></tr> 7826 7827 7828<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> 7829<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 7830matches the given matcher. 7831 7832The associated declaration is: 7833- for type nodes, the declaration of the underlying type 7834- for CallExpr, the declaration of the callee 7835- for MemberExpr, the declaration of the referenced member 7836- for CXXConstructExpr, the declaration of the constructor 7837- for CXXNewExpr, the declaration of the operator new 7838- for ObjCIvarExpr, the declaration of the ivar 7839 7840For type nodes, hasDeclaration will generally match the declaration of the 7841sugared type. Given 7842 class X {}; 7843 typedef X Y; 7844 Y y; 7845in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7846typedefDecl. A common use case is to match the underlying, desugared type. 7847This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7848 varDecl(hasType(hasUnqualifiedDesugaredType( 7849 recordType(hasDeclaration(decl()))))) 7850In this matcher, the decl will match the CXXRecordDecl of class X. 7851 7852Usable 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>>, 7853 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>>, 7854 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>>, 7855 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>>, 7856 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>>, 7857 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>>, 7858 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7859</pre></td></tr> 7860 7861 7862<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> 7863<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 7864 7865(Note: Clang's AST refers to other conversions as "casts" too, and calls 7866actual casts "explicit" casts.) 7867</pre></td></tr> 7868 7869 7870<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> 7871<tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher. 7872 7873Examples: 7874 int x; 7875declaratorDecl(hasTypeLoc(loc(asString("int")))) 7876 matches int x 7877 7878auto x = int(3); 7879cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7880 matches int(3) 7881 7882struct Foo { Foo(int, int); }; 7883auto x = Foo(1, 2); 7884cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7885 matches Foo(1, 2) 7886 7887Usable 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>>, 7888 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>>, 7889 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>>, 7890 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7891 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>>, 7892 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>>, 7893 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>>, 7894 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7895</pre></td></tr> 7896 7897 7898<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> 7899<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 7900declaration's type. 7901 7902In case of a value declaration (for example a variable declaration), 7903this resolves one layer of indirection. For example, in the value 7904declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7905X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7906declaration of x. 7907 7908Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7909 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7910 and friend class X (matcher = friendDecl(hasType("X")) 7911 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7912 cxxRecordDecl(hasName("X")))) 7913 class X {}; 7914 void y(X &x) { x; X z; } 7915 class Y { friend class X; }; 7916 class Z : public virtual X {}; 7917 7918Example matches class Derived 7919(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7920class Base {}; 7921class Derived : Base {}; 7922 7923Usable 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>>, 7924Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7925</pre></td></tr> 7926 7927 7928<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> 7929<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 7930matcher. 7931 7932Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7933 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7934 and U (matcher = typedefDecl(hasType(asString("int"))) 7935 and friend class X (matcher = friendDecl(hasType("X")) 7936 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7937 asString("class X"))) 7938 class X {}; 7939 void y(X &x) { x; X z; } 7940 typedef int U; 7941 class Y { friend class X; }; 7942 class Z : public virtual X {}; 7943</pre></td></tr> 7944 7945 7946<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> 7947<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 7948elidable constructor and other corresponding bookkeeping nodes. 7949 7950In C++17, elidable copy constructors are no longer being generated in the 7951AST as it is not permitted by the standard. They are, however, part of the 7952AST in C++14 and earlier. So, a matcher must abstract over these differences 7953to work in all language modes. This matcher skips elidable constructor-call 7954AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 7955various implicit nodes inside the constructor calls, all of which will not 7956appear in the C++17 AST. 7957 7958Given 7959 7960struct H {}; 7961H G(); 7962void f() { 7963 H D = G(); 7964} 7965 7966``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 7967matches ``H D = G()`` in C++11 through C++17 (and beyond). 7968</pre></td></tr> 7969 7970 7971<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> 7972<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 7973are stripped off. 7974 7975Parentheses and explicit casts are not discarded. 7976Given 7977 int arr[5]; 7978 int a = 0; 7979 char b = 0; 7980 const int c = a; 7981 int *d = arr; 7982 long e = (long) 0l; 7983The matchers 7984 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 7985 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 7986would match the declarations for a, b, c, and d, but not e. 7987While 7988 varDecl(hasInitializer(integerLiteral())) 7989 varDecl(hasInitializer(declRefExpr())) 7990only match the declarations for a. 7991</pre></td></tr> 7992 7993 7994<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> 7995<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 7996nodes are stripped off. 7997 7998Parentheses and explicit casts are not discarded. 7999Given 8000 class C {}; 8001 C a = C(); 8002 C b; 8003 C c = b; 8004The matchers 8005 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 8006would match the declarations for a, b, and c. 8007While 8008 varDecl(hasInitializer(cxxConstructExpr())) 8009only match the declarations for b and c. 8010</pre></td></tr> 8011 8012 8013<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> 8014<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 8015casts are stripped off. 8016 8017Implicit and non-C Style casts are also discarded. 8018Given 8019 int a = 0; 8020 char b = (0); 8021 void* c = reinterpret_cast<char*>(0); 8022 char d = char(0); 8023The matcher 8024 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 8025would match the declarations for a, b, c, and d. 8026while 8027 varDecl(hasInitializer(integerLiteral())) 8028only match the declaration for a. 8029</pre></td></tr> 8030 8031 8032<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> 8033<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 8034parentheses are stripped off. 8035 8036Explicit casts are not discarded. 8037Given 8038 int arr[5]; 8039 int a = 0; 8040 char b = (0); 8041 const int c = a; 8042 int *d = (arr); 8043 long e = ((long) 0l); 8044The matchers 8045 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 8046 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 8047would match the declarations for a, b, c, and d, but not e. 8048while 8049 varDecl(hasInitializer(integerLiteral())) 8050 varDecl(hasInitializer(declRefExpr())) 8051would only match the declaration for a. 8052</pre></td></tr> 8053 8054 8055<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> 8056<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 8057 8058Given 8059 const char* str = ("my-string"); 8060The matcher 8061 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 8062would match the implicit cast resulting from the assignment. 8063</pre></td></tr> 8064 8065 8066<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> 8067<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 8068 8069Given 8070 class C { 8071 int a = 2; 8072 int b = 3; 8073 int c; 8074 }; 8075fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 8076 matches 'int a;' but not 'int b;'. 8077fieldDecl(hasInClassInitializer(anything())) 8078 matches 'int a;' and 'int b;' but not 'int c;'. 8079</pre></td></tr> 8080 8081 8082<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> 8083<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr> 8084 8085 8086<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> 8087<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 8088switch statement or conditional operator. 8089 8090Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8091 if (true) {} 8092</pre></td></tr> 8093 8094 8095<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> 8096<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 8097 8098Example: 8099 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 8100matches '++x' in 8101 for (x; x < N; ++x) { } 8102</pre></td></tr> 8103 8104 8105<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> 8106<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 8107 8108Example: 8109 forStmt(hasLoopInit(declStmt())) 8110matches 'int x = 0' in 8111 for (int x = 0; x < N; ++x) { } 8112</pre></td></tr> 8113 8114 8115<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> 8116<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 8117declaration's type. 8118 8119In case of a value declaration (for example a variable declaration), 8120this resolves one layer of indirection. For example, in the value 8121declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 8122X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 8123declaration of x. 8124 8125Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8126 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8127 and friend class X (matcher = friendDecl(hasType("X")) 8128 and public virtual X (matcher = cxxBaseSpecifier(hasType( 8129 cxxRecordDecl(hasName("X")))) 8130 class X {}; 8131 void y(X &x) { x; X z; } 8132 class Y { friend class X; }; 8133 class Z : public virtual X {}; 8134 8135Example matches class Derived 8136(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 8137class Base {}; 8138class Derived : Base {}; 8139 8140Usable 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>>, 8141Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 8142</pre></td></tr> 8143 8144 8145<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> 8146<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 8147matcher. 8148 8149Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8150 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8151 and U (matcher = typedefDecl(hasType(asString("int"))) 8152 and friend class X (matcher = friendDecl(hasType("X")) 8153 and public virtual X (matcher = cxxBaseSpecifier(hasType( 8154 asString("class X"))) 8155 class X {}; 8156 void y(X &x) { x; X z; } 8157 typedef int U; 8158 class Y { friend class X; }; 8159 class Z : public virtual X {}; 8160</pre></td></tr> 8161 8162 8163<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> 8164<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST. 8165Note that this matcher matches all the declarations of a function whose 8166body is present in the AST. 8167 8168Given 8169 void f(); 8170 void f() {} 8171 void g(); 8172functionDecl(hasAnyBody(compoundStmt())) 8173 matches both 'void f();' 8174 and 'void f() {}' 8175with compoundStmt() 8176 matching '{}' 8177 but does not match 'void g();' 8178</pre></td></tr> 8179 8180 8181<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> 8182<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 8183block. 8184 8185Does not match the 'this' parameter of a method. 8186 8187Given 8188 class X { void f(int x, int y, int z) {} }; 8189cxxMethodDecl(hasAnyParameter(hasName("y"))) 8190 matches f(int x, int y, int z) {} 8191with hasAnyParameter(...) 8192 matching int y 8193 8194For ObjectiveC, given 8195 @interface I - (void) f:(int) y; @end 8196 8197the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 8198matches the declaration of method f with hasParameter 8199matching y. 8200 8201For blocks, given 8202 b = ^(int y) { printf("%d", y) }; 8203 8204the matcher blockDecl(hasAnyParameter(hasName("y"))) 8205matches the declaration of the block b with hasParameter 8206matching y. 8207</pre></td></tr> 8208 8209 8210<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('forEachTemplateArgument1')"><a name="forEachTemplateArgument1Anchor">forEachTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 8211<tr><td colspan="4" class="doc" id="forEachTemplateArgument1"><pre>Matches classTemplateSpecialization, templateSpecializationType and functionDecl nodes where the template argument matches the inner matcher. 8212This matcher may produce multiple matches. 8213 8214Given 8215 template <typename T, unsigned N, unsigned M> 8216 struct Matrix {}; 8217 8218 constexpr unsigned R = 2; 8219 Matrix<int, R * 2, R * 4> M; 8220 8221 template <typename T, typename U> 8222 void f(T&& t, U&& u) {} 8223 8224 bool B = false; 8225 f(R, B); 8226 8227templateSpecializationType(forEachTemplateArgument(isExpr(expr()))) 8228 matches twice, with expr() matching 'R * 2' and 'R * 4' 8229 8230functionDecl(forEachTemplateArgument(refersToType(builtinType()))) 8231 matches the specialization f<unsigned, bool> twice, for 'unsigned' 8232 and 'bool' 8233</pre></td></tr> 8234 8235 8236<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> 8237<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8238functionDecl that have at least one TemplateArgument matching the given 8239InnerMatcher. 8240 8241Given 8242 template<typename T> class A {}; 8243 template<> class A<double> {}; 8244 A<int> a; 8245 8246 template<typename T> f() {}; 8247 void func() { f<int>(); }; 8248 8249classTemplateSpecializationDecl(hasAnyTemplateArgument( 8250 refersToType(asString("int")))) 8251 matches the specialization A<int> 8252 8253functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 8254 matches the specialization f<int> 8255</pre></td></tr> 8256 8257 8258<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> 8259<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr> 8260 8261 8262<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> 8263<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 8264declaration. 8265 8266Given 8267 template<bool b> 8268 struct S { 8269 S(int); // #1 8270 explicit S(double); // #2 8271 operator int(); // #3 8272 explicit operator bool(); // #4 8273 explicit(false) S(bool) // # 7 8274 explicit(true) S(char) // # 8 8275 explicit(b) S(S) // # 9 8276 }; 8277 S(int) -> S<true> // #5 8278 explicit S(double) -> S<false> // #6 8279cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 8280cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 8281cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 8282</pre></td></tr> 8283 8284 8285<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> 8286<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 8287declaration or a block. 8288 8289Given 8290 class X { void f(int x) {} }; 8291cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 8292 matches f(int x) {} 8293with hasParameter(...) 8294 matching int x 8295 8296For ObjectiveC, given 8297 @interface I - (void) f:(int) y; @end 8298 8299the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 8300matches the declaration of method f with hasParameter 8301matching y. 8302</pre></td></tr> 8303 8304 8305<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> 8306<tr><td colspan="4" class="doc" id="hasReturnTypeLoc0"><pre>Matches a function declared with the specified return `TypeLoc`. 8307 8308Given 8309 int f() { return 5; } 8310 void g() {} 8311functionDecl(hasReturnTypeLoc(loc(asString("int")))) 8312 matches the declaration of `f`, but not `g`. 8313</pre></td></tr> 8314 8315 8316<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> 8317<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8318functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 8319 8320Given 8321 template<typename T, typename U> class A {}; 8322 A<bool, int> b; 8323 A<int, bool> c; 8324 8325 template<typename T> void f() {} 8326 void func() { f<int>(); }; 8327classTemplateSpecializationDecl(hasTemplateArgument( 8328 1, refersToType(asString("int")))) 8329 matches the specialization A<bool, int> 8330 8331functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 8332 matches the specialization f<int> 8333</pre></td></tr> 8334 8335 8336<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> 8337<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 8338 8339Given: 8340 class X { int f() { return 1; } }; 8341cxxMethodDecl(returns(asString("int"))) 8342 matches int f() { return 1; } 8343</pre></td></tr> 8344 8345 8346<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> 8347<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 8348switch statement or conditional operator. 8349 8350Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8351 if (true) {} 8352</pre></td></tr> 8353 8354 8355<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> 8356<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 8357 8358Given 8359 if (A* a = GetAPointer()) {} 8360hasConditionVariableStatement(...) 8361 matches 'A* a = GetAPointer()'. 8362</pre></td></tr> 8363 8364 8365<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> 8366<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 8367 8368Examples matches the if statement 8369 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 8370 if (false) false; else true; 8371</pre></td></tr> 8372 8373 8374<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> 8375<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 8376 8377Given: 8378 void foo() { 8379 if (int i = foobar(); i > 0) {} 8380 switch (int i = foobar(); i) {} 8381 for (auto& a = get_range(); auto& x : a) {} 8382 } 8383 void bar() { 8384 if (foobar() > 0) {} 8385 switch (foobar()) {} 8386 for (auto& x : get_range()) {} 8387 } 8388ifStmt(hasInitStatement(anything())) 8389 matches the if statement in foo but not in bar. 8390switchStmt(hasInitStatement(anything())) 8391 matches the switch statement in foo but not in bar. 8392cxxForRangeStmt(hasInitStatement(anything())) 8393 matches the range for statement in foo but not in bar. 8394</pre></td></tr> 8395 8396 8397<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> 8398<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 8399 8400Examples matches the if statement 8401 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 8402 if (false) true; else false; 8403</pre></td></tr> 8404 8405 8406<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> 8407<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 8408matcher. 8409 8410FIXME: Unit test this matcher 8411</pre></td></tr> 8412 8413 8414<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> 8415<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 8416 8417Example matches y. 8418 (matcher = initListExpr(hasInit(0, expr()))) 8419 int x{y}. 8420</pre></td></tr> 8421 8422 8423<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> 8424<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 8425(if expression have it). 8426</pre></td></tr> 8427 8428 8429<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> 8430<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 8431matches the given matcher. 8432 8433The associated declaration is: 8434- for type nodes, the declaration of the underlying type 8435- for CallExpr, the declaration of the callee 8436- for MemberExpr, the declaration of the referenced member 8437- for CXXConstructExpr, the declaration of the constructor 8438- for CXXNewExpr, the declaration of the operator new 8439- for ObjCIvarExpr, the declaration of the ivar 8440 8441For type nodes, hasDeclaration will generally match the declaration of the 8442sugared type. Given 8443 class X {}; 8444 typedef X Y; 8445 Y y; 8446in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8447typedefDecl. A common use case is to match the underlying, desugared type. 8448This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8449 varDecl(hasType(hasUnqualifiedDesugaredType( 8450 recordType(hasDeclaration(decl()))))) 8451In this matcher, the decl will match the CXXRecordDecl of class X. 8452 8453Usable 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>>, 8454 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>>, 8455 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>>, 8456 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>>, 8457 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>>, 8458 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>>, 8459 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8460</pre></td></tr> 8461 8462 8463<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> 8464<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 8465matches the given matcher. 8466 8467The associated declaration is: 8468- for type nodes, the declaration of the underlying type 8469- for CallExpr, the declaration of the callee 8470- for MemberExpr, the declaration of the referenced member 8471- for CXXConstructExpr, the declaration of the constructor 8472- for CXXNewExpr, the declaration of the operator new 8473- for ObjCIvarExpr, the declaration of the ivar 8474 8475For type nodes, hasDeclaration will generally match the declaration of the 8476sugared type. Given 8477 class X {}; 8478 typedef X Y; 8479 Y y; 8480in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8481typedefDecl. A common use case is to match the underlying, desugared type. 8482This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8483 varDecl(hasType(hasUnqualifiedDesugaredType( 8484 recordType(hasDeclaration(decl()))))) 8485In this matcher, the decl will match the CXXRecordDecl of class X. 8486 8487Usable 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>>, 8488 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>>, 8489 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>>, 8490 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>>, 8491 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>>, 8492 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>>, 8493 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8494</pre></td></tr> 8495 8496 8497<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> 8498<tr><td colspan="4" class="doc" id="capturesVar0"><pre>Matches a `LambdaCapture` that refers to the specified `VarDecl`. The 8499`VarDecl` can be a separate variable that is captured by value or 8500reference, or a synthesized variable if the capture has an initializer. 8501 8502Given 8503 void foo() { 8504 int x; 8505 auto f = [x](){}; 8506 auto g = [x = 1](){}; 8507 } 8508In the matcher 8509lambdaExpr(hasAnyCapture(lambdaCapture(capturesVar(hasName("x")))), 8510capturesVar(hasName("x")) matches `x` and `x = 1`. 8511</pre></td></tr> 8512 8513 8514<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> 8515<tr><td colspan="4" class="doc" id="forEachLambdaCapture0"><pre>Matches each lambda capture in a lambda expression. 8516 8517Given 8518 int main() { 8519 int x, y; 8520 float z; 8521 auto f = [=]() { return x + y + z; }; 8522 } 8523lambdaExpr(forEachLambdaCapture( 8524 lambdaCapture(capturesVar(varDecl(hasType(isInteger())))))) 8525will trigger two matches, binding for 'x' and 'y' respectively. 8526</pre></td></tr> 8527 8528 8529<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> 8530<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture in a lambda expression. 8531 8532Given 8533 void foo() { 8534 int t = 5; 8535 auto f = [=](){ return t; }; 8536 } 8537lambdaExpr(hasAnyCapture(lambdaCapture())) and 8538lambdaExpr(hasAnyCapture(lambdaCapture(refersToVarDecl(hasName("t"))))) 8539 both match `[=](){ return t; }`. 8540</pre></td></tr> 8541 8542 8543<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> 8544<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 8545matches the given matcher. 8546 8547The associated declaration is: 8548- for type nodes, the declaration of the underlying type 8549- for CallExpr, the declaration of the callee 8550- for MemberExpr, the declaration of the referenced member 8551- for CXXConstructExpr, the declaration of the constructor 8552- for CXXNewExpr, the declaration of the operator new 8553- for ObjCIvarExpr, the declaration of the ivar 8554 8555For type nodes, hasDeclaration will generally match the declaration of the 8556sugared type. Given 8557 class X {}; 8558 typedef X Y; 8559 Y y; 8560in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8561typedefDecl. A common use case is to match the underlying, desugared type. 8562This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8563 varDecl(hasType(hasUnqualifiedDesugaredType( 8564 recordType(hasDeclaration(decl()))))) 8565In this matcher, the decl will match the CXXRecordDecl of class X. 8566 8567Usable 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>>, 8568 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>>, 8569 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>>, 8570 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>>, 8571 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>>, 8572 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>>, 8573 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8574</pre></td></tr> 8575 8576 8577<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> 8578<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 8579given matcher. Implicit object expressions are included; that is, it matches 8580use of implicit `this`. 8581 8582Given 8583 struct X { 8584 int m; 8585 int f(X x) { x.m; return m; } 8586 }; 8587memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 8588 matches `x.m`, but not `m`; however, 8589memberExpr(hasObjectExpression(hasType(pointsTo( 8590 cxxRecordDecl(hasName("X")))))) 8591 matches `m` (aka. `this->m`), but not `x.m`. 8592</pre></td></tr> 8593 8594 8595<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> 8596<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 8597given matcher. 8598 8599Given 8600 struct { int first, second; } first, second; 8601 int i(second.first); 8602 int j(first.second); 8603memberExpr(member(hasName("first"))) 8604 matches second.first 8605 but not first.second (because the member name there is "second"). 8606</pre></td></tr> 8607 8608 8609<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> 8610<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 8611pointee matches a given matcher. 8612 8613Given 8614 int *a; 8615 int const *b; 8616 float const *f; 8617pointerType(pointee(isConstQualified(), isInteger())) 8618 matches "int const *b" 8619 8620Usable 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>>, 8621 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>> 8622</pre></td></tr> 8623 8624 8625<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> 8626<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 8627matcher. 8628 8629Given 8630 namespace N { template<class T> void f(T t); } 8631 template <class T> void g() { using N::f; f(T()); } 8632unresolvedLookupExpr(hasAnyDeclaration( 8633 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 8634 matches the use of f in g() . 8635</pre></td></tr> 8636 8637 8638<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> 8639<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 8640 8641Given 8642 struct A { struct B { struct C {}; }; }; 8643 A::B::C c; 8644nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 8645 matches "A::" 8646</pre></td></tr> 8647 8648 8649<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> 8650<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 8651NestedNameSpecifier-matcher matches. 8652</pre></td></tr> 8653 8654 8655<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> 8656<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 8657given TypeLoc. 8658 8659Given 8660 struct A { struct B { struct C {}; }; }; 8661 A::B::C c; 8662nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 8663 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 8664 matches "A::" 8665</pre></td></tr> 8666 8667 8668<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> 8669<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 8670 8671Given 8672 struct A { struct B { struct C {}; }; }; 8673 A::B::C c; 8674nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 8675 matches "A::" 8676</pre></td></tr> 8677 8678 8679<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> 8680<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 8681given namespace matcher. 8682 8683Given 8684 namespace ns { struct A {}; } 8685 ns::A a; 8686nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 8687 matches "ns::" 8688</pre></td></tr> 8689 8690 8691<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> 8692<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 8693given QualType matcher without qualifiers. 8694 8695Given 8696 struct A { struct B { struct C {}; }; }; 8697 A::B::C c; 8698nestedNameSpecifier(specifiesType( 8699 hasDeclaration(cxxRecordDecl(hasName("A"))) 8700)) 8701 matches "A::" 8702</pre></td></tr> 8703 8704 8705<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> 8706<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 8707 8708Given 8709 8710 #pragma omp parallel 8711 #pragma omp parallel default(none) 8712 8713``ompExecutableDirective(hasAnyClause(anything()))`` matches 8714``omp parallel default(none)``. 8715</pre></td></tr> 8716 8717 8718<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> 8719<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 8720 8721Prerequisite: the executable directive must not be standalone directive. 8722If it is, it will never match. 8723 8724Given 8725 8726 #pragma omp parallel 8727 ; 8728 #pragma omp parallel 8729 {} 8730 8731``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 8732</pre></td></tr> 8733 8734 8735<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> 8736<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 8737matching Base, or Objective-C classes that directly or indirectly 8738subclass a class matching Base. 8739 8740Note that a class is not considered to be derived from itself. 8741 8742Example matches Y, Z, C (Base == hasName("X")) 8743 class X; 8744 class Y : public X {}; // directly derived 8745 class Z : public Y {}; // indirectly derived 8746 typedef X A; 8747 typedef A B; 8748 class C : public B {}; // derived from a typedef of X 8749 8750In the following example, Bar matches isDerivedFrom(hasName("X")): 8751 class Foo; 8752 typedef Foo X; 8753 class Bar : public Foo {}; // derived from a type that X is a typedef of 8754 8755In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 8756 @interface NSObject @end 8757 @interface Bar : NSObject @end 8758 8759Usable 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>> 8760</pre></td></tr> 8761 8762 8763<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> 8764<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 8765matching Base. 8766 8767Note that a class is not considered to be derived from itself. 8768 8769Example matches Y, C (Base == hasName("X")) 8770 class X; 8771 class Y : public X {}; // directly derived 8772 class Z : public Y {}; // indirectly derived 8773 typedef X A; 8774 typedef A B; 8775 class C : public B {}; // derived from a typedef of X 8776 8777In the following example, Bar matches isDerivedFrom(hasName("X")): 8778 class Foo; 8779 typedef Foo X; 8780 class Bar : public Foo {}; // derived from a type that X is a typedef of 8781</pre></td></tr> 8782 8783 8784<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> 8785<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 8786match Base. 8787</pre></td></tr> 8788 8789 8790<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> 8791<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 8792expression, or an ObjC-message-send expression. 8793 8794Given 8795 void x(int, int, int) { int y; x(1, y, 42); } 8796callExpr(hasAnyArgument(declRefExpr())) 8797 matches x(1, y, 42) 8798with hasAnyArgument(...) 8799 matching y 8800 8801For ObjectiveC, given 8802 @interface I - (void) f:(int) y; @end 8803 void foo(I *i) { [i f:12]; } 8804objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 8805 matches [i f:12] 8806</pre></td></tr> 8807 8808 8809<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> 8810<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor 8811call expression. 8812 8813Example matches y in x(y) 8814 (matcher = callExpr(hasArgument(0, declRefExpr()))) 8815 void x(int) { int y; x(y); } 8816</pre></td></tr> 8817 8818 8819<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> 8820<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 8821and the inner matcher matches on that instance. 8822 8823For example the method call in 8824 NSString *x = @"hello"; 8825 [x containsString:@"h"]; 8826is matched by 8827objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 8828</pre></td></tr> 8829 8830 8831<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> 8832<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 8833 8834Example 8835matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 8836matches the [webView ...] message invocation. 8837 NSString *webViewJavaScript = ... 8838 UIWebView *webView = ... 8839 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 8840</pre></td></tr> 8841 8842 8843<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> 8844<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 8845block. 8846 8847Does not match the 'this' parameter of a method. 8848 8849Given 8850 class X { void f(int x, int y, int z) {} }; 8851cxxMethodDecl(hasAnyParameter(hasName("y"))) 8852 matches f(int x, int y, int z) {} 8853with hasAnyParameter(...) 8854 matching int y 8855 8856For ObjectiveC, given 8857 @interface I - (void) f:(int) y; @end 8858 8859the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 8860matches the declaration of method f with hasParameter 8861matching y. 8862 8863For blocks, given 8864 b = ^(int y) { printf("%d", y) }; 8865 8866the matcher blockDecl(hasAnyParameter(hasName("y"))) 8867matches the declaration of the block b with hasParameter 8868matching y. 8869</pre></td></tr> 8870 8871 8872<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> 8873<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 8874declaration or a block. 8875 8876Given 8877 class X { void f(int x) {} }; 8878cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 8879 matches f(int x) {} 8880with hasParameter(...) 8881 matching int x 8882 8883For ObjectiveC, given 8884 @interface I - (void) f:(int) y; @end 8885 8886the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 8887matches the declaration of method f with hasParameter 8888matching y. 8889</pre></td></tr> 8890 8891 8892<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> 8893<tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher. 8894 8895Examples: 8896 int x; 8897declaratorDecl(hasTypeLoc(loc(asString("int")))) 8898 matches int x 8899 8900auto x = int(3); 8901cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 8902 matches int(3) 8903 8904struct Foo { Foo(int, int); }; 8905auto x = Foo(1, 2); 8906cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 8907 matches Foo(1, 2) 8908 8909Usable 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>>, 8910 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>>, 8911 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>>, 8912 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 8913 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>>, 8914 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>>, 8915 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>>, 8916 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 8917</pre></td></tr> 8918 8919 8920<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> 8921<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 8922or opaque value's source expression matches the given matcher. 8923 8924Example 1: matches "a string" 8925(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 8926class URL { URL(string); }; 8927URL url = "a string"; 8928 8929Example 2: matches 'b' (matcher = 8930opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 8931int a = b ?: 1; 8932</pre></td></tr> 8933 8934 8935<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> 8936<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 8937overloads matches the given matcher. 8938 8939Given 8940 template <typename T> void foo(T); 8941 template <typename T> void bar(T); 8942 template <typename T> void baz(T t) { 8943 foo(t); 8944 bar(t); 8945 } 8946unresolvedLookupExpr(hasAnyDeclaration( 8947 functionTemplateDecl(hasName("foo")))) 8948 matches foo in foo(t); but not bar in bar(t); 8949</pre></td></tr> 8950 8951 8952<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> 8953<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 8954 8955Given 8956 int (*ptr_to_array)[4]; 8957 int (*ptr_to_func)(int); 8958 8959varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 8960ptr_to_func but not ptr_to_array. 8961 8962Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 8963</pre></td></tr> 8964 8965 8966<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> 8967<tr><td colspan="4" class="doc" id="hasPointeeLoc0"><pre>Matches pointer `TypeLoc`s that have a pointee `TypeLoc` matching 8968`PointeeMatcher`. 8969 8970Given 8971 int* x; 8972pointerTypeLoc(hasPointeeLoc(loc(asString("int")))) 8973 matches `int*`. 8974</pre></td></tr> 8975 8976 8977<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> 8978<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 8979pointee matches a given matcher. 8980 8981Given 8982 int *a; 8983 int const *b; 8984 float const *f; 8985pointerType(pointee(isConstQualified(), isInteger())) 8986 matches "int const *b" 8987 8988Usable 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>>, 8989 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>> 8990</pre></td></tr> 8991 8992 8993<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> 8994<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 8995 8996Given: 8997 typedef int &int_ref; 8998 int a; 8999 int_ref b = a; 9000 9001varDecl(hasType(qualType(referenceType()))))) will not match the 9002declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 9003</pre></td></tr> 9004 9005 9006<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> 9007<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 9008matches the given matcher. 9009 9010The associated declaration is: 9011- for type nodes, the declaration of the underlying type 9012- for CallExpr, the declaration of the callee 9013- for MemberExpr, the declaration of the referenced member 9014- for CXXConstructExpr, the declaration of the constructor 9015- for CXXNewExpr, the declaration of the operator new 9016- for ObjCIvarExpr, the declaration of the ivar 9017 9018For type nodes, hasDeclaration will generally match the declaration of the 9019sugared type. Given 9020 class X {}; 9021 typedef X Y; 9022 Y y; 9023in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9024typedefDecl. A common use case is to match the underlying, desugared type. 9025This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9026 varDecl(hasType(hasUnqualifiedDesugaredType( 9027 recordType(hasDeclaration(decl()))))) 9028In this matcher, the decl will match the CXXRecordDecl of class X. 9029 9030Usable 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>>, 9031 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>>, 9032 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>>, 9033 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>>, 9034 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>>, 9035 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>>, 9036 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9037</pre></td></tr> 9038 9039 9040<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> 9041<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 9042 9043Given 9044 void (*fp)(void); 9045The matcher 9046 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 9047would match the declaration for fp. 9048</pre></td></tr> 9049 9050 9051<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> 9052<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 9053</pre></td></tr> 9054 9055 9056<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> 9057<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 9058matches the specified matcher. 9059 9060Example matches y->x() 9061 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 9062 cxxRecordDecl(hasName("Y"))))))) 9063 class Y { public: void x(); }; 9064 void z() { Y *y; y->x(); } 9065</pre></td></tr> 9066 9067 9068<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> 9069<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 9070</pre></td></tr> 9071 9072 9073<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> 9074<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 9075type matches the specified matcher. 9076 9077Example matches X &x and const X &y 9078 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 9079 class X { 9080 void a(X b) { 9081 X &x = b; 9082 const X &y = b; 9083 } 9084 }; 9085</pre></td></tr> 9086 9087 9088<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> 9089<tr><td colspan="4" class="doc" id="hasUnqualifiedLoc0"><pre>Matches `QualifiedTypeLoc`s that have an unqualified `TypeLoc` matching 9090`InnerMatcher`. 9091 9092Given 9093 int* const x; 9094 const int y; 9095qualifiedTypeLoc(hasUnqualifiedLoc(pointerTypeLoc())) 9096 matches the `TypeLoc` of the variable declaration of `x`, but not `y`. 9097</pre></td></tr> 9098 9099 9100<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> 9101<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 9102matches the given matcher. 9103 9104The associated declaration is: 9105- for type nodes, the declaration of the underlying type 9106- for CallExpr, the declaration of the callee 9107- for MemberExpr, the declaration of the referenced member 9108- for CXXConstructExpr, the declaration of the constructor 9109- for CXXNewExpr, the declaration of the operator new 9110- for ObjCIvarExpr, the declaration of the ivar 9111 9112For type nodes, hasDeclaration will generally match the declaration of the 9113sugared type. Given 9114 class X {}; 9115 typedef X Y; 9116 Y y; 9117in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9118typedefDecl. A common use case is to match the underlying, desugared type. 9119This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9120 varDecl(hasType(hasUnqualifiedDesugaredType( 9121 recordType(hasDeclaration(decl()))))) 9122In this matcher, the decl will match the CXXRecordDecl of class X. 9123 9124Usable 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>>, 9125 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>>, 9126 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>>, 9127 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>>, 9128 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>>, 9129 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>>, 9130 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9131</pre></td></tr> 9132 9133 9134<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> 9135<tr><td colspan="4" class="doc" id="hasReferentLoc0"><pre>Matches reference `TypeLoc`s that have a referent `TypeLoc` matching 9136`ReferentMatcher`. 9137 9138Given 9139 int x = 3; 9140 int& xx = x; 9141referenceTypeLoc(hasReferentLoc(loc(asString("int")))) 9142 matches `int&`. 9143</pre></td></tr> 9144 9145 9146<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> 9147<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 9148pointee matches a given matcher. 9149 9150Given 9151 int *a; 9152 int const *b; 9153 float const *f; 9154pointerType(pointee(isConstQualified(), isInteger())) 9155 matches "int const *b" 9156 9157Usable 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>>, 9158 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>> 9159</pre></td></tr> 9160 9161 9162<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> 9163<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 9164 9165Given 9166 return a + b; 9167hasReturnValue(binaryOperator()) 9168 matches 'return a + b' 9169with binaryOperator() 9170 matching 'a + b' 9171</pre></td></tr> 9172 9173 9174<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> 9175<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 9176a given matcher. Also matches StmtExprs that have CompoundStmt as children. 9177 9178Given 9179 { {}; 1+2; } 9180hasAnySubstatement(compoundStmt()) 9181 matches '{ {}; 1+2; }' 9182with compoundStmt() 9183 matching '{}' 9184</pre></td></tr> 9185 9186 9187<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> 9188<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 9189alignof. 9190</pre></td></tr> 9191 9192 9193<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> 9194<tr><td colspan="4" class="doc" id="forCallable0"><pre>Matches declaration of the function, method, or block the statement 9195belongs to. 9196 9197Given: 9198F& operator=(const F& o) { 9199 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 9200 return *this; 9201} 9202returnStmt(forCallable(functionDecl(hasName("operator=")))) 9203 matches 'return *this' 9204 but does not match 'return v > 0' 9205 9206Given: 9207-(void) foo { 9208 int x = 1; 9209 dispatch_sync(queue, ^{ int y = 2; }); 9210} 9211declStmt(forCallable(objcMethodDecl())) 9212 matches 'int x = 1' 9213 but does not match 'int y = 2'. 9214whereas declStmt(forCallable(blockDecl())) 9215 matches 'int y = 2' 9216 but does not match 'int x = 1'. 9217</pre></td></tr> 9218 9219 9220<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> 9221<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to. 9222 9223Deprecated. Use forCallable() to correctly handle the situation when 9224the declaration is not a function (but a block or an Objective-C method). 9225forFunction() not only fails to take non-functions into account but also 9226may match the wrong declaration in their presence. 9227 9228Given: 9229F& operator=(const F& o) { 9230 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 9231 return *this; 9232} 9233returnStmt(forFunction(hasName("operator="))) 9234 matches 'return *this' 9235 but does not match 'return v > 0' 9236</pre></td></tr> 9237 9238 9239<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> 9240<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 9241sizeof. 9242</pre></td></tr> 9243 9244 9245<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> 9246<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 9247type that matches the provided matcher. 9248 9249Given 9250 template <typename T> 9251 double F(T t); 9252 int i; 9253 double j = F(i); 9254 9255substTemplateTypeParmType(hasReplacementType(type())) matches int 9256</pre></td></tr> 9257 9258 9259<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> 9260<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 9261statement. This matcher may produce multiple matches. 9262 9263Given 9264 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 9265switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 9266 matches four times, with "c" binding each of "case 1:", "case 2:", 9267"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 9268"switch (1)", "switch (2)" and "switch (2)". 9269</pre></td></tr> 9270 9271 9272<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> 9273<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 9274switch statement or conditional operator. 9275 9276Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 9277 if (true) {} 9278</pre></td></tr> 9279 9280 9281<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> 9282<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 9283 9284Given: 9285 void foo() { 9286 if (int i = foobar(); i > 0) {} 9287 switch (int i = foobar(); i) {} 9288 for (auto& a = get_range(); auto& x : a) {} 9289 } 9290 void bar() { 9291 if (foobar() > 0) {} 9292 switch (foobar()) {} 9293 for (auto& x : get_range()) {} 9294 } 9295ifStmt(hasInitStatement(anything())) 9296 matches the if statement in foo but not in bar. 9297switchStmt(hasInitStatement(anything())) 9298 matches the switch statement in foo but not in bar. 9299cxxForRangeStmt(hasInitStatement(anything())) 9300 matches the range for statement in foo but not in bar. 9301</pre></td></tr> 9302 9303 9304<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> 9305<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 9306matches the given matcher. 9307 9308The associated declaration is: 9309- for type nodes, the declaration of the underlying type 9310- for CallExpr, the declaration of the callee 9311- for MemberExpr, the declaration of the referenced member 9312- for CXXConstructExpr, the declaration of the constructor 9313- for CXXNewExpr, the declaration of the operator new 9314- for ObjCIvarExpr, the declaration of the ivar 9315 9316For type nodes, hasDeclaration will generally match the declaration of the 9317sugared type. Given 9318 class X {}; 9319 typedef X Y; 9320 Y y; 9321in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9322typedefDecl. A common use case is to match the underlying, desugared type. 9323This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9324 varDecl(hasType(hasUnqualifiedDesugaredType( 9325 recordType(hasDeclaration(decl()))))) 9326In this matcher, the decl will match the CXXRecordDecl of class X. 9327 9328Usable 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>>, 9329 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>>, 9330 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>>, 9331 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>>, 9332 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>>, 9333 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>>, 9334 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9335</pre></td></tr> 9336 9337 9338<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> 9339<tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher. 9340 9341Examples: 9342 int x; 9343declaratorDecl(hasTypeLoc(loc(asString("int")))) 9344 matches int x 9345 9346auto x = int(3); 9347cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 9348 matches int(3) 9349 9350struct Foo { Foo(int, int); }; 9351auto x = Foo(1, 2); 9352cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 9353 matches Foo(1, 2) 9354 9355Usable 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>>, 9356 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>>, 9357 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>>, 9358 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 9359 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>>, 9360 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>>, 9361 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>>, 9362 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 9363</pre></td></tr> 9364 9365 9366<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> 9367<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 9368 9369Given 9370 struct B { int next; }; 9371 template<int(B::*next_ptr)> struct A {}; 9372 A<&B::next> a; 9373templateSpecializationType(hasAnyTemplateArgument( 9374 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 9375 matches the specialization A<&B::next> with fieldDecl(...) matching 9376 B::next 9377</pre></td></tr> 9378 9379 9380<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> 9381<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 9382declaration. 9383 9384Given 9385 struct B { int next; }; 9386 template<int(B::*next_ptr)> struct A {}; 9387 A<&B::next> a; 9388classTemplateSpecializationDecl(hasAnyTemplateArgument( 9389 refersToDeclaration(fieldDecl(hasName("next"))))) 9390 matches the specialization A<&B::next> with fieldDecl(...) matching 9391 B::next 9392</pre></td></tr> 9393 9394 9395<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> 9396<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type. 9397 9398Given 9399 template<int T> struct C {}; 9400 C<42> c; 9401classTemplateSpecializationDecl( 9402 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 9403 matches the implicit instantiation of C in C<42>. 9404</pre></td></tr> 9405 9406 9407<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> 9408<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 9409 9410Given 9411 template<template <typename> class S> class X {}; 9412 template<typename T> class Y {}; 9413 X<Y> xi; 9414classTemplateSpecializationDecl(hasAnyTemplateArgument( 9415 refersToTemplate(templateName()))) 9416 matches the specialization X<Y> 9417</pre></td></tr> 9418 9419 9420<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> 9421<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 9422 9423Given 9424 struct X {}; 9425 template<typename T> struct A {}; 9426 A<X> a; 9427classTemplateSpecializationDecl(hasAnyTemplateArgument( 9428 refersToType(class(hasName("X"))))) 9429 matches the specialization A<X> 9430</pre></td></tr> 9431 9432 9433<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> 9434<tr><td colspan="4" class="doc" id="hasAnyTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s that have at least one 9435`TemplateArgumentLoc` matching the given `InnerMatcher`. 9436 9437Given 9438 template<typename T> class A {}; 9439 A<int> a; 9440varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc( 9441 hasTypeLoc(loc(asString("int"))))))) 9442 matches `A<int> a`. 9443</pre></td></tr> 9444 9445 9446<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> 9447<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc1"><pre>Matches template specialization `TypeLoc`s where the n'th 9448`TemplateArgumentLoc` matches the given `InnerMatcher`. 9449 9450Given 9451 template<typename T, typename U> class A {}; 9452 A<double, int> b; 9453 A<int, double> c; 9454varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0, 9455 hasTypeLoc(loc(asString("double"))))))) 9456 matches `A<double, int> b`, but not `A<int, double> c`. 9457</pre></td></tr> 9458 9459 9460<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('forEachTemplateArgument2')"><a name="forEachTemplateArgument2Anchor">forEachTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 9461<tr><td colspan="4" class="doc" id="forEachTemplateArgument2"><pre>Matches classTemplateSpecialization, templateSpecializationType and functionDecl nodes where the template argument matches the inner matcher. 9462This matcher may produce multiple matches. 9463 9464 9465Given 9466 template <typename T, unsigned N, unsigned M> 9467 struct Matrix {}; 9468 9469 constexpr unsigned R = 2; 9470 Matrix<int, R * 2, R * 4> M; 9471 9472 template <typename T, typename U> 9473 void f(T&& t, U&& u) {} 9474 9475 bool B = false; 9476 f(R, B); 9477 9478templateSpecializationType(forEachTemplateArgument(isExpr(expr()))) 9479 matches twice, with expr() matching 'R * 2' and 'R * 4' 9480 9481functionDecl(forEachTemplateArgument(refersToType(builtinType()))) 9482 matches the specialization f<unsigned, bool> twice, for 'unsigned' 9483 and 'bool' 9484</pre></td></tr> 9485 9486 9487<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> 9488<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 9489functionDecl that have at least one TemplateArgument matching the given 9490InnerMatcher. 9491 9492Given 9493 template<typename T> class A {}; 9494 template<> class A<double> {}; 9495 A<int> a; 9496 9497 template<typename T> f() {}; 9498 void func() { f<int>(); }; 9499 9500classTemplateSpecializationDecl(hasAnyTemplateArgument( 9501 refersToType(asString("int")))) 9502 matches the specialization A<int> 9503 9504functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 9505 matches the specialization f<int> 9506</pre></td></tr> 9507 9508 9509<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> 9510<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 9511matches the given matcher. 9512 9513The associated declaration is: 9514- for type nodes, the declaration of the underlying type 9515- for CallExpr, the declaration of the callee 9516- for MemberExpr, the declaration of the referenced member 9517- for CXXConstructExpr, the declaration of the constructor 9518- for CXXNewExpr, the declaration of the operator new 9519- for ObjCIvarExpr, the declaration of the ivar 9520 9521For type nodes, hasDeclaration will generally match the declaration of the 9522sugared type. Given 9523 class X {}; 9524 typedef X Y; 9525 Y y; 9526in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9527typedefDecl. A common use case is to match the underlying, desugared type. 9528This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9529 varDecl(hasType(hasUnqualifiedDesugaredType( 9530 recordType(hasDeclaration(decl()))))) 9531In this matcher, the decl will match the CXXRecordDecl of class X. 9532 9533Usable 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>>, 9534 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>>, 9535 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>>, 9536 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>>, 9537 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>>, 9538 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>>, 9539 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9540</pre></td></tr> 9541 9542 9543<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> 9544<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 9545functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 9546 9547Given 9548 template<typename T, typename U> class A {}; 9549 A<bool, int> b; 9550 A<int, bool> c; 9551 9552 template<typename T> void f() {} 9553 void func() { f<int>(); }; 9554classTemplateSpecializationDecl(hasTemplateArgument( 9555 1, refersToType(asString("int")))) 9556 matches the specialization A<bool, int> 9557 9558functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 9559 matches the specialization f<int> 9560</pre></td></tr> 9561 9562 9563<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> 9564<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 9565matches the given matcher. 9566 9567The associated declaration is: 9568- for type nodes, the declaration of the underlying type 9569- for CallExpr, the declaration of the callee 9570- for MemberExpr, the declaration of the referenced member 9571- for CXXConstructExpr, the declaration of the constructor 9572- for CXXNewExpr, the declaration of the operator new 9573- for ObjCIvarExpr, the declaration of the ivar 9574 9575For type nodes, hasDeclaration will generally match the declaration of the 9576sugared type. Given 9577 class X {}; 9578 typedef X Y; 9579 Y y; 9580in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9581typedefDecl. A common use case is to match the underlying, desugared type. 9582This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9583 varDecl(hasType(hasUnqualifiedDesugaredType( 9584 recordType(hasDeclaration(decl()))))) 9585In this matcher, the decl will match the CXXRecordDecl of class X. 9586 9587Usable 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>>, 9588 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>>, 9589 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>>, 9590 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>>, 9591 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>>, 9592 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>>, 9593 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9594</pre></td></tr> 9595 9596 9597<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> 9598<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 9599QualType-matcher matches. 9600</pre></td></tr> 9601 9602 9603<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> 9604<tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher. 9605 9606Examples: 9607 int x; 9608declaratorDecl(hasTypeLoc(loc(asString("int")))) 9609 matches int x 9610 9611auto x = int(3); 9612cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 9613 matches int(3) 9614 9615struct Foo { Foo(int, int); }; 9616auto x = Foo(1, 2); 9617cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 9618 matches Foo(1, 2) 9619 9620Usable 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>>, 9621 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>>, 9622 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>>, 9623 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 9624 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>>, 9625 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>>, 9626 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>>, 9627 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 9628</pre></td></tr> 9629 9630 9631<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> 9632<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 9633matcher. 9634 9635Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9636 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9637 and U (matcher = typedefDecl(hasType(asString("int"))) 9638 and friend class X (matcher = friendDecl(hasType("X")) 9639 and public virtual X (matcher = cxxBaseSpecifier(hasType( 9640 asString("class X"))) 9641 class X {}; 9642 void y(X &x) { x; X z; } 9643 typedef int U; 9644 class Y { friend class X; }; 9645 class Z : public virtual X {}; 9646</pre></td></tr> 9647 9648 9649<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> 9650<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 9651matches the given matcher. 9652 9653The associated declaration is: 9654- for type nodes, the declaration of the underlying type 9655- for CallExpr, the declaration of the callee 9656- for MemberExpr, the declaration of the referenced member 9657- for CXXConstructExpr, the declaration of the constructor 9658- for CXXNewExpr, the declaration of the operator new 9659- for ObjCIvarExpr, the declaration of the ivar 9660 9661For type nodes, hasDeclaration will generally match the declaration of the 9662sugared type. Given 9663 class X {}; 9664 typedef X Y; 9665 Y y; 9666in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9667typedefDecl. A common use case is to match the underlying, desugared type. 9668This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9669 varDecl(hasType(hasUnqualifiedDesugaredType( 9670 recordType(hasDeclaration(decl()))))) 9671In this matcher, the decl will match the CXXRecordDecl of class X. 9672 9673Usable 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>>, 9674 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>>, 9675 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>>, 9676 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>>, 9677 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>>, 9678 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>>, 9679 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9680</pre></td></tr> 9681 9682 9683<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> 9684<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 9685type of the matched node. 9686 9687For example, in: 9688 class A {}; 9689 using B = A; 9690The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 9691both B and A. 9692</pre></td></tr> 9693 9694 9695<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> 9696<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 9697 9698Given 9699 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 9700unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 9701 matches sizeof(a) and alignof(c) 9702</pre></td></tr> 9703 9704 9705<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> 9706<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 9707 9708Example matches true (matcher = hasUnaryOperand( 9709 cxxBoolLiteral(equals(true)))) 9710 !true 9711</pre></td></tr> 9712 9713 9714<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> 9715<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 9716given matcher. Implicit object expressions are included; that is, it matches 9717use of implicit `this`. 9718 9719Given 9720 struct X { 9721 int m; 9722 int f(X x) { x.m; return m; } 9723 }; 9724memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 9725 matches `x.m`, but not `m`; however, 9726memberExpr(hasObjectExpression(hasType(pointsTo( 9727 cxxRecordDecl(hasName("X")))))) 9728 matches `m` (aka. `this->m`), but not `x.m`. 9729</pre></td></tr> 9730 9731 9732<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> 9733<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 9734matches the given matcher. 9735 9736The associated declaration is: 9737- for type nodes, the declaration of the underlying type 9738- for CallExpr, the declaration of the callee 9739- for MemberExpr, the declaration of the referenced member 9740- for CXXConstructExpr, the declaration of the constructor 9741- for CXXNewExpr, the declaration of the operator new 9742- for ObjCIvarExpr, the declaration of the ivar 9743 9744For type nodes, hasDeclaration will generally match the declaration of the 9745sugared type. Given 9746 class X {}; 9747 typedef X Y; 9748 Y y; 9749in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9750typedefDecl. A common use case is to match the underlying, desugared type. 9751This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9752 varDecl(hasType(hasUnqualifiedDesugaredType( 9753 recordType(hasDeclaration(decl()))))) 9754In this matcher, the decl will match the CXXRecordDecl of class X. 9755 9756Usable 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>>, 9757 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>>, 9758 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>>, 9759 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>>, 9760 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>>, 9761 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>>, 9762 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9763</pre></td></tr> 9764 9765 9766<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> 9767<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 9768matched by the given matcher. 9769 9770Given 9771 namespace X { int a; void b(); } 9772 using X::a; 9773 using X::b; 9774usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 9775 matches using X::b but not using X::a </pre></td></tr> 9776 9777 9778<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>></td><td class="name" onclick="toggle('hasUnderlyingType1')"><a name="hasUnderlyingType1Anchor">hasUnderlyingType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 9779<tr><td colspan="4" class="doc" id="hasUnderlyingType1"><pre>Matches DecltypeType or UsingType nodes to find the underlying type. 9780 9781Given 9782 decltype(1) a = 1; 9783 decltype(2.0) b = 2.0; 9784decltypeType(hasUnderlyingType(isInteger())) 9785 matches the type of "a" 9786 9787Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>> 9788</pre></td></tr> 9789 9790 9791<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>></td><td class="name" onclick="toggle('throughUsingDecl1')"><a name="throughUsingDecl1Anchor">throughUsingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> Inner</td></tr> 9792<tr><td colspan="4" class="doc" id="throughUsingDecl1"><pre>Matches if a node refers to a declaration through a specific 9793using shadow declaration. 9794 9795Examples: 9796 namespace a { int f(); } 9797 using a::f; 9798 int x = f(); 9799declRefExpr(throughUsingDecl(anything())) 9800 matches f 9801 9802 namespace a { class X{}; } 9803 using a::X; 9804 X x; 9805typeLoc(loc(usingType(throughUsingDecl(anything())))) 9806 matches X 9807 9808Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>> 9809</pre></td></tr> 9810 9811 9812<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> 9813<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value 9814declaration's type. 9815 9816In case of a value declaration (for example a variable declaration), 9817this resolves one layer of indirection. For example, in the value 9818declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 9819X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 9820declaration of x. 9821 9822Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9823 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9824 and friend class X (matcher = friendDecl(hasType("X")) 9825 and public virtual X (matcher = cxxBaseSpecifier(hasType( 9826 cxxRecordDecl(hasName("X")))) 9827 class X {}; 9828 void y(X &x) { x; X z; } 9829 class Y { friend class X; }; 9830 class Z : public virtual X {}; 9831 9832Example matches class Derived 9833(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 9834class Base {}; 9835class Derived : Base {}; 9836 9837Usable 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>>, 9838Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 9839</pre></td></tr> 9840 9841 9842<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> 9843<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 9844matcher. 9845 9846Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9847 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9848 and U (matcher = typedefDecl(hasType(asString("int"))) 9849 and friend class X (matcher = friendDecl(hasType("X")) 9850 and public virtual X (matcher = cxxBaseSpecifier(hasType( 9851 asString("class X"))) 9852 class X {}; 9853 void y(X &x) { x; X z; } 9854 typedef int U; 9855 class Y { friend class X; }; 9856 class Z : public virtual X {}; 9857</pre></td></tr> 9858 9859 9860<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> 9861<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 9862that matches the given matcher. 9863 9864Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 9865 bool y() { return true; } 9866 bool x = y(); 9867</pre></td></tr> 9868 9869 9870<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> 9871<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 9872expression. 9873 9874Given 9875 void f(int b) { 9876 int a[b]; 9877 } 9878variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 9879 varDecl(hasName("b"))))))) 9880 matches "int a[b]" 9881</pre></td></tr> 9882 9883 9884<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> 9885<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr> 9886 9887 9888<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> 9889<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 9890switch statement or conditional operator. 9891 9892Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 9893 if (true) {} 9894</pre></td></tr> 9895 9896<!--END_TRAVERSAL_MATCHERS --> 9897</table> 9898 9899</div> 9900</body> 9901</html> 9902 9903 9904