1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 2 "http://www.w3.org/TR/html4/strict.dtd"> 3<html> 4<head> 5<title>AST Matcher Reference</title> 6<link type="text/css" rel="stylesheet" href="../menu.css" /> 7<link type="text/css" rel="stylesheet" href="../content.css" /> 8<style type="text/css"> 9td { 10 padding: .33em; 11} 12td.doc { 13 display: none; 14 border-bottom: 1px solid black; 15} 16td.name:hover { 17 color: blue; 18 cursor: pointer; 19} 20span.mono { font-family: monospace; } 21 22.traverse_compare, .traverse_compare td, .traverse_compare th { 23 border: 1px solid black; 24 border-collapse: collapse; 25} 26</style> 27<script type="text/javascript"> 28function toggle(id) { 29 if (!id) return; 30 row = document.getElementById(id); 31 if (row.style.display != 'table-cell') 32 row.style.display = 'table-cell'; 33 else 34 row.style.display = 'none'; 35} 36</script> 37</head> 38<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))"> 39 40<!--#include virtual="../menu.html.incl"--> 41 42<div id="content"> 43 44<h1>AST Matcher Reference</h1> 45 46<p>This document shows all currently implemented matchers. The matchers are grouped 47by category and node type they match. You can click on matcher names to show the 48matcher's source documentation.</p> 49 50<p>There are three different basic categories of matchers: 51<ul> 52<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li> 53<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li> 54<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li> 55</ul> 56</p> 57 58<p>Within each category the matchers are ordered by node type they match on. 59Note that if a matcher can match multiple node types, it will appear 60multiple times. This means that by searching for Matcher<Stmt> you can 61find all matchers that can be used to match on Stmt nodes.</p> 62 63<p>The exception to that rule are matchers that can match on any node. Those 64are marked with a * and are listed in the beginning of each category.</p> 65 66<p>Note that the categorization of matchers is a great help when you combine 67them into matcher expressions. You will usually want to form matcher expressions 68that read like english sentences by alternating between node matchers and 69narrowing or traversal matchers, like this: 70<pre> 71recordDecl(hasDescendant( 72 ifStmt(hasTrueExpression( 73 expr(hasDescendant( 74 ifStmt())))))) 75</pre> 76</p> 77 78<!-- ======================================================================= --> 79<h2 id="traverse-mode">Traverse Mode</h2> 80<!-- ======================================================================= --> 81 82<p>The default mode of operation of AST Matchers visits all nodes in the AST, 83even if they are not spelled in the source. This is 84<span class="mono">AsIs</span> mode. This mode requires writing AST matchers 85that explicitly traverse or ignore implicit nodes, such as parentheses 86surrounding an expression or expressions with cleanups. These implicit 87nodes are not always obvious from the syntax of the source code, and so this 88mode requires careful consideration and testing to get the desired behavior 89from an AST matcher. 90</p> 91 92<p>In addition, because template instantiations are matched in the default mode, 93transformations can be accidentally made to template declarations. Finally, 94because implicit nodes are matched by default, transformations can be made on 95entirely incorrect places in the code.</p> 96 97<p>For these reasons, it is possible to ignore AST nodes which are not spelled 98in the source using the <span class="mono">IgnoreUnlessSpelledInSource</span> 99mode. This is likely to be far less error-prone for users who are not already 100very familiar with where implicit nodes appear in the AST. It is also likely 101to be less error-prone for experienced AST users, as difficult cases do not 102need to be encountered and matcher expressions adjusted for these cases.</p> 103 104<p>In clang-query, the mode can be changed with 105<pre> 106set traversal IgnoreUnlessSpelledInSource 107</pre> 108</p> 109This affects both matchers and AST dump output in results. 110 111<p>When using the C++ API such as in clang-tidy checks, the 112<span class="mono">traverse()</span> matcher is used to set the mode: 113<pre> 114Finder->addMatcher(traverse(TK_IgnoreUnlessSpelledInSource, 115 returnStmt(hasReturnArgument(integerLiteral(equals(0)))) 116 ), this); 117</pre> 118</p> 119<p>The following table compares the <span class="mono">AsIs</span> mode with 120the <span class="mono">IgnoreUnlessSpelledInSource</span> mode:</p> 121 122<table class="traverse_compare"> 123<tr> 124<th></th> 125<th><span class="mono">AsIs</span></th> 126<th><span class="mono">IgnoreUnlessSpelledInSource</span></th> 127</tr> 128<tr> 129 <td>AST dump of <span class="mono">func1</span>: 130<pre> 131struct B { 132 B(int); 133}; 134 135B func1() { return 42; } 136</pre> 137 138 </td> 139 <td> 140C++98 dialect: 141<pre> 142FunctionDecl 143`-CompoundStmt 144 `-ReturnStmt 145 `-ExprWithCleanups 146 `-CXXConstructExpr 147 `-MaterializeTemporaryExpr 148 `-ImplicitCastExpr 149 `-ImplicitCastExpr 150 `-CXXConstructExpr 151 `-IntegerLiteral 'int' 42 152</pre> 153C++11, C++14 dialect: 154<pre> 155FunctionDecl 156`-CompoundStmt 157 `-ReturnStmt 158 `-ExprWithCleanups 159 `-CXXConstructExpr 160 `-MaterializeTemporaryExpr 161 `-ImplicitCastExpr 162 `-CXXConstructExpr 163 `-IntegerLiteral 'int' 42 164</pre> 165C++17, C++20 dialect: 166<pre> 167FunctionDecl 168`-CompoundStmt 169 `-ReturnStmt 170 `-ImplicitCastExpr 171 `-CXXConstructExpr 172 `-IntegerLiteral 'int' 42 173</pre> 174</td> 175 <td> 176All dialects: 177 <pre> 178FunctionDecl 179`-CompoundStmt 180 `-ReturnStmt 181 `-IntegerLiteral 'int' 42 182</pre></td> 183</tr> 184 185<tr> 186<td>Matcher for returned <span class="mono">42</span>: 187<pre> 188struct B { 189 B(int); 190}; 191 192B func1() { return 42; } 193</pre> 194 195 </td> 196 <td> 197All dialects: 198<pre> 199returnStmt(hasReturnValue( 200 ignoringImplicit( 201 ignoringElidableConstructorCall( 202 ignoringImplicit( 203 cxxConstructExpr(hasArgument(0, 204 ignoringImplicit( 205 integerLiteral().bind("returnVal") 206 ) 207 )) 208 ) 209 ) 210 ) 211 )) 212</pre></td> 213 <td> 214All dialects: 215<pre> 216returnStmt(hasReturnValue( 217 integerLiteral().bind("returnVal") 218)) 219</pre></td> 220</tr> 221<tr> 222<td>Match result for 223<pre>implicitCastExpr()</pre> 224given: 225<pre> 226struct B { 227 B(int); 228}; 229 230B func1() { return 42; } 231</pre> 232 233</td> 234<td> 235Match found.</td> 236 <td> 237No match.</td> 238</tr> 239<tr> 240 <td>Match result for: 241<pre> 242cxxConstructorDecl( 243 isCopyConstructor() 244 ).bind("prepend_explicit") 245</pre> 246given: 247<pre> 248struct Other {}; 249struct Copyable { 250 Other m_o; 251 Copyable(); 252}; 253</pre> 254</td> 255<td> 256Match found. Insertion produces incorrect output: 257<pre> 258struct Other {}; 259struct explicit Copyable { 260 Other m_o; 261 Copyable(); 262}; 263</pre> 264</td> 265<td> 266No match found. Incorrect replacement not possible. 267</td> 268</tr> 269<tr> 270 <td>Replacement of <span class="mono">begin()</span> 271 with <span class="mono">cbegin()</span>: 272<pre> 273cxxMemberCallExpr( 274 on(ConstContainerExpr), 275 callee(cxxMethodDecl(hasName("begin"))) 276 ).bind("replace_with_cbegin") 277</pre> 278given: 279<pre> 280void foo() { 281 const Container c; 282 c.begin(); 283 284 for (auto i : c) { 285 } 286} 287</pre> 288</td> 289<td> 2902 matches found. Replacement produces incorrect output: 291<pre> 292void foo() { 293 const Container c; 294 c.cbegin(); 295 296 for (auto i :.cbegin() c) { 297 } 298} 299</pre> 300</td> 301<td> 3021 match found. Replacement produces correct output: 303<pre> 304void foo() { 305 const Container c; 306 c.cbegin(); 307 308 for (auto i : c) { 309 } 310} 311</pre> 312</td> 313</tr> 314<tr> 315 <td>Replacement of <span class="mono">int</span> member 316 with <span class="mono">safe_int</span>: 317<pre> 318fieldDecl( 319 hasType(asString("int")) 320 ).bind("use_safe_int") 321</pre> 322given: 323<pre> 324struct S { 325 int m_i; 326}; 327 328template <typename T> struct TemplStruct { 329 TemplStruct() {} 330 ~TemplStruct() {} 331 332private: 333 T m_t; 334}; 335 336void instantiate() { TemplStruct<int> ti; } 337</pre> 338</td> 339<td> 3402 matches found. Replacement produces incorrect output: 341<pre> 342struct S { 343 safe_int m_i; 344}; 345 346template <typename T> struct TemplStruct { 347 TemplStruct() {} 348 ~TemplStruct() {} 349 350private: 351 safe_int m_t; 352}; 353 354void instantiate() { TemplStruct<int> ti; } 355</pre> 356</td> 357<td> 3581 match found. Replacement produces correct output: 359<pre> 360struct S { 361 safe_int m_i; 362}; 363 364template <typename T> struct TemplStruct { 365 TemplStruct() {} 366 ~TemplStruct() {} 367 368private: 369 T m_t; 370}; 371 372void instantiate() { TemplStruct<int> ti; } 373</pre> 374</td> 375</tr> 376<tr> 377 <td>Add prefix to member initializer 378<pre> 379cxxCtorInitializer( 380 forField(fieldDecl()) 381 ).bind("add_prefix") 382</pre> 383given: 384<pre> 385struct Simple {}; 386 387struct Record { 388 Record() : i(42) {} 389private: 390 int i; 391 Simple s; 392}; 393</pre> 394</td> 395<td> 3962 matches found. Replacement produces incorrect output: 397<pre> 398struct Simple {}; 399 400struct Record { 401 m_Record() : m_i(42) {} 402private: 403 int i; 404 Simple s; 405}; 406</pre> 407</td> 408<td> 4091 match found. Replacement produces correct output: 410<pre> 411struct Simple {}; 412 413struct Record { 414 Record() : m_i(42) {} 415private: 416 int i; 417 Simple s; 418}; 419</pre> 420</td> 421</tr> 422<tr> 423 <td>Ignored default arguments 424<pre> 425callExpr( 426 callee(functionDecl( 427 hasName("hasDefaultArg") 428 )), 429 argumentCountIs(1) 430 ).bind("add_prefix") 431</pre> 432given: 433<pre> 434void hasDefaultArg(int i, int j = 0) {} 435void callDefaultArg() { hasDefaultArg(42); } 436</pre> 437</td> 438<td> 439No match. 440</td> 441<td> 4421 match found. 443</td> 444</tr> 445<tr> 446 <td>Lambda fields 447<pre> 448fieldDecl( 449 hasType(asString("int")) 450 ).bind("make_safe") 451</pre> 452given: 453<pre> 454struct S { 455 int m_i; 456}; 457 458void func() { 459 int a = 0; 460 int c = 0; 461 462 auto l = [a, b = c](int d) { int e = d; }; 463 l(43); 464} 465</pre> 466</td> 467<td> 4682 matches found. Replacement produces incorrect output: 469<pre> 470struct S { 471 safe_int m_i; 472}; 473 474void func() { 475 int a = 0; 476 int c = 0; 477 478 auto l = [safe_a, safe_b = c](int d) { int e = d; }; 479 l(43); 480} 481</pre> 482</td> 483<td> 4841 match found. Replacement produces correct output: 485<pre> 486struct S { 487 safe_int m_i; 488}; 489 490void func() { 491 int a = 0; 492 int c = 0; 493 494 auto l = [a, b = c](int d) { int e = d; }; 495 l(43); 496} 497</pre> 498</td> 499 500</tr> 501 502 503 504 505 506<tr> 507 <td>Rewritten binary operators 508<pre> 509binaryOperator( 510 hasOperatorName("<"), 511 hasRHS(hasDescendant(integerLiteral(equals(0)))) 512 ) 513</pre> 514given: 515<pre> 516#include <compare> 517 518class HasSpaceship { 519public: 520 int x; 521 bool operator==(const HasSpaceship&) const = default; 522 std::strong_ordering operator<=>(const HasSpaceship&) const = default; 523}; 524 525bool isLess(const HasSpaceship& a, const HasSpaceship& b) { 526 return a < b; 527} 528</pre> 529</td> 530<td> 5311 match found. 532 533<pre> 534 return a < b; 535 ^~~~~ 536</pre> 537 538</td> 539<td> 540No match found. 541</td> 542</tr> 543</table> 544 545<!-- ======================================================================= --> 546<h2 id="decl-matchers">Node Matchers</h2> 547<!-- ======================================================================= --> 548 549<p>Node matchers are at the core of matcher expressions - they specify the type 550of node that is expected. Every match expression starts with a node matcher, 551which can then be further refined with a narrowing or traversal matcher. All 552traversal matchers take node matchers as their arguments.</p> 553 554<p>For convenience, all node matchers take an arbitrary number of arguments 555and implicitly act as allOf matchers.</p> 556 557<p>Node matchers are the only matchers that support the bind("id") call to 558bind the matched node to the given string, to be later retrieved from the 559match callback.</p> 560 561<p>It is important to remember that the arguments to node matchers are 562predicates on the same node, just with additional information about the type. 563This is often useful to make matcher expression more readable by inlining bind 564calls into redundant node matchers inside another node matcher: 565<pre> 566// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on 567// the same node. 568recordDecl(decl().bind("id"), hasName("::MyClass")) 569</pre> 570</p> 571 572<table> 573<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 574<!-- START_DECL_MATCHERS --> 575 576<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('cxxBaseSpecifier0')"><a name="cxxBaseSpecifier0Anchor">cxxBaseSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>...</td></tr> 577<tr><td colspan="4" class="doc" id="cxxBaseSpecifier0"><pre>Matches class bases. 578 579Examples matches public virtual B. 580 class B {}; 581 class C : public virtual B {}; 582</pre></td></tr> 583 584 585<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_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> 586<tr><td colspan="4" class="doc" id="attr0"><pre>Matches attributes. 587Attributes may be attached with a variety of different syntaxes (including 588keywords, C++11 attributes, GNU ``__attribute``` and MSVC `__declspec``, 589and ``#pragma``s). They may also be implicit. 590 591Given 592 struct [[nodiscard]] Foo{}; 593 void bar(int * __attribute__((nonnull)) ); 594 __declspec(noinline) void baz(); 595 596 #pragma omp declare simd 597 int min(); 598attr() 599 matches "nodiscard", "nonnull", "noinline", and the whole "#pragma" line. 600</pre></td></tr> 601 602 603<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>...</td></tr> 604<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers. 605 606Examples matches i(42). 607 class C { 608 C() : i(42) {} 609 int i; 610 }; 611</pre></td></tr> 612 613 614<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>>...</td></tr> 615<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations. 616 617Given 618 class C { 619 public: 620 int a; 621 }; 622accessSpecDecl() 623 matches 'public:' 624</pre></td></tr> 625 626 627<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('bindingDecl0')"><a name="bindingDecl0Anchor">bindingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>>...</td></tr> 628<tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations 629Example matches foo and bar 630(matcher = bindingDecl() 631 632 auto [foo, bar] = std::make_pair{42, 42}; 633</pre></td></tr> 634 635 636<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>...</td></tr> 637<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations. 638 639Example matches the declaration of the nameless block printing an input 640integer. 641 642 myFunc(^(int p) { 643 printf("%d", p); 644 }) 645</pre></td></tr> 646 647 648<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>>...</td></tr> 649<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations. 650 651Example matches Z 652 template<class T> class Z {}; 653</pre></td></tr> 654 655 656<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>>...</td></tr> 657<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations. 658 659Given 660 template<class T1, class T2, int I> 661 class A {}; 662 663 template<class T, int I> 664 class A<T, T*, I> {}; 665 666 template<> 667 class A<int, int, 1> {}; 668classTemplatePartialSpecializationDecl() 669 matches the specialization A<T,T*,I> but not A<int,int,1> 670</pre></td></tr> 671 672 673<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>...</td></tr> 674<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations. 675 676Given 677 template<typename T> class A {}; 678 template<> class A<double> {}; 679 A<int> a; 680classTemplateSpecializationDecl() 681 matches the specializations A<int> and A<double> 682</pre></td></tr> 683 684 685<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>>...</td></tr> 686<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. 687 688Example matches Foo::Foo() and Foo::Foo(int) 689 class Foo { 690 public: 691 Foo(); 692 Foo(int); 693 int DoSomething(); 694 }; 695</pre></td></tr> 696 697 698<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>>...</td></tr> 699<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations. 700 701Example matches the operator. 702 class X { operator int() const; }; 703</pre></td></tr> 704 705 706<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>>...</td></tr> 707<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide. 708 709Example matches the deduction guide. 710 template<typename T> 711 class X { X(int) }; 712 X(int) -> X<int>; 713</pre></td></tr> 714 715 716<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>>...</td></tr> 717<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations. 718 719Example matches Foo::~Foo() 720 class Foo { 721 public: 722 virtual ~Foo(); 723 }; 724</pre></td></tr> 725 726 727<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>...</td></tr> 728<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations. 729 730Example matches y 731 class X { void y(); }; 732</pre></td></tr> 733 734 735<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>...</td></tr> 736<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations. 737 738Example matches X, Z 739 class X; 740 template<class T> class Z {}; 741</pre></td></tr> 742 743 744<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>...</td></tr> 745<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 746 747Examples matches X, C, and the friend declaration inside C; 748 void X(); 749 class C { 750 friend X; 751 }; 752</pre></td></tr> 753 754 755<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>...</td></tr> 756<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 757and non-type template parameter declarations). 758 759Given 760 class X { int y; }; 761declaratorDecl() 762 matches int y. 763</pre></td></tr> 764 765 766<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('decompositionDecl0')"><a name="decompositionDecl0Anchor">decompositionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>>...</td></tr> 767<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations. 768 769Examples matches the declaration node with foo and bar, but not 770number. 771(matcher = declStmt(has(decompositionDecl()))) 772 773 int number = 42; 774 auto [foo, bar] = std::make_pair{42, 42}; 775</pre></td></tr> 776 777 778<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>>...</td></tr> 779<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 780 781Example matches A, B, C 782 enum X { 783 A, B, C 784 }; 785</pre></td></tr> 786 787 788<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>>...</td></tr> 789<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 790 791Example matches X 792 enum X { 793 A, B, C 794 }; 795</pre></td></tr> 796 797 798<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>>...</td></tr> 799<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 800 801Given 802 class X { int m; }; 803fieldDecl() 804 matches 'm'. 805</pre></td></tr> 806 807 808<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>...</td></tr> 809<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 810 811Given 812 class X { friend void foo(); }; 813friendDecl() 814 matches 'friend void foo()'. 815</pre></td></tr> 816 817 818<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>...</td></tr> 819<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 820 821Example matches f 822 void f(); 823</pre></td></tr> 824 825 826<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>>...</td></tr> 827<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 828 829Example matches f 830 template<class T> void f(T t) {} 831</pre></td></tr> 832 833 834<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>>...</td></tr> 835<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations. 836 837Given 838 struct X { struct { int a; }; }; 839indirectFieldDecl() 840 matches 'a'. 841</pre></td></tr> 842 843 844<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>>...</td></tr> 845<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label. 846 847Given 848 goto FOO; 849 FOO: bar(); 850labelDecl() 851 matches 'FOO:' 852</pre></td></tr> 853 854 855<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>>...</td></tr> 856<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification. 857 858Given 859 extern "C" {} 860linkageSpecDecl() 861 matches "extern "C" {}" 862</pre></td></tr> 863 864 865<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>>...</td></tr> 866<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 867 868Example matches X, S, the anonymous union type, i, and U; 869 typedef int X; 870 struct S { 871 union { 872 int i; 873 } U; 874 }; 875</pre></td></tr> 876 877 878<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>>...</td></tr> 879<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias. 880 881Given 882 namespace test {} 883 namespace alias = ::test; 884namespaceAliasDecl() 885 matches "namespace alias" but not "namespace test" 886</pre></td></tr> 887 888 889<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>>...</td></tr> 890<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 891 892Given 893 namespace {} 894 namespace test {} 895namespaceDecl() 896 matches "namespace {}" and "namespace test {}" 897</pre></td></tr> 898 899 900<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>>...</td></tr> 901<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations. 902 903Given 904 template <typename T, int N> struct C {}; 905nonTypeTemplateParmDecl() 906 matches 'N', but not 'T'. 907</pre></td></tr> 908 909 910<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>>...</td></tr> 911<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations. 912 913Example matches Foo (Additions) 914 @interface Foo (Additions) 915 @end 916</pre></td></tr> 917 918 919<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>>...</td></tr> 920<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions. 921 922Example matches Foo (Additions) 923 @implementation Foo (Additions) 924 @end 925</pre></td></tr> 926 927 928<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>>...</td></tr> 929<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations. 930 931Example matches Foo 932 @implementation Foo 933 @end 934</pre></td></tr> 935 936 937<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>...</td></tr> 938<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 939 940Example matches Foo 941 @interface Foo 942 @end 943</pre></td></tr> 944 945 946<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>>...</td></tr> 947<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations. 948 949Example matches _enabled 950 @implementation Foo { 951 BOOL _enabled; 952 } 953 @end 954</pre></td></tr> 955 956 957<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>...</td></tr> 958<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations. 959 960Example matches both declaration and definition of -[Foo method] 961 @interface Foo 962 - (void)method; 963 @end 964 965 @implementation Foo 966 - (void)method {} 967 @end 968</pre></td></tr> 969 970 971<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>...</td></tr> 972<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations. 973 974Example matches enabled 975 @interface Foo 976 @property BOOL enabled; 977 @end 978</pre></td></tr> 979 980 981<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>>...</td></tr> 982<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations. 983 984Example matches FooDelegate 985 @protocol FooDelegate 986 @end 987</pre></td></tr> 988 989 990<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>>...</td></tr> 991<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 992 993Given 994 void f(int x); 995parmVarDecl() 996 matches int x. 997</pre></td></tr> 998 999 1000<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>>...</td></tr> 1001<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 1002 1003Example matches X, Z, U, and S 1004 class X; 1005 template<class T> class Z {}; 1006 struct S {}; 1007 union U {}; 1008</pre></td></tr> 1009 1010 1011<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>>...</td></tr> 1012<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 1013 1014Example: 1015 staticAssertExpr() 1016matches 1017 static_assert(sizeof(S) == sizeof(int)) 1018in 1019 struct S { 1020 int x; 1021 }; 1022 static_assert(sizeof(S) == sizeof(int)); 1023</pre></td></tr> 1024 1025 1026<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>...</td></tr> 1027<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations. 1028 1029Example matches X, Z, U, S, E 1030 class X; 1031 template<class T> class Z {}; 1032 struct S {}; 1033 union U {}; 1034 enum E { 1035 A, B, C 1036 }; 1037</pre></td></tr> 1038 1039 1040<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTemplateParmDecl0')"><a name="templateTemplateParmDecl0Anchor">templateTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl</a>>...</td></tr> 1041<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations. 1042 1043Given 1044 template <template <typename> class Z, int N> struct C {}; 1045templateTypeParmDecl() 1046 matches 'Z', but not 'N'. 1047</pre></td></tr> 1048 1049 1050<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>>...</td></tr> 1051<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 1052 1053Given 1054 template <typename T, int N> struct C {}; 1055templateTypeParmDecl() 1056 matches 'T', but not 'N'. 1057</pre></td></tr> 1058 1059 1060<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>>...</td></tr> 1061<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 1062 1063Given 1064 int X; 1065 namespace NS { 1066 int Y; 1067 } // namespace NS 1068decl(hasDeclContext(translationUnitDecl())) 1069 matches "int X", but not "int Y". 1070</pre></td></tr> 1071 1072 1073<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>>...</td></tr> 1074<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations. 1075 1076Given 1077 typedef int X; 1078 using Y = int; 1079typeAliasDecl() 1080 matches "using Y = int", but not "typedef int X" 1081</pre></td></tr> 1082 1083 1084<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>>...</td></tr> 1085<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations. 1086 1087typeAliasTemplateDecl() matches 1088 template <typename T> 1089 using Y = X<T>; 1090</pre></td></tr> 1091 1092 1093<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>>...</td></tr> 1094<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 1095 1096Given 1097 typedef int X; 1098 using Y = int; 1099typedefDecl() 1100 matches "typedef int X", but not "using Y = int" 1101</pre></td></tr> 1102 1103 1104<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>...</td></tr> 1105<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations. 1106 1107Given 1108 typedef int X; 1109 using Y = int; 1110typedefNameDecl() 1111 matches "typedef int X" and "using Y = int" 1112</pre></td></tr> 1113 1114 1115<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>>...</td></tr> 1116<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 1117typename. 1118 1119Given 1120 template <typename T> 1121 struct Base { typedef T Foo; }; 1122 1123 template<typename T> 1124 struct S : private Base<T> { 1125 using typename Base<T>::Foo; 1126 }; 1127unresolvedUsingTypenameDecl() 1128 matches using Base<T>::Foo </pre></td></tr> 1129 1130 1131<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>>...</td></tr> 1132<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 1133 1134Given 1135 template<typename X> 1136 class C : private X { 1137 using X::x; 1138 }; 1139unresolvedUsingValueDecl() 1140 matches using X::x </pre></td></tr> 1141 1142 1143<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>>...</td></tr> 1144<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 1145 1146Given 1147 namespace X { int x; } 1148 using X::x; 1149usingDecl() 1150 matches using X::x </pre></td></tr> 1151 1152 1153<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>>...</td></tr> 1154<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 1155 1156Given 1157 namespace X { int x; } 1158 using namespace X; 1159usingDirectiveDecl() 1160 matches using namespace X </pre></td></tr> 1161 1162 1163<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>...</td></tr> 1164<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 1165 1166Example matches A, B, C and F 1167 enum X { A, B, C }; 1168 void F(); 1169</pre></td></tr> 1170 1171 1172<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> 1173<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 1174 1175Note: this does not match declarations of member variables, which are 1176"field" declarations in Clang parlance. 1177 1178Example matches a 1179 int a; 1180</pre></td></tr> 1181 1182 1183<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> 1184<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 1185</pre></td></tr> 1186 1187 1188<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> 1189<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 1190 1191Given 1192 namespace ns { 1193 struct A { static void f(); }; 1194 void A::f() {} 1195 void g() { A::f(); } 1196 } 1197 ns::A a; 1198nestedNameSpecifier() 1199 matches "ns::" and both "A::" 1200</pre></td></tr> 1201 1202 1203<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> 1204<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause. 1205 1206Given 1207 1208 #pragma omp parallel default(none) 1209 #pragma omp parallel default(shared) 1210 #pragma omp parallel default(firstprivate) 1211 #pragma omp parallel 1212 1213``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and 1214``default(firstprivate)`` 1215</pre></td></tr> 1216 1217 1218<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> 1219<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 1220</pre></td></tr> 1221 1222 1223<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> 1224<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension). 1225 1226Given 1227 FOO: bar(); 1228 void *ptr = &&FOO; 1229 goto *bar; 1230addrLabelExpr() 1231 matches '&&FOO' 1232</pre></td></tr> 1233 1234 1235<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>>...</td></tr> 1236<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 1237 1238Given 1239 int i = a[1]; 1240arraySubscriptExpr() 1241 matches "a[1]" 1242</pre></td></tr> 1243 1244 1245<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> 1246<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 1247 1248 int i = 100; 1249 __asm("mov al, 2"); 1250asmStmt() 1251 matches '__asm("mov al, 2")' 1252</pre></td></tr> 1253 1254 1255<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>>...</td></tr> 1256<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins. 1257Example matches __atomic_load_n(ptr, 1) 1258 void foo() { int *ptr; __atomic_load_n(ptr, 1); } 1259</pre></td></tr> 1260 1261 1262<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> 1263<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement. 1264 1265Given 1266 @autoreleasepool { 1267 int x = 0; 1268 } 1269autoreleasePoolStmt(stmt()) matches the declaration of "x" 1270inside the autorelease pool. 1271</pre></td></tr> 1272 1273 1274<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> 1275<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension). 1276 1277Example matches a ?: b 1278 (a ?: b) + 42; 1279</pre></td></tr> 1280 1281 1282<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>>...</td></tr> 1283<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 1284 1285Example matches a || b 1286 !(a || b) 1287See also the binaryOperation() matcher for more-general matching. 1288</pre></td></tr> 1289 1290 1291<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>>...</td></tr> 1292<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block. 1293 1294Example: matches "^{}": 1295 void f() { ^{}(); } 1296</pre></td></tr> 1297 1298 1299<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>>...</td></tr> 1300<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 1301 1302Given 1303 while (true) { break; } 1304breakStmt() 1305 matches 'break' 1306</pre></td></tr> 1307 1308 1309<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>>...</td></tr> 1310<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 1311 1312Example: Matches (int) 2.2f in 1313 int i = (int) 2.2f; 1314</pre></td></tr> 1315 1316 1317<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> 1318<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 1319 1320Example matches x.y() and y() 1321 X x; 1322 x.y(); 1323 y(); 1324</pre></td></tr> 1325 1326 1327<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> 1328<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 1329 1330Given 1331 switch(a) { case 42: break; default: break; } 1332caseStmt() 1333 matches 'case 42:'. 1334</pre></td></tr> 1335 1336 1337<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> 1338<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 1339 1340Example: castExpr() matches each of the following: 1341 (int) 3; 1342 const_cast<Expr *>(SubExpr); 1343 char c = 0; 1344but does not match 1345 int i = (0); 1346 int k = 0; 1347</pre></td></tr> 1348 1349 1350<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> 1351<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 1352 1353Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 1354though. 1355 1356Example matches 'a', L'a' 1357 char ch = 'a'; 1358 wchar_t chw = L'a'; 1359</pre></td></tr> 1360 1361 1362<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> 1363<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr. 1364</pre></td></tr> 1365 1366 1367<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> 1368<tr><td colspan="4" class="doc" id="coawaitExpr0"><pre>Matches co_await expressions. 1369 1370Given 1371 co_await 1; 1372coawaitExpr() 1373 matches 'co_await 1' 1374</pre></td></tr> 1375 1376 1377<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> 1378<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 1379 1380Example match: {1}, (1, 2) 1381 int array[4] = {1}; 1382 vector int myvec = (vector int)(1, 2); 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('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>>...</td></tr> 1387<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 1388 1389Example matches '{}' and '{{}}' in 'for (;;) {{}}' 1390 for (;;) {{}} 1391</pre></td></tr> 1392 1393 1394<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>>...</td></tr> 1395<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 1396 1397Example matches a ? b : c 1398 (a ? b : c) + 42 1399</pre></td></tr> 1400 1401 1402<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> 1403<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper. 1404 1405Example matches the constant in the case statement: 1406 (matcher = constantExpr()) 1407 switch (a) { 1408 case 37: break; 1409 } 1410</pre></td></tr> 1411 1412 1413<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> 1414<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 1415 1416Given 1417 while (true) { continue; } 1418continueStmt() 1419 matches 'continue' 1420</pre></td></tr> 1421 1422 1423<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> 1424<tr><td colspan="4" class="doc" id="coreturnStmt0"><pre>Matches co_return statements. 1425 1426Given 1427 while (true) { co_return; } 1428coreturnStmt() 1429 matches 'co_return' 1430</pre></td></tr> 1431 1432 1433<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('coyieldExpr0')"><a name="coyieldExpr0Anchor">coyieldExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoyieldExpr.html">CoyieldExpr</a>>...</td></tr> 1434<tr><td colspan="4" class="doc" id="coyieldExpr0"><pre>Matches co_yield expressions. 1435 1436Given 1437 co_yield 1; 1438coyieldExpr() 1439 matches 'co_yield 1' 1440</pre></td></tr> 1441 1442 1443<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>>...</td></tr> 1444<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 1445 1446Example matches, 1447 kernel<<<i,j>>>(); 1448</pre></td></tr> 1449 1450 1451<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>>...</td></tr> 1452<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 1453 1454Example matches FunctionTakesString(GetStringByValue()) 1455 (matcher = cxxBindTemporaryExpr()) 1456 FunctionTakesString(GetStringByValue()); 1457 FunctionTakesStringByPointer(GetStringPointer()); 1458</pre></td></tr> 1459 1460 1461<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> 1462<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 1463 1464Example matches true 1465 true 1466</pre></td></tr> 1467 1468 1469<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> 1470<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 1471 1472 try {} catch(int i) {} 1473cxxCatchStmt() 1474 matches 'catch(int i)' 1475</pre></td></tr> 1476 1477 1478<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> 1479<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 1480 1481Example: Matches const_cast<int*>(&r) in 1482 int n = 42; 1483 const int &r(n); 1484 int* p = const_cast<int*>(&r); 1485</pre></td></tr> 1486 1487 1488<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> 1489<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 1490 1491Example matches string(ptr, n) and ptr within arguments of f 1492 (matcher = cxxConstructExpr()) 1493 void f(const string &a, const string &b); 1494 char *ptr; 1495 int n; 1496 f(string(ptr, n), ptr); 1497</pre></td></tr> 1498 1499 1500<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> 1501<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 1502 1503Example matches the CXXDefaultArgExpr placeholder inserted for the 1504 default value of the second parameter in the call expression f(42) 1505 (matcher = cxxDefaultArgExpr()) 1506 void f(int x, int y = 0); 1507 f(42); 1508</pre></td></tr> 1509 1510 1511<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> 1512<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 1513 1514Given 1515 delete X; 1516cxxDeleteExpr() 1517 matches 'delete X'. 1518</pre></td></tr> 1519 1520 1521<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> 1522<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be 1523resolved because the base expression or the member name was dependent. 1524 1525Given 1526 template <class T> void f() { T t; t.g(); } 1527cxxDependentScopeMemberExpr() 1528 matches t.g 1529</pre></td></tr> 1530 1531 1532<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> 1533<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 1534 1535Example: 1536 cxxDynamicCastExpr() 1537matches 1538 dynamic_cast<D*>(&b); 1539in 1540 struct B { virtual ~B() {} }; struct D : B {}; 1541 B b; 1542 D* p = dynamic_cast<D*>(&b); 1543</pre></td></tr> 1544 1545 1546<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> 1547<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 1548 1549cxxForRangeStmt() matches 'for (auto a : i)' 1550 int i[] = {1, 2, 3}; for (auto a : i); 1551 for(int j = 0; j < 5; ++j); 1552</pre></td></tr> 1553 1554 1555<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> 1556<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 1557 1558Example: Matches Foo(bar); 1559 Foo f = bar; 1560 Foo g = (Foo) bar; 1561 Foo h = Foo(bar); 1562</pre></td></tr> 1563 1564 1565<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr> 1566<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 1567 1568Example matches x.y() 1569 X x; 1570 x.y(); 1571</pre></td></tr> 1572 1573 1574<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> 1575<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 1576 1577Given 1578 new X; 1579cxxNewExpr() 1580 matches 'new X'. 1581</pre></td></tr> 1582 1583 1584<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> 1585<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions. 1586 1587Given 1588 bool a() noexcept; 1589 bool b() noexcept(true); 1590 bool c() noexcept(false); 1591 bool d() noexcept(noexcept(a())); 1592 bool e = noexcept(b()) || noexcept(c()); 1593cxxNoexceptExpr() 1594 matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`. 1595 doesn't match the noexcept specifier in the declarations a, b, c or d. 1596</pre></td></tr> 1597 1598 1599<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> 1600<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 1601</pre></td></tr> 1602 1603 1604<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr> 1605<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 1606 1607Note that if an operator isn't overloaded, it won't match. Instead, use 1608binaryOperator matcher. 1609Currently it does not match operators such as new delete. 1610FIXME: figure out why these do not match? 1611 1612Example matches both operator<<((o << b), c) and operator<<(o, b) 1613 (matcher = cxxOperatorCallExpr()) 1614 ostream &operator<< (ostream &out, int i) { }; 1615 ostream &o; int b = 1, c = 1; 1616 o << b << c; 1617See also the binaryOperation() matcher for more-general matching of binary 1618uses of this AST node. 1619</pre></td></tr> 1620 1621 1622<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> 1623<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 1624 1625Either the source expression or the destination type can be matched 1626using has(), but hasDestinationType() is more specific and can be 1627more readable. 1628 1629Example matches reinterpret_cast<char*>(&p) in 1630 void* p = reinterpret_cast<char*>(&p); 1631</pre></td></tr> 1632 1633 1634<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> 1635<tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators 1636 1637Example matches use of "<": 1638 #include <compare> 1639 struct HasSpaceshipMem { 1640 int a; 1641 constexpr auto operator<=>(const HasSpaceshipMem&) const = default; 1642 }; 1643 void compare() { 1644 HasSpaceshipMem hs1, hs2; 1645 if (hs1 < hs2) 1646 return; 1647 } 1648See also the binaryOperation() matcher for more-general matching 1649of this AST node. 1650</pre></td></tr> 1651 1652 1653<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>>...</td></tr> 1654<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 1655 1656See also: hasDestinationType 1657See also: reinterpretCast 1658 1659Example: 1660 cxxStaticCastExpr() 1661matches 1662 static_cast<long>(8) 1663in 1664 long eight(static_cast<long>(8)); 1665</pre></td></tr> 1666 1667 1668<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> 1669<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions. 1670 1671Given 1672 std::vector<int> a({ 1, 2, 3 }); 1673 std::vector<int> b = { 4, 5 }; 1674 int c[] = { 6, 7 }; 1675 std::pair<int, int> d = { 8, 9 }; 1676cxxStdInitializerListExpr() 1677 matches "{ 1, 2, 3 }" and "{ 4, 5 }" 1678</pre></td></tr> 1679 1680 1681<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>...</td></tr> 1682<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 1683 1684Example: Matches Foo(bar, bar) 1685 Foo h = Foo(bar, bar); 1686</pre></td></tr> 1687 1688 1689<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> 1690<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 1691 1692Example matches the implicit this expression in "return i". 1693 (matcher = cxxThisExpr()) 1694struct foo { 1695 int i; 1696 int f() { return i; } 1697}; 1698</pre></td></tr> 1699 1700 1701<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>>...</td></tr> 1702<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 1703 1704 try { throw 5; } catch(int i) {} 1705cxxThrowExpr() 1706 matches 'throw 5' 1707</pre></td></tr> 1708 1709 1710<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> 1711<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 1712 1713 try {} catch(int i) {} 1714cxxTryStmt() 1715 matches 'try {}' 1716</pre></td></tr> 1717 1718 1719<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>...</td></tr> 1720<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 1721 1722Example matches T(t) in return statement of f 1723 (matcher = cxxUnresolvedConstructExpr()) 1724 template <typename T> 1725 void f(const T& t) { return T(t); } 1726</pre></td></tr> 1727 1728 1729<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> 1730<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 1731 1732Example matches x in if (x) 1733 bool x; 1734 if (x) {} 1735</pre></td></tr> 1736 1737 1738<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> 1739<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 1740 1741Given 1742 int a; 1743declStmt() 1744 matches 'int a'. 1745</pre></td></tr> 1746 1747 1748<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>>...</td></tr> 1749<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 1750 1751Given 1752 switch(a) { case 42: break; default: break; } 1753defaultStmt() 1754 matches 'default:'. 1755</pre></td></tr> 1756 1757 1758<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> 1759<tr><td colspan="4" class="doc" id="dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent 1760</pre></td></tr> 1761 1762 1763<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>>...</td></tr> 1764<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8]. 1765 1766Example: Matches { [2].y = 1.0, [0].x = 1.0 } 1767 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 1768</pre></td></tr> 1769 1770 1771<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>>...</td></tr> 1772<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 1773 1774Given 1775 do {} while (true); 1776doStmt() 1777 matches 'do {} while(true)' 1778</pre></td></tr> 1779 1780 1781<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> 1782<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 1783 1784Matches any cast expression written in user code, whether it be a 1785C-style cast, a functional-style cast, or a keyword cast. 1786 1787Does not match implicit conversions. 1788 1789Note: the name "explicitCast" is chosen to match Clang's terminology, as 1790Clang uses the term "cast" to apply to implicit conversions as well as to 1791actual cast expressions. 1792 1793See also: hasDestinationType. 1794 1795Example: matches all five of the casts in 1796 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 1797but does not match the implicit conversion in 1798 long ell = 42; 1799</pre></td></tr> 1800 1801 1802<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> 1803<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 1804 1805Example matches x() 1806 void f() { x(); } 1807</pre></td></tr> 1808 1809 1810<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> 1811<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 1812of the sub-expression's evaluation. 1813 1814Example matches std::string() 1815 const std::string str = std::string(); 1816</pre></td></tr> 1817 1818 1819<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> 1820<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals 1821</pre></td></tr> 1822 1823 1824<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>...</td></tr> 1825<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g. 18261.0, 1.0f, 1.0L and 1e10. 1827 1828Does not match implicit conversions such as 1829 float a = 10; 1830</pre></td></tr> 1831 1832 1833<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>>...</td></tr> 1834<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 1835 1836Example matches 'for (;;) {}' 1837 for (;;) {} 1838 int i[] = {1, 2, 3}; for (auto a : i); 1839</pre></td></tr> 1840 1841 1842<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> 1843<tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression. 1844</pre></td></tr> 1845 1846 1847<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> 1848<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 1849</pre></td></tr> 1850 1851 1852<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> 1853<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 1854 1855Given 1856 goto FOO; 1857 FOO: bar(); 1858gotoStmt() 1859 matches 'goto FOO' 1860</pre></td></tr> 1861 1862 1863<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> 1864<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 1865 1866Example matches 'if (x) {}' 1867 if (x) {} 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('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>>...</td></tr> 1872<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating 1873point literals e.g.: 1i, 1.0i 1874</pre></td></tr> 1875 1876 1877<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>>...</td></tr> 1878<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 1879 1880This matches many different places, including function call return value 1881eliding, as well as any type conversions. 1882</pre></td></tr> 1883 1884 1885<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> 1886<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions. 1887 1888Given 1889 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 1890implicitValueInitExpr() 1891 matches "[0].y" (implicitly) 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('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>>...</td></tr> 1896<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 1897 1898Given 1899 int a[] = { 1, 2 }; 1900 struct B { int x, y; }; 1901 B b = { 5, 6 }; 1902initListExpr() 1903 matches "{ 1, 2 }" and "{ 5, 6 }" 1904</pre></td></tr> 1905 1906 1907<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> 1908<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g. 19091, 1L, 0x1 and 1U. 1910 1911Does not match character-encoded integers such as L'a'. 1912</pre></td></tr> 1913 1914 1915<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> 1916<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 1917 1918Given 1919 goto FOO; 1920 FOO: bar(); 1921labelStmt() 1922 matches 'FOO:' 1923</pre></td></tr> 1924 1925 1926<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> 1927<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1928 1929Example matches [&](){return 5;} 1930 [&](){return 5;} 1931</pre></td></tr> 1932 1933 1934<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> 1935<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1936 1937Example: Given 1938 struct T {void func();}; 1939 T f(); 1940 void g(T); 1941materializeTemporaryExpr() matches 'f()' in these statements 1942 T u(f()); 1943 g(f()); 1944 f().func(); 1945but does not match 1946 f(); 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('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>...</td></tr> 1951<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1952 1953Given 1954 class Y { 1955 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1956 int a; static int b; 1957 }; 1958memberExpr() 1959 matches this->x, x, y.x, a, this->b 1960</pre></td></tr> 1961 1962 1963<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>>...</td></tr> 1964<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1965 1966 foo();; 1967nullStmt() 1968 matches the second ';' 1969</pre></td></tr> 1970 1971 1972<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>>...</td></tr> 1973<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements. 1974 1975Example matches @catch 1976 @try {} 1977 @catch (...) {} 1978</pre></td></tr> 1979 1980 1981<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> 1982<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements. 1983 1984Example matches @finally 1985 @try {} 1986 @finally {} 1987</pre></td></tr> 1988 1989 1990<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> 1991<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar. 1992 1993Example: matches "a" in "init" method: 1994@implementation A { 1995 NSString *a; 1996} 1997- (void) init { 1998 a = @"hello"; 1999} 2000</pre></td></tr> 2001 2002 2003<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>>...</td></tr> 2004<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 2005 2006The innermost message send invokes the "alloc" class method on the 2007NSString class, while the outermost message send invokes the 2008"initWithString" instance method on the object returned from 2009NSString's "alloc". This matcher should match both message sends. 2010 [[NSString alloc] initWithString:@"Hello"] 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('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>>...</td></tr> 2015<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements. 2016 2017Example matches @throw obj; 2018</pre></td></tr> 2019 2020 2021<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> 2022<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements. 2023 2024Example matches @try 2025 @try {} 2026 @catch (...) {} 2027</pre></td></tr> 2028 2029 2030<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> 2031<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive. 2032 2033Given 2034 2035 #pragma omp parallel 2036 #pragma omp parallel default(none) 2037 #pragma omp taskyield 2038 2039``ompExecutableDirective()`` matches ``omp parallel``, 2040``omp parallel default(none)`` and ``omp taskyield``. 2041</pre></td></tr> 2042 2043 2044<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> 2045<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers 2046to reference another expressions and can be met 2047in BinaryConditionalOperators, for example. 2048 2049Example matches 'a' 2050 (a ?: c) + 42; 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('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>>...</td></tr> 2055<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions. 2056 2057Example matches (foo() + 1) 2058 int foo() { return 1; } 2059 int a = (foo() + 1); 2060</pre></td></tr> 2061 2062 2063<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>>...</td></tr> 2064<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions. 2065ParenListExprs don't have a predefined type and are used for late parsing. 2066In the final AST, they can be met in template declarations. 2067 2068Given 2069 template<typename T> class X { 2070 void f() { 2071 X x(*this); 2072 int a = 0, b = 1; int i = (a, b); 2073 } 2074 }; 2075parenListExpr() matches "*this" but NOT matches (a, b) because (a, b) 2076has a predefined type and is a ParenExpr, not a ParenListExpr. 2077</pre></td></tr> 2078 2079 2080<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>>...</td></tr> 2081<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2]. 2082 2083Example: Matches __func__ 2084 printf("%s", __func__); 2085</pre></td></tr> 2086 2087 2088<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> 2089<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 2090 2091Given 2092 return 1; 2093returnStmt() 2094 matches 'return 1' 2095</pre></td></tr> 2096 2097 2098<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>...</td></tr> 2099<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 2100 2101Given 2102 { ++a; } 2103stmt() 2104 matches both the compound statement '{ ++a; }' and '++a'. 2105</pre></td></tr> 2106 2107 2108<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> 2109<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension). 2110 2111Example match: ({ int X = 4; X; }) 2112 int C = ({ int X = 4; X; }); 2113</pre></td></tr> 2114 2115 2116<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> 2117<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 2118 2119Example matches "abcd", L"abcd" 2120 char *s = "abcd"; 2121 wchar_t *ws = L"abcd"; 2122</pre></td></tr> 2123 2124 2125<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> 2126<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 2127 2128Given 2129 template <int N> 2130 struct A { static const int n = N; }; 2131 struct B : public A<42> {}; 2132substNonTypeTemplateParmExpr() 2133 matches "N" in the right-hand side of "static const int n = N;" 2134</pre></td></tr> 2135 2136 2137<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> 2138<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 2139 2140Given 2141 switch(a) { case 42: break; default: break; } 2142switchCase() 2143 matches 'case 42:' and 'default:'. 2144</pre></td></tr> 2145 2146 2147<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> 2148<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 2149 2150Given 2151 switch(a) { case 42: break; default: break; } 2152switchStmt() 2153 matches 'switch(a)'. 2154</pre></td></tr> 2155 2156 2157<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> 2158<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 2159 2160Given 2161 Foo x = bar; 2162 int y = sizeof(x) + alignof(x); 2163unaryExprOrTypeTraitExpr() 2164 matches sizeof(x) and alignof(x) 2165</pre></td></tr> 2166 2167 2168<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> 2169<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 2170 2171Example matches !a 2172 !a || b 2173</pre></td></tr> 2174 2175 2176<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> 2177<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing 2178but could not be resolved to a specific declaration. 2179 2180Given 2181 template<typename T> 2182 T foo() { T a; return a; } 2183 template<typename T> 2184 void bar() { 2185 foo<T>(); 2186 } 2187unresolvedLookupExpr() 2188 matches foo<T>() </pre></td></tr> 2189 2190 2191<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> 2192<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions. 2193 2194Given 2195 struct X { 2196 template <class T> void f(); 2197 void g(); 2198 }; 2199 template <class T> void h() { X x; x.f<T>(); x.g(); } 2200unresolvedMemberExpr() 2201 matches x.f<T> 2202</pre></td></tr> 2203 2204 2205<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> 2206<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 2207 2208Example match: "foo"_suffix 2209</pre></td></tr> 2210 2211 2212<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> 2213<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 2214 2215Given 2216 while (true) {} 2217whileStmt() 2218 matches 'while (true) {}'. 2219</pre></td></tr> 2220 2221 2222<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> 2223<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info). 2224 2225Given 2226 template <typename T> struct C {}; 2227 C<int> c; 2228templateArgumentLoc() 2229 matches 'int' in C<int>. 2230</pre></td></tr> 2231 2232 2233<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> 2234<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 2235 2236Given 2237 template <typename T> struct C {}; 2238 C<int> c; 2239templateArgument() 2240 matches 'int' in C<int>. 2241</pre></td></tr> 2242 2243 2244<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> 2245<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name. 2246 2247Given 2248 template <typename T> class X { }; 2249 X<int> xi; 2250templateName() 2251 matches 'X' in X<int>. 2252</pre></td></tr> 2253 2254 2255<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> 2256<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 2257</pre></td></tr> 2258 2259 2260<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> 2261<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 2262 2263Given 2264 int a[] = { 2, 3 }; 2265 int b[4]; 2266 void f() { int c[a[0]]; } 2267arrayType() 2268 matches "int a[]", "int b[4]" and "int c[a[0]]"; 2269</pre></td></tr> 2270 2271 2272<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> 2273<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 2274 2275Given 2276 _Atomic(int) i; 2277atomicType() 2278 matches "_Atomic(int) i" 2279</pre></td></tr> 2280 2281 2282<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> 2283<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 2284 2285Given: 2286 auto n = 4; 2287 int v[] = { 2, 3 } 2288 for (auto i : v) { } 2289autoType() 2290 matches "auto n" and "auto i" 2291</pre></td></tr> 2292 2293 2294<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> 2295<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 2296"void (^)(int)". 2297 2298The pointee is always required to be a FunctionType. 2299</pre></td></tr> 2300 2301 2302<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>>...</td></tr> 2303<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 2304 2305Given 2306 struct A {}; 2307 A a; 2308 int b; 2309 float c; 2310 bool d; 2311builtinType() 2312 matches "int b", "float c" and "bool d" 2313</pre></td></tr> 2314 2315 2316<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>>...</td></tr> 2317<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 2318 2319Given 2320 _Complex float f; 2321complexType() 2322 matches "_Complex float f" 2323</pre></td></tr> 2324 2325 2326<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> 2327<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 2328 2329Given 2330 void() { 2331 int a[2]; 2332 int b[] = { 2, 3 }; 2333 int c[b[0]]; 2334 } 2335constantArrayType() 2336 matches "int a[2]" 2337</pre></td></tr> 2338 2339 2340<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> 2341<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 2342Example matches i[] in declaration of f. 2343 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 2344Example matches i[1]. 2345 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 2346 void f(int i[]) { 2347 i[1] = 0; 2348 } 2349</pre></td></tr> 2350 2351 2352<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> 2353<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(<expr>) types. 2354 2355Given: 2356 short i = 1; 2357 int j = 42; 2358 decltype(i + j) result = i + j; 2359decltypeType() 2360 matches "decltype(i + j)" 2361</pre></td></tr> 2362 2363 2364<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>>...</td></tr> 2365<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class 2366template types. 2367 2368Given 2369 template <typename T> 2370 class C { public: C(T); }; 2371 2372 C c(123); 2373deducedTemplateSpecializationType() matches the type in the declaration 2374of the variable c. 2375</pre></td></tr> 2376 2377 2378<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> 2379<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 2380 2381Given 2382 template<typename T, int Size> 2383 class array { 2384 T data[Size]; 2385 }; 2386dependentSizedArrayType 2387 matches "T data[Size]" 2388</pre></td></tr> 2389 2390 2391<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> 2392<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 2393qualified name. 2394 2395Given 2396 namespace N { 2397 namespace M { 2398 class D {}; 2399 } 2400 } 2401 class C {}; 2402 2403 class C c; 2404 N::M::D d; 2405 2406elaboratedType() matches the type of the variable declarations of both 2407c and d. 2408</pre></td></tr> 2409 2410 2411<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>...</td></tr> 2412<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types. 2413 2414Given 2415 enum C { Green }; 2416 enum class S { Red }; 2417 2418 C c; 2419 S s; 2420 2421enumType() matches the type of the variable declarations of both c and 2422s. 2423</pre></td></tr> 2424 2425 2426<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> 2427<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes. 2428 2429Given 2430 int (*f)(int); 2431 void g(); 2432functionProtoType() 2433 matches "int (*f)(int)" and the type of "g" in C++ mode. 2434 In C mode, "g" is not matched because it does not contain a prototype. 2435</pre></td></tr> 2436 2437 2438<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>>...</td></tr> 2439<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 2440 2441Given 2442 int (*f)(int); 2443 void g(); 2444functionType() 2445 matches "int (*f)(int)" and the type of "g". 2446</pre></td></tr> 2447 2448 2449<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> 2450<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 2451 2452Given 2453 int a[] = { 2, 3 }; 2454 int b[42]; 2455 void f(int c[]) { int d[a[0]]; }; 2456incompleteArrayType() 2457 matches "int a[]" and "int c[]" 2458</pre></td></tr> 2459 2460 2461<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> 2462<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 2463 2464Example matches S s, but not S<T> s. 2465 (matcher = parmVarDecl(hasType(injectedClassNameType()))) 2466 template <typename T> struct S { 2467 void f(S s); 2468 void g(S<T> s); 2469 }; 2470</pre></td></tr> 2471 2472 2473<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> 2474<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 2475 2476Given: 2477 int *a; 2478 int &b = *a; 2479 int &&c = 1; 2480 auto &d = b; 2481 auto &&e = c; 2482 auto &&f = 2; 2483 int g = 5; 2484 2485lValueReferenceType() matches the types of b, d, and e. e is 2486matched since the type is deduced as int& by reference collapsing rules. 2487</pre></td></tr> 2488 2489 2490<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> 2491<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 2492Given 2493 struct A { int i; } 2494 A::* ptr = A::i; 2495memberPointerType() 2496 matches "A::* ptr" 2497</pre></td></tr> 2498 2499 2500<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> 2501<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 2502a pointer type, despite being syntactically similar. 2503 2504Given 2505 int *a; 2506 2507 @interface Foo 2508 @end 2509 Foo *f; 2510pointerType() 2511 matches "Foo *f", but does not match "int *a". 2512</pre></td></tr> 2513 2514 2515<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> 2516<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 2517 2518Given 2519 int (*ptr_to_array)[4]; 2520 int *array_of_ptrs[4]; 2521 2522varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 2523array_of_ptrs. 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('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>...</td></tr> 2528<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 2529types. 2530 2531Given 2532 int *a; 2533 int &b = *a; 2534 int c = 5; 2535 2536 @interface Foo 2537 @end 2538 Foo *f; 2539pointerType() 2540 matches "int *a", but does not match "Foo *f". 2541</pre></td></tr> 2542 2543 2544<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>>...</td></tr> 2545<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 2546 2547Given: 2548 int *a; 2549 int &b = *a; 2550 int &&c = 1; 2551 auto &d = b; 2552 auto &&e = c; 2553 auto &&f = 2; 2554 int g = 5; 2555 2556rValueReferenceType() matches the types of c and f. e is not 2557matched as it is deduced to int& by reference collapsing rules. 2558</pre></td></tr> 2559 2560 2561<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> 2562<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 2563 2564Given 2565 class C {}; 2566 struct S {}; 2567 2568 C c; 2569 S s; 2570 2571recordType() matches the type of the variable declarations of both c 2572and s. 2573</pre></td></tr> 2574 2575 2576<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> 2577<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 2578 2579Given 2580 int *a; 2581 int &b = *a; 2582 int &&c = 1; 2583 auto &d = b; 2584 auto &&e = c; 2585 auto &&f = 2; 2586 int g = 5; 2587 2588referenceType() matches the types of b, c, d, e, and f. 2589</pre></td></tr> 2590 2591 2592<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> 2593<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 2594template type parameter. 2595 2596Given 2597 template <typename T> 2598 void F(T t) { 2599 int i = 1 + t; 2600 } 2601 2602substTemplateTypeParmType() matches the type of 't' but not '1' 2603</pre></td></tr> 2604 2605 2606<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> 2607<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types). 2608 2609Given 2610 enum E {}; 2611 class C {}; 2612 2613 E e; 2614 C c; 2615 2616tagType() matches the type of the variable declarations of both e 2617and c. 2618</pre></td></tr> 2619 2620 2621<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> 2622<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 2623 2624Given 2625 template <typename T> 2626 class C { }; 2627 2628 template class C<int>; // A 2629 C<char> var; // B 2630 2631templateSpecializationType() matches the type of the explicit 2632instantiation in A and the type of the variable declaration in B. 2633</pre></td></tr> 2634 2635 2636<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> 2637<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 2638 2639Example matches T, but not int. 2640 (matcher = templateTypeParmType()) 2641 template <typename T> void f(int i); 2642</pre></td></tr> 2643 2644 2645<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> 2646<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 2647</pre></td></tr> 2648 2649 2650<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> 2651<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 2652 2653Given 2654 typedef int X; 2655typedefType() 2656 matches "typedef int X" 2657</pre></td></tr> 2658 2659 2660<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> 2661<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 2662 2663Given: 2664 typedef __underlying_type(T) type; 2665unaryTransformType() 2666 matches "__underlying_type(T)" 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('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>>...</td></tr> 2671<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 2672integer-constant-expression. 2673 2674Given 2675 void f() { 2676 int a[] = { 2, 3 } 2677 int b[42]; 2678 int c[a[0]]; 2679 } 2680variableArrayType() 2681 matches "int c[a[0]]" 2682</pre></td></tr> 2683 2684<!--END_DECL_MATCHERS --> 2685</table> 2686 2687<!-- ======================================================================= --> 2688<h2 id="narrowing-matchers">Narrowing Matchers</h2> 2689<!-- ======================================================================= --> 2690 2691<p>Narrowing matchers match certain attributes on the current node, thus 2692narrowing down the set of nodes of the current type to match on.</p> 2693 2694<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 2695which allow users to create more powerful match expressions.</p> 2696 2697<table> 2698<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 2699<!-- START_NARROWING_MATCHERS --> 2700 2701<tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2702<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 2703 2704Usable as: Any Matcher 2705</pre></td></tr> 2706 2707 2708<tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2709<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 2710 2711Usable as: Any Matcher 2712</pre></td></tr> 2713 2714 2715<tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 2716<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 2717 2718Useful when another matcher requires a child matcher, but there's no 2719additional constraint. This will often be used with an explicit conversion 2720to an internal::Matcher<> type such as TypeMatcher. 2721 2722Example: DeclarationMatcher(anything()) matches all declarations, e.g., 2723"int* p" and "void f()" in 2724 int* p; 2725 void f(); 2726 2727Usable as: Any Matcher 2728</pre></td></tr> 2729 2730 2731<tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr> 2732<tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within 2733 2734Given 2735 if (true); 2736 for (; true; ); 2737with the matcher 2738 mapAnyOf(ifStmt, forStmt).with( 2739 hasCondition(cxxBoolLiteralExpr(equals(true))) 2740 ).bind("trueCond") 2741matches the if and the for. It is equivalent to: 2742 auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true))); 2743 anyOf( 2744 ifStmt(trueCond).bind("trueCond"), 2745 forStmt(trueCond).bind("trueCond") 2746 ); 2747 2748The with() chain-call accepts zero or more matchers which are combined 2749as-if with allOf() in each of the node matchers. 2750Usable as: Any Matcher 2751</pre></td></tr> 2752 2753 2754<tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 2755<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 2756 2757Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 2758 class X {}; 2759 class Y {}; 2760 2761Usable as: Any Matcher 2762</pre></td></tr> 2763 2764 2765<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> 2766<tr><td colspan="4" class="doc" id="isImplicit1"><pre>Matches an entity that has been implicitly added by the compiler (e.g. 2767implicit default/copy constructors). 2768</pre></td></tr> 2769 2770 2771<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> 2772<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the 2773specified names. 2774 2775 hasAnyOperatorName("+", "-") 2776 Is equivalent to 2777 anyOf(hasOperatorName("+"), hasOperatorName("-")) 2778</pre></td></tr> 2779 2780 2781<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> 2782<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 2783unary). 2784 2785Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 2786 !(a || b) 2787</pre></td></tr> 2788 2789 2790<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> 2791<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators. 2792 2793Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2794 if (a == b) 2795 a += b; 2796 2797Example 2: matches s1 = s2 2798 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2799 struct S { S& operator=(const S&); }; 2800 void x() { S s1, s2; s1 = s2; } 2801</pre></td></tr> 2802 2803 2804<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> 2805<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators. 2806 2807Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 2808 if (a == b) 2809 a += b; 2810 2811Example 2: matches s1 < s2 2812 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 2813 struct S { bool operator<(const S& other); }; 2814 void x(S s1, S s2) { bool b1 = s1 < s2; } 2815</pre></td></tr> 2816 2817 2818<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> 2819<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private 2820inheritance. 2821 2822Examples: 2823 class C { 2824 public: int a; 2825 protected: int b; 2826 private: int c; // fieldDecl(isPrivate()) matches 'c' 2827 }; 2828 2829 struct Base {}; 2830 struct Derived1 : private Base {}; // matches 'Base' 2831 class Derived2 : Base {}; // matches 'Base' 2832</pre></td></tr> 2833 2834 2835<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> 2836<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify 2837protected inheritance. 2838 2839Examples: 2840 class C { 2841 public: int a; 2842 protected: int b; // fieldDecl(isProtected()) matches 'b' 2843 private: int c; 2844 }; 2845 2846 class Base {}; 2847 class Derived : protected Base {}; // matches 'Base' 2848</pre></td></tr> 2849 2850 2851<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> 2852<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public 2853inheritance. 2854 2855Examples: 2856 class C { 2857 public: int a; // fieldDecl(isPublic()) matches 'a' 2858 protected: int b; 2859 private: int c; 2860 }; 2861 2862 class Base {}; 2863 class Derived1 : public Base {}; // matches 'Base' 2864 struct Derived2 : Base {}; // matches 'Base' 2865</pre></td></tr> 2866 2867 2868<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> 2869<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify 2870virtual inheritance. 2871 2872Example: 2873 class A { 2874 public: 2875 virtual void x(); // matches x 2876 }; 2877 2878Example: 2879 class Base {}; 2880 class DirectlyDerived : virtual Base {}; // matches Base 2881 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 2882 2883Usable 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>> 2884</pre></td></tr> 2885 2886 2887<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> 2888<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr> 2889 2890 2891<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> 2892<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT. 2893 2894Given 2895 f('false, 3.14, 42); 2896characterLiteral(equals(0)) 2897 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2898 match false 2899floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2900 match 3.14 2901integerLiteral(equals(42)) 2902 matches 42 2903 2904Note that you cannot directly match a negative numeric literal because the 2905minus sign is not part of the literal: It is a unary operator whose operand 2906is the positive numeric literal. Instead, you must use a unaryOperator() 2907matcher to match the minus sign: 2908 2909unaryOperator(hasOperatorName("-"), 2910 hasUnaryOperand(integerLiteral(equals(13)))) 2911 2912Usable 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>>, 2913 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>> 2914</pre></td></tr> 2915 2916 2917<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> 2918<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr> 2919 2920 2921<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> 2922<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr> 2923 2924 2925<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> 2926<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 2927 2928Given 2929 try { 2930 // ... 2931 } catch (int) { 2932 // ... 2933 } catch (...) { 2934 // ... 2935 } 2936cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 2937</pre></td></tr> 2938 2939 2940<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> 2941<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 2942a specific number of arguments (including absent default arguments). 2943 2944Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2945 void f(int x, int y); 2946 f(0, 0); 2947</pre></td></tr> 2948 2949 2950<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> 2951<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 2952</pre></td></tr> 2953 2954 2955<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> 2956<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 2957zero initialization. 2958 2959Given 2960void foo() { 2961 struct point { double x; double y; }; 2962 point pt[2] = { { 1.0, 2.0 } }; 2963} 2964initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 2965will match the implicit array filler for pt[1]. 2966</pre></td></tr> 2967 2968 2969<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> 2970<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 2971 2972Given 2973 struct S { 2974 S(); // #1 2975 S(const S &); // #2 2976 S(S &&); // #3 2977 }; 2978cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 2979</pre></td></tr> 2980 2981 2982<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> 2983<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 2984 2985Given 2986 struct S { 2987 S(); // #1 2988 S(const S &); // #2 2989 S(S &&); // #3 2990 }; 2991cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 2992</pre></td></tr> 2993 2994 2995<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> 2996<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 2997 2998Given 2999 struct S { 3000 S(); // #1 3001 S(int) {} // #2 3002 S(S &&) : S() {} // #3 3003 }; 3004 S::S() : S(0) {} // #4 3005cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 3006#1 or #2. 3007</pre></td></tr> 3008 3009 3010<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr> 3011<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations 3012that have an explicit specifier if this explicit specifier is resolved to 3013true. 3014 3015Given 3016 template<bool b> 3017 struct S { 3018 S(int); // #1 3019 explicit S(double); // #2 3020 operator int(); // #3 3021 explicit operator bool(); // #4 3022 explicit(false) S(bool) // # 7 3023 explicit(true) S(char) // # 8 3024 explicit(b) S(S) // # 9 3025 }; 3026 S(int) -> S<true> // #5 3027 explicit S(double) -> S<false> // #6 3028cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3029cxxConversionDecl(isExplicit()) will match #4, but not #3. 3030cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3031</pre></td></tr> 3032 3033 3034<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> 3035<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 3036 3037Given 3038 struct S { 3039 S(); // #1 3040 S(const S &); // #2 3041 S(S &&); // #3 3042 }; 3043cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 3044</pre></td></tr> 3045 3046 3047<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> 3048<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations 3049that have an explicit specifier if this explicit specifier is resolved to 3050true. 3051 3052Given 3053 template<bool b> 3054 struct S { 3055 S(int); // #1 3056 explicit S(double); // #2 3057 operator int(); // #3 3058 explicit operator bool(); // #4 3059 explicit(false) S(bool) // # 7 3060 explicit(true) S(char) // # 8 3061 explicit(b) S(S) // # 9 3062 }; 3063 S(int) -> S<true> // #5 3064 explicit S(double) -> S<false> // #6 3065cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3066cxxConversionDecl(isExplicit()) will match #4, but not #3. 3067cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3068</pre></td></tr> 3069 3070 3071<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> 3072<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 3073opposed to a member. 3074 3075Given 3076 struct B {}; 3077 struct D : B { 3078 int I; 3079 D(int i) : I(i) {} 3080 }; 3081 struct E : B { 3082 E() : B() {} 3083 }; 3084cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 3085 will match E(), but not match D(int). 3086</pre></td></tr> 3087 3088 3089<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> 3090<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 3091opposed to a base. 3092 3093Given 3094 struct B {}; 3095 struct D : B { 3096 int I; 3097 D(int i) : I(i) {} 3098 }; 3099 struct E : B { 3100 E() : B() {} 3101 }; 3102cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 3103 will match D(int), but not match E(). 3104</pre></td></tr> 3105 3106 3107<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> 3108<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 3109code (as opposed to implicitly added by the compiler). 3110 3111Given 3112 struct Foo { 3113 Foo() { } 3114 Foo(int) : foo_("A") { } 3115 string foo_; 3116 }; 3117cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 3118 will match Foo(int), but not Foo() 3119</pre></td></tr> 3120 3121 3122<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> 3123<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations 3124that have an explicit specifier if this explicit specifier is resolved to 3125true. 3126 3127Given 3128 template<bool b> 3129 struct S { 3130 S(int); // #1 3131 explicit S(double); // #2 3132 operator int(); // #3 3133 explicit operator bool(); // #4 3134 explicit(false) S(bool) // # 7 3135 explicit(true) S(char) // # 8 3136 explicit(b) S(S) // # 9 3137 }; 3138 S(int) -> S<true> // #5 3139 explicit S(double) -> S<false> // #6 3140cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3141cxxConversionDecl(isExplicit()) will match #4, but not #3. 3142cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3143</pre></td></tr> 3144 3145 3146<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> 3147<tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names. 3148 3149In template declarations, dependent members are not resolved and so can 3150not be matched to particular named declarations. 3151 3152This matcher allows to match on the known name of members. 3153 3154Given 3155 template <typename T> 3156 struct S { 3157 void mem(); 3158 }; 3159 template <typename T> 3160 void x() { 3161 S<T> s; 3162 s.mem(); 3163 } 3164cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()` 3165</pre></td></tr> 3166 3167 3168<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> 3169<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed 3170to '.'. 3171 3172Member calls on the implicit this pointer match as called with '->'. 3173 3174Given 3175 class Y { 3176 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3177 template <class T> void f() { this->f<T>(); f<T>(); } 3178 int a; 3179 static int b; 3180 }; 3181 template <class T> 3182 class Z { 3183 void x() { this->m; } 3184 }; 3185memberExpr(isArrow()) 3186 matches this->x, x, y.x, a, this->b 3187cxxDependentScopeMemberExpr(isArrow()) 3188 matches this->m 3189unresolvedMemberExpr(isArrow()) 3190 matches this->f<T>, f<T> 3191</pre></td></tr> 3192 3193 3194<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> 3195<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound 3196node 3197 3198In template declarations, dependent members are not resolved and so can 3199not be matched to particular named declarations. 3200 3201This matcher allows to match on the name of already-bound VarDecl, FieldDecl 3202and CXXMethodDecl nodes. 3203 3204Given 3205 template <typename T> 3206 struct S { 3207 void mem(); 3208 }; 3209 template <typename T> 3210 void x() { 3211 S<T> s; 3212 s.mem(); 3213 } 3214The matcher 3215@code 3216cxxDependentScopeMemberExpr( 3217 hasObjectExpression(declRefExpr(hasType(templateSpecializationType( 3218 hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has( 3219 cxxMethodDecl(hasName("mem")).bind("templMem") 3220 ))))) 3221 )))), 3222 memberHasSameNameAsBoundNode("templMem") 3223 ) 3224@endcode 3225first matches and binds the @c mem member of the @c S template, then 3226compares its name to the usage in @c s.mem() in the @c x function template 3227</pre></td></tr> 3228 3229 3230<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> 3231<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 3232 3233Given 3234struct A { 3235 void foo() const; 3236 void bar(); 3237}; 3238 3239cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 3240</pre></td></tr> 3241 3242 3243<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> 3244<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 3245operator. 3246 3247Given 3248struct A { 3249 A &operator=(const A &); 3250 A &operator=(A &&); 3251}; 3252 3253cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 3254the second one. 3255</pre></td></tr> 3256 3257 3258<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> 3259<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 3260 3261Given: 3262 class A final {}; 3263 3264 struct B { 3265 virtual void f(); 3266 }; 3267 3268 struct C : B { 3269 void f() final; 3270 }; 3271matches A and C::f, but not B, C, or B::f 3272</pre></td></tr> 3273 3274 3275<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> 3276<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 3277operator. 3278 3279Given 3280struct A { 3281 A &operator=(const A &); 3282 A &operator=(A &&); 3283}; 3284 3285cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 3286the first one. 3287</pre></td></tr> 3288 3289 3290<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> 3291<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 3292 3293Given 3294 class A { 3295 public: 3296 virtual void x(); 3297 }; 3298 class B : public A { 3299 public: 3300 virtual void x(); 3301 }; 3302 matches B::x 3303</pre></td></tr> 3304 3305 3306<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> 3307<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 3308 3309Given 3310 class A { 3311 public: 3312 virtual void x() = 0; 3313 }; 3314 matches A::x 3315</pre></td></tr> 3316 3317 3318<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> 3319<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 3320 3321Given 3322 struct S { 3323 S(); // #1 3324 S(const S &) = default; // #2 3325 S(S &&) = delete; // #3 3326 }; 3327cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 3328</pre></td></tr> 3329 3330 3331<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> 3332<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify 3333virtual inheritance. 3334 3335Example: 3336 class A { 3337 public: 3338 virtual void x(); // matches x 3339 }; 3340 3341Example: 3342 class Base {}; 3343 class DirectlyDerived : virtual Base {}; // matches Base 3344 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 3345 3346Usable 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>> 3347</pre></td></tr> 3348 3349 3350<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> 3351<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 3352 3353Given 3354 class A { 3355 public: 3356 virtual void x(); 3357 }; 3358 class B : public A { 3359 public: 3360 void x(); 3361 }; 3362 matches A::x but not B::x 3363</pre></td></tr> 3364 3365 3366<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> 3367<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions. 3368 3369Given: 3370 MyClass *p1 = new MyClass[10]; 3371cxxNewExpr(isArray()) 3372 matches the expression 'new MyClass[10]'. 3373</pre></td></tr> 3374 3375 3376<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> 3377<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the 3378specified names. 3379 3380 hasAnyOperatorName("+", "-") 3381 Is equivalent to 3382 anyOf(hasOperatorName("+"), hasOperatorName("-")) 3383</pre></td></tr> 3384 3385 3386<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> 3387<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names. 3388 3389Matches overloaded operator names specified in strings without the 3390"operator" prefix: e.g. "<<". 3391 3392 hasAnyOverloadedOperatorName("+", "-") 3393Is equivalent to 3394 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3395</pre></td></tr> 3396 3397 3398<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> 3399<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 3400unary). 3401 3402Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3403 !(a || b) 3404</pre></td></tr> 3405 3406 3407<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> 3408<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 3409 3410Matches overloaded operator names specified in strings without the 3411"operator" prefix: e.g. "<<". 3412 3413Given: 3414 class A { int operator*(); }; 3415 const A &operator<<(const A &a, const A &b); 3416 A a; 3417 a << a; // <-- This matches 3418 3419cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3420specified line and 3421cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3422matches the declaration of A. 3423 3424Usable 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>> 3425</pre></td></tr> 3426 3427 3428<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> 3429<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators. 3430 3431Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3432 if (a == b) 3433 a += b; 3434 3435Example 2: matches s1 = s2 3436 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3437 struct S { S& operator=(const S&); }; 3438 void x() { S s1, s2; s1 = s2; } 3439</pre></td></tr> 3440 3441 3442<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> 3443<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators. 3444 3445Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3446 if (a == b) 3447 a += b; 3448 3449Example 2: matches s1 < s2 3450 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3451 struct S { bool operator<(const S& other); }; 3452 void x(S s1, S s2) { bool b1 = s1 < s2; } 3453</pre></td></tr> 3454 3455 3456<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> 3457<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined. 3458 3459Example matches x (matcher = cxxRecordDecl(hasDefinition())) 3460class x {}; 3461class y; 3462</pre></td></tr> 3463 3464 3465<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom2')"><a name="isDerivedFrom2Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr> 3466<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 3467</pre></td></tr> 3468 3469 3470<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> 3471<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 3472</pre></td></tr> 3473 3474 3475<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> 3476<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 3477static member variable template instantiations. 3478 3479Given 3480 template<typename T> void A(T t) { } 3481 template<> void A(int N) { } 3482functionDecl(isExplicitTemplateSpecialization()) 3483 matches the specialization A<int>(). 3484 3485Usable 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>> 3486</pre></td></tr> 3487 3488 3489<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> 3490<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 3491 3492Given: 3493 class A final {}; 3494 3495 struct B { 3496 virtual void f(); 3497 }; 3498 3499 struct C : B { 3500 void f() final; 3501 }; 3502matches A and C::f, but not B, C, or B::f 3503</pre></td></tr> 3504 3505 3506<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> 3507<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 3508 3509Given: 3510 auto x = []{}; 3511 3512cxxRecordDecl(isLambda()) matches the implicit class declaration of 3513decltype(x) 3514</pre></td></tr> 3515 3516 3517<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> 3518<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for 3519isSameOrDerivedFrom(hasName(...)). 3520</pre></td></tr> 3521 3522 3523<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> 3524<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 3525member variable template instantiations. 3526 3527Given 3528 template <typename T> class X {}; class A {}; X<A> x; 3529or 3530 template <typename T> class X {}; class A {}; template class X<A>; 3531or 3532 template <typename T> class X {}; class A {}; extern template class X<A>; 3533cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3534 matches the template instantiation of X<A>. 3535 3536But given 3537 template <typename T> class X {}; class A {}; 3538 template <> class X<A> {}; X<A> x; 3539cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3540 does not match, as X<A> is an explicit template specialization. 3541 3542Usable 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>> 3543</pre></td></tr> 3544 3545 3546<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> 3547<tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the 3548specified names. 3549 3550 hasAnyOperatorName("+", "-") 3551 Is equivalent to 3552 anyOf(hasOperatorName("+"), hasOperatorName("-")) 3553</pre></td></tr> 3554 3555 3556<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> 3557<tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or 3558unary). 3559 3560Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3561 !(a || b) 3562</pre></td></tr> 3563 3564 3565<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> 3566<tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators. 3567 3568Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3569 if (a == b) 3570 a += b; 3571 3572Example 2: matches s1 = s2 3573 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3574 struct S { S& operator=(const S&); }; 3575 void x() { S s1, s2; s1 = s2; } 3576</pre></td></tr> 3577 3578 3579<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> 3580<tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators. 3581 3582Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3583 if (a == b) 3584 a += b; 3585 3586Example 2: matches s1 < s2 3587 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3588 struct S { bool operator<(const S& other); }; 3589 void x(S s1, S s2) { bool b1 = s1 < s2; } 3590</pre></td></tr> 3591 3592 3593<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> 3594<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3595a specific number of arguments (including absent default arguments). 3596 3597Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3598 void f(int x, int y); 3599 f(0, 0); 3600</pre></td></tr> 3601 3602 3603<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> 3604<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 3605a specific number of arguments (including absent default arguments). 3606 3607Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3608 void f(int x, int y); 3609 f(0, 0); 3610</pre></td></tr> 3611 3612 3613<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> 3614<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL. 3615 3616Example matches y(x) but not y(42) or NS::y(x). 3617 namespace NS { 3618 struct X {}; 3619 void y(X); 3620 } 3621 3622 void y(...); 3623 3624 void test() { 3625 NS::X x; 3626 y(x); // Matches 3627 NS::y(x); // Doesn't match 3628 y(42); // Doesn't match 3629 using NS::y; 3630 y(x); // Found by both unqualified lookup and ADL, doesn't match 3631 } 3632</pre></td></tr> 3633 3634 3635<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> 3636<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 3637 3638Example: matches the implicit cast around 0 3639(matcher = castExpr(hasCastKind(CK_NullToPointer))) 3640 int *p = 0; 3641 3642If the matcher is use from clang-query, CastKind parameter 3643should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer"). 3644</pre></td></tr> 3645 3646 3647<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> 3648<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr> 3649 3650 3651<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> 3652<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT. 3653 3654Given 3655 f('false, 3.14, 42); 3656characterLiteral(equals(0)) 3657 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3658 match false 3659floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3660 match 3.14 3661integerLiteral(equals(42)) 3662 matches 42 3663 3664Note that you cannot directly match a negative numeric literal because the 3665minus sign is not part of the literal: It is a unary operator whose operand 3666is the positive numeric literal. Instead, you must use a unaryOperator() 3667matcher to match the minus sign: 3668 3669unaryOperator(hasOperatorName("-"), 3670 hasUnaryOperand(integerLiteral(equals(13)))) 3671 3672Usable 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>>, 3673 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>> 3674</pre></td></tr> 3675 3676 3677<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> 3678<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr> 3679 3680 3681<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> 3682<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr> 3683 3684 3685<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> 3686<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 3687 3688Given 3689 template<typename T> struct C {}; 3690 C<int> c; 3691classTemplateSpecializationDecl(templateArgumentCountIs(1)) 3692 matches C<int>. 3693</pre></td></tr> 3694 3695 3696<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> 3697<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 3698child statements. 3699 3700Example: Given 3701 { for (;;) {} } 3702compoundStmt(statementCountIs(0))) 3703 matches '{}' 3704 but does not match the outer compound statement. 3705</pre></td></tr> 3706 3707 3708<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> 3709<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 3710 3711Given 3712 int a[42]; 3713 int b[2 * 21]; 3714 int c[41], d[43]; 3715 char *s = "abcd"; 3716 wchar_t *ws = L"abcd"; 3717 char *w = "a"; 3718constantArrayType(hasSize(42)) 3719 matches "int a[42]" and "int b[2 * 21]" 3720stringLiteral(hasSize(4)) 3721 matches "abcd", L"abcd" 3722</pre></td></tr> 3723 3724 3725<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> 3726<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 3727declarations. 3728 3729Example: Given 3730 int a, b; 3731 int c; 3732 int d = 2, e; 3733declCountIs(2) 3734 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 3735</pre></td></tr> 3736 3737 3738<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 3739<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 3740 3741Matches a node if it equals the node previously bound to ID. 3742 3743Given 3744 class X { int a; int b; }; 3745cxxRecordDecl( 3746 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3747 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3748 matches the class X, as a and b have the same type. 3749 3750Note that when multiple matches are involved via forEach* matchers, 3751equalsBoundNodes acts as a filter. 3752For example: 3753compoundStmt( 3754 forEachDescendant(varDecl().bind("d")), 3755 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3756will trigger a match for each combination of variable declaration 3757and reference to that variable declaration within a compound statement. 3758</pre></td></tr> 3759 3760 3761<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> 3762<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 3763 3764Decl has pointer identity in the AST. 3765</pre></td></tr> 3766 3767 3768<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> 3769<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 3770 3771Given 3772 __attribute__((device)) void f() { ... } 3773decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 3774f. If the matcher is used from clang-query, attr::Kind parameter should be 3775passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 3776</pre></td></tr> 3777 3778 3779<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> 3780<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro. 3781Does not match if only part of the statement is expanded from that macro or 3782if different parts of the the statement are expanded from different 3783appearances of the macro. 3784</pre></td></tr> 3785 3786 3787<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> 3788<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 3789partially matching a given regex. 3790 3791Example matches Y but not X 3792 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3793 #include "ASTMatcher.h" 3794 class X {}; 3795ASTMatcher.h: 3796 class Y {}; 3797 3798Usable 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>> 3799 3800If the matcher is used in clang-query, RegexFlags parameter 3801should be passed as a quoted string. e.g: "NoFlags". 3802Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3803</pre></td></tr> 3804 3805 3806<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> 3807<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 3808 3809Example matches X but not Y 3810 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3811 #include <Y.h> 3812 class X {}; 3813Y.h: 3814 class Y {}; 3815 3816Usable 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>> 3817</pre></td></tr> 3818 3819 3820<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr> 3821<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 3822 3823Example matches Y but not X 3824 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3825 #include <SystemHeader.h> 3826 class X {}; 3827SystemHeader.h: 3828 class Y {}; 3829 3830Usable 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>> 3831</pre></td></tr> 3832 3833 3834<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> 3835<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches an entity that has been implicitly added by the compiler (e.g. 3836implicit default/copy constructors). 3837</pre></td></tr> 3838 3839 3840<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> 3841<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces. 3842 3843Given 3844 class vector {}; 3845 namespace foo { 3846 class vector {}; 3847 namespace std { 3848 class vector {}; 3849 } 3850 } 3851 namespace std { 3852 inline namespace __1 { 3853 class vector {}; // #1 3854 namespace experimental { 3855 class vector {}; 3856 } 3857 } 3858 } 3859cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1. 3860</pre></td></tr> 3861 3862 3863<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> 3864<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3865template instantiations. 3866 3867Given 3868 template<typename T> void A(T t) { T i; } 3869 A(0); 3870 A(0U); 3871functionDecl(isInstantiated()) 3872 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3873</pre></td></tr> 3874 3875 3876<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> 3877<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private 3878inheritance. 3879 3880Examples: 3881 class C { 3882 public: int a; 3883 protected: int b; 3884 private: int c; // fieldDecl(isPrivate()) matches 'c' 3885 }; 3886 3887 struct Base {}; 3888 struct Derived1 : private Base {}; // matches 'Base' 3889 class Derived2 : Base {}; // matches 'Base' 3890</pre></td></tr> 3891 3892 3893<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> 3894<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify 3895protected inheritance. 3896 3897Examples: 3898 class C { 3899 public: int a; 3900 protected: int b; // fieldDecl(isProtected()) matches 'b' 3901 private: int c; 3902 }; 3903 3904 class Base {}; 3905 class Derived : protected Base {}; // matches 'Base' 3906</pre></td></tr> 3907 3908 3909<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> 3910<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public 3911inheritance. 3912 3913Examples: 3914 class C { 3915 public: int a; // fieldDecl(isPublic()) matches 'a' 3916 protected: int b; 3917 private: int c; 3918 }; 3919 3920 class Base {}; 3921 class Derived1 : public Base {}; // matches 'Base' 3922 struct Derived2 : Base {}; // matches 'Base' 3923</pre></td></tr> 3924 3925 3926<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> 3927<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 3928a specific number of designators. 3929 3930Example: Given 3931 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 3932 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 3933designatorCountIs(2) 3934 matches '{ [2].y = 1.0, [0].x = 1.0 }', 3935 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 3936</pre></td></tr> 3937 3938 3939<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> 3940<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration. 3941 3942Example matches Y (matcher = enumDecl(isScoped())) 3943enum X {}; 3944enum class Y {}; 3945</pre></td></tr> 3946 3947 3948<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> 3949<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is 3950neither type- nor value-dependent. 3951 3952In the following example, the expression sizeof(sizeof(T() + T())) 3953is instantiation-dependent (since it involves a template parameter T), 3954but is neither type- nor value-dependent, since the type of the inner 3955sizeof is known (std::size_t) and therefore the size of the outer 3956sizeof is known. 3957 template<typename T> 3958 void f(T x, T y) { sizeof(sizeof(T() + T()); } 3959expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T()) 3960</pre></td></tr> 3961 3962 3963<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> 3964<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type 3965is not yet instantiated. 3966 3967For example, the expressions "x" and "x + y" are type-dependent in 3968the following code, but "y" is not type-dependent: 3969 template<typename T> 3970 void add(T x, int y) { 3971 x + y; 3972 } 3973expr(isTypeDependent()) matches x + y 3974</pre></td></tr> 3975 3976 3977<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> 3978<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a 3979non-type template parameter. 3980 3981For example, the array bound of "Chars" in the following example is 3982value-dependent. 3983 template<int Size> int f() { return Size; } 3984expr(isValueDependent()) matches return Size 3985</pre></td></tr> 3986 3987 3988<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> 3989<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 3990GNU's __null, C++11's nullptr, or C's NULL macro. 3991 3992Given: 3993 void *v1 = NULL; 3994 void *v2 = nullptr; 3995 void *v3 = __null; // GNU extension 3996 char *cp = (char *)0; 3997 int *ip = 0; 3998 int i = 0; 3999expr(nullPointerConstant()) 4000 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 4001 initializer for i. 4002</pre></td></tr> 4003 4004 4005<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> 4006<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 4007bit width. 4008 4009Given 4010 class C { 4011 int a : 2; 4012 int b : 4; 4013 int c : 2; 4014 }; 4015fieldDecl(hasBitWidth(2)) 4016 matches 'int a;' and 'int c;' but not 'int b;'. 4017</pre></td></tr> 4018 4019 4020<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> 4021<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 4022 4023Given 4024 class C { 4025 int a : 2; 4026 int b; 4027 }; 4028fieldDecl(isBitField()) 4029 matches 'int a;' but not 'int b;'. 4030</pre></td></tr> 4031 4032 4033<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> 4034<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 4035 4036Given 4037 f('false, 3.14, 42); 4038characterLiteral(equals(0)) 4039 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4040 match false 4041floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4042 match 3.14 4043integerLiteral(equals(42)) 4044 matches 42 4045 4046Note that you cannot directly match a negative numeric literal because the 4047minus sign is not part of the literal: It is a unary operator whose operand 4048is the positive numeric literal. Instead, you must use a unaryOperator() 4049matcher to match the minus sign: 4050 4051unaryOperator(hasOperatorName("-"), 4052 hasUnaryOperand(integerLiteral(equals(13)))) 4053 4054Usable 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>>, 4055 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>> 4056</pre></td></tr> 4057 4058 4059<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> 4060<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr> 4061 4062 4063<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> 4064<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names. 4065 4066Matches overloaded operator names specified in strings without the 4067"operator" prefix: e.g. "<<". 4068 4069 hasAnyOverloadedOperatorName("+", "-") 4070Is equivalent to 4071 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 4072</pre></td></tr> 4073 4074 4075<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> 4076<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 4077 4078Given: 4079 void f(); 4080 void g() noexcept; 4081 void h() noexcept(true); 4082 void i() noexcept(false); 4083 void j() throw(); 4084 void k() throw(int); 4085 void l() throw(...); 4086functionDecl(hasDynamicExceptionSpec()) and 4087 functionProtoType(hasDynamicExceptionSpec()) 4088 match the declarations of j, k, and l, but not f, g, h, or i. 4089</pre></td></tr> 4090 4091 4092<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> 4093<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 4094 4095Matches overloaded operator names specified in strings without the 4096"operator" prefix: e.g. "<<". 4097 4098Given: 4099 class A { int operator*(); }; 4100 const A &operator<<(const A &a, const A &b); 4101 A a; 4102 a << a; // <-- This matches 4103 4104cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 4105specified line and 4106cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 4107matches the declaration of A. 4108 4109Usable 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>> 4110</pre></td></tr> 4111 4112 4113<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> 4114<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 4115 4116Example matches Y (matcher = functionDecl(hasTrailingReturn())) 4117int X() {} 4118auto Y() -> int {} 4119</pre></td></tr> 4120 4121 4122<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> 4123<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations, 4124 and if constexpr. 4125 4126Given: 4127 constexpr int foo = 42; 4128 constexpr int bar(); 4129 void baz() { if constexpr(1 > 0) {} } 4130varDecl(isConstexpr()) 4131 matches the declaration of foo. 4132functionDecl(isConstexpr()) 4133 matches the declaration of bar. 4134ifStmt(isConstexpr()) 4135 matches the if statement in baz. 4136</pre></td></tr> 4137 4138 4139<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> 4140<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 4141 4142Given: 4143 class A { ~A(); }; 4144 class B { ~B() = default; }; 4145functionDecl(isDefaulted()) 4146 matches the declaration of ~B, but not ~A. 4147</pre></td></tr> 4148 4149 4150<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> 4151<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 4152 4153Example matches A, va, fa 4154 class A {}; 4155 class B; // Doesn't match, as it has no body. 4156 int va; 4157 extern int vb; // Doesn't match, as it doesn't define the variable. 4158 void fa() {} 4159 void fb(); // Doesn't match, as it has no body. 4160 @interface X 4161 - (void)ma; // Doesn't match, interface is declaration. 4162 @end 4163 @implementation X 4164 - (void)ma {} 4165 @end 4166 4167Usable 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>>, 4168 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4169</pre></td></tr> 4170 4171 4172<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> 4173<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 4174 4175Given: 4176 void Func(); 4177 void DeletedFunc() = delete; 4178functionDecl(isDeleted()) 4179 matches the declaration of DeletedFunc, but not Func. 4180</pre></td></tr> 4181 4182 4183<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> 4184<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 4185static member variable template instantiations. 4186 4187Given 4188 template<typename T> void A(T t) { } 4189 template<> void A(int N) { } 4190functionDecl(isExplicitTemplateSpecialization()) 4191 matches the specialization A<int>(). 4192 4193Usable 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>> 4194</pre></td></tr> 4195 4196 4197<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> 4198<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 4199 4200Given: 4201 extern "C" void f() {} 4202 extern "C" { void g() {} } 4203 void h() {} 4204 extern "C" int x = 1; 4205 extern "C" int y = 2; 4206 int z = 3; 4207functionDecl(isExternC()) 4208 matches the declaration of f and g, but not the declaration of h. 4209varDecl(isExternC()) 4210 matches the declaration of x and y, but not the declaration of z. 4211</pre></td></tr> 4212 4213 4214<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> 4215<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 4216the inline keyword. 4217 4218Given 4219 inline void f(); 4220 void g(); 4221 namespace n { 4222 inline namespace m {} 4223 } 4224functionDecl(isInline()) will match ::f(). 4225namespaceDecl(isInline()) will match n::m. 4226</pre></td></tr> 4227 4228 4229<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> 4230<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point 4231into an executable program. 4232</pre></td></tr> 4233 4234 4235<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> 4236<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 4237 4238Given 4239 void nope(); 4240 [[noreturn]] void a(); 4241 __attribute__((noreturn)) void b(); 4242 struct c { [[noreturn]] c(); }; 4243functionDecl(isNoReturn()) 4244 matches all of those except 4245 void nope(); 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('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr> 4250<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 4251 4252Given: 4253 void f(); 4254 void g() noexcept; 4255 void h() throw(); 4256 void i() throw(int); 4257 void j() noexcept(false); 4258functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4259 match the declarations of g, and h, but not f, i or j. 4260</pre></td></tr> 4261 4262 4263<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> 4264<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage 4265class specifier ("static" keyword) written in the source. 4266 4267Given: 4268 static void f() {} 4269 static int i = 0; 4270 extern int j; 4271 int k; 4272functionDecl(isStaticStorageClass()) 4273 matches the function declaration f. 4274varDecl(isStaticStorageClass()) 4275 matches the variable declaration i. 4276</pre></td></tr> 4277 4278 4279<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> 4280<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 4281member variable template instantiations. 4282 4283Given 4284 template <typename T> class X {}; class A {}; X<A> x; 4285or 4286 template <typename T> class X {}; class A {}; template class X<A>; 4287or 4288 template <typename T> class X {}; class A {}; extern template class X<A>; 4289cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4290 matches the template instantiation of X<A>. 4291 4292But given 4293 template <typename T> class X {}; class A {}; 4294 template <> class X<A> {}; X<A> x; 4295cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4296 does not match, as X<A> is an explicit template specialization. 4297 4298Usable 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>> 4299</pre></td></tr> 4300 4301 4302<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> 4303<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 4304 4305Example matches f, but not g or h. The function i will not match, even when 4306compiled in C mode. 4307 void f(...); 4308 void g(int); 4309 template <typename... Ts> void h(Ts...); 4310 void i(); 4311</pre></td></tr> 4312 4313 4314<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> 4315<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations. 4316 4317Given: 4318 void foo() __attribute__((__weakref__("__foo"))); 4319 void bar(); 4320functionDecl(isWeak()) 4321 matches the weak declaration "foo", but not "bar". 4322</pre></td></tr> 4323 4324 4325<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> 4326<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4327specific parameter count. 4328 4329Given 4330 void f(int i) {} 4331 void g(int i, int j) {} 4332 void h(int i, int j); 4333 void j(int i); 4334 void k(int x, int y, int z, ...); 4335functionDecl(parameterCountIs(2)) 4336 matches g and h 4337functionProtoType(parameterCountIs(2)) 4338 matches g and h 4339functionProtoType(parameterCountIs(3)) 4340 matches k 4341</pre></td></tr> 4342 4343 4344<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> 4345<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 4346 4347Given: 4348 void f(); 4349 void g() noexcept; 4350 void h() noexcept(true); 4351 void i() noexcept(false); 4352 void j() throw(); 4353 void k() throw(int); 4354 void l() throw(...); 4355functionDecl(hasDynamicExceptionSpec()) and 4356 functionProtoType(hasDynamicExceptionSpec()) 4357 match the declarations of j, k, and l, but not f, g, h, or i. 4358</pre></td></tr> 4359 4360 4361<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> 4362<tr><td colspan="4" class="doc" id="isNoThrow1"><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_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr> 4376<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4377specific parameter count. 4378 4379Given 4380 void f(int i) {} 4381 void g(int i, int j) {} 4382 void h(int i, int j); 4383 void j(int i); 4384 void k(int x, int y, int z, ...); 4385functionDecl(parameterCountIs(2)) 4386 matches g and h 4387functionProtoType(parameterCountIs(2)) 4388 matches g and h 4389functionProtoType(parameterCountIs(3)) 4390 matches k 4391</pre></td></tr> 4392 4393 4394<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> 4395<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations, 4396 and if constexpr. 4397 4398Given: 4399 constexpr int foo = 42; 4400 constexpr int bar(); 4401 void baz() { if constexpr(1 > 0) {} } 4402varDecl(isConstexpr()) 4403 matches the declaration of foo. 4404functionDecl(isConstexpr()) 4405 matches the declaration of bar. 4406ifStmt(isConstexpr()) 4407 matches the if statement in baz. 4408</pre></td></tr> 4409 4410 4411<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> 4412<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 4413 4414 4415<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> 4416<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 4417 4418Given 4419 f('false, 3.14, 42); 4420characterLiteral(equals(0)) 4421 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4422 match false 4423floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4424 match 3.14 4425integerLiteral(equals(42)) 4426 matches 42 4427 4428Note that you cannot directly match a negative numeric literal because the 4429minus sign is not part of the literal: It is a unary operator whose operand 4430is the positive numeric literal. Instead, you must use a unaryOperator() 4431matcher to match the minus sign: 4432 4433unaryOperator(hasOperatorName("-"), 4434 hasUnaryOperand(integerLiteral(equals(13)))) 4435 4436Usable 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>>, 4437 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>> 4438</pre></td></tr> 4439 4440 4441<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> 4442<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 4443 4444 4445<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> 4446<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 4447 4448 4449<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> 4450<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 4451to '.'. 4452 4453Member calls on the implicit this pointer match as called with '->'. 4454 4455Given 4456 class Y { 4457 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 4458 template <class T> void f() { this->f<T>(); f<T>(); } 4459 int a; 4460 static int b; 4461 }; 4462 template <class T> 4463 class Z { 4464 void x() { this->m; } 4465 }; 4466memberExpr(isArrow()) 4467 matches this->x, x, y.x, a, this->b 4468cxxDependentScopeMemberExpr(isArrow()) 4469 matches this->m 4470unresolvedMemberExpr(isArrow()) 4471 matches this->f<T>, f<T> 4472</pre></td></tr> 4473 4474 4475<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> 4476<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 4477 4478This matcher is only provided as a performance optimization of hasName. 4479 hasAnyName(a, b, c) 4480 is equivalent to, but faster than 4481 anyOf(hasName(a), hasName(b), hasName(c)) 4482</pre></td></tr> 4483 4484 4485<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> 4486<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 4487 4488Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 4489void f() { 4490 int x; 4491 static int y; 4492} 4493int z; 4494 4495Example matches f() because it has external formal linkage despite being 4496unique to the translation unit as though it has internal likage 4497(matcher = functionDecl(hasExternalFormalLinkage())) 4498 4499namespace { 4500void f() {} 4501} 4502</pre></td></tr> 4503 4504 4505<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> 4506<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 4507 4508Supports specifying enclosing namespaces or classes by prefixing the name 4509with '<enclosing>::'. 4510Does not match typedefs of an underlying type with the given name. 4511 4512Example matches X (Name == "X") 4513 class X; 4514 4515Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 4516 namespace a { namespace b { class X; } } 4517</pre></td></tr> 4518 4519 4520<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> 4521<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 4522a substring matched by the given RegExp. 4523 4524Supports specifying enclosing namespaces or classes by 4525prefixing the name with '<enclosing>::'. Does not match typedefs 4526of an underlying type with the given name. 4527 4528Example matches X (regexp == "::X") 4529 class X; 4530 4531Example matches X (regexp is one of "::X", "^foo::.*X", among others) 4532 namespace foo { namespace bar { class X; } } 4533 4534If the matcher is used in clang-query, RegexFlags parameter 4535should be passed as a quoted string. e.g: "NoFlags". 4536Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4537</pre></td></tr> 4538 4539 4540<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> 4541<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 4542 4543Given 4544 namespace n { 4545 namespace {} // #1 4546 } 4547namespaceDecl(isAnonymous()) will match #1 but not ::n. 4548</pre></td></tr> 4549 4550 4551<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> 4552<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 4553the inline keyword. 4554 4555Given 4556 inline void f(); 4557 void g(); 4558 namespace n { 4559 inline namespace m {} 4560 } 4561functionDecl(isInline()) will match ::f(). 4562namespaceDecl(isInline()) will match n::m. 4563</pre></td></tr> 4564 4565 4566<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> 4567<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind 4568specified. 4569 4570Given 4571 4572 #pragma omp parallel 4573 #pragma omp parallel default(none) 4574 #pragma omp parallel default(shared) 4575 #pragma omp parallel default(firstprivate) 4576 4577``ompDefaultClause(isFirstPrivateKind())`` matches only 4578``default(firstprivate)``. 4579</pre></td></tr> 4580 4581 4582<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> 4583<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified. 4584 4585Given 4586 4587 #pragma omp parallel 4588 #pragma omp parallel default(none) 4589 #pragma omp parallel default(shared) 4590 #pragma omp parallel default(firstprivate) 4591 4592``ompDefaultClause(isNoneKind())`` matches only ``default(none)``. 4593</pre></td></tr> 4594 4595 4596<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> 4597<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified. 4598 4599Given 4600 4601 #pragma omp parallel 4602 #pragma omp parallel default(none) 4603 #pragma omp parallel default(shared) 4604 #pragma omp parallel default(firstprivate) 4605 4606``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``. 4607</pre></td></tr> 4608 4609 4610<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> 4611<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP 4612clause kind. 4613 4614Given 4615 4616 #pragma omp parallel 4617 #pragma omp parallel for 4618 #pragma omp for 4619 4620`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches 4621``omp parallel`` and ``omp parallel for``. 4622 4623If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter 4624should be passed as a quoted string. e.g., 4625``isAllowedToContainClauseKind("OMPC_default").`` 4626</pre></td></tr> 4627 4628 4629<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> 4630<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives, 4631i.e., directives that can't have a structured block. 4632 4633Given 4634 4635 #pragma omp parallel 4636 {} 4637 #pragma omp taskyield 4638 4639``ompExecutableDirective(isStandaloneDirective()))`` matches 4640``omp taskyield``. 4641</pre></td></tr> 4642 4643 4644<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> 4645<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 4646</pre></td></tr> 4647 4648 4649<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> 4650<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 4651</pre></td></tr> 4652 4653 4654<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> 4655<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for 4656isSameOrDerivedFrom(hasName(...)). 4657</pre></td></tr> 4658 4659 4660<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> 4661<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has 4662a specific number of arguments (including absent default arguments). 4663 4664Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 4665 void f(int x, int y); 4666 f(0, 0); 4667</pre></td></tr> 4668 4669 4670<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> 4671<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 4672Selector.getAsString() 4673 4674 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 4675 matches both of the expressions below: 4676 [myObj methodA:argA]; 4677 [myObj methodB:argB]; 4678</pre></td></tr> 4679 4680 4681<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr> 4682<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 4683 4684objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 4685message expression in 4686 4687 UIWebView *webView = ...; 4688 CGRect bodyFrame = webView.frame; 4689 bodyFrame.size.height = self.bodyContentHeight; 4690 webView.frame = bodyFrame; 4691 // ^---- matches here 4692</pre></td></tr> 4693 4694 4695<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> 4696<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 4697 4698Matches only when the selector of the objCMessageExpr is NULL. This may 4699represent an error condition in the tree! 4700</pre></td></tr> 4701 4702 4703<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> 4704<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 4705 4706 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 4707 matches the outer message expr in the code below, but NOT the message 4708 invocation for self.bodyView. 4709 [self.bodyView loadHTMLString:html baseURL:NULL]; 4710</pre></td></tr> 4711 4712 4713<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> 4714<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 4715 4716 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 4717 matches self.bodyView in the code below, but NOT the outer message 4718 invocation of "loadHTMLString:baseURL:". 4719 [self.bodyView loadHTMLString:html baseURL:NULL]; 4720</pre></td></tr> 4721 4722 4723<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> 4724<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class. 4725 4726Example 4727matcher = objcMessageExpr(isClassMessage()) 4728matches 4729 [NSString stringWithFormat:@"format"]; 4730but not 4731 NSString *x = @"hello"; 4732 [x containsString:@"h"]; 4733</pre></td></tr> 4734 4735 4736<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> 4737<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance. 4738 4739Example 4740matcher = objcMessageExpr(isInstanceMessage()) 4741matches 4742 NSString *x = @"hello"; 4743 [x containsString:@"h"]; 4744but not 4745 [NSString stringWithFormat:@"format"]; 4746</pre></td></tr> 4747 4748 4749<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> 4750<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 4751a substring matched by the given RegExp. 4752 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 4753 invocation for self.bodyView. 4754 [self.bodyView loadHTMLString:html baseURL:NULL]; 4755 4756If the matcher is used in clang-query, RegexFlags parameter 4757should be passed as a quoted string. e.g: "NoFlags". 4758Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4759</pre></td></tr> 4760 4761 4762<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> 4763<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 4764 4765 matcher = objCMessageExpr(numSelectorArgs(0)); 4766 matches self.bodyView in the code below 4767 4768 matcher = objCMessageExpr(numSelectorArgs(2)); 4769 matches the invocation of "loadHTMLString:baseURL:" but not that 4770 of self.bodyView 4771 [self.bodyView loadHTMLString:html baseURL:NULL]; 4772</pre></td></tr> 4773 4774 4775<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> 4776<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method. 4777 4778Example 4779matcher = objcMethodDecl(isClassMethod()) 4780matches 4781@interface I + (void)foo; @end 4782but not 4783@interface I - (void)bar; @end 4784</pre></td></tr> 4785 4786 4787<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> 4788<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 4789 4790Example matches A, va, fa 4791 class A {}; 4792 class B; // Doesn't match, as it has no body. 4793 int va; 4794 extern int vb; // Doesn't match, as it doesn't define the variable. 4795 void fa() {} 4796 void fb(); // Doesn't match, as it has no body. 4797 @interface X 4798 - (void)ma; // Doesn't match, interface is declaration. 4799 @end 4800 @implementation X 4801 - (void)ma {} 4802 @end 4803 4804Usable 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>>, 4805 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4806</pre></td></tr> 4807 4808 4809<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> 4810<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method. 4811 4812Example 4813matcher = objcMethodDecl(isInstanceMethod()) 4814matches 4815@interface I - (void)bar; @end 4816but not 4817@interface I + (void)foo; @end 4818</pre></td></tr> 4819 4820 4821<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> 4822<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 4823 4824Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 4825void x(int val) {} 4826void y(int val = 0) {} 4827 4828Deprecated. Use hasInitializer() instead to be able to 4829match on the contents of the default argument. For example: 4830 4831void x(int val = 7) {} 4832void y(int val = 42) {} 4833parmVarDecl(hasInitializer(integerLiteral(equals(42)))) 4834 matches the parameter of y 4835 4836A matcher such as 4837 parmVarDecl(hasInitializer(anything())) 4838is equivalent to parmVarDecl(hasDefaultArgument()). 4839</pre></td></tr> 4840 4841 4842<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> 4843<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter 4844list. The parameter list could be that of either a block, function, or 4845objc-method. 4846 4847 4848Given 4849 4850void f(int a, int b, int c) { 4851} 4852 4853``parmVarDecl(isAtPosition(0))`` matches ``int a``. 4854 4855``parmVarDecl(isAtPosition(1))`` matches ``int b``. 4856</pre></td></tr> 4857 4858 4859<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> 4860<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 4861 4862Given 4863 class Y { public: void x(); }; 4864 void z() { Y* y; y->x(); } 4865cxxMemberCallExpr(on(hasType(asString("class Y *")))) 4866 matches y->x() 4867</pre></td></tr> 4868 4869 4870<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 4871<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 4872 4873Matches a node if it equals the node previously bound to ID. 4874 4875Given 4876 class X { int a; int b; }; 4877cxxRecordDecl( 4878 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4879 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4880 matches the class X, as a and b have the same type. 4881 4882Note that when multiple matches are involved via forEach* matchers, 4883equalsBoundNodes acts as a filter. 4884For example: 4885compoundStmt( 4886 forEachDescendant(varDecl().bind("d")), 4887 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4888will trigger a match for each combination of variable declaration 4889and reference to that variable declaration within a compound statement. 4890</pre></td></tr> 4891 4892 4893<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> 4894<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 4895the node, not hidden within a typedef. 4896 4897Given 4898 typedef const int const_int; 4899 const_int i; 4900 int *const j; 4901 int *volatile k; 4902 int m; 4903varDecl(hasType(hasLocalQualifiers())) matches only j and k. 4904i is const-qualified but the qualifier is not local. 4905</pre></td></tr> 4906 4907 4908<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> 4909<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 4910 4911Given 4912 void a(char); 4913 void b(wchar_t); 4914 void c(double); 4915functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 4916matches "a(char)", "b(wchar_t)", but not "c(double)". 4917</pre></td></tr> 4918 4919 4920<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> 4921<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 4922the Objective-C object pointer type, which is different despite being 4923syntactically similar. 4924 4925Given 4926 int *i = nullptr; 4927 4928 @interface Foo 4929 @end 4930 Foo *f; 4931 4932 int j; 4933varDecl(hasType(isAnyPointer())) 4934 matches "int *i" and "Foo *f", but not "int j". 4935</pre></td></tr> 4936 4937 4938<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> 4939<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 4940include "top-level" const. 4941 4942Given 4943 void a(int); 4944 void b(int const); 4945 void c(const int); 4946 void d(const int*); 4947 void e(int const) {}; 4948functionDecl(hasAnyParameter(hasType(isConstQualified()))) 4949 matches "void b(int const)", "void c(const int)" and 4950 "void e(int const) {}". It does not match d as there 4951 is no top-level const on the parameter type "const int *". 4952</pre></td></tr> 4953 4954 4955<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isInteger0')"><a name="isInteger0Anchor">isInteger</a></td><td></td></tr> 4956<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 4957 4958Given 4959 void a(int); 4960 void b(long); 4961 void c(double); 4962functionDecl(hasAnyParameter(hasType(isInteger()))) 4963matches "a(int)", "b(long)", but not "c(double)". 4964</pre></td></tr> 4965 4966 4967<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr> 4968<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 4969 4970Given 4971 void a(int); 4972 void b(unsigned long); 4973 void c(double); 4974functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 4975matches "a(int)", but not "b(unsigned long)" and "c(double)". 4976</pre></td></tr> 4977 4978 4979<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> 4980<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 4981 4982Given 4983 void a(int); 4984 void b(unsigned long); 4985 void c(double); 4986functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 4987matches "b(unsigned long)", but not "a(int)" and "c(double)". 4988</pre></td></tr> 4989 4990 4991<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> 4992<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 4993include "top-level" volatile. 4994 4995Given 4996 void a(int); 4997 void b(int volatile); 4998 void c(volatile int); 4999 void d(volatile int*); 5000 void e(int volatile) {}; 5001functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 5002 matches "void b(int volatile)", "void c(volatile int)" and 5003 "void e(int volatile) {}". It does not match d as there 5004 is no top-level volatile on the parameter type "volatile int *". 5005</pre></td></tr> 5006 5007 5008<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> 5009<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 5010 5011Matches a node if it equals the node previously bound to ID. 5012 5013Given 5014 class X { int a; int b; }; 5015cxxRecordDecl( 5016 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5017 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5018 matches the class X, as a and b have the same type. 5019 5020Note that when multiple matches are involved via forEach* matchers, 5021equalsBoundNodes acts as a filter. 5022For example: 5023compoundStmt( 5024 forEachDescendant(varDecl().bind("d")), 5025 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5026will trigger a match for each combination of variable declaration 5027and reference to that variable declaration within a compound statement. 5028</pre></td></tr> 5029 5030 5031<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> 5032<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 5033 5034Stmt has pointer identity in the AST. 5035</pre></td></tr> 5036 5037 5038<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> 5039<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro. 5040Does not match if only part of the statement is expanded from that macro or 5041if different parts of the statement are expanded from different 5042appearances of the macro. 5043</pre></td></tr> 5044 5045 5046<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> 5047<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 5048partially matching a given regex. 5049 5050Example matches Y but not X 5051 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5052 #include "ASTMatcher.h" 5053 class X {}; 5054ASTMatcher.h: 5055 class Y {}; 5056 5057Usable 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>> 5058 5059If the matcher is used in clang-query, RegexFlags parameter 5060should be passed as a quoted string. e.g: "NoFlags". 5061Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5062</pre></td></tr> 5063 5064 5065<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> 5066<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 5067 5068Example matches X but not Y 5069 (matcher = cxxRecordDecl(isExpansionInMainFile()) 5070 #include <Y.h> 5071 class X {}; 5072Y.h: 5073 class Y {}; 5074 5075Usable 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>> 5076</pre></td></tr> 5077 5078 5079<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> 5080<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 5081 5082Example matches Y but not X 5083 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5084 #include <SystemHeader.h> 5085 class X {}; 5086SystemHeader.h: 5087 class Y {}; 5088 5089Usable 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>> 5090</pre></td></tr> 5091 5092 5093<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> 5094<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 5095 5096Given 5097 int j; 5098 template<typename T> void A(T t) { T i; j += 42;} 5099 A(0); 5100 A(0U); 5101declStmt(isInTemplateInstantiation()) 5102 matches 'int i;' and 'unsigned i'. 5103unless(stmt(isInTemplateInstantiation())) 5104 will NOT match j += 42; as it's shared between the template definition and 5105 instantiation. 5106</pre></td></tr> 5107 5108 5109<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> 5110<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 5111 5112Given 5113 int a[42]; 5114 int b[2 * 21]; 5115 int c[41], d[43]; 5116 char *s = "abcd"; 5117 wchar_t *ws = L"abcd"; 5118 char *w = "a"; 5119constantArrayType(hasSize(42)) 5120 matches "int a[42]" and "int b[2 * 21]" 5121stringLiteral(hasSize(4)) 5122 matches "abcd", L"abcd" 5123</pre></td></tr> 5124 5125 5126<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> 5127<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class." 5128 5129Example matches C, but not S, U or E. 5130 struct S {}; 5131 class C {}; 5132 union U {}; 5133 enum E {}; 5134</pre></td></tr> 5135 5136 5137<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> 5138<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 5139 5140Example matches A, va, fa 5141 class A {}; 5142 class B; // Doesn't match, as it has no body. 5143 int va; 5144 extern int vb; // Doesn't match, as it doesn't define the variable. 5145 void fa() {} 5146 void fb(); // Doesn't match, as it has no body. 5147 @interface X 5148 - (void)ma; // Doesn't match, interface is declaration. 5149 @end 5150 @implementation X 5151 - (void)ma {} 5152 @end 5153 5154Usable 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>>, 5155 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5156</pre></td></tr> 5157 5158 5159<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> 5160<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum." 5161 5162Example matches E, but not C, S or U. 5163 struct S {}; 5164 class C {}; 5165 union U {}; 5166 enum E {}; 5167</pre></td></tr> 5168 5169 5170<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> 5171<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct." 5172 5173Example matches S, but not C, U or E. 5174 struct S {}; 5175 class C {}; 5176 union U {}; 5177 enum E {}; 5178</pre></td></tr> 5179 5180 5181<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> 5182<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union." 5183 5184Example matches U, but not C, S or E. 5185 struct S {}; 5186 class C {}; 5187 union U {}; 5188 enum E {}; 5189</pre></td></tr> 5190 5191 5192<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> 5193<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 5194 5195Note that 'Value' is a string as the template argument's value is 5196an arbitrary precision integer. 'Value' must be euqal to the canonical 5197representation of that integral value in base 10. 5198 5199Given 5200 template<int T> struct C {}; 5201 C<42> c; 5202classTemplateSpecializationDecl( 5203 hasAnyTemplateArgument(equalsIntegralValue("42"))) 5204 matches the implicit instantiation of C in C<42>. 5205</pre></td></tr> 5206 5207 5208<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> 5209<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 5210 5211Given 5212 template<int T> struct C {}; 5213 C<42> c; 5214classTemplateSpecializationDecl( 5215 hasAnyTemplateArgument(isIntegral())) 5216 matches the implicit instantiation of C in C<42> 5217 with isIntegral() matching 42. 5218</pre></td></tr> 5219 5220 5221<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> 5222<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 5223 5224Given 5225 template<typename T> struct C {}; 5226 C<int> c; 5227classTemplateSpecializationDecl(templateArgumentCountIs(1)) 5228 matches C<int>. 5229</pre></td></tr> 5230 5231 5232<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> 5233<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro. 5234Does not match if only part of the statement is expanded from that macro or 5235if different parts of the the statement are expanded from different 5236appearances of the macro. 5237</pre></td></tr> 5238 5239 5240<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> 5241<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 5242partially matching a given regex. 5243 5244Example matches Y but not X 5245 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5246 #include "ASTMatcher.h" 5247 class X {}; 5248ASTMatcher.h: 5249 class Y {}; 5250 5251Usable 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>> 5252 5253If the matcher is used in clang-query, RegexFlags parameter 5254should be passed as a quoted string. e.g: "NoFlags". 5255Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5256</pre></td></tr> 5257 5258 5259<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> 5260<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 5261 5262Example matches X but not Y 5263 (matcher = cxxRecordDecl(isExpansionInMainFile()) 5264 #include <Y.h> 5265 class X {}; 5266Y.h: 5267 class Y {}; 5268 5269Usable 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>> 5270</pre></td></tr> 5271 5272 5273<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> 5274<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 5275 5276Example matches Y but not X 5277 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5278 #include <SystemHeader.h> 5279 class X {}; 5280SystemHeader.h: 5281 class Y {}; 5282 5283Usable 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>> 5284</pre></td></tr> 5285 5286 5287<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> 5288<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 5289 5290Given 5291 struct S { bool func(); }; 5292functionDecl(returns(booleanType())) 5293 matches "bool func();" 5294</pre></td></tr> 5295 5296 5297<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> 5298<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 5299 5300Matches a node if it equals the node previously bound to ID. 5301 5302Given 5303 class X { int a; int b; }; 5304cxxRecordDecl( 5305 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5306 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5307 matches the class X, as a and b have the same type. 5308 5309Note that when multiple matches are involved via forEach* matchers, 5310equalsBoundNodes acts as a filter. 5311For example: 5312compoundStmt( 5313 forEachDescendant(varDecl().bind("d")), 5314 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5315will trigger a match for each combination of variable declaration 5316and reference to that variable declaration within a compound statement. 5317</pre></td></tr> 5318 5319 5320<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> 5321<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 5322 5323Type has pointer identity in the AST. 5324</pre></td></tr> 5325 5326 5327<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> 5328<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 5329 5330Given 5331 int i; 5332 float f; 5333realFloatingPointType() 5334 matches "float f" but not "int i" 5335</pre></td></tr> 5336 5337 5338<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> 5339<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 5340 5341Given 5342 struct S { void func(); }; 5343functionDecl(returns(voidType())) 5344 matches "void func();" 5345</pre></td></tr> 5346 5347 5348<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> 5349<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 5350 5351Given 5352 int x; 5353 int s = sizeof(x) + alignof(x) 5354unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 5355 matches sizeof(x) 5356 5357If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter 5358should be passed as a quoted string. e.g., ofKind("UETT_SizeOf"). 5359</pre></td></tr> 5360 5361 5362<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> 5363<tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the 5364specified names. 5365 5366 hasAnyOperatorName("+", "-") 5367 Is equivalent to 5368 anyOf(hasOperatorName("+"), hasOperatorName("-")) 5369</pre></td></tr> 5370 5371 5372<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> 5373<tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or 5374unary). 5375 5376Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 5377 !(a || b) 5378</pre></td></tr> 5379 5380 5381<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> 5382<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed 5383to '.'. 5384 5385Member calls on the implicit this pointer match as called with '->'. 5386 5387Given 5388 class Y { 5389 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 5390 template <class T> void f() { this->f<T>(); f<T>(); } 5391 int a; 5392 static int b; 5393 }; 5394 template <class T> 5395 class Z { 5396 void x() { this->m; } 5397 }; 5398memberExpr(isArrow()) 5399 matches this->x, x, y.x, a, this->b 5400cxxDependentScopeMemberExpr(isArrow()) 5401 matches this->m 5402unresolvedMemberExpr(isArrow()) 5403 matches this->f<T>, f<T> 5404</pre></td></tr> 5405 5406 5407<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> 5408<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 5409 5410Example matches x, but not y, z, or a. 5411(matcher = varDecl(hasAutomaticStorageDuration()) 5412void f() { 5413 int x; 5414 static int y; 5415 thread_local int z; 5416} 5417int a; 5418</pre></td></tr> 5419 5420 5421<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> 5422<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 5423 5424Example matches y and z (matcher = varDecl(hasGlobalStorage()) 5425void f() { 5426 int x; 5427 static int y; 5428} 5429int z; 5430</pre></td></tr> 5431 5432 5433<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> 5434<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 5435non-static local variable. 5436 5437Example matches x (matcher = varDecl(hasLocalStorage()) 5438void f() { 5439 int x; 5440 static int y; 5441} 5442int z; 5443</pre></td></tr> 5444 5445 5446<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> 5447<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 5448It includes the variable declared at namespace scope and those declared 5449with "static" and "extern" storage class specifiers. 5450 5451void f() { 5452 int x; 5453 static int y; 5454 thread_local int z; 5455} 5456int a; 5457static int b; 5458extern int c; 5459varDecl(hasStaticStorageDuration()) 5460 matches the function declaration y, a, b and c. 5461</pre></td></tr> 5462 5463 5464<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> 5465<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 5466 5467Example matches z, but not x, z, or a. 5468(matcher = varDecl(hasThreadStorageDuration()) 5469void f() { 5470 int x; 5471 static int y; 5472 thread_local int z; 5473} 5474int a; 5475</pre></td></tr> 5476 5477 5478<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> 5479<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations, 5480 and if constexpr. 5481 5482Given: 5483 constexpr int foo = 42; 5484 constexpr int bar(); 5485 void baz() { if constexpr(1 > 0) {} } 5486varDecl(isConstexpr()) 5487 matches the declaration of foo. 5488functionDecl(isConstexpr()) 5489 matches the declaration of bar. 5490ifStmt(isConstexpr()) 5491 matches the if statement in baz. 5492</pre></td></tr> 5493 5494 5495<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> 5496<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 5497 5498Example matches A, va, fa 5499 class A {}; 5500 class B; // Doesn't match, as it has no body. 5501 int va; 5502 extern int vb; // Doesn't match, as it doesn't define the variable. 5503 void fa() {} 5504 void fb(); // Doesn't match, as it has no body. 5505 @interface X 5506 - (void)ma; // Doesn't match, interface is declaration. 5507 @end 5508 @implementation X 5509 - (void)ma {} 5510 @end 5511 5512Usable 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>>, 5513 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5514</pre></td></tr> 5515 5516 5517<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> 5518<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 5519a C++ catch block, or an Objective-C statement. 5520 5521Example matches x (matcher = varDecl(isExceptionVariable()) 5522void f(int y) { 5523 try { 5524 } catch (int x) { 5525 } 5526} 5527</pre></td></tr> 5528 5529 5530<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> 5531<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 5532static member variable template instantiations. 5533 5534Given 5535 template<typename T> void A(T t) { } 5536 template<> void A(int N) { } 5537functionDecl(isExplicitTemplateSpecialization()) 5538 matches the specialization A<int>(). 5539 5540Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 5541</pre></td></tr> 5542 5543 5544<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> 5545<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 5546 5547Given: 5548 extern "C" void f() {} 5549 extern "C" { void g() {} } 5550 void h() {} 5551 extern "C" int x = 1; 5552 extern "C" int y = 2; 5553 int z = 3; 5554functionDecl(isExternC()) 5555 matches the declaration of f and g, but not the declaration of h. 5556varDecl(isExternC()) 5557 matches the declaration of x and y, but not the declaration of z. 5558</pre></td></tr> 5559 5560 5561<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> 5562<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope. 5563 5564Example matches y (matcher = varDecl(isStaticLocal())) 5565void f() { 5566 int x; 5567 static int y; 5568} 5569static int z; 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('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr> 5574<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage 5575class specifier ("static" keyword) written in the source. 5576 5577Given: 5578 static void f() {} 5579 static int i = 0; 5580 extern int j; 5581 int k; 5582functionDecl(isStaticStorageClass()) 5583 matches the function declaration f. 5584varDecl(isStaticStorageClass()) 5585 matches the variable declaration i. 5586</pre></td></tr> 5587 5588 5589<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> 5590<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 5591member variable template instantiations. 5592 5593Given 5594 template <typename T> class X {}; class A {}; X<A> x; 5595or 5596 template <typename T> class X {}; class A {}; template class X<A>; 5597or 5598 template <typename T> class X {}; class A {}; extern template class X<A>; 5599cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5600 matches the template instantiation of X<A>. 5601 5602But given 5603 template <typename T> class X {}; class A {}; 5604 template <> class X<A> {}; X<A> x; 5605cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5606 does not match, as X<A> is an explicit template specialization. 5607 5608Usable 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>> 5609</pre></td></tr> 5610 5611<!--END_NARROWING_MATCHERS --> 5612</table> 5613 5614<!-- ======================================================================= --> 5615<h2 id="traversal-matchers">AST Traversal Matchers</h2> 5616<!-- ======================================================================= --> 5617 5618<p>Traversal matchers specify the relationship to other nodes that are 5619reachable from the current node.</p> 5620 5621<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 5622forEachDescendant) which work on all nodes and allow users to write more generic 5623match expressions.</p> 5624 5625<table> 5626<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 5627<!-- START_TRAVERSAL_MATCHERS --> 5628 5629<tr><td>Matcher<*></td><td class="name" onclick="toggle('binaryOperation0')"><a name="binaryOperation0Anchor">binaryOperation</a></td><td>Matcher<*>...Matcher<*></td></tr> 5630<tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators. 5631 5632The code 5633 var1 != var2; 5634might be represented in the clang AST as a binaryOperator, a 5635cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on 5636 5637* whether the types of var1 and var2 are fundamental (binaryOperator) or at 5638 least one is a class type (cxxOperatorCallExpr) 5639* whether the code appears in a template declaration, if at least one of the 5640 vars is a dependent-type (binaryOperator) 5641* whether the code relies on a rewritten binary operator, such as a 5642spaceship operator or an inverted equality operator 5643(cxxRewrittenBinaryOperator) 5644 5645This matcher elides details in places where the matchers for the nodes are 5646compatible. 5647 5648Given 5649 binaryOperation( 5650 hasOperatorName("!="), 5651 hasLHS(expr().bind("lhs")), 5652 hasRHS(expr().bind("rhs")) 5653 ) 5654matches each use of "!=" in: 5655 struct S{ 5656 bool operator!=(const S&) const; 5657 }; 5658 5659 void foo() 5660 { 5661 1 != 2; 5662 S() != S(); 5663 } 5664 5665 template<typename T> 5666 void templ() 5667 { 5668 1 != 2; 5669 T() != S(); 5670 } 5671 struct HasOpEq 5672 { 5673 bool operator==(const HasOpEq &) const; 5674 }; 5675 5676 void inverse() 5677 { 5678 HasOpEq s1; 5679 HasOpEq s2; 5680 if (s1 != s2) 5681 return; 5682 } 5683 5684 struct HasSpaceship 5685 { 5686 bool operator<=>(const HasOpEq &) const; 5687 }; 5688 5689 void use_spaceship() 5690 { 5691 HasSpaceship s1; 5692 HasSpaceship s2; 5693 if (s1 != s2) 5694 return; 5695 } 5696</pre></td></tr> 5697 5698 5699<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 5700<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 5701 5702Unlike anyOf, eachOf will generate a match result for each 5703matching submatcher. 5704 5705For example, in: 5706 class A { int a; int b; }; 5707The matcher: 5708 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 5709 has(fieldDecl(hasName("b")).bind("v")))) 5710will generate two results binding "v", the first of which binds 5711the field declaration of a, the second the field declaration of 5712b. 5713 5714Usable as: Any Matcher 5715</pre></td></tr> 5716 5717 5718<tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr> 5719<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 5720 5721Generates results for each match. 5722 5723For example, in: 5724 class A { class B {}; class C {}; }; 5725The matcher: 5726 cxxRecordDecl(hasName("::A"), 5727 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 5728will generate results for A, B and C. 5729 5730Usable as: Any Matcher 5731</pre></td></tr> 5732 5733 5734<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 5735<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5736provided matcher. 5737 5738Example matches X, A, A::X, B, B::C, B::C::X 5739 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 5740 class X {}; 5741 class A { class X {}; }; // Matches A, because A::X is a class of name 5742 // X inside A. 5743 class B { class C { class X {}; }; }; 5744 5745DescendantT must be an AST base type. 5746 5747As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 5748each result that matches instead of only on the first one. 5749 5750Note: Recursively combined ForEachDescendant can cause many matches: 5751 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 5752 forEachDescendant(cxxRecordDecl()) 5753 ))) 5754will match 10 times (plus injected class name matches) on: 5755 class A { class B { class C { class D { class E {}; }; }; }; }; 5756 5757Usable as: Any Matcher 5758</pre></td></tr> 5759 5760 5761<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 5762<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 5763provided matcher. 5764 5765Example matches X, Y, Y::X, Z::Y, Z::Y::X 5766 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 5767 class X {}; 5768 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X 5769 // inside Y. 5770 class Z { class Y { class X {}; }; }; // Does not match Z. 5771 5772ChildT must be an AST base type. 5773 5774As opposed to 'has', 'forEach' will cause a match for each result that 5775matches instead of only on the first one. 5776 5777Usable as: Any Matcher 5778</pre></td></tr> 5779 5780 5781<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 5782<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 5783matcher. 5784 5785Given 5786void f() { if (true) { int x = 42; } } 5787void g() { for (;;) { int x = 43; } } 5788expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 5789 5790Usable as: Any Matcher 5791</pre></td></tr> 5792 5793 5794<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 5795<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5796provided matcher. 5797 5798Example matches X, Y, Z 5799 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 5800 class X {}; // Matches X, because X::X is a class of name X inside X. 5801 class Y { class X {}; }; 5802 class Z { class Y { class X {}; }; }; 5803 5804DescendantT must be an AST base type. 5805 5806Usable as: Any Matcher 5807</pre></td></tr> 5808 5809 5810<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 5811<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 5812provided matcher. 5813 5814Example matches X, Y 5815 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 5816 class X {}; // Matches X, because X::X is a class of name X inside X. 5817 class Y { class X {}; }; 5818 class Z { class Y { class X {}; }; }; // Does not match Z. 5819 5820ChildT must be an AST base type. 5821 5822Usable as: Any Matcher 5823Note that has is direct matcher, so it also matches things like implicit 5824casts and paren casts. If you are matching with expr then you should 5825probably consider using ignoringParenImpCasts like: 5826has(ignoringParenImpCasts(expr())). 5827</pre></td></tr> 5828 5829 5830<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 5831<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 5832matcher. 5833 5834Given 5835void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 5836compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 5837 5838Usable as: Any Matcher 5839</pre></td></tr> 5840 5841 5842<tr><td>Matcher<*></td><td class="name" onclick="toggle('invocation0')"><a name="invocation0Anchor">invocation</a></td><td>Matcher<*>...Matcher<*></td></tr> 5843<tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls 5844 5845Because CallExpr and CXXConstructExpr do not share a common 5846base class with API accessing arguments etc, AST Matchers for code 5847which should match both are typically duplicated. This matcher 5848removes the need for duplication. 5849 5850Given code 5851struct ConstructorTakesInt 5852{ 5853 ConstructorTakesInt(int i) {} 5854}; 5855 5856void callTakesInt(int i) 5857{ 5858} 5859 5860void doCall() 5861{ 5862 callTakesInt(42); 5863} 5864 5865void doConstruct() 5866{ 5867 ConstructorTakesInt cti(42); 5868} 5869 5870The matcher 5871invocation(hasArgument(0, integerLiteral(equals(42)))) 5872matches the expression in both doCall and doConstruct 5873</pre></td></tr> 5874 5875 5876<tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr> 5877<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher. 5878 5879However, optionally will retain any bindings generated by the submatcher. 5880Useful when additional information which may or may not present about a main 5881matching node is desired. 5882 5883For example, in: 5884 class Foo { 5885 int bar; 5886 } 5887The matcher: 5888 cxxRecordDecl( 5889 optionally(has( 5890 fieldDecl(hasName("bar")).bind("var") 5891 ))).bind("record") 5892will produce a result binding for both "record" and "var". 5893The matcher will produce a "record" binding for even if there is no data 5894member named "bar" in that class. 5895 5896Usable as: Any Matcher 5897</pre></td></tr> 5898 5899 5900<tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr> 5901<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind. 5902 5903Given 5904 void foo() 5905 { 5906 int i = 3.0; 5907 } 5908The matcher 5909 traverse(TK_IgnoreUnlessSpelledInSource, 5910 varDecl(hasInitializer(floatLiteral().bind("init"))) 5911 ) 5912matches the variable declaration with "init" bound to the "3.0". 5913</pre></td></tr> 5914 5915 5916<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> 5917<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 5918switch statement or conditional operator. 5919 5920Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5921 if (true) {} 5922</pre></td></tr> 5923 5924 5925<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> 5926<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 5927(binary or ternary). 5928 5929Example matches b 5930 condition ? a : b 5931 condition ?: b 5932</pre></td></tr> 5933 5934 5935<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> 5936<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 5937 5938Example 1 (conditional ternary operator): matches a 5939 condition ? a : b 5940 5941Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 5942 condition ?: b 5943</pre></td></tr> 5944 5945 5946<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> 5947<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 5948matches the given matcher. 5949 5950The associated declaration is: 5951- for type nodes, the declaration of the underlying type 5952- for CallExpr, the declaration of the callee 5953- for MemberExpr, the declaration of the referenced member 5954- for CXXConstructExpr, the declaration of the constructor 5955- for CXXNewExpr, the declaration of the operator new 5956- for ObjCIvarExpr, the declaration of the ivar 5957 5958For type nodes, hasDeclaration will generally match the declaration of the 5959sugared type. Given 5960 class X {}; 5961 typedef X Y; 5962 Y y; 5963in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5964typedefDecl. A common use case is to match the underlying, desugared type. 5965This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5966 varDecl(hasType(hasUnqualifiedDesugaredType( 5967 recordType(hasDeclaration(decl()))))) 5968In this matcher, the decl will match the CXXRecordDecl of class X. 5969 5970Usable 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>>, 5971 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>>, 5972 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>>, 5973 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>>, 5974 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>>, 5975 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>>, 5976 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5977</pre></td></tr> 5978 5979 5980<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> 5981<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 5982 5983Given 5984 int i[5]; 5985 void f() { i[1] = 42; } 5986arraySubscriptExpression(hasBase(implicitCastExpr( 5987 hasSourceExpression(declRefExpr())))) 5988 matches i[1] with the declRefExpr() matching i 5989</pre></td></tr> 5990 5991 5992<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> 5993<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 5994 5995Given 5996 int i[5]; 5997 void f() { i[1] = 42; } 5998arraySubscriptExpression(hasIndex(integerLiteral())) 5999 matches i[1] with the integerLiteral() matching 1 6000</pre></td></tr> 6001 6002 6003<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> 6004<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions. 6005 6006Example matches a (matcher = binaryOperator(hasLHS())) 6007 a || b 6008</pre></td></tr> 6009 6010 6011<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> 6012<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions. 6013 6014Example matches b (matcher = binaryOperator(hasRHS())) 6015 a || b 6016</pre></td></tr> 6017 6018 6019<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> 6020<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 6021type. 6022 6023Given 6024 struct A {}; 6025 A a[7]; 6026 int b[7]; 6027arrayType(hasElementType(builtinType())) 6028 matches "int b[7]" 6029 6030Usable 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>> 6031</pre></td></tr> 6032 6033 6034<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> 6035<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 6036 6037Given 6038 _Atomic(int) i; 6039 _Atomic(float) f; 6040atomicType(hasValueType(isInteger())) 6041 matches "_Atomic(int) i" 6042 6043Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 6044</pre></td></tr> 6045 6046 6047<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> 6048<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 6049 6050Note: There is no TypeLoc for the deduced type and thus no 6051getDeducedLoc() matcher. 6052 6053Given 6054 auto a = 1; 6055 auto b = 2.0; 6056autoType(hasDeducedType(isInteger())) 6057 matches "auto a" 6058 6059Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 6060</pre></td></tr> 6061 6062 6063<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> 6064<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 6065binary operator matches. 6066</pre></td></tr> 6067 6068 6069<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> 6070<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 6071 6072Example matches a (matcher = binaryOperator(hasLHS())) 6073 a || b 6074</pre></td></tr> 6075 6076 6077<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> 6078<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator. 6079 6080Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6081 integerLiteral(equals(2))) 6082 1 + 2 // Match 6083 2 + 1 // Match 6084 1 + 1 // No match 6085 2 + 2 // No match 6086</pre></td></tr> 6087 6088 6089<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> 6090<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 6091 6092Example matches b (matcher = binaryOperator(hasRHS())) 6093 a || b 6094</pre></td></tr> 6095 6096 6097<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> 6098<tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to. 6099 6100For example, in: 6101void foo() 6102{ 6103 int arr[3]; 6104 auto &[f, s, t] = arr; 6105 6106 f = 42; 6107} 6108The matcher: 6109 bindingDecl(hasName("f"), 6110 forDecomposition(decompositionDecl()) 6111matches 'f' in 'auto &[f, s, t]'. 6112</pre></td></tr> 6113 6114 6115<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> 6116<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 6117block. 6118 6119Does not match the 'this' parameter of a method. 6120 6121Given 6122 class X { void f(int x, int y, int z) {} }; 6123cxxMethodDecl(hasAnyParameter(hasName("y"))) 6124 matches f(int x, int y, int z) {} 6125with hasAnyParameter(...) 6126 matching int y 6127 6128For ObjectiveC, given 6129 @interface I - (void) f:(int) y; @end 6130 6131the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 6132matches the declaration of method f with hasParameter 6133matching y. 6134 6135For blocks, given 6136 b = ^(int y) { printf("%d", y) }; 6137 6138the matcher blockDecl(hasAnyParameter(hasName("y"))) 6139matches the declaration of the block b with hasParameter 6140matching y. 6141</pre></td></tr> 6142 6143 6144<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> 6145<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 6146declaration or a block. 6147 6148Given 6149 class X { void f(int x) {} }; 6150cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6151 matches f(int x) {} 6152with hasParameter(...) 6153 matching int x 6154 6155For ObjectiveC, given 6156 @interface I - (void) f:(int) y; @end 6157 6158the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6159matches the declaration of method f with hasParameter 6160matching y. 6161</pre></td></tr> 6162 6163 6164<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> 6165<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher. 6166 6167Examples: 6168 int x; 6169declaratorDecl(hasTypeLoc(loc(asString("int")))) 6170 matches int x 6171 6172auto x = int(3); 6173cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6174 matches int(3) 6175 6176struct Foo { Foo(int, int); }; 6177auto x = Foo(1, 2); 6178cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6179 matches Foo(1, 2) 6180 6181Usable 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>>, 6182 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>>, 6183 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>>, 6184 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6185 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>>, 6186 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>>, 6187 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>>, 6188 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6189</pre></td></tr> 6190 6191 6192<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> 6193<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 6194pointee matches a given matcher. 6195 6196Given 6197 int *a; 6198 int const *b; 6199 float const *f; 6200pointerType(pointee(isConstQualified(), isInteger())) 6201 matches "int const *b" 6202 6203Usable 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>>, 6204 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>> 6205</pre></td></tr> 6206 6207 6208<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> 6209<tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher. 6210 6211Examples: 6212 int x; 6213declaratorDecl(hasTypeLoc(loc(asString("int")))) 6214 matches int x 6215 6216auto x = int(3); 6217cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6218 matches int(3) 6219 6220struct Foo { Foo(int, int); }; 6221auto x = Foo(1, 2); 6222cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6223 matches Foo(1, 2) 6224 6225Usable 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>>, 6226 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>>, 6227 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>>, 6228 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6229 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>>, 6230 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>>, 6231 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>>, 6232 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6233</pre></td></tr> 6234 6235 6236<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> 6237<tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value 6238declaration's type. 6239 6240In case of a value declaration (for example a variable declaration), 6241this resolves one layer of indirection. For example, in the value 6242declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6243X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6244declaration of x. 6245 6246Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6247 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6248 and friend class X (matcher = friendDecl(hasType("X")) 6249 and public virtual X (matcher = cxxBaseSpecifier(hasType( 6250 cxxRecordDecl(hasName("X")))) 6251 class X {}; 6252 void y(X &x) { x; X z; } 6253 class Y { friend class X; }; 6254 class Z : public virtual X {}; 6255 6256Example matches class Derived 6257(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6258class Base {}; 6259class Derived : Base {}; 6260 6261Usable 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>>, 6262Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6263</pre></td></tr> 6264 6265 6266<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> 6267<tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type 6268matcher. 6269 6270Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6271 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6272 and U (matcher = typedefDecl(hasType(asString("int"))) 6273 and friend class X (matcher = friendDecl(hasType("X")) 6274 and public virtual X (matcher = cxxBaseSpecifier(hasType( 6275 asString("class X"))) 6276 class X {}; 6277 void y(X &x) { x; X z; } 6278 typedef int U; 6279 class Y { friend class X; }; 6280 class Z : public virtual X {}; 6281</pre></td></tr> 6282 6283 6284<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> 6285<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 6286 6287Given 6288 void f(int i); 6289 int y; 6290 f(y); 6291callExpr( 6292 forEachArgumentWithParam( 6293 declRefExpr(to(varDecl(hasName("y")))), 6294 parmVarDecl(hasType(isInteger())) 6295)) 6296 matches f(y); 6297with declRefExpr(...) 6298 matching int y 6299and parmVarDecl(...) 6300 matching int i 6301</pre></td></tr> 6302 6303 6304<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> 6305<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or 6306CXXConstructExpr. It is very similar to forEachArgumentWithParam but 6307it works on calls through function pointers as well. 6308 6309The difference is, that function pointers do not provide access to a 6310ParmVarDecl, but only the QualType for each argument. 6311 6312Given 6313 void f(int i); 6314 int y; 6315 f(y); 6316 void (*f_ptr)(int) = f; 6317 f_ptr(y); 6318callExpr( 6319 forEachArgumentWithParamType( 6320 declRefExpr(to(varDecl(hasName("y")))), 6321 qualType(isInteger()).bind("type) 6322)) 6323 matches f(y) and f_ptr(y) 6324with declRefExpr(...) 6325 matching int y 6326and qualType(...) 6327 matching int 6328</pre></td></tr> 6329 6330 6331<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> 6332<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 6333expression, or an ObjC-message-send expression. 6334 6335Given 6336 void x(int, int, int) { int y; x(1, y, 42); } 6337callExpr(hasAnyArgument(declRefExpr())) 6338 matches x(1, y, 42) 6339with hasAnyArgument(...) 6340 matching y 6341 6342For ObjectiveC, given 6343 @interface I - (void) f:(int) y; @end 6344 void foo(I *i) { [i f:12]; } 6345objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6346 matches [i f:12] 6347</pre></td></tr> 6348 6349 6350<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> 6351<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 6352call expression. 6353 6354Example matches y in x(y) 6355 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6356 void x(int) { int y; x(y); } 6357</pre></td></tr> 6358 6359 6360<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> 6361<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 6362matches the given matcher. 6363 6364The associated declaration is: 6365- for type nodes, the declaration of the underlying type 6366- for CallExpr, the declaration of the callee 6367- for MemberExpr, the declaration of the referenced member 6368- for CXXConstructExpr, the declaration of the constructor 6369- for CXXNewExpr, the declaration of the operator new 6370- for ObjCIvarExpr, the declaration of the ivar 6371 6372For type nodes, hasDeclaration will generally match the declaration of the 6373sugared type. Given 6374 class X {}; 6375 typedef X Y; 6376 Y y; 6377in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6378typedefDecl. A common use case is to match the underlying, desugared type. 6379This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6380 varDecl(hasType(hasUnqualifiedDesugaredType( 6381 recordType(hasDeclaration(decl()))))) 6382In this matcher, the decl will match the CXXRecordDecl of class X. 6383 6384Usable 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>>, 6385 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>>, 6386 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>>, 6387 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>>, 6388 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>>, 6389 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>>, 6390 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6391</pre></td></tr> 6392 6393 6394<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> 6395<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 6396 6397Given 6398 class A { A() : i(42), j(42) {} int i; int j; }; 6399cxxConstructorDecl(forEachConstructorInitializer( 6400 forField(decl().bind("x")) 6401)) 6402 will trigger two matches, binding for 'i' and 'j' respectively. 6403</pre></td></tr> 6404 6405 6406<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> 6407<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 6408 6409Given 6410 struct Foo { 6411 Foo() : foo_(1) { } 6412 int foo_; 6413 }; 6414cxxRecordDecl(has(cxxConstructorDecl( 6415 hasAnyConstructorInitializer(anything()) 6416))) 6417 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 6418</pre></td></tr> 6419 6420 6421<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> 6422<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 6423 6424Given 6425 struct Foo { 6426 Foo() : foo_(1) { } 6427 int foo_; 6428 }; 6429cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6430 forField(hasName("foo_")))))) 6431 matches Foo 6432with forField matching foo_ 6433</pre></td></tr> 6434 6435 6436<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> 6437<tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher. 6438 6439Examples: 6440 int x; 6441declaratorDecl(hasTypeLoc(loc(asString("int")))) 6442 matches int x 6443 6444auto x = int(3); 6445cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6446 matches int(3) 6447 6448struct Foo { Foo(int, int); }; 6449auto x = Foo(1, 2); 6450cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6451 matches Foo(1, 2) 6452 6453Usable 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>>, 6454 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>>, 6455 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>>, 6456 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6457 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>>, 6458 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>>, 6459 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>>, 6460 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6461</pre></td></tr> 6462 6463 6464<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> 6465<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 6466 6467Given 6468 struct Foo { 6469 Foo() : foo_(1) { } 6470 int foo_; 6471 }; 6472cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6473 withInitializer(integerLiteral(equals(1))))))) 6474 matches Foo 6475with withInitializer matching (1) 6476</pre></td></tr> 6477 6478 6479<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> 6480<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 6481given matcher. Implicit object expressions are included; that is, it matches 6482use of implicit `this`. 6483 6484Given 6485 struct X { 6486 int m; 6487 int f(X x) { x.m; return m; } 6488 }; 6489memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6490 matches `x.m`, but not `m`; however, 6491memberExpr(hasObjectExpression(hasType(pointsTo( 6492 cxxRecordDecl(hasName("X")))))) 6493 matches `m` (aka. `this->m`), but not `x.m`. 6494</pre></td></tr> 6495 6496 6497<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> 6498<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr> 6499 6500 6501<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> 6502<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer. 6503 6504Given: 6505 void foo() { 6506 if (int i = foobar(); i > 0) {} 6507 switch (int i = foobar(); i) {} 6508 for (auto& a = get_range(); auto& x : a) {} 6509 } 6510 void bar() { 6511 if (foobar() > 0) {} 6512 switch (foobar()) {} 6513 for (auto& x : get_range()) {} 6514 } 6515ifStmt(hasInitStatement(anything())) 6516 matches the if statement in foo but not in bar. 6517switchStmt(hasInitStatement(anything())) 6518 matches the switch statement in foo but not in bar. 6519cxxForRangeStmt(hasInitStatement(anything())) 6520 matches the range for statement in foo but not in bar. 6521</pre></td></tr> 6522 6523 6524<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> 6525<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 6526 6527Example: 6528 forStmt(hasLoopVariable(anything())) 6529matches 'int x' in 6530 for (int x : a) { } 6531</pre></td></tr> 6532 6533 6534<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> 6535<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 6536 6537Example: 6538 forStmt(hasRangeInit(anything())) 6539matches 'a' in 6540 for (int x : a) { } 6541</pre></td></tr> 6542 6543 6544<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> 6545<tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher. 6546 6547Examples: 6548 int x; 6549declaratorDecl(hasTypeLoc(loc(asString("int")))) 6550 matches int x 6551 6552auto x = int(3); 6553cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6554 matches int(3) 6555 6556struct Foo { Foo(int, int); }; 6557auto x = Foo(1, 2); 6558cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6559 matches Foo(1, 2) 6560 6561Usable 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>>, 6562 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>>, 6563 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>>, 6564 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6565 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>>, 6566 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>>, 6567 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>>, 6568 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6569</pre></td></tr> 6570 6571 6572<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> 6573<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 6574`on`, matches the argument directly without stripping away anything. 6575 6576Given 6577 class Y { public: void m(); }; 6578 Y g(); 6579 class X : public Y { void g(); }; 6580 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 6581cxxMemberCallExpr(onImplicitObjectArgument(hasType( 6582 cxxRecordDecl(hasName("Y"))))) 6583 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 6584cxxMemberCallExpr(on(callExpr())) 6585 does not match `(g()).m()`, because the parens are not ignored. 6586 6587FIXME: Overload to allow directly matching types? 6588</pre></td></tr> 6589 6590 6591<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> 6592<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 6593stripping off any parentheses or implicit casts. 6594 6595Given 6596 class Y { public: void m(); }; 6597 Y g(); 6598 class X : public Y {}; 6599 void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 6600cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 6601 matches `y.m()` and `(g()).m()`. 6602cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 6603 matches `x.m()`. 6604cxxMemberCallExpr(on(callExpr())) 6605 matches `(g()).m()`. 6606 6607FIXME: Overload to allow directly matching types? 6608</pre></td></tr> 6609 6610 6611<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> 6612<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 6613</pre></td></tr> 6614 6615 6616<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> 6617<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 6618matches the InnerMatcher, or is a pointer to a type that matches the 6619InnerMatcher. 6620 6621Given 6622 class Y { public: void m(); }; 6623 class X : public Y { void g(); }; 6624 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 6625cxxMemberCallExpr(thisPointerType(hasDeclaration( 6626 cxxRecordDecl(hasName("Y"))))) 6627 matches `y.m()`, `p->m()` and `x.m()`. 6628cxxMemberCallExpr(thisPointerType(hasDeclaration( 6629 cxxRecordDecl(hasName("X"))))) 6630 matches `x.g()`. 6631</pre></td></tr> 6632 6633 6634<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> 6635<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 6636produce multiple matches. 6637 6638Given 6639 class A { virtual void f(); }; 6640 class B : public A { void f(); }; 6641 class C : public B { void f(); }; 6642cxxMethodDecl(ofClass(hasName("C")), 6643 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6644 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 6645 that B::f is not overridden by C::f). 6646 6647The check can produce multiple matches in case of multiple inheritance, e.g. 6648 class A1 { virtual void f(); }; 6649 class A2 { virtual void f(); }; 6650 class C : public A1, public A2 { void f(); }; 6651cxxMethodDecl(ofClass(hasName("C")), 6652 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6653 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 6654 once with "b" binding "A2::f" and "d" binding "C::f". 6655</pre></td></tr> 6656 6657 6658<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> 6659<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 6660belongs to. 6661 6662FIXME: Generalize this for other kinds of declarations. 6663FIXME: What other kind of declarations would we need to generalize 6664this to? 6665 6666Example matches A() in the last line 6667 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 6668 ofClass(hasName("A")))))) 6669 class A { 6670 public: 6671 A(); 6672 }; 6673 A a = A(); 6674</pre></td></tr> 6675 6676 6677<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> 6678<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments. 6679 6680Given: 6681 MyClass *p1 = new (Storage) MyClass(); 6682cxxNewExpr(hasAnyPlacementArg(anything())) 6683 matches the expression 'new (Storage, 16) MyClass()'. 6684</pre></td></tr> 6685 6686 6687<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> 6688<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 6689 6690Given: 6691 MyClass *p1 = new MyClass[10]; 6692cxxNewExpr(hasArraySize(integerLiteral(equals(10)))) 6693 matches the expression 'new MyClass[10]'. 6694</pre></td></tr> 6695 6696 6697<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> 6698<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 6699matches the given matcher. 6700 6701The associated declaration is: 6702- for type nodes, the declaration of the underlying type 6703- for CallExpr, the declaration of the callee 6704- for MemberExpr, the declaration of the referenced member 6705- for CXXConstructExpr, the declaration of the constructor 6706- for CXXNewExpr, the declaration of the operator new 6707- for ObjCIvarExpr, the declaration of the ivar 6708 6709For type nodes, hasDeclaration will generally match the declaration of the 6710sugared type. Given 6711 class X {}; 6712 typedef X Y; 6713 Y y; 6714in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6715typedefDecl. A common use case is to match the underlying, desugared type. 6716This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6717 varDecl(hasType(hasUnqualifiedDesugaredType( 6718 recordType(hasDeclaration(decl()))))) 6719In this matcher, the decl will match the CXXRecordDecl of class X. 6720 6721Usable 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>>, 6722 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>>, 6723 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>>, 6724 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>>, 6725 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>>, 6726 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>>, 6727 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6728</pre></td></tr> 6729 6730 6731<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> 6732<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments. 6733 6734Given: 6735 MyClass *p1 = new (Storage, 16) MyClass(); 6736cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16)))) 6737 matches the expression 'new (Storage, 16) MyClass()'. 6738</pre></td></tr> 6739 6740 6741<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> 6742<tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher. 6743 6744Examples: 6745 int x; 6746declaratorDecl(hasTypeLoc(loc(asString("int")))) 6747 matches int x 6748 6749auto x = int(3); 6750cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6751 matches int(3) 6752 6753struct Foo { Foo(int, int); }; 6754auto x = Foo(1, 2); 6755cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6756 matches Foo(1, 2) 6757 6758Usable 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>>, 6759 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>>, 6760 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>>, 6761 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6762 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>>, 6763 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>>, 6764 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>>, 6765 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6766</pre></td></tr> 6767 6768 6769<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> 6770<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a 6771binary operator matches. 6772</pre></td></tr> 6773 6774 6775<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> 6776<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 6777 6778Example matches a (matcher = binaryOperator(hasLHS())) 6779 a || b 6780</pre></td></tr> 6781 6782 6783<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> 6784<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator. 6785 6786Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6787 integerLiteral(equals(2))) 6788 1 + 2 // Match 6789 2 + 1 // Match 6790 1 + 1 // No match 6791 2 + 2 // No match 6792</pre></td></tr> 6793 6794 6795<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> 6796<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 6797 6798Example matches b (matcher = binaryOperator(hasRHS())) 6799 a || b 6800</pre></td></tr> 6801 6802 6803<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> 6804<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches. 6805 6806Example matches true (matcher = hasUnaryOperand( 6807 cxxBoolLiteral(equals(true)))) 6808 !true 6809</pre></td></tr> 6810 6811 6812<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> 6813<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher. 6814 6815Example: 6816matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6817 class Foo; 6818 class Bar : Foo {}; 6819 class Baz : Bar {}; 6820 class SpecialBase; 6821 class Proxy : SpecialBase {}; // matches Proxy 6822 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived 6823 6824FIXME: Refactor this and isDerivedFrom to reuse implementation. 6825</pre></td></tr> 6826 6827 6828<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> 6829<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher. 6830 6831Example: 6832matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6833 class Foo; 6834 class Bar : Foo {}; 6835 class Baz : Bar {}; 6836 class SpecialBase; 6837 class Proxy : SpecialBase {}; // matches Proxy 6838 class IndirectlyDerived : Proxy {}; // doesn't match 6839</pre></td></tr> 6840 6841 6842<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> 6843<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 6844 6845Given: 6846 class A { void func(); }; 6847 class B { void member(); }; 6848 6849cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 6850A but not B. 6851</pre></td></tr> 6852 6853 6854<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> 6855<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class 6856matching Base, or Objective-C classes that directly or indirectly 6857subclass a class matching Base. 6858 6859Note that a class is not considered to be derived from itself. 6860 6861Example matches Y, Z, C (Base == hasName("X")) 6862 class X; 6863 class Y : public X {}; // directly derived 6864 class Z : public Y {}; // indirectly derived 6865 typedef X A; 6866 typedef A B; 6867 class C : public B {}; // derived from a typedef of X 6868 6869In the following example, Bar matches isDerivedFrom(hasName("X")): 6870 class Foo; 6871 typedef Foo X; 6872 class Bar : public Foo {}; // derived from a type that X is a typedef of 6873 6874In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 6875 @interface NSObject @end 6876 @interface Bar : NSObject @end 6877 6878Usable 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>> 6879</pre></td></tr> 6880 6881 6882<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> 6883<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class 6884matching Base. 6885 6886Note that a class is not considered to be derived from itself. 6887 6888Example matches Y, C (Base == hasName("X")) 6889 class X; 6890 class Y : public X {}; // directly derived 6891 class Z : public Y {}; // indirectly derived 6892 typedef X A; 6893 typedef A B; 6894 class C : public B {}; // derived from a typedef of X 6895 6896In the following example, Bar matches isDerivedFrom(hasName("X")): 6897 class Foo; 6898 typedef Foo X; 6899 class Bar : public Foo {}; // derived from a type that X is a typedef of 6900</pre></td></tr> 6901 6902 6903<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> 6904<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 6905match Base. 6906</pre></td></tr> 6907 6908 6909<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> 6910<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a 6911binary operator matches. 6912</pre></td></tr> 6913 6914 6915<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> 6916<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions. 6917 6918Example matches a (matcher = binaryOperator(hasLHS())) 6919 a || b 6920</pre></td></tr> 6921 6922 6923<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> 6924<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator. 6925 6926Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6927 integerLiteral(equals(2))) 6928 1 + 2 // Match 6929 2 + 1 // Match 6930 1 + 1 // No match 6931 2 + 2 // No match 6932</pre></td></tr> 6933 6934 6935<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> 6936<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions. 6937 6938Example matches b (matcher = binaryOperator(hasRHS())) 6939 a || b 6940</pre></td></tr> 6941 6942 6943<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> 6944<tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher. 6945 6946Examples: 6947 int x; 6948declaratorDecl(hasTypeLoc(loc(asString("int")))) 6949 matches int x 6950 6951auto x = int(3); 6952cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6953 matches int(3) 6954 6955struct Foo { Foo(int, int); }; 6956auto x = Foo(1, 2); 6957cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6958 matches Foo(1, 2) 6959 6960Usable 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>>, 6961 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>>, 6962 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>>, 6963 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6964 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>>, 6965 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>>, 6966 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>>, 6967 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6968</pre></td></tr> 6969 6970 6971<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> 6972<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 6973expression, or an ObjC-message-send expression. 6974 6975Given 6976 void x(int, int, int) { int y; x(1, y, 42); } 6977callExpr(hasAnyArgument(declRefExpr())) 6978 matches x(1, y, 42) 6979with hasAnyArgument(...) 6980 matching y 6981 6982For ObjectiveC, given 6983 @interface I - (void) f:(int) y; @end 6984 void foo(I *i) { [i f:12]; } 6985objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6986 matches [i f:12] 6987</pre></td></tr> 6988 6989 6990<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> 6991<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 6992call expression. 6993 6994Example matches y in x(y) 6995 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6996 void x(int) { int y; x(y); } 6997</pre></td></tr> 6998 6999 7000<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> 7001<tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher. 7002 7003Examples: 7004 int x; 7005declaratorDecl(hasTypeLoc(loc(asString("int")))) 7006 matches int x 7007 7008auto x = int(3); 7009cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7010 matches int(3) 7011 7012struct Foo { Foo(int, int); }; 7013auto x = Foo(1, 2); 7014cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7015 matches Foo(1, 2) 7016 7017Usable 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>>, 7018 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>>, 7019 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>>, 7020 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7021 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>>, 7022 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>>, 7023 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>>, 7024 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7025</pre></td></tr> 7026 7027 7028<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> 7029<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 7030given matcher. 7031 7032Example matches y.x() (matcher = callExpr(callee( 7033 cxxMethodDecl(hasName("x"))))) 7034 class Y { public: void x(); }; 7035 void z() { Y y; y.x(); } 7036</pre></td></tr> 7037 7038 7039<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> 7040<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 7041 7042Given 7043 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 7044 void f() { f(); } 7045callExpr(callee(expr())) 7046 matches this->x(), x(), y.x(), f() 7047with callee(...) 7048 matching this->x, x, y.x, f respectively 7049 7050Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 7051because this introduces ambiguous overloads with calls to Callee taking a 7052internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 7053implemented in terms of implicit casts. 7054</pre></td></tr> 7055 7056 7057<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> 7058<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 7059 7060Given 7061 void f(int i); 7062 int y; 7063 f(y); 7064callExpr( 7065 forEachArgumentWithParam( 7066 declRefExpr(to(varDecl(hasName("y")))), 7067 parmVarDecl(hasType(isInteger())) 7068)) 7069 matches f(y); 7070with declRefExpr(...) 7071 matching int y 7072and parmVarDecl(...) 7073 matching int i 7074</pre></td></tr> 7075 7076 7077<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> 7078<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or 7079CXXConstructExpr. It is very similar to forEachArgumentWithParam but 7080it works on calls through function pointers as well. 7081 7082The difference is, that function pointers do not provide access to a 7083ParmVarDecl, but only the QualType for each argument. 7084 7085Given 7086 void f(int i); 7087 int y; 7088 f(y); 7089 void (*f_ptr)(int) = f; 7090 f_ptr(y); 7091callExpr( 7092 forEachArgumentWithParamType( 7093 declRefExpr(to(varDecl(hasName("y")))), 7094 qualType(isInteger()).bind("type) 7095)) 7096 matches f(y) and f_ptr(y) 7097with declRefExpr(...) 7098 matching int y 7099and qualType(...) 7100 matching int 7101</pre></td></tr> 7102 7103 7104<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> 7105<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 7106expression, or an ObjC-message-send expression. 7107 7108Given 7109 void x(int, int, int) { int y; x(1, y, 42); } 7110callExpr(hasAnyArgument(declRefExpr())) 7111 matches x(1, y, 42) 7112with hasAnyArgument(...) 7113 matching y 7114 7115For ObjectiveC, given 7116 @interface I - (void) f:(int) y; @end 7117 void foo(I *i) { [i f:12]; } 7118objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 7119 matches [i f:12] 7120</pre></td></tr> 7121 7122 7123<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> 7124<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 7125call expression. 7126 7127Example matches y in x(y) 7128 (matcher = callExpr(hasArgument(0, declRefExpr()))) 7129 void x(int) { int y; x(y); } 7130</pre></td></tr> 7131 7132 7133<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> 7134<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 7135matches the given matcher. 7136 7137The associated declaration is: 7138- for type nodes, the declaration of the underlying type 7139- for CallExpr, the declaration of the callee 7140- for MemberExpr, the declaration of the referenced member 7141- for CXXConstructExpr, the declaration of the constructor 7142- for CXXNewExpr, the declaration of the operator new 7143- for ObjCIvarExpr, the declaration of the ivar 7144 7145For type nodes, hasDeclaration will generally match the declaration of the 7146sugared type. Given 7147 class X {}; 7148 typedef X Y; 7149 Y y; 7150in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7151typedefDecl. A common use case is to match the underlying, desugared type. 7152This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7153 varDecl(hasType(hasUnqualifiedDesugaredType( 7154 recordType(hasDeclaration(decl()))))) 7155In this matcher, the decl will match the CXXRecordDecl of class X. 7156 7157Usable 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>>, 7158 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>>, 7159 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>>, 7160 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>>, 7161 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>>, 7162 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>>, 7163 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7164</pre></td></tr> 7165 7166 7167<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> 7168<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 7169extension, matches the constant given in the statement. 7170 7171Given 7172 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 7173caseStmt(hasCaseConstant(integerLiteral())) 7174 matches "case 1:" 7175</pre></td></tr> 7176 7177 7178<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> 7179<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 7180or opaque value's source expression matches the given matcher. 7181 7182Example 1: matches "a string" 7183(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 7184class URL { URL(string); }; 7185URL url = "a string"; 7186 7187Example 2: matches 'b' (matcher = 7188opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 7189int a = b ?: 1; 7190</pre></td></tr> 7191 7192 7193<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> 7194<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7195functionDecl that have at least one TemplateArgument matching the given 7196InnerMatcher. 7197 7198Given 7199 template<typename T> class A {}; 7200 template<> class A<double> {}; 7201 A<int> a; 7202 7203 template<typename T> f() {}; 7204 void func() { f<int>(); }; 7205 7206classTemplateSpecializationDecl(hasAnyTemplateArgument( 7207 refersToType(asString("int")))) 7208 matches the specialization A<int> 7209 7210functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7211 matches the specialization f<int> 7212</pre></td></tr> 7213 7214 7215<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> 7216<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 7217 7218Given 7219 template<typename T> class A {}; #1 7220 template<> class A<int> {}; #2 7221classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 7222 matches '#2' with classTemplateDecl() matching the class template 7223 declaration of 'A' at #1. 7224</pre></td></tr> 7225 7226 7227<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> 7228<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7229functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7230 7231Given 7232 template<typename T, typename U> class A {}; 7233 A<bool, int> b; 7234 A<int, bool> c; 7235 7236 template<typename T> void f() {} 7237 void func() { f<int>(); }; 7238classTemplateSpecializationDecl(hasTemplateArgument( 7239 1, refersToType(asString("int")))) 7240 matches the specialization A<bool, int> 7241 7242functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7243 matches the specialization f<int> 7244</pre></td></tr> 7245 7246 7247<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> 7248<tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher. 7249 7250Examples: 7251 int x; 7252declaratorDecl(hasTypeLoc(loc(asString("int")))) 7253 matches int x 7254 7255auto x = int(3); 7256cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7257 matches int(3) 7258 7259struct Foo { Foo(int, int); }; 7260auto x = Foo(1, 2); 7261cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7262 matches Foo(1, 2) 7263 7264Usable 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>>, 7265 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>>, 7266 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>>, 7267 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7268 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>>, 7269 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>>, 7270 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>>, 7271 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7272</pre></td></tr> 7273 7274 7275<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> 7276<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 7277type. 7278 7279Given 7280 struct A {}; 7281 A a[7]; 7282 int b[7]; 7283arrayType(hasElementType(builtinType())) 7284 matches "int b[7]" 7285 7286Usable 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>> 7287</pre></td></tr> 7288 7289 7290<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> 7291<tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher. 7292 7293Examples: 7294 int x; 7295declaratorDecl(hasTypeLoc(loc(asString("int")))) 7296 matches int x 7297 7298auto x = int(3); 7299cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7300 matches int(3) 7301 7302struct Foo { Foo(int, int); }; 7303auto x = Foo(1, 2); 7304cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7305 matches Foo(1, 2) 7306 7307Usable 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>>, 7308 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>>, 7309 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>>, 7310 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7311 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>>, 7312 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>>, 7313 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>>, 7314 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7315</pre></td></tr> 7316 7317 7318<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> 7319<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 7320a given matcher. Also matches StmtExprs that have CompoundStmt as children. 7321 7322Given 7323 { {}; 1+2; } 7324hasAnySubstatement(compoundStmt()) 7325 matches '{ {}; 1+2; }' 7326with compoundStmt() 7327 matching '{}' 7328</pre></td></tr> 7329 7330 7331<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> 7332<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher 7333</pre></td></tr> 7334 7335 7336<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> 7337<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 7338matches the given matcher. 7339 7340The associated declaration is: 7341- for type nodes, the declaration of the underlying type 7342- for CallExpr, the declaration of the callee 7343- for MemberExpr, the declaration of the referenced member 7344- for CXXConstructExpr, the declaration of the constructor 7345- for CXXNewExpr, the declaration of the operator new 7346- for ObjCIvarExpr, the declaration of the ivar 7347 7348For type nodes, hasDeclaration will generally match the declaration of the 7349sugared type. Given 7350 class X {}; 7351 typedef X Y; 7352 Y y; 7353in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7354typedefDecl. A common use case is to match the underlying, desugared type. 7355This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7356 varDecl(hasType(hasUnqualifiedDesugaredType( 7357 recordType(hasDeclaration(decl()))))) 7358In this matcher, the decl will match the CXXRecordDecl of class X. 7359 7360Usable 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>>, 7361 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>>, 7362 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>>, 7363 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>>, 7364 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>>, 7365 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>>, 7366 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7367</pre></td></tr> 7368 7369 7370<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('throughUsingDecl0')"><a name="throughUsingDecl0Anchor">throughUsingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr> 7371<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 7372specific using shadow declaration. 7373 7374Given 7375 namespace a { void f() {} } 7376 using a::f; 7377 void g() { 7378 f(); // Matches this .. 7379 a::f(); // .. but not this. 7380 } 7381declRefExpr(throughUsingDecl(anything())) 7382 matches f() 7383</pre></td></tr> 7384 7385 7386<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> 7387<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 7388specified matcher. 7389 7390Example matches x in if(x) 7391 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 7392 bool x; 7393 if (x) {} 7394</pre></td></tr> 7395 7396 7397<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> 7398<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 7399 7400Note that this does not work for global declarations because the AST 7401breaks up multiple-declaration DeclStmt's into multiple single-declaration 7402DeclStmt's. 7403Example: Given non-global declarations 7404 int a, b = 0; 7405 int c; 7406 int d = 2, e; 7407declStmt(containsDeclaration( 7408 0, varDecl(hasInitializer(anything())))) 7409 matches only 'int d = 2, e;', and 7410declStmt(containsDeclaration(1, varDecl())) 7411 matches 'int a, b = 0' as well as 'int d = 2, e;' 7412 but 'int c;' is not matched. 7413</pre></td></tr> 7414 7415 7416<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> 7417<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 7418 7419Given 7420 int a, b; 7421 int c; 7422declStmt(hasSingleDecl(anything())) 7423 matches 'int c;' but not 'int a, b;'. 7424</pre></td></tr> 7425 7426 7427<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> 7428<tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher. 7429 7430Examples: 7431 int x; 7432declaratorDecl(hasTypeLoc(loc(asString("int")))) 7433 matches int x 7434 7435auto x = int(3); 7436cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7437 matches int(3) 7438 7439struct Foo { Foo(int, int); }; 7440auto x = Foo(1, 2); 7441cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7442 matches Foo(1, 2) 7443 7444Usable 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>>, 7445 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>>, 7446 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>>, 7447 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7448 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>>, 7449 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>>, 7450 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>>, 7451 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7452</pre></td></tr> 7453 7454 7455<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> 7456<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 7457Decl, matches InnerMatcher. 7458 7459Given 7460 namespace N { 7461 namespace M { 7462 class D {}; 7463 } 7464 } 7465 7466cxxRecordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 7467declaration of class D. 7468</pre></td></tr> 7469 7470 7471<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> 7472<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type. 7473 7474Given 7475 decltype(1) a = 1; 7476 decltype(2.0) b = 2.0; 7477decltypeType(hasUnderlyingType(isInteger())) 7478 matches the type of "a" 7479 7480Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>> 7481</pre></td></tr> 7482 7483 7484<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> 7485<tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl. 7486 7487For example, in: 7488void foo() 7489{ 7490 int arr[3]; 7491 auto &[f, s, t] = arr; 7492 7493 f = 42; 7494} 7495The matcher: 7496 decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding")))) 7497matches the decomposition decl with 'f' bound to "fBinding". 7498</pre></td></tr> 7499 7500 7501<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> 7502<tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl. 7503 7504For example, in: 7505void foo() 7506{ 7507 int arr[3]; 7508 auto &[f, s, t] = arr; 7509 7510 f = 42; 7511} 7512The matcher: 7513 decompositionDecl(hasBinding(0, 7514 bindingDecl(hasName("f").bind("fBinding")))) 7515matches the decomposition decl with 'f' bound to "fBinding". 7516</pre></td></tr> 7517 7518 7519<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> 7520<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr> 7521 7522 7523<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> 7524<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 7525switch statement or conditional operator. 7526 7527Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7528 if (true) {} 7529</pre></td></tr> 7530 7531 7532<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> 7533<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 7534matches InnerMatcher if the qualifier exists. 7535 7536Given 7537 namespace N { 7538 namespace M { 7539 class D {}; 7540 } 7541 } 7542 N::M::D d; 7543 7544elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 7545matches the type of the variable declaration of d. 7546</pre></td></tr> 7547 7548 7549<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> 7550<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 7551 7552Given 7553 namespace N { 7554 namespace M { 7555 class D {}; 7556 } 7557 } 7558 N::M::D d; 7559 7560elaboratedType(namesType(recordType( 7561hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 7562declaration of d. 7563</pre></td></tr> 7564 7565 7566<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> 7567<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 7568matches the given matcher. 7569 7570The associated declaration is: 7571- for type nodes, the declaration of the underlying type 7572- for CallExpr, the declaration of the callee 7573- for MemberExpr, the declaration of the referenced member 7574- for CXXConstructExpr, the declaration of the constructor 7575- for CXXNewExpr, the declaration of the operator new 7576- for ObjCIvarExpr, the declaration of the ivar 7577 7578For type nodes, hasDeclaration will generally match the declaration of the 7579sugared type. Given 7580 class X {}; 7581 typedef X Y; 7582 Y y; 7583in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7584typedefDecl. A common use case is to match the underlying, desugared type. 7585This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7586 varDecl(hasType(hasUnqualifiedDesugaredType( 7587 recordType(hasDeclaration(decl()))))) 7588In this matcher, the decl will match the CXXRecordDecl of class X. 7589 7590Usable 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>>, 7591 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>>, 7592 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>>, 7593 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>>, 7594 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>>, 7595 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>>, 7596 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7597</pre></td></tr> 7598 7599 7600<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> 7601<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 7602 7603(Note: Clang's AST refers to other conversions as "casts" too, and calls 7604actual casts "explicit" casts.) 7605</pre></td></tr> 7606 7607 7608<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> 7609<tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher. 7610 7611Examples: 7612 int x; 7613declaratorDecl(hasTypeLoc(loc(asString("int")))) 7614 matches int x 7615 7616auto x = int(3); 7617cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7618 matches int(3) 7619 7620struct Foo { Foo(int, int); }; 7621auto x = Foo(1, 2); 7622cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7623 matches Foo(1, 2) 7624 7625Usable 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>>, 7626 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>>, 7627 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>>, 7628 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7629 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>>, 7630 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>>, 7631 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>>, 7632 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7633</pre></td></tr> 7634 7635 7636<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> 7637<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 7638declaration's type. 7639 7640In case of a value declaration (for example a variable declaration), 7641this resolves one layer of indirection. For example, in the value 7642declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7643X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7644declaration of x. 7645 7646Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7647 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7648 and friend class X (matcher = friendDecl(hasType("X")) 7649 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7650 cxxRecordDecl(hasName("X")))) 7651 class X {}; 7652 void y(X &x) { x; X z; } 7653 class Y { friend class X; }; 7654 class Z : public virtual X {}; 7655 7656Example matches class Derived 7657(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7658class Base {}; 7659class Derived : Base {}; 7660 7661Usable 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>>, 7662Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7663</pre></td></tr> 7664 7665 7666<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> 7667<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 7668matcher. 7669 7670Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7671 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7672 and U (matcher = typedefDecl(hasType(asString("int"))) 7673 and friend class X (matcher = friendDecl(hasType("X")) 7674 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7675 asString("class X"))) 7676 class X {}; 7677 void y(X &x) { x; X z; } 7678 typedef int U; 7679 class Y { friend class X; }; 7680 class Z : public virtual X {}; 7681</pre></td></tr> 7682 7683 7684<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> 7685<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 7686elidable constructor and other corresponding bookkeeping nodes. 7687 7688In C++17, elidable copy constructors are no longer being generated in the 7689AST as it is not permitted by the standard. They are, however, part of the 7690AST in C++14 and earlier. So, a matcher must abstract over these differences 7691to work in all language modes. This matcher skips elidable constructor-call 7692AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 7693various implicit nodes inside the constructor calls, all of which will not 7694appear in the C++17 AST. 7695 7696Given 7697 7698struct H {}; 7699H G(); 7700void f() { 7701 H D = G(); 7702} 7703 7704``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 7705matches ``H D = G()`` in C++11 through C++17 (and beyond). 7706</pre></td></tr> 7707 7708 7709<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> 7710<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 7711are stripped off. 7712 7713Parentheses and explicit casts are not discarded. 7714Given 7715 int arr[5]; 7716 int a = 0; 7717 char b = 0; 7718 const int c = a; 7719 int *d = arr; 7720 long e = (long) 0l; 7721The matchers 7722 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 7723 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 7724would match the declarations for a, b, c, and d, but not e. 7725While 7726 varDecl(hasInitializer(integerLiteral())) 7727 varDecl(hasInitializer(declRefExpr())) 7728only match the declarations for a. 7729</pre></td></tr> 7730 7731 7732<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> 7733<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 7734nodes are stripped off. 7735 7736Parentheses and explicit casts are not discarded. 7737Given 7738 class C {}; 7739 C a = C(); 7740 C b; 7741 C c = b; 7742The matchers 7743 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 7744would match the declarations for a, b, and c. 7745While 7746 varDecl(hasInitializer(cxxConstructExpr())) 7747only match the declarations for b and c. 7748</pre></td></tr> 7749 7750 7751<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> 7752<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 7753casts are stripped off. 7754 7755Implicit and non-C Style casts are also discarded. 7756Given 7757 int a = 0; 7758 char b = (0); 7759 void* c = reinterpret_cast<char*>(0); 7760 char d = char(0); 7761The matcher 7762 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 7763would match the declarations for a, b, c, and d. 7764while 7765 varDecl(hasInitializer(integerLiteral())) 7766only match the declaration for a. 7767</pre></td></tr> 7768 7769 7770<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> 7771<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 7772parentheses are stripped off. 7773 7774Explicit casts are not discarded. 7775Given 7776 int arr[5]; 7777 int a = 0; 7778 char b = (0); 7779 const int c = a; 7780 int *d = (arr); 7781 long e = ((long) 0l); 7782The matchers 7783 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 7784 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 7785would match the declarations for a, b, c, and d, but not e. 7786while 7787 varDecl(hasInitializer(integerLiteral())) 7788 varDecl(hasInitializer(declRefExpr())) 7789would only match the declaration for a. 7790</pre></td></tr> 7791 7792 7793<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> 7794<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 7795 7796Given 7797 const char* str = ("my-string"); 7798The matcher 7799 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 7800would match the implicit cast resulting from the assignment. 7801</pre></td></tr> 7802 7803 7804<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> 7805<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 7806 7807Given 7808 class C { 7809 int a = 2; 7810 int b = 3; 7811 int c; 7812 }; 7813fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 7814 matches 'int a;' but not 'int b;'. 7815fieldDecl(hasInClassInitializer(anything())) 7816 matches 'int a;' and 'int b;' but not 'int c;'. 7817</pre></td></tr> 7818 7819 7820<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> 7821<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr> 7822 7823 7824<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> 7825<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 7826switch statement or conditional operator. 7827 7828Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7829 if (true) {} 7830</pre></td></tr> 7831 7832 7833<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> 7834<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 7835 7836Example: 7837 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 7838matches '++x' in 7839 for (x; x < N; ++x) { } 7840</pre></td></tr> 7841 7842 7843<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> 7844<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 7845 7846Example: 7847 forStmt(hasLoopInit(declStmt())) 7848matches 'int x = 0' in 7849 for (int x = 0; x < N; ++x) { } 7850</pre></td></tr> 7851 7852 7853<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> 7854<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 7855declaration's type. 7856 7857In case of a value declaration (for example a variable declaration), 7858this resolves one layer of indirection. For example, in the value 7859declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7860X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7861declaration of x. 7862 7863Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7864 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7865 and friend class X (matcher = friendDecl(hasType("X")) 7866 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7867 cxxRecordDecl(hasName("X")))) 7868 class X {}; 7869 void y(X &x) { x; X z; } 7870 class Y { friend class X; }; 7871 class Z : public virtual X {}; 7872 7873Example matches class Derived 7874(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7875class Base {}; 7876class Derived : Base {}; 7877 7878Usable 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>>, 7879Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7880</pre></td></tr> 7881 7882 7883<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> 7884<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 7885matcher. 7886 7887Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7888 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7889 and U (matcher = typedefDecl(hasType(asString("int"))) 7890 and friend class X (matcher = friendDecl(hasType("X")) 7891 and public virtual X (matcher = cxxBaseSpecifier(hasType( 7892 asString("class X"))) 7893 class X {}; 7894 void y(X &x) { x; X z; } 7895 typedef int U; 7896 class Y { friend class X; }; 7897 class Z : public virtual X {}; 7898</pre></td></tr> 7899 7900 7901<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> 7902<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST. 7903Note that this matcher matches all the declarations of a function whose 7904body is present in the AST. 7905 7906Given 7907 void f(); 7908 void f() {} 7909 void g(); 7910functionDecl(hasAnyBody(compoundStmt())) 7911 matches both 'void f();' 7912 and 'void f() {}' 7913with compoundStmt() 7914 matching '{}' 7915 but does not match 'void g();' 7916</pre></td></tr> 7917 7918 7919<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> 7920<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 7921block. 7922 7923Does not match the 'this' parameter of a method. 7924 7925Given 7926 class X { void f(int x, int y, int z) {} }; 7927cxxMethodDecl(hasAnyParameter(hasName("y"))) 7928 matches f(int x, int y, int z) {} 7929with hasAnyParameter(...) 7930 matching int y 7931 7932For ObjectiveC, given 7933 @interface I - (void) f:(int) y; @end 7934 7935the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 7936matches the declaration of method f with hasParameter 7937matching y. 7938 7939For blocks, given 7940 b = ^(int y) { printf("%d", y) }; 7941 7942the matcher blockDecl(hasAnyParameter(hasName("y"))) 7943matches the declaration of the block b with hasParameter 7944matching y. 7945</pre></td></tr> 7946 7947 7948<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> 7949<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7950functionDecl that have at least one TemplateArgument matching the given 7951InnerMatcher. 7952 7953Given 7954 template<typename T> class A {}; 7955 template<> class A<double> {}; 7956 A<int> a; 7957 7958 template<typename T> f() {}; 7959 void func() { f<int>(); }; 7960 7961classTemplateSpecializationDecl(hasAnyTemplateArgument( 7962 refersToType(asString("int")))) 7963 matches the specialization A<int> 7964 7965functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7966 matches the specialization f<int> 7967</pre></td></tr> 7968 7969 7970<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> 7971<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr> 7972 7973 7974<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> 7975<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 7976declaration. 7977 7978Given 7979 template<bool b> 7980 struct S { 7981 S(int); // #1 7982 explicit S(double); // #2 7983 operator int(); // #3 7984 explicit operator bool(); // #4 7985 explicit(false) S(bool) // # 7 7986 explicit(true) S(char) // # 8 7987 explicit(b) S(S) // # 9 7988 }; 7989 S(int) -> S<true> // #5 7990 explicit S(double) -> S<false> // #6 7991cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 7992cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 7993cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 7994</pre></td></tr> 7995 7996 7997<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> 7998<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 7999declaration or a block. 8000 8001Given 8002 class X { void f(int x) {} }; 8003cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 8004 matches f(int x) {} 8005with hasParameter(...) 8006 matching int x 8007 8008For ObjectiveC, given 8009 @interface I - (void) f:(int) y; @end 8010 8011the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 8012matches the declaration of method f with hasParameter 8013matching y. 8014</pre></td></tr> 8015 8016 8017<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> 8018<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8019functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 8020 8021Given 8022 template<typename T, typename U> class A {}; 8023 A<bool, int> b; 8024 A<int, bool> c; 8025 8026 template<typename T> void f() {} 8027 void func() { f<int>(); }; 8028classTemplateSpecializationDecl(hasTemplateArgument( 8029 1, refersToType(asString("int")))) 8030 matches the specialization A<bool, int> 8031 8032functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 8033 matches the specialization f<int> 8034</pre></td></tr> 8035 8036 8037<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> 8038<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 8039 8040Given: 8041 class X { int f() { return 1; } }; 8042cxxMethodDecl(returns(asString("int"))) 8043 matches int f() { return 1; } 8044</pre></td></tr> 8045 8046 8047<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> 8048<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 8049switch statement or conditional operator. 8050 8051Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8052 if (true) {} 8053</pre></td></tr> 8054 8055 8056<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> 8057<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 8058 8059Given 8060 if (A* a = GetAPointer()) {} 8061hasConditionVariableStatement(...) 8062 matches 'A* a = GetAPointer()'. 8063</pre></td></tr> 8064 8065 8066<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> 8067<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 8068 8069Examples matches the if statement 8070 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 8071 if (false) false; else true; 8072</pre></td></tr> 8073 8074 8075<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> 8076<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 8077 8078Given: 8079 void foo() { 8080 if (int i = foobar(); i > 0) {} 8081 switch (int i = foobar(); i) {} 8082 for (auto& a = get_range(); auto& x : a) {} 8083 } 8084 void bar() { 8085 if (foobar() > 0) {} 8086 switch (foobar()) {} 8087 for (auto& x : get_range()) {} 8088 } 8089ifStmt(hasInitStatement(anything())) 8090 matches the if statement in foo but not in bar. 8091switchStmt(hasInitStatement(anything())) 8092 matches the switch statement in foo but not in bar. 8093cxxForRangeStmt(hasInitStatement(anything())) 8094 matches the range for statement in foo but not in bar. 8095</pre></td></tr> 8096 8097 8098<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> 8099<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 8100 8101Examples matches the if statement 8102 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 8103 if (false) true; else false; 8104</pre></td></tr> 8105 8106 8107<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> 8108<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 8109matcher. 8110 8111FIXME: Unit test this matcher 8112</pre></td></tr> 8113 8114 8115<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> 8116<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 8117 8118Example matches y. 8119 (matcher = initListExpr(hasInit(0, expr()))) 8120 int x{y}. 8121</pre></td></tr> 8122 8123 8124<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> 8125<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 8126(if expression have it). 8127</pre></td></tr> 8128 8129 8130<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> 8131<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 8132matches the given matcher. 8133 8134The associated declaration is: 8135- for type nodes, the declaration of the underlying type 8136- for CallExpr, the declaration of the callee 8137- for MemberExpr, the declaration of the referenced member 8138- for CXXConstructExpr, the declaration of the constructor 8139- for CXXNewExpr, the declaration of the operator new 8140- for ObjCIvarExpr, the declaration of the ivar 8141 8142For type nodes, hasDeclaration will generally match the declaration of the 8143sugared type. Given 8144 class X {}; 8145 typedef X Y; 8146 Y y; 8147in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8148typedefDecl. A common use case is to match the underlying, desugared type. 8149This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8150 varDecl(hasType(hasUnqualifiedDesugaredType( 8151 recordType(hasDeclaration(decl()))))) 8152In this matcher, the decl will match the CXXRecordDecl of class X. 8153 8154Usable 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>>, 8155 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>>, 8156 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>>, 8157 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>>, 8158 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>>, 8159 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>>, 8160 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8161</pre></td></tr> 8162 8163 8164<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> 8165<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 8166matches the given matcher. 8167 8168The associated declaration is: 8169- for type nodes, the declaration of the underlying type 8170- for CallExpr, the declaration of the callee 8171- for MemberExpr, the declaration of the referenced member 8172- for CXXConstructExpr, the declaration of the constructor 8173- for CXXNewExpr, the declaration of the operator new 8174- for ObjCIvarExpr, the declaration of the ivar 8175 8176For type nodes, hasDeclaration will generally match the declaration of the 8177sugared type. Given 8178 class X {}; 8179 typedef X Y; 8180 Y y; 8181in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8182typedefDecl. A common use case is to match the underlying, desugared type. 8183This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8184 varDecl(hasType(hasUnqualifiedDesugaredType( 8185 recordType(hasDeclaration(decl()))))) 8186In this matcher, the decl will match the CXXRecordDecl of class X. 8187 8188Usable 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>>, 8189 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>>, 8190 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>>, 8191 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>>, 8192 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>>, 8193 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>>, 8194 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8195</pre></td></tr> 8196 8197 8198<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>></td><td class="name" onclick="toggle('hasAnyCapture1')"><a name="hasAnyCapture1Anchor">hasAnyCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>> InnerMatcher</td></tr> 8199<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression. 8200 8201Given 8202 struct foo { 8203 void bar() { 8204 auto f = [this](){}; 8205 } 8206 } 8207lambdaExpr(hasAnyCapture(cxxThisExpr())) 8208 matches [this](){}; 8209</pre></td></tr> 8210 8211 8212<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>></td><td class="name" onclick="toggle('hasAnyCapture0')"><a name="hasAnyCapture0Anchor">hasAnyCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>> InnerMatcher</td></tr> 8213<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression. 8214 8215Given 8216 void foo() { 8217 int x; 8218 auto f = [x](){}; 8219 } 8220lambdaExpr(hasAnyCapture(anything())) 8221 matches [x](){}; 8222</pre></td></tr> 8223 8224 8225<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> 8226<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 8227matches the given matcher. 8228 8229The associated declaration is: 8230- for type nodes, the declaration of the underlying type 8231- for CallExpr, the declaration of the callee 8232- for MemberExpr, the declaration of the referenced member 8233- for CXXConstructExpr, the declaration of the constructor 8234- for CXXNewExpr, the declaration of the operator new 8235- for ObjCIvarExpr, the declaration of the ivar 8236 8237For type nodes, hasDeclaration will generally match the declaration of the 8238sugared type. Given 8239 class X {}; 8240 typedef X Y; 8241 Y y; 8242in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8243typedefDecl. A common use case is to match the underlying, desugared type. 8244This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8245 varDecl(hasType(hasUnqualifiedDesugaredType( 8246 recordType(hasDeclaration(decl()))))) 8247In this matcher, the decl will match the CXXRecordDecl of class X. 8248 8249Usable 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>>, 8250 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>>, 8251 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>>, 8252 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>>, 8253 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>>, 8254 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>>, 8255 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8256</pre></td></tr> 8257 8258 8259<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> 8260<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 8261given matcher. Implicit object expressions are included; that is, it matches 8262use of implicit `this`. 8263 8264Given 8265 struct X { 8266 int m; 8267 int f(X x) { x.m; return m; } 8268 }; 8269memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 8270 matches `x.m`, but not `m`; however, 8271memberExpr(hasObjectExpression(hasType(pointsTo( 8272 cxxRecordDecl(hasName("X")))))) 8273 matches `m` (aka. `this->m`), but not `x.m`. 8274</pre></td></tr> 8275 8276 8277<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> 8278<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 8279given matcher. 8280 8281Given 8282 struct { int first, second; } first, second; 8283 int i(second.first); 8284 int j(first.second); 8285memberExpr(member(hasName("first"))) 8286 matches second.first 8287 but not first.second (because the member name there is "second"). 8288</pre></td></tr> 8289 8290 8291<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> 8292<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 8293pointee matches a given matcher. 8294 8295Given 8296 int *a; 8297 int const *b; 8298 float const *f; 8299pointerType(pointee(isConstQualified(), isInteger())) 8300 matches "int const *b" 8301 8302Usable 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>>, 8303 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>> 8304</pre></td></tr> 8305 8306 8307<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> 8308<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 8309matcher. 8310 8311Given 8312 namespace N { template<class T> void f(T t); } 8313 template <class T> void g() { using N::f; f(T()); } 8314unresolvedLookupExpr(hasAnyDeclaration( 8315 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 8316 matches the use of f in g() . 8317</pre></td></tr> 8318 8319 8320<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> 8321<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 8322 8323Given 8324 struct A { struct B { struct C {}; }; }; 8325 A::B::C c; 8326nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 8327 matches "A::" 8328</pre></td></tr> 8329 8330 8331<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> 8332<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 8333NestedNameSpecifier-matcher matches. 8334</pre></td></tr> 8335 8336 8337<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> 8338<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 8339given TypeLoc. 8340 8341Given 8342 struct A { struct B { struct C {}; }; }; 8343 A::B::C c; 8344nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 8345 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 8346 matches "A::" 8347</pre></td></tr> 8348 8349 8350<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> 8351<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 8352 8353Given 8354 struct A { struct B { struct C {}; }; }; 8355 A::B::C c; 8356nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 8357 matches "A::" 8358</pre></td></tr> 8359 8360 8361<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> 8362<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 8363given namespace matcher. 8364 8365Given 8366 namespace ns { struct A {}; } 8367 ns::A a; 8368nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 8369 matches "ns::" 8370</pre></td></tr> 8371 8372 8373<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> 8374<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 8375given QualType matcher without qualifiers. 8376 8377Given 8378 struct A { struct B { struct C {}; }; }; 8379 A::B::C c; 8380nestedNameSpecifier(specifiesType( 8381 hasDeclaration(cxxRecordDecl(hasName("A"))) 8382)) 8383 matches "A::" 8384</pre></td></tr> 8385 8386 8387<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> 8388<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 8389 8390Given 8391 8392 #pragma omp parallel 8393 #pragma omp parallel default(none) 8394 8395``ompExecutableDirective(hasAnyClause(anything()))`` matches 8396``omp parallel default(none)``. 8397</pre></td></tr> 8398 8399 8400<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> 8401<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 8402 8403Prerequisite: the executable directive must not be standalone directive. 8404If it is, it will never match. 8405 8406Given 8407 8408 #pragma omp parallel 8409 ; 8410 #pragma omp parallel 8411 {} 8412 8413``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 8414</pre></td></tr> 8415 8416 8417<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> 8418<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 8419matching Base, or Objective-C classes that directly or indirectly 8420subclass a class matching Base. 8421 8422Note that a class is not considered to be derived from itself. 8423 8424Example matches Y, Z, C (Base == hasName("X")) 8425 class X; 8426 class Y : public X {}; // directly derived 8427 class Z : public Y {}; // indirectly derived 8428 typedef X A; 8429 typedef A B; 8430 class C : public B {}; // derived from a typedef of X 8431 8432In the following example, Bar matches isDerivedFrom(hasName("X")): 8433 class Foo; 8434 typedef Foo X; 8435 class Bar : public Foo {}; // derived from a type that X is a typedef of 8436 8437In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 8438 @interface NSObject @end 8439 @interface Bar : NSObject @end 8440 8441Usable 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>> 8442</pre></td></tr> 8443 8444 8445<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> 8446<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 8447matching Base. 8448 8449Note that a class is not considered to be derived from itself. 8450 8451Example matches Y, C (Base == hasName("X")) 8452 class X; 8453 class Y : public X {}; // directly derived 8454 class Z : public Y {}; // indirectly derived 8455 typedef X A; 8456 typedef A B; 8457 class C : public B {}; // derived from a typedef of X 8458 8459In the following example, Bar matches isDerivedFrom(hasName("X")): 8460 class Foo; 8461 typedef Foo X; 8462 class Bar : public Foo {}; // derived from a type that X is a typedef of 8463</pre></td></tr> 8464 8465 8466<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> 8467<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 8468match Base. 8469</pre></td></tr> 8470 8471 8472<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> 8473<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 8474expression, or an ObjC-message-send expression. 8475 8476Given 8477 void x(int, int, int) { int y; x(1, y, 42); } 8478callExpr(hasAnyArgument(declRefExpr())) 8479 matches x(1, y, 42) 8480with hasAnyArgument(...) 8481 matching y 8482 8483For ObjectiveC, given 8484 @interface I - (void) f:(int) y; @end 8485 void foo(I *i) { [i f:12]; } 8486objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 8487 matches [i f:12] 8488</pre></td></tr> 8489 8490 8491<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> 8492<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor 8493call expression. 8494 8495Example matches y in x(y) 8496 (matcher = callExpr(hasArgument(0, declRefExpr()))) 8497 void x(int) { int y; x(y); } 8498</pre></td></tr> 8499 8500 8501<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> 8502<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 8503and the inner matcher matches on that instance. 8504 8505For example the method call in 8506 NSString *x = @"hello"; 8507 [x containsString:@"h"]; 8508is matched by 8509objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 8510</pre></td></tr> 8511 8512 8513<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> 8514<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 8515 8516Example 8517matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 8518matches the [webView ...] message invocation. 8519 NSString *webViewJavaScript = ... 8520 UIWebView *webView = ... 8521 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 8522</pre></td></tr> 8523 8524 8525<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> 8526<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 8527block. 8528 8529Does not match the 'this' parameter of a method. 8530 8531Given 8532 class X { void f(int x, int y, int z) {} }; 8533cxxMethodDecl(hasAnyParameter(hasName("y"))) 8534 matches f(int x, int y, int z) {} 8535with hasAnyParameter(...) 8536 matching int y 8537 8538For ObjectiveC, given 8539 @interface I - (void) f:(int) y; @end 8540 8541the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 8542matches the declaration of method f with hasParameter 8543matching y. 8544 8545For blocks, given 8546 b = ^(int y) { printf("%d", y) }; 8547 8548the matcher blockDecl(hasAnyParameter(hasName("y"))) 8549matches the declaration of the block b with hasParameter 8550matching y. 8551</pre></td></tr> 8552 8553 8554<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> 8555<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 8556declaration or a block. 8557 8558Given 8559 class X { void f(int x) {} }; 8560cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 8561 matches f(int x) {} 8562with hasParameter(...) 8563 matching int x 8564 8565For ObjectiveC, given 8566 @interface I - (void) f:(int) y; @end 8567 8568the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 8569matches the declaration of method f with hasParameter 8570matching y. 8571</pre></td></tr> 8572 8573 8574<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> 8575<tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher. 8576 8577Examples: 8578 int x; 8579declaratorDecl(hasTypeLoc(loc(asString("int")))) 8580 matches int x 8581 8582auto x = int(3); 8583cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 8584 matches int(3) 8585 8586struct Foo { Foo(int, int); }; 8587auto x = Foo(1, 2); 8588cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 8589 matches Foo(1, 2) 8590 8591Usable 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>>, 8592 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>>, 8593 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>>, 8594 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 8595 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>>, 8596 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>>, 8597 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>>, 8598 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 8599</pre></td></tr> 8600 8601 8602<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> 8603<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 8604or opaque value's source expression matches the given matcher. 8605 8606Example 1: matches "a string" 8607(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 8608class URL { URL(string); }; 8609URL url = "a string"; 8610 8611Example 2: matches 'b' (matcher = 8612opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 8613int a = b ?: 1; 8614</pre></td></tr> 8615 8616 8617<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> 8618<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 8619overloads matches the given matcher. 8620 8621Given 8622 template <typename T> void foo(T); 8623 template <typename T> void bar(T); 8624 template <typename T> void baz(T t) { 8625 foo(t); 8626 bar(t); 8627 } 8628unresolvedLookupExpr(hasAnyDeclaration( 8629 functionTemplateDecl(hasName("foo")))) 8630 matches foo in foo(t); but not bar in bar(t); 8631</pre></td></tr> 8632 8633 8634<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> 8635<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 8636 8637Given 8638 int (*ptr_to_array)[4]; 8639 int (*ptr_to_func)(int); 8640 8641varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 8642ptr_to_func but not ptr_to_array. 8643 8644Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 8645</pre></td></tr> 8646 8647 8648<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> 8649<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 8650pointee matches a given matcher. 8651 8652Given 8653 int *a; 8654 int const *b; 8655 float const *f; 8656pointerType(pointee(isConstQualified(), isInteger())) 8657 matches "int const *b" 8658 8659Usable 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>>, 8660 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>> 8661</pre></td></tr> 8662 8663 8664<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> 8665<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 8666 8667Given: 8668 typedef int &int_ref; 8669 int a; 8670 int_ref b = a; 8671 8672varDecl(hasType(qualType(referenceType()))))) will not match the 8673declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 8674</pre></td></tr> 8675 8676 8677<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> 8678<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 8679matches the given matcher. 8680 8681The associated declaration is: 8682- for type nodes, the declaration of the underlying type 8683- for CallExpr, the declaration of the callee 8684- for MemberExpr, the declaration of the referenced member 8685- for CXXConstructExpr, the declaration of the constructor 8686- for CXXNewExpr, the declaration of the operator new 8687- for ObjCIvarExpr, the declaration of the ivar 8688 8689For type nodes, hasDeclaration will generally match the declaration of the 8690sugared type. Given 8691 class X {}; 8692 typedef X Y; 8693 Y y; 8694in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8695typedefDecl. A common use case is to match the underlying, desugared type. 8696This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8697 varDecl(hasType(hasUnqualifiedDesugaredType( 8698 recordType(hasDeclaration(decl()))))) 8699In this matcher, the decl will match the CXXRecordDecl of class X. 8700 8701Usable 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>>, 8702 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>>, 8703 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>>, 8704 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>>, 8705 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>>, 8706 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>>, 8707 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8708</pre></td></tr> 8709 8710 8711<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> 8712<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 8713 8714Given 8715 void (*fp)(void); 8716The matcher 8717 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 8718would match the declaration for fp. 8719</pre></td></tr> 8720 8721 8722<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> 8723<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 8724</pre></td></tr> 8725 8726 8727<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> 8728<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 8729matches the specified matcher. 8730 8731Example matches y->x() 8732 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 8733 cxxRecordDecl(hasName("Y"))))))) 8734 class Y { public: void x(); }; 8735 void z() { Y *y; y->x(); } 8736</pre></td></tr> 8737 8738 8739<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> 8740<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 8741</pre></td></tr> 8742 8743 8744<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> 8745<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 8746type matches the specified matcher. 8747 8748Example matches X &x and const X &y 8749 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 8750 class X { 8751 void a(X b) { 8752 X &x = b; 8753 const X &y = b; 8754 } 8755 }; 8756</pre></td></tr> 8757 8758 8759<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> 8760<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 8761matches the given matcher. 8762 8763The associated declaration is: 8764- for type nodes, the declaration of the underlying type 8765- for CallExpr, the declaration of the callee 8766- for MemberExpr, the declaration of the referenced member 8767- for CXXConstructExpr, the declaration of the constructor 8768- for CXXNewExpr, the declaration of the operator new 8769- for ObjCIvarExpr, the declaration of the ivar 8770 8771For type nodes, hasDeclaration will generally match the declaration of the 8772sugared type. Given 8773 class X {}; 8774 typedef X Y; 8775 Y y; 8776in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8777typedefDecl. A common use case is to match the underlying, desugared type. 8778This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8779 varDecl(hasType(hasUnqualifiedDesugaredType( 8780 recordType(hasDeclaration(decl()))))) 8781In this matcher, the decl will match the CXXRecordDecl of class X. 8782 8783Usable 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>>, 8784 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>>, 8785 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>>, 8786 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>>, 8787 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>>, 8788 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>>, 8789 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8790</pre></td></tr> 8791 8792 8793<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> 8794<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 8795pointee matches a given matcher. 8796 8797Given 8798 int *a; 8799 int const *b; 8800 float const *f; 8801pointerType(pointee(isConstQualified(), isInteger())) 8802 matches "int const *b" 8803 8804Usable 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>>, 8805 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>> 8806</pre></td></tr> 8807 8808 8809<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> 8810<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 8811 8812Given 8813 return a + b; 8814hasReturnValue(binaryOperator()) 8815 matches 'return a + b' 8816with binaryOperator() 8817 matching 'a + b' 8818</pre></td></tr> 8819 8820 8821<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> 8822<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 8823a given matcher. Also matches StmtExprs that have CompoundStmt as children. 8824 8825Given 8826 { {}; 1+2; } 8827hasAnySubstatement(compoundStmt()) 8828 matches '{ {}; 1+2; }' 8829with compoundStmt() 8830 matching '{}' 8831</pre></td></tr> 8832 8833 8834<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> 8835<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8836alignof. 8837</pre></td></tr> 8838 8839 8840<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> 8841<tr><td colspan="4" class="doc" id="forCallable0"><pre>Matches declaration of the function, method, or block the statement 8842belongs to. 8843 8844Given: 8845F& operator=(const F& o) { 8846 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 8847 return *this; 8848} 8849returnStmt(forCallable(functionDecl(hasName("operator=")))) 8850 matches 'return *this' 8851 but does not match 'return v > 0' 8852 8853Given: 8854-(void) foo { 8855 int x = 1; 8856 dispatch_sync(queue, ^{ int y = 2; }); 8857} 8858declStmt(forCallable(objcMethodDecl())) 8859 matches 'int x = 1' 8860 but does not match 'int y = 2'. 8861whereas declStmt(forCallable(blockDecl())) 8862 matches 'int y = 2' 8863 but does not match 'int x = 1'. 8864</pre></td></tr> 8865 8866 8867<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> 8868<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to. 8869 8870Deprecated. Use forCallable() to correctly handle the situation when 8871the declaration is not a function (but a block or an Objective-C method). 8872forFunction() not only fails to take non-functions into account but also 8873may match the wrong declaration in their presence. 8874 8875Given: 8876F& operator=(const F& o) { 8877 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 8878 return *this; 8879} 8880returnStmt(forFunction(hasName("operator="))) 8881 matches 'return *this' 8882 but does not match 'return v > 0' 8883</pre></td></tr> 8884 8885 8886<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> 8887<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8888sizeof. 8889</pre></td></tr> 8890 8891 8892<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> 8893<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 8894type that matches the provided matcher. 8895 8896Given 8897 template <typename T> 8898 double F(T t); 8899 int i; 8900 double j = F(i); 8901 8902substTemplateTypeParmType(hasReplacementType(type())) matches int 8903</pre></td></tr> 8904 8905 8906<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> 8907<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 8908statement. This matcher may produce multiple matches. 8909 8910Given 8911 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 8912switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 8913 matches four times, with "c" binding each of "case 1:", "case 2:", 8914"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 8915"switch (1)", "switch (2)" and "switch (2)". 8916</pre></td></tr> 8917 8918 8919<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> 8920<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 8921switch statement or conditional operator. 8922 8923Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8924 if (true) {} 8925</pre></td></tr> 8926 8927 8928<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> 8929<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 8930 8931Given: 8932 void foo() { 8933 if (int i = foobar(); i > 0) {} 8934 switch (int i = foobar(); i) {} 8935 for (auto& a = get_range(); auto& x : a) {} 8936 } 8937 void bar() { 8938 if (foobar() > 0) {} 8939 switch (foobar()) {} 8940 for (auto& x : get_range()) {} 8941 } 8942ifStmt(hasInitStatement(anything())) 8943 matches the if statement in foo but not in bar. 8944switchStmt(hasInitStatement(anything())) 8945 matches the switch statement in foo but not in bar. 8946cxxForRangeStmt(hasInitStatement(anything())) 8947 matches the range for statement in foo but not in bar. 8948</pre></td></tr> 8949 8950 8951<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> 8952<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 8953matches the given matcher. 8954 8955The associated declaration is: 8956- for type nodes, the declaration of the underlying type 8957- for CallExpr, the declaration of the callee 8958- for MemberExpr, the declaration of the referenced member 8959- for CXXConstructExpr, the declaration of the constructor 8960- for CXXNewExpr, the declaration of the operator new 8961- for ObjCIvarExpr, the declaration of the ivar 8962 8963For type nodes, hasDeclaration will generally match the declaration of the 8964sugared type. Given 8965 class X {}; 8966 typedef X Y; 8967 Y y; 8968in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8969typedefDecl. A common use case is to match the underlying, desugared type. 8970This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8971 varDecl(hasType(hasUnqualifiedDesugaredType( 8972 recordType(hasDeclaration(decl()))))) 8973In this matcher, the decl will match the CXXRecordDecl of class X. 8974 8975Usable 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>>, 8976 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>>, 8977 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>>, 8978 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>>, 8979 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>>, 8980 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>>, 8981 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8982</pre></td></tr> 8983 8984 8985<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> 8986<tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher. 8987 8988Examples: 8989 int x; 8990declaratorDecl(hasTypeLoc(loc(asString("int")))) 8991 matches int x 8992 8993auto x = int(3); 8994cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 8995 matches int(3) 8996 8997struct Foo { Foo(int, int); }; 8998auto x = Foo(1, 2); 8999cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 9000 matches Foo(1, 2) 9001 9002Usable 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>>, 9003 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>>, 9004 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>>, 9005 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 9006 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>>, 9007 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>>, 9008 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>>, 9009 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 9010</pre></td></tr> 9011 9012 9013<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> 9014<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 9015 9016Given 9017 struct B { int next; }; 9018 template<int(B::*next_ptr)> struct A {}; 9019 A<&B::next> a; 9020templateSpecializationType(hasAnyTemplateArgument( 9021 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 9022 matches the specialization A<&B::next> with fieldDecl(...) matching 9023 B::next 9024</pre></td></tr> 9025 9026 9027<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> 9028<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 9029declaration. 9030 9031Given 9032 struct B { int next; }; 9033 template<int(B::*next_ptr)> struct A {}; 9034 A<&B::next> a; 9035classTemplateSpecializationDecl(hasAnyTemplateArgument( 9036 refersToDeclaration(fieldDecl(hasName("next"))))) 9037 matches the specialization A<&B::next> with fieldDecl(...) matching 9038 B::next 9039</pre></td></tr> 9040 9041 9042<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> 9043<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type. 9044 9045Given 9046 template<int T> struct C {}; 9047 C<42> c; 9048classTemplateSpecializationDecl( 9049 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 9050 matches the implicit instantiation of C in C<42>. 9051</pre></td></tr> 9052 9053 9054<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> 9055<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 9056 9057Given 9058 template<template <typename> class S> class X {}; 9059 template<typename T> class Y {}; 9060 X<Y> xi; 9061classTemplateSpecializationDecl(hasAnyTemplateArgument( 9062 refersToTemplate(templateName()))) 9063 matches the specialization X<Y> 9064</pre></td></tr> 9065 9066 9067<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> 9068<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 9069 9070Given 9071 struct X {}; 9072 template<typename T> struct A {}; 9073 A<X> a; 9074classTemplateSpecializationDecl(hasAnyTemplateArgument( 9075 refersToType(class(hasName("X"))))) 9076 matches the specialization A<X> 9077</pre></td></tr> 9078 9079 9080<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> 9081<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 9082functionDecl that have at least one TemplateArgument matching the given 9083InnerMatcher. 9084 9085Given 9086 template<typename T> class A {}; 9087 template<> class A<double> {}; 9088 A<int> a; 9089 9090 template<typename T> f() {}; 9091 void func() { f<int>(); }; 9092 9093classTemplateSpecializationDecl(hasAnyTemplateArgument( 9094 refersToType(asString("int")))) 9095 matches the specialization A<int> 9096 9097functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 9098 matches the specialization f<int> 9099</pre></td></tr> 9100 9101 9102<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> 9103<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 9104matches the given matcher. 9105 9106The associated declaration is: 9107- for type nodes, the declaration of the underlying type 9108- for CallExpr, the declaration of the callee 9109- for MemberExpr, the declaration of the referenced member 9110- for CXXConstructExpr, the declaration of the constructor 9111- for CXXNewExpr, the declaration of the operator new 9112- for ObjCIvarExpr, the declaration of the ivar 9113 9114For type nodes, hasDeclaration will generally match the declaration of the 9115sugared type. Given 9116 class X {}; 9117 typedef X Y; 9118 Y y; 9119in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9120typedefDecl. A common use case is to match the underlying, desugared type. 9121This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9122 varDecl(hasType(hasUnqualifiedDesugaredType( 9123 recordType(hasDeclaration(decl()))))) 9124In this matcher, the decl will match the CXXRecordDecl of class X. 9125 9126Usable 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>>, 9127 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>>, 9128 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>>, 9129 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>>, 9130 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>>, 9131 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>>, 9132 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9133</pre></td></tr> 9134 9135 9136<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> 9137<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 9138functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 9139 9140Given 9141 template<typename T, typename U> class A {}; 9142 A<bool, int> b; 9143 A<int, bool> c; 9144 9145 template<typename T> void f() {} 9146 void func() { f<int>(); }; 9147classTemplateSpecializationDecl(hasTemplateArgument( 9148 1, refersToType(asString("int")))) 9149 matches the specialization A<bool, int> 9150 9151functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 9152 matches the specialization f<int> 9153</pre></td></tr> 9154 9155 9156<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> 9157<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 9158matches the given matcher. 9159 9160The associated declaration is: 9161- for type nodes, the declaration of the underlying type 9162- for CallExpr, the declaration of the callee 9163- for MemberExpr, the declaration of the referenced member 9164- for CXXConstructExpr, the declaration of the constructor 9165- for CXXNewExpr, the declaration of the operator new 9166- for ObjCIvarExpr, the declaration of the ivar 9167 9168For type nodes, hasDeclaration will generally match the declaration of the 9169sugared type. Given 9170 class X {}; 9171 typedef X Y; 9172 Y y; 9173in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9174typedefDecl. A common use case is to match the underlying, desugared type. 9175This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9176 varDecl(hasType(hasUnqualifiedDesugaredType( 9177 recordType(hasDeclaration(decl()))))) 9178In this matcher, the decl will match the CXXRecordDecl of class X. 9179 9180Usable 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>>, 9181 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>>, 9182 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>>, 9183 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>>, 9184 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>>, 9185 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>>, 9186 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9187</pre></td></tr> 9188 9189 9190<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> 9191<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 9192QualType-matcher matches. 9193</pre></td></tr> 9194 9195 9196<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> 9197<tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher. 9198 9199Examples: 9200 int x; 9201declaratorDecl(hasTypeLoc(loc(asString("int")))) 9202 matches int x 9203 9204auto x = int(3); 9205cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 9206 matches int(3) 9207 9208struct Foo { Foo(int, int); }; 9209auto x = Foo(1, 2); 9210cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 9211 matches Foo(1, 2) 9212 9213Usable 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>>, 9214 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>>, 9215 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>>, 9216 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 9217 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>>, 9218 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>>, 9219 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>>, 9220 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 9221</pre></td></tr> 9222 9223 9224<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> 9225<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 9226matcher. 9227 9228Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9229 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9230 and U (matcher = typedefDecl(hasType(asString("int"))) 9231 and friend class X (matcher = friendDecl(hasType("X")) 9232 and public virtual X (matcher = cxxBaseSpecifier(hasType( 9233 asString("class X"))) 9234 class X {}; 9235 void y(X &x) { x; X z; } 9236 typedef int U; 9237 class Y { friend class X; }; 9238 class Z : public virtual X {}; 9239</pre></td></tr> 9240 9241 9242<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> 9243<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 9244matches the given matcher. 9245 9246The associated declaration is: 9247- for type nodes, the declaration of the underlying type 9248- for CallExpr, the declaration of the callee 9249- for MemberExpr, the declaration of the referenced member 9250- for CXXConstructExpr, the declaration of the constructor 9251- for CXXNewExpr, the declaration of the operator new 9252- for ObjCIvarExpr, the declaration of the ivar 9253 9254For type nodes, hasDeclaration will generally match the declaration of the 9255sugared type. Given 9256 class X {}; 9257 typedef X Y; 9258 Y y; 9259in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9260typedefDecl. A common use case is to match the underlying, desugared type. 9261This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9262 varDecl(hasType(hasUnqualifiedDesugaredType( 9263 recordType(hasDeclaration(decl()))))) 9264In this matcher, the decl will match the CXXRecordDecl of class X. 9265 9266Usable 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>>, 9267 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>>, 9268 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>>, 9269 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>>, 9270 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>>, 9271 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>>, 9272 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9273</pre></td></tr> 9274 9275 9276<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> 9277<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 9278type of the matched node. 9279 9280For example, in: 9281 class A {}; 9282 using B = A; 9283The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 9284both B and A. 9285</pre></td></tr> 9286 9287 9288<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> 9289<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 9290 9291Given 9292 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 9293unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 9294 matches sizeof(a) and alignof(c) 9295</pre></td></tr> 9296 9297 9298<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> 9299<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 9300 9301Example matches true (matcher = hasUnaryOperand( 9302 cxxBoolLiteral(equals(true)))) 9303 !true 9304</pre></td></tr> 9305 9306 9307<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> 9308<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 9309given matcher. Implicit object expressions are included; that is, it matches 9310use of implicit `this`. 9311 9312Given 9313 struct X { 9314 int m; 9315 int f(X x) { x.m; return m; } 9316 }; 9317memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 9318 matches `x.m`, but not `m`; however, 9319memberExpr(hasObjectExpression(hasType(pointsTo( 9320 cxxRecordDecl(hasName("X")))))) 9321 matches `m` (aka. `this->m`), but not `x.m`. 9322</pre></td></tr> 9323 9324 9325<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> 9326<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 9327matches the given matcher. 9328 9329The associated declaration is: 9330- for type nodes, the declaration of the underlying type 9331- for CallExpr, the declaration of the callee 9332- for MemberExpr, the declaration of the referenced member 9333- for CXXConstructExpr, the declaration of the constructor 9334- for CXXNewExpr, the declaration of the operator new 9335- for ObjCIvarExpr, the declaration of the ivar 9336 9337For type nodes, hasDeclaration will generally match the declaration of the 9338sugared type. Given 9339 class X {}; 9340 typedef X Y; 9341 Y y; 9342in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9343typedefDecl. A common use case is to match the underlying, desugared type. 9344This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9345 varDecl(hasType(hasUnqualifiedDesugaredType( 9346 recordType(hasDeclaration(decl()))))) 9347In this matcher, the decl will match the CXXRecordDecl of class X. 9348 9349Usable 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>>, 9350 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>>, 9351 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>>, 9352 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>>, 9353 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>>, 9354 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>>, 9355 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9356</pre></td></tr> 9357 9358 9359<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>></td><td class="name" onclick="toggle('hasAnyUsingShadowDecl0')"><a name="hasAnyUsingShadowDecl0Anchor">hasAnyUsingShadowDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr> 9360<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 9361 9362Given 9363 namespace X { void b(); } 9364 using X::b; 9365usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 9366 matches using X::b </pre></td></tr> 9367 9368 9369<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> 9370<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 9371matched by the given matcher. 9372 9373Given 9374 namespace X { int a; void b(); } 9375 using X::a; 9376 using X::b; 9377usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 9378 matches using X::b but not using X::a </pre></td></tr> 9379 9380 9381<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> 9382<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value 9383declaration's type. 9384 9385In case of a value declaration (for example a variable declaration), 9386this resolves one layer of indirection. For example, in the value 9387declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 9388X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 9389declaration of x. 9390 9391Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9392 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9393 and friend class X (matcher = friendDecl(hasType("X")) 9394 and public virtual X (matcher = cxxBaseSpecifier(hasType( 9395 cxxRecordDecl(hasName("X")))) 9396 class X {}; 9397 void y(X &x) { x; X z; } 9398 class Y { friend class X; }; 9399 class Z : public virtual X {}; 9400 9401Example matches class Derived 9402(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 9403class Base {}; 9404class Derived : Base {}; 9405 9406Usable 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>>, 9407Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 9408</pre></td></tr> 9409 9410 9411<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> 9412<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 9413matcher. 9414 9415Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9416 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9417 and U (matcher = typedefDecl(hasType(asString("int"))) 9418 and friend class X (matcher = friendDecl(hasType("X")) 9419 and public virtual X (matcher = cxxBaseSpecifier(hasType( 9420 asString("class X"))) 9421 class X {}; 9422 void y(X &x) { x; X z; } 9423 typedef int U; 9424 class Y { friend class X; }; 9425 class Z : public virtual X {}; 9426</pre></td></tr> 9427 9428 9429<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> 9430<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 9431that matches the given matcher. 9432 9433Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 9434 bool y() { return true; } 9435 bool x = y(); 9436</pre></td></tr> 9437 9438 9439<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> 9440<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 9441expression. 9442 9443Given 9444 void f(int b) { 9445 int a[b]; 9446 } 9447variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 9448 varDecl(hasName("b"))))))) 9449 matches "int a[b]" 9450</pre></td></tr> 9451 9452 9453<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> 9454<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr> 9455 9456 9457<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> 9458<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 9459switch statement or conditional operator. 9460 9461Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 9462 if (true) {} 9463</pre></td></tr> 9464 9465<!--END_TRAVERSAL_MATCHERS --> 9466</table> 9467 9468</div> 9469</body> 9470</html> 9471 9472 9473