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(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</td> 533<td> 534No match found. 535</td> 536</tr> 537</table> 538 539<!-- ======================================================================= --> 540<h2 id="decl-matchers">Node Matchers</h2> 541<!-- ======================================================================= --> 542 543<p>Node matchers are at the core of matcher expressions - they specify the type 544of node that is expected. Every match expression starts with a node matcher, 545which can then be further refined with a narrowing or traversal matcher. All 546traversal matchers take node matchers as their arguments.</p> 547 548<p>For convenience, all node matchers take an arbitrary number of arguments 549and implicitly act as allOf matchers.</p> 550 551<p>Node matchers are the only matchers that support the bind("id") call to 552bind the matched node to the given string, to be later retrieved from the 553match callback.</p> 554 555<p>It is important to remember that the arguments to node matchers are 556predicates on the same node, just with additional information about the type. 557This is often useful to make matcher expression more readable by inlining bind 558calls into redundant node matchers inside another node matcher: 559<pre> 560// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on 561// the same node. 562recordDecl(decl().bind("id"), hasName("::MyClass")) 563</pre> 564</p> 565 566<table> 567<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 568<!-- START_DECL_MATCHERS --> 569 570<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> 571<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers. 572 573Examples matches i(42). 574 class C { 575 C() : i(42) {} 576 int i; 577 }; 578</pre></td></tr> 579 580 581<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> 582<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations. 583 584Given 585 class C { 586 public: 587 int a; 588 }; 589accessSpecDecl() 590 matches 'public:' 591</pre></td></tr> 592 593 594<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> 595<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations. 596 597Example matches the declaration of the nameless block printing an input 598integer. 599 600 myFunc(^(int p) { 601 printf("%d", p); 602 }) 603</pre></td></tr> 604 605 606<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> 607<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations. 608 609Example matches Z 610 template<class T> class Z {}; 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('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>>...</td></tr> 615<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations. 616 617Given 618 template<class T1, class T2, int I> 619 class A {}; 620 621 template<class T, int I> 622 class A<T, T*, I> {}; 623 624 template<> 625 class A<int, int, 1> {}; 626classTemplatePartialSpecializationDecl() 627 matches the specialization A<T,T*,I> but not A<int,int,1> 628</pre></td></tr> 629 630 631<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> 632<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations. 633 634Given 635 template<typename T> class A {}; 636 template<> class A<double> {}; 637 A<int> a; 638classTemplateSpecializationDecl() 639 matches the specializations A<int> and A<double> 640</pre></td></tr> 641 642 643<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> 644<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. 645 646Example matches Foo::Foo() and Foo::Foo(int) 647 class Foo { 648 public: 649 Foo(); 650 Foo(int); 651 int DoSomething(); 652 }; 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('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>>...</td></tr> 657<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations. 658 659Example matches the operator. 660 class X { operator int() const; }; 661</pre></td></tr> 662 663 664<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> 665<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide. 666 667Example matches the deduction guide. 668 template<typename T> 669 class X { X(int) }; 670 X(int) -> X<int>; 671</pre></td></tr> 672 673 674<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> 675<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations. 676 677Example matches Foo::~Foo() 678 class Foo { 679 public: 680 virtual ~Foo(); 681 }; 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('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>...</td></tr> 686<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations. 687 688Example matches y 689 class X { void y(); }; 690</pre></td></tr> 691 692 693<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> 694<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations. 695 696Example matches X, Z 697 class X; 698 template<class T> class Z {}; 699</pre></td></tr> 700 701 702<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> 703<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 704 705Examples matches X, C, and the friend declaration inside C; 706 void X(); 707 class C { 708 friend X; 709 }; 710</pre></td></tr> 711 712 713<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> 714<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 715and non-type template parameter declarations). 716 717Given 718 class X { int y; }; 719declaratorDecl() 720 matches int y. 721</pre></td></tr> 722 723 724<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> 725<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 726 727Example matches A, B, C 728 enum X { 729 A, B, C 730 }; 731</pre></td></tr> 732 733 734<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> 735<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 736 737Example matches X 738 enum X { 739 A, B, C 740 }; 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('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>>...</td></tr> 745<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 746 747Given 748 class X { int m; }; 749fieldDecl() 750 matches 'm'. 751</pre></td></tr> 752 753 754<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> 755<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 756 757Given 758 class X { friend void foo(); }; 759friendDecl() 760 matches 'friend void foo()'. 761</pre></td></tr> 762 763 764<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> 765<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 766 767Example matches f 768 void f(); 769</pre></td></tr> 770 771 772<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> 773<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 774 775Example matches f 776 template<class T> void f(T t) {} 777</pre></td></tr> 778 779 780<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>>...</td></tr> 781<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations. 782 783Given 784 struct X { struct { int a; }; }; 785indirectFieldDecl() 786 matches 'a'. 787</pre></td></tr> 788 789 790<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>>...</td></tr> 791<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label. 792 793Given 794 goto FOO; 795 FOO: bar(); 796labelDecl() 797 matches 'FOO:' 798</pre></td></tr> 799 800 801<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> 802<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification. 803 804Given 805 extern "C" {} 806linkageSpecDecl() 807 matches "extern "C" {}" 808</pre></td></tr> 809 810 811<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> 812<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 813 814Example matches X, S, the anonymous union type, i, and U; 815 typedef int X; 816 struct S { 817 union { 818 int i; 819 } U; 820 }; 821</pre></td></tr> 822 823 824<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> 825<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias. 826 827Given 828 namespace test {} 829 namespace alias = ::test; 830namespaceAliasDecl() 831 matches "namespace alias" but not "namespace test" 832</pre></td></tr> 833 834 835<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> 836<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 837 838Given 839 namespace {} 840 namespace test {} 841namespaceDecl() 842 matches "namespace {}" and "namespace test {}" 843</pre></td></tr> 844 845 846<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> 847<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations. 848 849Given 850 template <typename T, int N> struct C {}; 851nonTypeTemplateParmDecl() 852 matches 'N', but not 'T'. 853</pre></td></tr> 854 855 856<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> 857<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations. 858 859Example matches Foo (Additions) 860 @interface Foo (Additions) 861 @end 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('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>>...</td></tr> 866<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions. 867 868Example matches Foo (Additions) 869 @implementation Foo (Additions) 870 @end 871</pre></td></tr> 872 873 874<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> 875<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations. 876 877Example matches Foo 878 @implementation Foo 879 @end 880</pre></td></tr> 881 882 883<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>...</td></tr> 884<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 885 886Example matches Foo 887 @interface Foo 888 @end 889</pre></td></tr> 890 891 892<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>>...</td></tr> 893<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations. 894 895Example matches _enabled 896 @implementation Foo { 897 BOOL _enabled; 898 } 899 @end 900</pre></td></tr> 901 902 903<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> 904<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations. 905 906Example matches both declaration and definition of -[Foo method] 907 @interface Foo 908 - (void)method; 909 @end 910 911 @implementation Foo 912 - (void)method {} 913 @end 914</pre></td></tr> 915 916 917<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> 918<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations. 919 920Example matches enabled 921 @interface Foo 922 @property BOOL enabled; 923 @end 924</pre></td></tr> 925 926 927<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> 928<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations. 929 930Example matches FooDelegate 931 @protocol FooDelegate 932 @end 933</pre></td></tr> 934 935 936<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> 937<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 938 939Given 940 void f(int x); 941parmVarDecl() 942 matches int x. 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('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>>...</td></tr> 947<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 948 949Example matches X, Z, U, and S 950 class X; 951 template<class T> class Z {}; 952 struct S {}; 953 union U {}; 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('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>>...</td></tr> 958<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 959 960Example: 961 staticAssertExpr() 962matches 963 static_assert(sizeof(S) == sizeof(int)) 964in 965 struct S { 966 int x; 967 }; 968 static_assert(sizeof(S) == sizeof(int)); 969</pre></td></tr> 970 971 972<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>...</td></tr> 973<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations. 974 975Example matches X, Z, U, S, E 976 class X; 977 template<class T> class Z {}; 978 struct S {}; 979 union U {}; 980 enum E { 981 A, B, C 982 }; 983</pre></td></tr> 984 985 986<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> 987<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations. 988 989Given 990 template <template <typename> class Z, int N> struct C {}; 991templateTypeParmDecl() 992 matches 'Z', but not 'N'. 993</pre></td></tr> 994 995 996<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> 997<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 998 999Given 1000 template <typename T, int N> struct C {}; 1001templateTypeParmDecl() 1002 matches 'T', but not 'N'. 1003</pre></td></tr> 1004 1005 1006<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> 1007<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 1008 1009Given 1010 int X; 1011 namespace NS { 1012 int Y; 1013 } // namespace NS 1014decl(hasDeclContext(translationUnitDecl())) 1015 matches "int X", but not "int Y". 1016</pre></td></tr> 1017 1018 1019<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> 1020<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations. 1021 1022Given 1023 typedef int X; 1024 using Y = int; 1025typeAliasDecl() 1026 matches "using Y = int", but not "typedef int X" 1027</pre></td></tr> 1028 1029 1030<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> 1031<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations. 1032 1033typeAliasTemplateDecl() matches 1034 template <typename T> 1035 using Y = X<T>; 1036</pre></td></tr> 1037 1038 1039<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> 1040<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 1041 1042Given 1043 typedef int X; 1044 using Y = int; 1045typedefDecl() 1046 matches "typedef int X", but not "using Y = int" 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('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>...</td></tr> 1051<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations. 1052 1053Given 1054 typedef int X; 1055 using Y = int; 1056typedefNameDecl() 1057 matches "typedef int X" and "using Y = int" 1058</pre></td></tr> 1059 1060 1061<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> 1062<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 1063typename. 1064 1065Given 1066 template <typename T> 1067 struct Base { typedef T Foo; }; 1068 1069 template<typename T> 1070 struct S : private Base<T> { 1071 using typename Base<T>::Foo; 1072 }; 1073unresolvedUsingTypenameDecl() 1074 matches using Base<T>::Foo </pre></td></tr> 1075 1076 1077<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>>...</td></tr> 1078<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 1079 1080Given 1081 template<typename X> 1082 class C : private X { 1083 using X::x; 1084 }; 1085unresolvedUsingValueDecl() 1086 matches using X::x </pre></td></tr> 1087 1088 1089<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> 1090<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 1091 1092Given 1093 namespace X { int x; } 1094 using X::x; 1095usingDecl() 1096 matches using X::x </pre></td></tr> 1097 1098 1099<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> 1100<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 1101 1102Given 1103 namespace X { int x; } 1104 using namespace X; 1105usingDirectiveDecl() 1106 matches using namespace X </pre></td></tr> 1107 1108 1109<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> 1110<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 1111 1112Example matches A, B, C and F 1113 enum X { A, B, C }; 1114 void F(); 1115</pre></td></tr> 1116 1117 1118<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> 1119<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 1120 1121Note: this does not match declarations of member variables, which are 1122"field" declarations in Clang parlance. 1123 1124Example matches a 1125 int a; 1126</pre></td></tr> 1127 1128 1129<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</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> 1130<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations. 1131 1132Examples matches the declaration node with foo and bar, but not 1133number. 1134(matcher = declStmt(has(decompositionDecl()))) 1135 1136 int number = 42; 1137 auto [foo, bar] = std::make_pair{42, 42}; 1138</pre></td></tr> 1139 1140 1141<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> 1142<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 1143</pre></td></tr> 1144 1145 1146<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> 1147<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 1148 1149Given 1150 namespace ns { 1151 struct A { static void f(); }; 1152 void A::f() {} 1153 void g() { A::f(); } 1154 } 1155 ns::A a; 1156nestedNameSpecifier() 1157 matches "ns::" and both "A::" 1158</pre></td></tr> 1159 1160 1161<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> 1162<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause. 1163 1164Given 1165 1166 #pragma omp parallel default(none) 1167 #pragma omp parallel default(shared) 1168 #pragma omp parallel default(firstprivate) 1169 #pragma omp parallel 1170 1171``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and 1172``default(firstprivate)`` 1173</pre></td></tr> 1174 1175 1176<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> 1177<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 1178</pre></td></tr> 1179 1180 1181<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> 1182<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension). 1183 1184Given 1185 FOO: bar(); 1186 void *ptr = &&FOO; 1187 goto *bar; 1188addrLabelExpr() 1189 matches '&&FOO' 1190</pre></td></tr> 1191 1192 1193<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> 1194<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 1195 1196Given 1197 int i = a[1]; 1198arraySubscriptExpr() 1199 matches "a[1]" 1200</pre></td></tr> 1201 1202 1203<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> 1204<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 1205 1206 int i = 100; 1207 __asm("mov al, 2"); 1208asmStmt() 1209 matches '__asm("mov al, 2")' 1210</pre></td></tr> 1211 1212 1213<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> 1214<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins. 1215Example matches __atomic_load_n(ptr, 1) 1216 void foo() { int *ptr; __atomic_load_n(ptr, 1); } 1217</pre></td></tr> 1218 1219 1220<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> 1221<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement. 1222 1223Given 1224 @autoreleasepool { 1225 int x = 0; 1226 } 1227autoreleasePoolStmt(stmt()) matches the declaration of "x" 1228inside the autorelease pool. 1229</pre></td></tr> 1230 1231 1232<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> 1233<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension). 1234 1235Example matches a ?: b 1236 (a ?: b) + 42; 1237</pre></td></tr> 1238 1239 1240<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> 1241<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 1242 1243Example matches a || b 1244 !(a || b) 1245See also the binaryOperation() matcher for more-general matching. 1246</pre></td></tr> 1247 1248 1249<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> 1250<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block. 1251 1252Example: matches "^{}": 1253 void f() { ^{}(); } 1254</pre></td></tr> 1255 1256 1257<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> 1258<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 1259 1260Given 1261 while (true) { break; } 1262breakStmt() 1263 matches 'break' 1264</pre></td></tr> 1265 1266 1267<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> 1268<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 1269 1270Example: Matches (int) 2.2f in 1271 int i = (int) 2.2f; 1272</pre></td></tr> 1273 1274 1275<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> 1276<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 1277 1278Example matches x.y() and y() 1279 X x; 1280 x.y(); 1281 y(); 1282</pre></td></tr> 1283 1284 1285<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> 1286<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 1287 1288Given 1289 switch(a) { case 42: break; default: break; } 1290caseStmt() 1291 matches 'case 42:'. 1292</pre></td></tr> 1293 1294 1295<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> 1296<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 1297 1298Example: castExpr() matches each of the following: 1299 (int) 3; 1300 const_cast<Expr *>(SubExpr); 1301 char c = 0; 1302but does not match 1303 int i = (0); 1304 int k = 0; 1305</pre></td></tr> 1306 1307 1308<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> 1309<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 1310 1311Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 1312though. 1313 1314Example matches 'a', L'a' 1315 char ch = 'a'; 1316 wchar_t chw = L'a'; 1317</pre></td></tr> 1318 1319 1320<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> 1321<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr. 1322</pre></td></tr> 1323 1324 1325<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> 1326<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 1327 1328Example match: {1}, (1, 2) 1329 int array[4] = {1}; 1330 vector int myvec = (vector int)(1, 2); 1331</pre></td></tr> 1332 1333 1334<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> 1335<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 1336 1337Example matches '{}' and '{{}}' in 'for (;;) {{}}' 1338 for (;;) {{}} 1339</pre></td></tr> 1340 1341 1342<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> 1343<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 1344 1345Example matches a ? b : c 1346 (a ? b : c) + 42 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('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>>...</td></tr> 1351<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper. 1352 1353Example matches the constant in the case statement: 1354 (matcher = constantExpr()) 1355 switch (a) { 1356 case 37: break; 1357 } 1358</pre></td></tr> 1359 1360 1361<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>>...</td></tr> 1362<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 1363 1364Given 1365 while (true) { continue; } 1366continueStmt() 1367 matches 'continue' 1368</pre></td></tr> 1369 1370 1371<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> 1372<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 1373 1374Example matches, 1375 kernel<<<i,j>>>(); 1376</pre></td></tr> 1377 1378 1379<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> 1380<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 1381 1382Example matches FunctionTakesString(GetStringByValue()) 1383 (matcher = cxxBindTemporaryExpr()) 1384 FunctionTakesString(GetStringByValue()); 1385 FunctionTakesStringByPointer(GetStringPointer()); 1386</pre></td></tr> 1387 1388 1389<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> 1390<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 1391 1392Example matches true 1393 true 1394</pre></td></tr> 1395 1396 1397<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> 1398<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 1399 1400 try {} catch(int i) {} 1401cxxCatchStmt() 1402 matches 'catch(int i)' 1403</pre></td></tr> 1404 1405 1406<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> 1407<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 1408 1409Example: Matches const_cast<int*>(&r) in 1410 int n = 42; 1411 const int &r(n); 1412 int* p = const_cast<int*>(&r); 1413</pre></td></tr> 1414 1415 1416<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> 1417<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 1418 1419Example matches string(ptr, n) and ptr within arguments of f 1420 (matcher = cxxConstructExpr()) 1421 void f(const string &a, const string &b); 1422 char *ptr; 1423 int n; 1424 f(string(ptr, n), ptr); 1425</pre></td></tr> 1426 1427 1428<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> 1429<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 1430 1431Example matches the CXXDefaultArgExpr placeholder inserted for the 1432 default value of the second parameter in the call expression f(42) 1433 (matcher = cxxDefaultArgExpr()) 1434 void f(int x, int y = 0); 1435 f(42); 1436</pre></td></tr> 1437 1438 1439<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> 1440<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 1441 1442Given 1443 delete X; 1444cxxDeleteExpr() 1445 matches 'delete X'. 1446</pre></td></tr> 1447 1448 1449<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> 1450<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be 1451resolved because the base expression or the member name was dependent. 1452 1453Given 1454 template <class T> void f() { T t; t.g(); } 1455cxxDependentScopeMemberExpr() 1456 matches t.g 1457</pre></td></tr> 1458 1459 1460<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>>...</td></tr> 1461<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 1462 1463Example: 1464 cxxDynamicCastExpr() 1465matches 1466 dynamic_cast<D*>(&b); 1467in 1468 struct B { virtual ~B() {} }; struct D : B {}; 1469 B b; 1470 D* p = dynamic_cast<D*>(&b); 1471</pre></td></tr> 1472 1473 1474<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> 1475<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 1476 1477cxxForRangeStmt() matches 'for (auto a : i)' 1478 int i[] = {1, 2, 3}; for (auto a : i); 1479 for(int j = 0; j < 5; ++j); 1480</pre></td></tr> 1481 1482 1483<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> 1484<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 1485 1486Example: Matches Foo(bar); 1487 Foo f = bar; 1488 Foo g = (Foo) bar; 1489 Foo h = Foo(bar); 1490</pre></td></tr> 1491 1492 1493<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr> 1494<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 1495 1496Example matches x.y() 1497 X x; 1498 x.y(); 1499</pre></td></tr> 1500 1501 1502<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>...</td></tr> 1503<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 1504 1505Given 1506 new X; 1507cxxNewExpr() 1508 matches 'new X'. 1509</pre></td></tr> 1510 1511 1512<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>>...</td></tr> 1513<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions. 1514 1515Given 1516 bool a() noexcept; 1517 bool b() noexcept(true); 1518 bool c() noexcept(false); 1519 bool d() noexcept(noexcept(a())); 1520 bool e = noexcept(b()) || noexcept(c()); 1521cxxNoexceptExpr() 1522 matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`. 1523 doesn't match the noexcept specifier in the declarations a, b, c or d. 1524</pre></td></tr> 1525 1526 1527<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>>...</td></tr> 1528<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 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('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr> 1533<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 1534 1535Note that if an operator isn't overloaded, it won't match. Instead, use 1536binaryOperator matcher. 1537Currently it does not match operators such as new delete. 1538FIXME: figure out why these do not match? 1539 1540Example matches both operator<<((o << b), c) and operator<<(o, b) 1541 (matcher = cxxOperatorCallExpr()) 1542 ostream &operator<< (ostream &out, int i) { }; 1543 ostream &o; int b = 1, c = 1; 1544 o << b << c; 1545See also the binaryOperation() matcher for more-general matching of binary 1546uses of this AST node. 1547</pre></td></tr> 1548 1549 1550<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> 1551<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 1552 1553Either the source expression or the destination type can be matched 1554using has(), but hasDestinationType() is more specific and can be 1555more readable. 1556 1557Example matches reinterpret_cast<char*>(&p) in 1558 void* p = reinterpret_cast<char*>(&p); 1559</pre></td></tr> 1560 1561 1562<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> 1563<tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators 1564 1565Example matches use of "<": 1566 #include <compare> 1567 struct HasSpaceshipMem { 1568 int a; 1569 constexpr auto operator<=>(const HasSpaceshipMem&) const = default; 1570 }; 1571 void compare() { 1572 HasSpaceshipMem hs1, hs2; 1573 if (hs1 < hs2) 1574 return; 1575 } 1576See also the binaryOperation() matcher for more-general matching 1577of this AST node. 1578</pre></td></tr> 1579 1580 1581<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>>...</td></tr> 1582<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 1583 1584See also: hasDestinationType 1585See also: reinterpretCast 1586 1587Example: 1588 cxxStaticCastExpr() 1589matches 1590 static_cast<long>(8) 1591in 1592 long eight(static_cast<long>(8)); 1593</pre></td></tr> 1594 1595 1596<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>>...</td></tr> 1597<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions. 1598 1599Given 1600 std::vector<int> a({ 1, 2, 3 }); 1601 std::vector<int> b = { 4, 5 }; 1602 int c[] = { 6, 7 }; 1603 std::pair<int, int> d = { 8, 9 }; 1604cxxStdInitializerListExpr() 1605 matches "{ 1, 2, 3 }" and "{ 4, 5 }" 1606</pre></td></tr> 1607 1608 1609<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> 1610<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 1611 1612Example: Matches Foo(bar, bar) 1613 Foo h = Foo(bar, bar); 1614</pre></td></tr> 1615 1616 1617<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> 1618<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 1619 1620Example matches the implicit this expression in "return i". 1621 (matcher = cxxThisExpr()) 1622struct foo { 1623 int i; 1624 int f() { return i; } 1625}; 1626</pre></td></tr> 1627 1628 1629<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> 1630<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 1631 1632 try { throw 5; } catch(int i) {} 1633cxxThrowExpr() 1634 matches 'throw 5' 1635</pre></td></tr> 1636 1637 1638<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> 1639<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 1640 1641 try {} catch(int i) {} 1642cxxTryStmt() 1643 matches 'try {}' 1644</pre></td></tr> 1645 1646 1647<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> 1648<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 1649 1650Example matches T(t) in return statement of f 1651 (matcher = cxxUnresolvedConstructExpr()) 1652 template <typename T> 1653 void f(const T& t) { return T(t); } 1654</pre></td></tr> 1655 1656 1657<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> 1658<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 1659 1660Example matches x in if (x) 1661 bool x; 1662 if (x) {} 1663</pre></td></tr> 1664 1665 1666<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> 1667<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 1668 1669Given 1670 int a; 1671declStmt() 1672 matches 'int a'. 1673</pre></td></tr> 1674 1675 1676<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> 1677<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 1678 1679Given 1680 switch(a) { case 42: break; default: break; } 1681defaultStmt() 1682 matches 'default:'. 1683</pre></td></tr> 1684 1685 1686<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> 1687<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8]. 1688 1689Example: Matches { [2].y = 1.0, [0].x = 1.0 } 1690 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 1691</pre></td></tr> 1692 1693 1694<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> 1695<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 1696 1697Given 1698 do {} while (true); 1699doStmt() 1700 matches 'do {} while(true)' 1701</pre></td></tr> 1702 1703 1704<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> 1705<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 1706 1707Matches any cast expression written in user code, whether it be a 1708C-style cast, a functional-style cast, or a keyword cast. 1709 1710Does not match implicit conversions. 1711 1712Note: the name "explicitCast" is chosen to match Clang's terminology, as 1713Clang uses the term "cast" to apply to implicit conversions as well as to 1714actual cast expressions. 1715 1716See also: hasDestinationType. 1717 1718Example: matches all five of the casts in 1719 int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 1720but does not match the implicit conversion in 1721 long ell = 42; 1722</pre></td></tr> 1723 1724 1725<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>...</td></tr> 1726<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 1727 1728Example matches x() 1729 void f() { x(); } 1730</pre></td></tr> 1731 1732 1733<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> 1734<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 1735of the sub-expression's evaluation. 1736 1737Example matches std::string() 1738 const std::string str = std::string(); 1739</pre></td></tr> 1740 1741 1742<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> 1743<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals 1744</pre></td></tr> 1745 1746 1747<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> 1748<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g. 17491.0, 1.0f, 1.0L and 1e10. 1750 1751Does not match implicit conversions such as 1752 float a = 10; 1753</pre></td></tr> 1754 1755 1756<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> 1757<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 1758 1759Example matches 'for (;;) {}' 1760 for (;;) {} 1761 int i[] = {1, 2, 3}; for (auto a : i); 1762</pre></td></tr> 1763 1764 1765<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> 1766<tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression. 1767</pre></td></tr> 1768 1769 1770<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> 1771<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 1772</pre></td></tr> 1773 1774 1775<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> 1776<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 1777 1778Given 1779 goto FOO; 1780 FOO: bar(); 1781gotoStmt() 1782 matches 'goto FOO' 1783</pre></td></tr> 1784 1785 1786<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> 1787<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 1788 1789Example matches 'if (x) {}' 1790 if (x) {} 1791</pre></td></tr> 1792 1793 1794<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> 1795<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating 1796point literals e.g.: 1i, 1.0i 1797</pre></td></tr> 1798 1799 1800<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> 1801<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 1802 1803This matches many different places, including function call return value 1804eliding, as well as any type conversions. 1805</pre></td></tr> 1806 1807 1808<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> 1809<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions. 1810 1811Given 1812 point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 1813implicitValueInitExpr() 1814 matches "[0].y" (implicitly) 1815</pre></td></tr> 1816 1817 1818<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> 1819<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 1820 1821Given 1822 int a[] = { 1, 2 }; 1823 struct B { int x, y; }; 1824 B b = { 5, 6 }; 1825initListExpr() 1826 matches "{ 1, 2 }" and "{ 5, 6 }" 1827</pre></td></tr> 1828 1829 1830<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> 1831<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g. 18321, 1L, 0x1 and 1U. 1833 1834Does not match character-encoded integers such as L'a'. 1835</pre></td></tr> 1836 1837 1838<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> 1839<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 1840 1841Given 1842 goto FOO; 1843 FOO: bar(); 1844labelStmt() 1845 matches 'FOO:' 1846</pre></td></tr> 1847 1848 1849<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> 1850<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1851 1852Example matches [&](){return 5;} 1853 [&](){return 5;} 1854</pre></td></tr> 1855 1856 1857<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>>...</td></tr> 1858<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1859 1860Example: Given 1861 struct T {void func();}; 1862 T f(); 1863 void g(T); 1864materializeTemporaryExpr() matches 'f()' in these statements 1865 T u(f()); 1866 g(f()); 1867 f().func(); 1868but does not match 1869 f(); 1870</pre></td></tr> 1871 1872 1873<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> 1874<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1875 1876Given 1877 class Y { 1878 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1879 int a; static int b; 1880 }; 1881memberExpr() 1882 matches this->x, x, y.x, a, this->b 1883</pre></td></tr> 1884 1885 1886<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> 1887<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1888 1889 foo();; 1890nullStmt() 1891 matches the second ';' 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('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>>...</td></tr> 1896<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements. 1897 1898Example matches @catch 1899 @try {} 1900 @catch (...) {} 1901</pre></td></tr> 1902 1903 1904<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> 1905<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements. 1906 1907Example matches @finally 1908 @try {} 1909 @finally {} 1910</pre></td></tr> 1911 1912 1913<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> 1914<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar. 1915 1916Example: matches "a" in "init" method: 1917@implementation A { 1918 NSString *a; 1919} 1920- (void) init { 1921 a = @"hello"; 1922} 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('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>>...</td></tr> 1927<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 1928 1929The innermost message send invokes the "alloc" class method on the 1930NSString class, while the outermost message send invokes the 1931"initWithString" instance method on the object returned from 1932NSString's "alloc". This matcher should match both message sends. 1933 [[NSString alloc] initWithString:@"Hello"] 1934</pre></td></tr> 1935 1936 1937<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> 1938<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements. 1939 1940Example matches @throw obj; 1941</pre></td></tr> 1942 1943 1944<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> 1945<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements. 1946 1947Example matches @try 1948 @try {} 1949 @catch (...) {} 1950</pre></td></tr> 1951 1952 1953<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> 1954<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive. 1955 1956Given 1957 1958 #pragma omp parallel 1959 #pragma omp parallel default(none) 1960 #pragma omp taskyield 1961 1962``ompExecutableDirective()`` matches ``omp parallel``, 1963``omp parallel default(none)`` and ``omp taskyield``. 1964</pre></td></tr> 1965 1966 1967<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> 1968<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers 1969to reference another expressions and can be met 1970in BinaryConditionalOperators, for example. 1971 1972Example matches 'a' 1973 (a ?: c) + 42; 1974</pre></td></tr> 1975 1976 1977<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> 1978<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions. 1979 1980Example matches (foo() + 1) 1981 int foo() { return 1; } 1982 int a = (foo() + 1); 1983</pre></td></tr> 1984 1985 1986<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> 1987<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions. 1988ParenListExprs don't have a predefined type and are used for late parsing. 1989In the final AST, they can be met in template declarations. 1990 1991Given 1992 template<typename T> class X { 1993 void f() { 1994 X x(*this); 1995 int a = 0, b = 1; int i = (a, b); 1996 } 1997 }; 1998parenListExpr() matches "*this" but NOT matches (a, b) because (a, b) 1999has a predefined type and is a ParenExpr, not a ParenListExpr. 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('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>>...</td></tr> 2004<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2]. 2005 2006Example: Matches __func__ 2007 printf("%s", __func__); 2008</pre></td></tr> 2009 2010 2011<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> 2012<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 2013 2014Given 2015 return 1; 2016returnStmt() 2017 matches 'return 1' 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('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>...</td></tr> 2022<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 2023 2024Given 2025 { ++a; } 2026stmt() 2027 matches both the compound statement '{ ++a; }' and '++a'. 2028</pre></td></tr> 2029 2030 2031<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> 2032<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension). 2033 2034Example match: ({ int X = 4; X; }) 2035 int C = ({ int X = 4; X; }); 2036</pre></td></tr> 2037 2038 2039<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> 2040<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 2041 2042Example matches "abcd", L"abcd" 2043 char *s = "abcd"; 2044 wchar_t *ws = L"abcd"; 2045</pre></td></tr> 2046 2047 2048<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> 2049<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 2050 2051Given 2052 template <int N> 2053 struct A { static const int n = N; }; 2054 struct B : public A<42> {}; 2055substNonTypeTemplateParmExpr() 2056 matches "N" in the right-hand side of "static const int n = N;" 2057</pre></td></tr> 2058 2059 2060<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> 2061<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 2062 2063Given 2064 switch(a) { case 42: break; default: break; } 2065switchCase() 2066 matches 'case 42:' and 'default:'. 2067</pre></td></tr> 2068 2069 2070<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>>...</td></tr> 2071<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 2072 2073Given 2074 switch(a) { case 42: break; default: break; } 2075switchStmt() 2076 matches 'switch(a)'. 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('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>>...</td></tr> 2081<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 2082 2083Given 2084 Foo x = bar; 2085 int y = sizeof(x) + alignof(x); 2086unaryExprOrTypeTraitExpr() 2087 matches sizeof(x) and alignof(x) 2088</pre></td></tr> 2089 2090 2091<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> 2092<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 2093 2094Example matches !a 2095 !a || b 2096</pre></td></tr> 2097 2098 2099<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> 2100<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing 2101but could not be resolved to a specific declaration. 2102 2103Given 2104 template<typename T> 2105 T foo() { T a; return a; } 2106 template<typename T> 2107 void bar() { 2108 foo<T>(); 2109 } 2110unresolvedLookupExpr() 2111 matches foo<T>() </pre></td></tr> 2112 2113 2114<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>>...</td></tr> 2115<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions. 2116 2117Given 2118 struct X { 2119 template <class T> void f(); 2120 void g(); 2121 }; 2122 template <class T> void h() { X x; x.f<T>(); x.g(); } 2123unresolvedMemberExpr() 2124 matches x.f<T> 2125</pre></td></tr> 2126 2127 2128<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> 2129<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 2130 2131Example match: "foo"_suffix 2132</pre></td></tr> 2133 2134 2135<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> 2136<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 2137 2138Given 2139 while (true) {} 2140whileStmt() 2141 matches 'while (true) {}'. 2142</pre></td></tr> 2143 2144 2145<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> 2146<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info). 2147 2148Given 2149 template <typename T> struct C {}; 2150 C<int> c; 2151templateArgumentLoc() 2152 matches 'int' in C<int>. 2153</pre></td></tr> 2154 2155 2156<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> 2157<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 2158 2159Given 2160 template <typename T> struct C {}; 2161 C<int> c; 2162templateArgument() 2163 matches 'int' in C<int>. 2164</pre></td></tr> 2165 2166 2167<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> 2168<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name. 2169 2170Given 2171 template <typename T> class X { }; 2172 X<int> xi; 2173templateName() 2174 matches 'X' in X<int>. 2175</pre></td></tr> 2176 2177 2178<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> 2179<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 2180</pre></td></tr> 2181 2182 2183<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> 2184<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 2185 2186Given 2187 int a[] = { 2, 3 }; 2188 int b[4]; 2189 void f() { int c[a[0]]; } 2190arrayType() 2191 matches "int a[]", "int b[4]" and "int c[a[0]]"; 2192</pre></td></tr> 2193 2194 2195<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> 2196<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 2197 2198Given 2199 _Atomic(int) i; 2200atomicType() 2201 matches "_Atomic(int) i" 2202</pre></td></tr> 2203 2204 2205<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> 2206<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 2207 2208Given: 2209 auto n = 4; 2210 int v[] = { 2, 3 } 2211 for (auto i : v) { } 2212autoType() 2213 matches "auto n" and "auto i" 2214</pre></td></tr> 2215 2216 2217<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> 2218<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 2219"void (^)(int)". 2220 2221The pointee is always required to be a FunctionType. 2222</pre></td></tr> 2223 2224 2225<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> 2226<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 2227 2228Given 2229 struct A {}; 2230 A a; 2231 int b; 2232 float c; 2233 bool d; 2234builtinType() 2235 matches "int b", "float c" and "bool d" 2236</pre></td></tr> 2237 2238 2239<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> 2240<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 2241 2242Given 2243 _Complex float f; 2244complexType() 2245 matches "_Complex float f" 2246</pre></td></tr> 2247 2248 2249<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> 2250<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 2251 2252Given 2253 void() { 2254 int a[2]; 2255 int b[] = { 2, 3 }; 2256 int c[b[0]]; 2257 } 2258constantArrayType() 2259 matches "int a[2]" 2260</pre></td></tr> 2261 2262 2263<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> 2264<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 2265Example matches i[] in declaration of f. 2266 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 2267Example matches i[1]. 2268 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 2269 void f(int i[]) { 2270 i[1] = 0; 2271 } 2272</pre></td></tr> 2273 2274 2275<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> 2276<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(<expr>) types. 2277 2278Given: 2279 short i = 1; 2280 int j = 42; 2281 decltype(i + j) result = i + j; 2282decltypeType() 2283 matches "decltype(i + j)" 2284</pre></td></tr> 2285 2286 2287<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> 2288<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class 2289template types. 2290 2291Given 2292 template <typename T> 2293 class C { public: C(T); }; 2294 2295 C c(123); 2296deducedTemplateSpecializationType() matches the type in the declaration 2297of the variable c. 2298</pre></td></tr> 2299 2300 2301<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> 2302<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 2303 2304Given 2305 template<typename T, int Size> 2306 class array { 2307 T data[Size]; 2308 }; 2309dependentSizedArrayType 2310 matches "T data[Size]" 2311</pre></td></tr> 2312 2313 2314<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> 2315<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 2316qualified name. 2317 2318Given 2319 namespace N { 2320 namespace M { 2321 class D {}; 2322 } 2323 } 2324 class C {}; 2325 2326 class C c; 2327 N::M::D d; 2328 2329elaboratedType() matches the type of the variable declarations of both 2330c and d. 2331</pre></td></tr> 2332 2333 2334<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>...</td></tr> 2335<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types. 2336 2337Given 2338 enum C { Green }; 2339 enum class S { Red }; 2340 2341 C c; 2342 S s; 2343 2344enumType() matches the type of the variable declarations of both c and 2345s. 2346</pre></td></tr> 2347 2348 2349<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>>...</td></tr> 2350<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes. 2351 2352Given 2353 int (*f)(int); 2354 void g(); 2355functionProtoType() 2356 matches "int (*f)(int)" and the type of "g" in C++ mode. 2357 In C mode, "g" is not matched because it does not contain a prototype. 2358</pre></td></tr> 2359 2360 2361<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> 2362<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 2363 2364Given 2365 int (*f)(int); 2366 void g(); 2367functionType() 2368 matches "int (*f)(int)" and the type of "g". 2369</pre></td></tr> 2370 2371 2372<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>>...</td></tr> 2373<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 2374 2375Given 2376 int a[] = { 2, 3 }; 2377 int b[42]; 2378 void f(int c[]) { int d[a[0]]; }; 2379incompleteArrayType() 2380 matches "int a[]" and "int c[]" 2381</pre></td></tr> 2382 2383 2384<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> 2385<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 2386 2387Example matches S s, but not S<T> s. 2388 (matcher = parmVarDecl(hasType(injectedClassNameType()))) 2389 template <typename T> struct S { 2390 void f(S s); 2391 void g(S<T> s); 2392 }; 2393</pre></td></tr> 2394 2395 2396<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> 2397<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 2398 2399Given: 2400 int *a; 2401 int &b = *a; 2402 int &&c = 1; 2403 auto &d = b; 2404 auto &&e = c; 2405 auto &&f = 2; 2406 int g = 5; 2407 2408lValueReferenceType() matches the types of b, d, and e. e is 2409matched since the type is deduced as int& by reference collapsing rules. 2410</pre></td></tr> 2411 2412 2413<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> 2414<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 2415Given 2416 struct A { int i; } 2417 A::* ptr = A::i; 2418memberPointerType() 2419 matches "A::* ptr" 2420</pre></td></tr> 2421 2422 2423<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> 2424<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 2425a pointer type, despite being syntactically similar. 2426 2427Given 2428 int *a; 2429 2430 @interface Foo 2431 @end 2432 Foo *f; 2433pointerType() 2434 matches "Foo *f", but does not match "int *a". 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('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>>...</td></tr> 2439<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 2440 2441Given 2442 int (*ptr_to_array)[4]; 2443 int *array_of_ptrs[4]; 2444 2445varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 2446array_of_ptrs. 2447</pre></td></tr> 2448 2449 2450<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> 2451<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 2452types. 2453 2454Given 2455 int *a; 2456 int &b = *a; 2457 int c = 5; 2458 2459 @interface Foo 2460 @end 2461 Foo *f; 2462pointerType() 2463 matches "int *a", but does not match "Foo *f". 2464</pre></td></tr> 2465 2466 2467<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> 2468<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 2469 2470Given: 2471 int *a; 2472 int &b = *a; 2473 int &&c = 1; 2474 auto &d = b; 2475 auto &&e = c; 2476 auto &&f = 2; 2477 int g = 5; 2478 2479rValueReferenceType() matches the types of c and f. e is not 2480matched as it is deduced to int& by reference collapsing rules. 2481</pre></td></tr> 2482 2483 2484<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> 2485<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 2486 2487Given 2488 class C {}; 2489 struct S {}; 2490 2491 C c; 2492 S s; 2493 2494recordType() matches the type of the variable declarations of both c 2495and s. 2496</pre></td></tr> 2497 2498 2499<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>...</td></tr> 2500<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 2501 2502Given 2503 int *a; 2504 int &b = *a; 2505 int &&c = 1; 2506 auto &d = b; 2507 auto &&e = c; 2508 auto &&f = 2; 2509 int g = 5; 2510 2511referenceType() matches the types of b, c, d, e, and f. 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('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>>...</td></tr> 2516<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 2517template type parameter. 2518 2519Given 2520 template <typename T> 2521 void F(T t) { 2522 int i = 1 + t; 2523 } 2524 2525substTemplateTypeParmType() matches the type of 't' but not '1' 2526</pre></td></tr> 2527 2528 2529<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> 2530<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types). 2531 2532Given 2533 enum E {}; 2534 class C {}; 2535 2536 E e; 2537 C c; 2538 2539tagType() matches the type of the variable declarations of both e 2540and c. 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('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>...</td></tr> 2545<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 2546 2547Given 2548 template <typename T> 2549 class C { }; 2550 2551 template class C<int>; // A 2552 C<char> var; // B 2553 2554templateSpecializationType() matches the type of the explicit 2555instantiation in A and the type of the variable declaration in B. 2556</pre></td></tr> 2557 2558 2559<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>...</td></tr> 2560<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 2561 2562Example matches T, but not int. 2563 (matcher = templateTypeParmType()) 2564 template <typename T> void f(int i); 2565</pre></td></tr> 2566 2567 2568<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>>...</td></tr> 2569<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 2570</pre></td></tr> 2571 2572 2573<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> 2574<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 2575 2576Given 2577 typedef int X; 2578typedefType() 2579 matches "typedef int X" 2580</pre></td></tr> 2581 2582 2583<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>>...</td></tr> 2584<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 2585 2586Given: 2587 typedef __underlying_type(T) type; 2588unaryTransformType() 2589 matches "__underlying_type(T)" 2590</pre></td></tr> 2591 2592 2593<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>>...</td></tr> 2594<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 2595integer-constant-expression. 2596 2597Given 2598 void f() { 2599 int a[] = { 2, 3 } 2600 int b[42]; 2601 int c[a[0]]; 2602 } 2603variableArrayType() 2604 matches "int c[a[0]]" 2605</pre></td></tr> 2606 2607<!--END_DECL_MATCHERS --> 2608</table> 2609 2610<!-- ======================================================================= --> 2611<h2 id="narrowing-matchers">Narrowing Matchers</h2> 2612<!-- ======================================================================= --> 2613 2614<p>Narrowing matchers match certain attributes on the current node, thus 2615narrowing down the set of nodes of the current type to match on.</p> 2616 2617<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 2618which allow users to create more powerful match expressions.</p> 2619 2620<table> 2621<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 2622<!-- START_NARROWING_MATCHERS --> 2623 2624<tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2625<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 2626 2627Usable as: Any Matcher 2628</pre></td></tr> 2629 2630 2631<tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2632<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 2633 2634Usable as: Any Matcher 2635</pre></td></tr> 2636 2637 2638<tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 2639<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 2640 2641Useful when another matcher requires a child matcher, but there's no 2642additional constraint. This will often be used with an explicit conversion 2643to an internal::Matcher<> type such as TypeMatcher. 2644 2645Example: DeclarationMatcher(anything()) matches all declarations, e.g., 2646"int* p" and "void f()" in 2647 int* p; 2648 void f(); 2649 2650Usable as: Any Matcher 2651</pre></td></tr> 2652 2653 2654<tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr> 2655<tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within 2656 2657Given 2658 if (true); 2659 for (; true; ); 2660with the matcher 2661 mapAnyOf(ifStmt, forStmt).with( 2662 hasCondition(cxxBoolLiteralExpr(equals(true))) 2663 ).bind("trueCond") 2664matches the if and the for. It is equivalent to: 2665 auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true))); 2666 anyOf( 2667 ifStmt(trueCond).bind("trueCond"), 2668 forStmt(trueCond).bind("trueCond") 2669 ); 2670 2671The with() chain-call accepts zero or more matchers which are combined 2672as-if with allOf() in each of the node matchers. 2673Usable as: Any Matcher 2674</pre></td></tr> 2675 2676 2677<tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 2678<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 2679 2680Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 2681 class X {}; 2682 class Y {}; 2683 2684Usable as: Any Matcher 2685</pre></td></tr> 2686 2687 2688<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> 2689<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the 2690specified names. 2691 2692 hasAnyOperatorName("+", "-") 2693 Is equivalent to 2694 anyOf(hasOperatorName("+"), hasOperatorName("-")) 2695</pre></td></tr> 2696 2697 2698<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> 2699<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 2700unary). 2701 2702Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 2703 !(a || b) 2704</pre></td></tr> 2705 2706 2707<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> 2708<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators. 2709 2710Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2711 if (a == b) 2712 a += b; 2713 2714Example 2: matches s1 = s2 2715 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2716 struct S { S& operator=(const S&); }; 2717 void x() { S s1, s2; s1 = s2; } 2718</pre></td></tr> 2719 2720 2721<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> 2722<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators. 2723 2724Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 2725 if (a == b) 2726 a += b; 2727 2728Example 2: matches s1 < s2 2729 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 2730 struct S { bool operator<(const S& other); }; 2731 void x(S s1, S s2) { bool b1 = s1 < s2; } 2732</pre></td></tr> 2733 2734 2735<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> 2736<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private 2737inheritance. 2738 2739Examples: 2740 class C { 2741 public: int a; 2742 protected: int b; 2743 private: int c; // fieldDecl(isPrivate()) matches 'c' 2744 }; 2745 2746 struct Base {}; 2747 struct Derived1 : private Base {}; // matches 'Base' 2748 class Derived2 : Base {}; // matches 'Base' 2749</pre></td></tr> 2750 2751 2752<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> 2753<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify 2754protected inheritance. 2755 2756Examples: 2757 class C { 2758 public: int a; 2759 protected: int b; // fieldDecl(isProtected()) matches 'b' 2760 private: int c; 2761 }; 2762 2763 class Base {}; 2764 class Derived : protected Base {}; // matches 'Base' 2765</pre></td></tr> 2766 2767 2768<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> 2769<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public 2770inheritance. 2771 2772Examples: 2773 class C { 2774 public: int a; // fieldDecl(isPublic()) matches 'a' 2775 protected: int b; 2776 private: int c; 2777 }; 2778 2779 class Base {}; 2780 class Derived1 : public Base {}; // matches 'Base' 2781 struct Derived2 : Base {}; // matches 'Base' 2782</pre></td></tr> 2783 2784 2785<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> 2786<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify 2787virtual inheritance. 2788 2789Example: 2790 class A { 2791 public: 2792 virtual void x(); // matches x 2793 }; 2794 2795Example: 2796 class Base {}; 2797 class DirectlyDerived : virtual Base {}; // matches Base 2798 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 2799 2800Usable 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>> 2801</pre></td></tr> 2802 2803 2804<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> 2805<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr> 2806 2807 2808<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> 2809<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT. 2810 2811Given 2812 f('false, 3.14, 42); 2813characterLiteral(equals(0)) 2814 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2815 match false 2816floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2817 match 3.14 2818integerLiteral(equals(42)) 2819 matches 42 2820 2821Note that you cannot directly match a negative numeric literal because the 2822minus sign is not part of the literal: It is a unary operator whose operand 2823is the positive numeric literal. Instead, you must use a unaryOperator() 2824matcher to match the minus sign: 2825 2826unaryOperator(hasOperatorName("-"), 2827 hasUnaryOperand(integerLiteral(equals(13)))) 2828 2829Usable 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>>, 2830 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>> 2831</pre></td></tr> 2832 2833 2834<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> 2835<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr> 2836 2837 2838<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> 2839<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr> 2840 2841 2842<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> 2843<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 2844 2845Given 2846 try { 2847 // ... 2848 } catch (int) { 2849 // ... 2850 } catch (...) { 2851 // ... 2852 } 2853cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 2854</pre></td></tr> 2855 2856 2857<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> 2858<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 2859a specific number of arguments (including absent default arguments). 2860 2861Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2862 void f(int x, int y); 2863 f(0, 0); 2864</pre></td></tr> 2865 2866 2867<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> 2868<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 2869</pre></td></tr> 2870 2871 2872<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr> 2873<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 2874zero initialization. 2875 2876Given 2877void foo() { 2878 struct point { double x; double y; }; 2879 point pt[2] = { { 1.0, 2.0 } }; 2880} 2881initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 2882will match the implicit array filler for pt[1]. 2883</pre></td></tr> 2884 2885 2886<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> 2887<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 2888 2889Given 2890 struct S { 2891 S(); // #1 2892 S(const S &); // #2 2893 S(S &&); // #3 2894 }; 2895cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 2896</pre></td></tr> 2897 2898 2899<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> 2900<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 2901 2902Given 2903 struct S { 2904 S(); // #1 2905 S(const S &); // #2 2906 S(S &&); // #3 2907 }; 2908cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 2909</pre></td></tr> 2910 2911 2912<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> 2913<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 2914 2915Given 2916 struct S { 2917 S(); // #1 2918 S(int) {} // #2 2919 S(S &&) : S() {} // #3 2920 }; 2921 S::S() : S(0) {} // #4 2922cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 2923#1 or #2. 2924</pre></td></tr> 2925 2926 2927<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr> 2928<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations 2929that have an explicit specifier if this explicit specifier is resolved to 2930true. 2931 2932Given 2933 template<bool b> 2934 struct S { 2935 S(int); // #1 2936 explicit S(double); // #2 2937 operator int(); // #3 2938 explicit operator bool(); // #4 2939 explicit(false) S(bool) // # 7 2940 explicit(true) S(char) // # 8 2941 explicit(b) S(S) // # 9 2942 }; 2943 S(int) -> S<true> // #5 2944 explicit S(double) -> S<false> // #6 2945cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2946cxxConversionDecl(isExplicit()) will match #4, but not #3. 2947cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2948</pre></td></tr> 2949 2950 2951<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> 2952<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 2953 2954Given 2955 struct S { 2956 S(); // #1 2957 S(const S &); // #2 2958 S(S &&); // #3 2959 }; 2960cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 2961</pre></td></tr> 2962 2963 2964<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> 2965<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations 2966that have an explicit specifier if this explicit specifier is resolved to 2967true. 2968 2969Given 2970 template<bool b> 2971 struct S { 2972 S(int); // #1 2973 explicit S(double); // #2 2974 operator int(); // #3 2975 explicit operator bool(); // #4 2976 explicit(false) S(bool) // # 7 2977 explicit(true) S(char) // # 8 2978 explicit(b) S(S) // # 9 2979 }; 2980 S(int) -> S<true> // #5 2981 explicit S(double) -> S<false> // #6 2982cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 2983cxxConversionDecl(isExplicit()) will match #4, but not #3. 2984cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 2985</pre></td></tr> 2986 2987 2988<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> 2989<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 2990opposed to a member. 2991 2992Given 2993 struct B {}; 2994 struct D : B { 2995 int I; 2996 D(int i) : I(i) {} 2997 }; 2998 struct E : B { 2999 E() : B() {} 3000 }; 3001cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 3002 will match E(), but not match D(int). 3003</pre></td></tr> 3004 3005 3006<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> 3007<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 3008opposed to a base. 3009 3010Given 3011 struct B {}; 3012 struct D : B { 3013 int I; 3014 D(int i) : I(i) {} 3015 }; 3016 struct E : B { 3017 E() : B() {} 3018 }; 3019cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 3020 will match D(int), but not match E(). 3021</pre></td></tr> 3022 3023 3024<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> 3025<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 3026code (as opposed to implicitly added by the compiler). 3027 3028Given 3029 struct Foo { 3030 Foo() { } 3031 Foo(int) : foo_("A") { } 3032 string foo_; 3033 }; 3034cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 3035 will match Foo(int), but not Foo() 3036</pre></td></tr> 3037 3038 3039<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> 3040<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations 3041that have an explicit specifier if this explicit specifier is resolved to 3042true. 3043 3044Given 3045 template<bool b> 3046 struct S { 3047 S(int); // #1 3048 explicit S(double); // #2 3049 operator int(); // #3 3050 explicit operator bool(); // #4 3051 explicit(false) S(bool) // # 7 3052 explicit(true) S(char) // # 8 3053 explicit(b) S(S) // # 9 3054 }; 3055 S(int) -> S<true> // #5 3056 explicit S(double) -> S<false> // #6 3057cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3058cxxConversionDecl(isExplicit()) will match #4, but not #3. 3059cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3060</pre></td></tr> 3061 3062 3063<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> 3064<tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names. 3065 3066In template declarations, dependent members are not resolved and so can 3067not be matched to particular named declarations. 3068 3069This matcher allows to match on the known name of members. 3070 3071Given 3072 template <typename T> 3073 struct S { 3074 void mem(); 3075 }; 3076 template <typename T> 3077 void x() { 3078 S<T> s; 3079 s.mem(); 3080 } 3081cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()` 3082</pre></td></tr> 3083 3084 3085<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> 3086<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed 3087to '.'. 3088 3089Member calls on the implicit this pointer match as called with '->'. 3090 3091Given 3092 class Y { 3093 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3094 template <class T> void f() { this->f<T>(); f<T>(); } 3095 int a; 3096 static int b; 3097 }; 3098 template <class T> 3099 class Z { 3100 void x() { this->m; } 3101 }; 3102memberExpr(isArrow()) 3103 matches this->x, x, y.x, a, this->b 3104cxxDependentScopeMemberExpr(isArrow()) 3105 matches this->m 3106unresolvedMemberExpr(isArrow()) 3107 matches this->f<T>, f<T> 3108</pre></td></tr> 3109 3110 3111<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> 3112<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound 3113node 3114 3115In template declarations, dependent members are not resolved and so can 3116not be matched to particular named declarations. 3117 3118This matcher allows to match on the name of already-bound VarDecl, FieldDecl 3119and CXXMethodDecl nodes. 3120 3121Given 3122 template <typename T> 3123 struct S { 3124 void mem(); 3125 }; 3126 template <typename T> 3127 void x() { 3128 S<T> s; 3129 s.mem(); 3130 } 3131The matcher 3132@code 3133cxxDependentScopeMemberExpr( 3134 hasObjectExpression(declRefExpr(hasType(templateSpecializationType( 3135 hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has( 3136 cxxMethodDecl(hasName("mem")).bind("templMem") 3137 ))))) 3138 )))), 3139 memberHasSameNameAsBoundNode("templMem") 3140 ) 3141@endcode 3142first matches and binds the @c mem member of the @c S template, then 3143compares its name to the usage in @c s.mem() in the @c x function template 3144</pre></td></tr> 3145 3146 3147<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> 3148<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 3149 3150Given 3151struct A { 3152 void foo() const; 3153 void bar(); 3154}; 3155 3156cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 3157</pre></td></tr> 3158 3159 3160<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> 3161<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 3162operator. 3163 3164Given 3165struct A { 3166 A &operator=(const A &); 3167 A &operator=(A &&); 3168}; 3169 3170cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 3171the second one. 3172</pre></td></tr> 3173 3174 3175<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr> 3176<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 3177 3178Given: 3179 class A final {}; 3180 3181 struct B { 3182 virtual void f(); 3183 }; 3184 3185 struct C : B { 3186 void f() final; 3187 }; 3188matches A and C::f, but not B, C, or B::f 3189</pre></td></tr> 3190 3191 3192<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> 3193<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 3194operator. 3195 3196Given 3197struct A { 3198 A &operator=(const A &); 3199 A &operator=(A &&); 3200}; 3201 3202cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 3203the first one. 3204</pre></td></tr> 3205 3206 3207<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr> 3208<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 3209 3210Given 3211 class A { 3212 public: 3213 virtual void x(); 3214 }; 3215 class B : public A { 3216 public: 3217 virtual void x(); 3218 }; 3219 matches B::x 3220</pre></td></tr> 3221 3222 3223<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> 3224<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 3225 3226Given 3227 class A { 3228 public: 3229 virtual void x() = 0; 3230 }; 3231 matches A::x 3232</pre></td></tr> 3233 3234 3235<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> 3236<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 3237 3238Given 3239 struct S { 3240 S(); // #1 3241 S(const S &) = default; // #2 3242 S(S &&) = delete; // #3 3243 }; 3244cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 3245</pre></td></tr> 3246 3247 3248<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> 3249<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify 3250virtual inheritance. 3251 3252Example: 3253 class A { 3254 public: 3255 virtual void x(); // matches x 3256 }; 3257 3258Example: 3259 class Base {}; 3260 class DirectlyDerived : virtual Base {}; // matches Base 3261 class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 3262 3263Usable 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>> 3264</pre></td></tr> 3265 3266 3267<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> 3268<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 3269 3270Given 3271 class A { 3272 public: 3273 virtual void x(); 3274 }; 3275 class B : public A { 3276 public: 3277 void x(); 3278 }; 3279 matches A::x but not B::x 3280</pre></td></tr> 3281 3282 3283<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> 3284<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions. 3285 3286Given: 3287 MyClass *p1 = new MyClass[10]; 3288cxxNewExpr(isArray()) 3289 matches the expression 'new MyClass[10]'. 3290</pre></td></tr> 3291 3292 3293<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> 3294<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the 3295specified names. 3296 3297 hasAnyOperatorName("+", "-") 3298 Is equivalent to 3299 anyOf(hasOperatorName("+"), hasOperatorName("-")) 3300</pre></td></tr> 3301 3302 3303<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> 3304<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names. 3305 3306Matches overloaded operator names specified in strings without the 3307"operator" prefix: e.g. "<<". 3308 3309 hasAnyOverloadedOperatorName("+", "-") 3310Is equivalent to 3311 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3312</pre></td></tr> 3313 3314 3315<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> 3316<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 3317unary). 3318 3319Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3320 !(a || b) 3321</pre></td></tr> 3322 3323 3324<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> 3325<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 3326 3327Matches overloaded operator names specified in strings without the 3328"operator" prefix: e.g. "<<". 3329 3330Given: 3331 class A { int operator*(); }; 3332 const A &operator<<(const A &a, const A &b); 3333 A a; 3334 a << a; // <-- This matches 3335 3336cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3337specified line and 3338cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3339matches the declaration of A. 3340 3341Usable 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>> 3342</pre></td></tr> 3343 3344 3345<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> 3346<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators. 3347 3348Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3349 if (a == b) 3350 a += b; 3351 3352Example 2: matches s1 = s2 3353 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3354 struct S { S& operator=(const S&); }; 3355 void x() { S s1, s2; s1 = s2; } 3356</pre></td></tr> 3357 3358 3359<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> 3360<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators. 3361 3362Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3363 if (a == b) 3364 a += b; 3365 3366Example 2: matches s1 < s2 3367 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3368 struct S { bool operator<(const S& other); }; 3369 void x(S s1, S s2) { bool b1 = s1 < s2; } 3370</pre></td></tr> 3371 3372 3373<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> 3374<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined. 3375 3376Example matches x (matcher = cxxRecordDecl(hasDefinition())) 3377class x {}; 3378class y; 3379</pre></td></tr> 3380 3381 3382<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> 3383<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 3384</pre></td></tr> 3385 3386 3387<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> 3388<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 3389</pre></td></tr> 3390 3391 3392<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> 3393<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 3394static member variable template instantiations. 3395 3396Given 3397 template<typename T> void A(T t) { } 3398 template<> void A(int N) { } 3399functionDecl(isExplicitTemplateSpecialization()) 3400 matches the specialization A<int>(). 3401 3402Usable 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>> 3403</pre></td></tr> 3404 3405 3406<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> 3407<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 3408 3409Given: 3410 class A final {}; 3411 3412 struct B { 3413 virtual void f(); 3414 }; 3415 3416 struct C : B { 3417 void f() final; 3418 }; 3419matches A and C::f, but not B, C, or B::f 3420</pre></td></tr> 3421 3422 3423<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> 3424<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 3425 3426Given: 3427 auto x = []{}; 3428 3429cxxRecordDecl(isLambda()) matches the implicit class declaration of 3430decltype(x) 3431</pre></td></tr> 3432 3433 3434<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> 3435<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for 3436isSameOrDerivedFrom(hasName(...)). 3437</pre></td></tr> 3438 3439 3440<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> 3441<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 3442member variable template instantiations. 3443 3444Given 3445 template <typename T> class X {}; class A {}; X<A> x; 3446or 3447 template <typename T> class X {}; class A {}; template class X<A>; 3448or 3449 template <typename T> class X {}; class A {}; extern template class X<A>; 3450cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3451 matches the template instantiation of X<A>. 3452 3453But given 3454 template <typename T> class X {}; class A {}; 3455 template <> class X<A> {}; X<A> x; 3456cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3457 does not match, as X<A> is an explicit template specialization. 3458 3459Usable 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>> 3460</pre></td></tr> 3461 3462 3463<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> 3464<tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the 3465specified names. 3466 3467 hasAnyOperatorName("+", "-") 3468 Is equivalent to 3469 anyOf(hasOperatorName("+"), hasOperatorName("-")) 3470</pre></td></tr> 3471 3472 3473<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> 3474<tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or 3475unary). 3476 3477Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3478 !(a || b) 3479</pre></td></tr> 3480 3481 3482<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> 3483<tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators. 3484 3485Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3486 if (a == b) 3487 a += b; 3488 3489Example 2: matches s1 = s2 3490 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3491 struct S { S& operator=(const S&); }; 3492 void x() { S s1, s2; s1 = s2; } 3493</pre></td></tr> 3494 3495 3496<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> 3497<tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators. 3498 3499Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3500 if (a == b) 3501 a += b; 3502 3503Example 2: matches s1 < s2 3504 (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3505 struct S { bool operator<(const S& other); }; 3506 void x(S s1, S s2) { bool b1 = s1 < s2; } 3507</pre></td></tr> 3508 3509 3510<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> 3511<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3512a specific number of arguments (including absent default arguments). 3513 3514Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3515 void f(int x, int y); 3516 f(0, 0); 3517</pre></td></tr> 3518 3519 3520<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> 3521<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 3522a specific number of arguments (including absent default arguments). 3523 3524Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3525 void f(int x, int y); 3526 f(0, 0); 3527</pre></td></tr> 3528 3529 3530<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> 3531<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL. 3532 3533Example matches y(x) but not y(42) or NS::y(x). 3534 namespace NS { 3535 struct X {}; 3536 void y(X); 3537 } 3538 3539 void y(...); 3540 3541 void test() { 3542 NS::X x; 3543 y(x); // Matches 3544 NS::y(x); // Doesn't match 3545 y(42); // Doesn't match 3546 using NS::y; 3547 y(x); // Found by both unqualified lookup and ADL, doesn't match 3548 } 3549</pre></td></tr> 3550 3551 3552<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> 3553<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 3554 3555Example: matches the implicit cast around 0 3556(matcher = castExpr(hasCastKind(CK_NullToPointer))) 3557 int *p = 0; 3558 3559If the matcher is use from clang-query, CastKind parameter 3560should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer"). 3561</pre></td></tr> 3562 3563 3564<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> 3565<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr> 3566 3567 3568<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> 3569<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT. 3570 3571Given 3572 f('false, 3.14, 42); 3573characterLiteral(equals(0)) 3574 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3575 match false 3576floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3577 match 3.14 3578integerLiteral(equals(42)) 3579 matches 42 3580 3581Note that you cannot directly match a negative numeric literal because the 3582minus sign is not part of the literal: It is a unary operator whose operand 3583is the positive numeric literal. Instead, you must use a unaryOperator() 3584matcher to match the minus sign: 3585 3586unaryOperator(hasOperatorName("-"), 3587 hasUnaryOperand(integerLiteral(equals(13)))) 3588 3589Usable 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>>, 3590 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>> 3591</pre></td></tr> 3592 3593 3594<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> 3595<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr> 3596 3597 3598<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> 3599<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr> 3600 3601 3602<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> 3603<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 3604 3605Given 3606 template<typename T> struct C {}; 3607 C<int> c; 3608classTemplateSpecializationDecl(templateArgumentCountIs(1)) 3609 matches C<int>. 3610</pre></td></tr> 3611 3612 3613<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> 3614<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 3615child statements. 3616 3617Example: Given 3618 { for (;;) {} } 3619compoundStmt(statementCountIs(0))) 3620 matches '{}' 3621 but does not match the outer compound statement. 3622</pre></td></tr> 3623 3624 3625<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> 3626<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 3627 3628Given 3629 int a[42]; 3630 int b[2 * 21]; 3631 int c[41], d[43]; 3632 char *s = "abcd"; 3633 wchar_t *ws = L"abcd"; 3634 char *w = "a"; 3635constantArrayType(hasSize(42)) 3636 matches "int a[42]" and "int b[2 * 21]" 3637stringLiteral(hasSize(4)) 3638 matches "abcd", L"abcd" 3639</pre></td></tr> 3640 3641 3642<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> 3643<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 3644declarations. 3645 3646Example: Given 3647 int a, b; 3648 int c; 3649 int d = 2, e; 3650declCountIs(2) 3651 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 3652</pre></td></tr> 3653 3654 3655<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> 3656<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 3657 3658Matches a node if it equals the node previously bound to ID. 3659 3660Given 3661 class X { int a; int b; }; 3662cxxRecordDecl( 3663 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3664 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3665 matches the class X, as a and b have the same type. 3666 3667Note that when multiple matches are involved via forEach* matchers, 3668equalsBoundNodes acts as a filter. 3669For example: 3670compoundStmt( 3671 forEachDescendant(varDecl().bind("d")), 3672 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3673will trigger a match for each combination of variable declaration 3674and reference to that variable declaration within a compound statement. 3675</pre></td></tr> 3676 3677 3678<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> 3679<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 3680 3681Decl has pointer identity in the AST. 3682</pre></td></tr> 3683 3684 3685<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> 3686<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 3687 3688Given 3689 __attribute__((device)) void f() { ... } 3690decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 3691f. If the matcher is used from clang-query, attr::Kind parameter should be 3692passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 3693</pre></td></tr> 3694 3695 3696<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> 3697<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro. 3698Does not match if only part of the statement is expanded from that macro or 3699if different parts of the the statement are expanded from different 3700appearances of the macro. 3701</pre></td></tr> 3702 3703 3704<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> 3705<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 3706partially matching a given regex. 3707 3708Example matches Y but not X 3709 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3710 #include "ASTMatcher.h" 3711 class X {}; 3712ASTMatcher.h: 3713 class Y {}; 3714 3715Usable 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>> 3716 3717If the matcher is used in clang-query, RegexFlags parameter 3718should be passed as a quoted string. e.g: "NoFlags". 3719Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3720</pre></td></tr> 3721 3722 3723<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> 3724<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 3725 3726Example matches X but not Y 3727 (matcher = cxxRecordDecl(isExpansionInMainFile()) 3728 #include <Y.h> 3729 class X {}; 3730Y.h: 3731 class Y {}; 3732 3733Usable 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>> 3734</pre></td></tr> 3735 3736 3737<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr> 3738<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 3739 3740Example matches Y but not X 3741 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3742 #include <SystemHeader.h> 3743 class X {}; 3744SystemHeader.h: 3745 class Y {}; 3746 3747Usable 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>> 3748</pre></td></tr> 3749 3750 3751<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> 3752<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added 3753by the compiler (eg. implicit default/copy constructors). 3754</pre></td></tr> 3755 3756 3757<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> 3758<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces. 3759 3760Given 3761 class vector {}; 3762 namespace foo { 3763 class vector {}; 3764 namespace std { 3765 class vector {}; 3766 } 3767 } 3768 namespace std { 3769 inline namespace __1 { 3770 class vector {}; // #1 3771 namespace experimental { 3772 class vector {}; 3773 } 3774 } 3775 } 3776cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1. 3777</pre></td></tr> 3778 3779 3780<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> 3781<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3782template instantiations. 3783 3784Given 3785 template<typename T> void A(T t) { T i; } 3786 A(0); 3787 A(0U); 3788functionDecl(isInstantiated()) 3789 matches 'A(int) {...};' and 'A(unsigned) {...}'. 3790</pre></td></tr> 3791 3792 3793<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> 3794<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private 3795inheritance. 3796 3797Examples: 3798 class C { 3799 public: int a; 3800 protected: int b; 3801 private: int c; // fieldDecl(isPrivate()) matches 'c' 3802 }; 3803 3804 struct Base {}; 3805 struct Derived1 : private Base {}; // matches 'Base' 3806 class Derived2 : Base {}; // matches 'Base' 3807</pre></td></tr> 3808 3809 3810<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr> 3811<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify 3812protected inheritance. 3813 3814Examples: 3815 class C { 3816 public: int a; 3817 protected: int b; // fieldDecl(isProtected()) matches 'b' 3818 private: int c; 3819 }; 3820 3821 class Base {}; 3822 class Derived : protected Base {}; // matches 'Base' 3823</pre></td></tr> 3824 3825 3826<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> 3827<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public 3828inheritance. 3829 3830Examples: 3831 class C { 3832 public: int a; // fieldDecl(isPublic()) matches 'a' 3833 protected: int b; 3834 private: int c; 3835 }; 3836 3837 class Base {}; 3838 class Derived1 : public Base {}; // matches 'Base' 3839 struct Derived2 : Base {}; // matches 'Base' 3840</pre></td></tr> 3841 3842 3843<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> 3844<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 3845a specific number of designators. 3846 3847Example: Given 3848 point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 3849 point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 3850designatorCountIs(2) 3851 matches '{ [2].y = 1.0, [0].x = 1.0 }', 3852 but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 3853</pre></td></tr> 3854 3855 3856<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> 3857<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration. 3858 3859Example matches Y (matcher = enumDecl(isScoped())) 3860enum X {}; 3861enum class Y {}; 3862</pre></td></tr> 3863 3864 3865<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> 3866<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is 3867neither type- nor value-dependent. 3868 3869In the following example, the expression sizeof(sizeof(T() + T())) 3870is instantiation-dependent (since it involves a template parameter T), 3871but is neither type- nor value-dependent, since the type of the inner 3872sizeof is known (std::size_t) and therefore the size of the outer 3873sizeof is known. 3874 template<typename T> 3875 void f(T x, T y) { sizeof(sizeof(T() + T()); } 3876expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T()) 3877</pre></td></tr> 3878 3879 3880<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr> 3881<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type 3882is not yet instantiated. 3883 3884For example, the expressions "x" and "x + y" are type-dependent in 3885the following code, but "y" is not type-dependent: 3886 template<typename T> 3887 void add(T x, int y) { 3888 x + y; 3889 } 3890expr(isTypeDependent()) matches x + y 3891</pre></td></tr> 3892 3893 3894<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> 3895<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a 3896non-type template parameter. 3897 3898For example, the array bound of "Chars" in the following example is 3899value-dependent. 3900 template<int Size> int f() { return Size; } 3901expr(isValueDependent()) matches return Size 3902</pre></td></tr> 3903 3904 3905<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> 3906<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 3907GNU's __null, C++11's nullptr, or C's NULL macro. 3908 3909Given: 3910 void *v1 = NULL; 3911 void *v2 = nullptr; 3912 void *v3 = __null; // GNU extension 3913 char *cp = (char *)0; 3914 int *ip = 0; 3915 int i = 0; 3916expr(nullPointerConstant()) 3917 matches the initializer for v1, v2, v3, cp, and ip. Does not match the 3918 initializer for i. 3919</pre></td></tr> 3920 3921 3922<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> 3923<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 3924bit width. 3925 3926Given 3927 class C { 3928 int a : 2; 3929 int b : 4; 3930 int c : 2; 3931 }; 3932fieldDecl(hasBitWidth(2)) 3933 matches 'int a;' and 'int c;' but not 'int b;'. 3934</pre></td></tr> 3935 3936 3937<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr> 3938<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 3939 3940Given 3941 class C { 3942 int a : 2; 3943 int b; 3944 }; 3945fieldDecl(isBitField()) 3946 matches 'int a;' but not 'int b;'. 3947</pre></td></tr> 3948 3949 3950<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> 3951<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 3952 3953Given 3954 f('false, 3.14, 42); 3955characterLiteral(equals(0)) 3956 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3957 match false 3958floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3959 match 3.14 3960integerLiteral(equals(42)) 3961 matches 42 3962 3963Note that you cannot directly match a negative numeric literal because the 3964minus sign is not part of the literal: It is a unary operator whose operand 3965is the positive numeric literal. Instead, you must use a unaryOperator() 3966matcher to match the minus sign: 3967 3968unaryOperator(hasOperatorName("-"), 3969 hasUnaryOperand(integerLiteral(equals(13)))) 3970 3971Usable 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>>, 3972 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>> 3973</pre></td></tr> 3974 3975 3976<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> 3977<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr> 3978 3979 3980<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> 3981<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names. 3982 3983Matches overloaded operator names specified in strings without the 3984"operator" prefix: e.g. "<<". 3985 3986 hasAnyOverloadedOperatorName("+", "-") 3987Is equivalent to 3988 anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3989</pre></td></tr> 3990 3991 3992<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> 3993<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 3994 3995Given: 3996 void f(); 3997 void g() noexcept; 3998 void h() noexcept(true); 3999 void i() noexcept(false); 4000 void j() throw(); 4001 void k() throw(int); 4002 void l() throw(...); 4003functionDecl(hasDynamicExceptionSpec()) and 4004 functionProtoType(hasDynamicExceptionSpec()) 4005 match the declarations of j, k, and l, but not f, g, h, or i. 4006</pre></td></tr> 4007 4008 4009<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> 4010<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 4011 4012Matches overloaded operator names specified in strings without the 4013"operator" prefix: e.g. "<<". 4014 4015Given: 4016 class A { int operator*(); }; 4017 const A &operator<<(const A &a, const A &b); 4018 A a; 4019 a << a; // <-- This matches 4020 4021cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 4022specified line and 4023cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 4024matches the declaration of A. 4025 4026Usable 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>> 4027</pre></td></tr> 4028 4029 4030<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> 4031<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 4032 4033Example matches Y (matcher = functionDecl(hasTrailingReturn())) 4034int X() {} 4035auto Y() -> int {} 4036</pre></td></tr> 4037 4038 4039<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr> 4040<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations, 4041 and if constexpr. 4042 4043Given: 4044 constexpr int foo = 42; 4045 constexpr int bar(); 4046 void baz() { if constexpr(1 > 0) {} } 4047varDecl(isConstexpr()) 4048 matches the declaration of foo. 4049functionDecl(isConstexpr()) 4050 matches the declaration of bar. 4051ifStmt(isConstexpr()) 4052 matches the if statement in baz. 4053</pre></td></tr> 4054 4055 4056<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> 4057<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 4058 4059Given: 4060 class A { ~A(); }; 4061 class B { ~B() = default; }; 4062functionDecl(isDefaulted()) 4063 matches the declaration of ~B, but not ~A. 4064</pre></td></tr> 4065 4066 4067<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> 4068<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 4069 4070Example matches A, va, fa 4071 class A {}; 4072 class B; // Doesn't match, as it has no body. 4073 int va; 4074 extern int vb; // Doesn't match, as it doesn't define the variable. 4075 void fa() {} 4076 void fb(); // Doesn't match, as it has no body. 4077 @interface X 4078 - (void)ma; // Doesn't match, interface is declaration. 4079 @end 4080 @implementation X 4081 - (void)ma {} 4082 @end 4083 4084Usable 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>>, 4085 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4086</pre></td></tr> 4087 4088 4089<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr> 4090<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 4091 4092Given: 4093 void Func(); 4094 void DeletedFunc() = delete; 4095functionDecl(isDeleted()) 4096 matches the declaration of DeletedFunc, but not Func. 4097</pre></td></tr> 4098 4099 4100<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> 4101<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 4102static member variable template instantiations. 4103 4104Given 4105 template<typename T> void A(T t) { } 4106 template<> void A(int N) { } 4107functionDecl(isExplicitTemplateSpecialization()) 4108 matches the specialization A<int>(). 4109 4110Usable 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>> 4111</pre></td></tr> 4112 4113 4114<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> 4115<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 4116 4117Given: 4118 extern "C" void f() {} 4119 extern "C" { void g() {} } 4120 void h() {} 4121 extern "C" int x = 1; 4122 extern "C" int y = 2; 4123 int z = 3; 4124functionDecl(isExternC()) 4125 matches the declaration of f and g, but not the declaration of h. 4126varDecl(isExternC()) 4127 matches the declaration of x and y, but not the declaration of z. 4128</pre></td></tr> 4129 4130 4131<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> 4132<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 4133the inline keyword. 4134 4135Given 4136 inline void f(); 4137 void g(); 4138 namespace n { 4139 inline namespace m {} 4140 } 4141functionDecl(isInline()) will match ::f(). 4142namespaceDecl(isInline()) will match n::m. 4143</pre></td></tr> 4144 4145 4146<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isMain0')"><a name="isMain0Anchor">isMain</a></td><td></td></tr> 4147<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point 4148into an executable program. 4149</pre></td></tr> 4150 4151 4152<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> 4153<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 4154 4155Given 4156 void nope(); 4157 [[noreturn]] void a(); 4158 __attribute__((noreturn)) void b(); 4159 struct c { [[noreturn]] c(); }; 4160functionDecl(isNoReturn()) 4161 matches all of those except 4162 void nope(); 4163</pre></td></tr> 4164 4165 4166<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> 4167<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 4168 4169Given: 4170 void f(); 4171 void g() noexcept; 4172 void h() throw(); 4173 void i() throw(int); 4174 void j() noexcept(false); 4175functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4176 match the declarations of g, and h, but not f, i or j. 4177</pre></td></tr> 4178 4179 4180<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> 4181<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage 4182class specifier ("static" keyword) written in the source. 4183 4184Given: 4185 static void f() {} 4186 static int i = 0; 4187 extern int j; 4188 int k; 4189functionDecl(isStaticStorageClass()) 4190 matches the function declaration f. 4191varDecl(isStaticStorageClass()) 4192 matches the variable declaration i. 4193</pre></td></tr> 4194 4195 4196<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> 4197<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 4198member variable template instantiations. 4199 4200Given 4201 template <typename T> class X {}; class A {}; X<A> x; 4202or 4203 template <typename T> class X {}; class A {}; template class X<A>; 4204or 4205 template <typename T> class X {}; class A {}; extern template class X<A>; 4206cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4207 matches the template instantiation of X<A>. 4208 4209But given 4210 template <typename T> class X {}; class A {}; 4211 template <> class X<A> {}; X<A> x; 4212cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4213 does not match, as X<A> is an explicit template specialization. 4214 4215Usable 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>> 4216</pre></td></tr> 4217 4218 4219<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> 4220<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 4221 4222Example matches f, but not g or h. The function i will not match, even when 4223compiled in C mode. 4224 void f(...); 4225 void g(int); 4226 template <typename... Ts> void h(Ts...); 4227 void i(); 4228</pre></td></tr> 4229 4230 4231<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> 4232<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations. 4233 4234Given: 4235 void foo() __attribute__((__weakref__("__foo"))); 4236 void bar(); 4237functionDecl(isWeak()) 4238 matches the weak declaration "foo", but not "bar". 4239</pre></td></tr> 4240 4241 4242<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> 4243<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4244specific parameter count. 4245 4246Given 4247 void f(int i) {} 4248 void g(int i, int j) {} 4249 void h(int i, int j); 4250 void j(int i); 4251 void k(int x, int y, int z, ...); 4252functionDecl(parameterCountIs(2)) 4253 matches g and h 4254functionProtoType(parameterCountIs(2)) 4255 matches g and h 4256functionProtoType(parameterCountIs(3)) 4257 matches k 4258</pre></td></tr> 4259 4260 4261<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> 4262<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 4263 4264Given: 4265 void f(); 4266 void g() noexcept; 4267 void h() noexcept(true); 4268 void i() noexcept(false); 4269 void j() throw(); 4270 void k() throw(int); 4271 void l() throw(...); 4272functionDecl(hasDynamicExceptionSpec()) and 4273 functionProtoType(hasDynamicExceptionSpec()) 4274 match the declarations of j, k, and l, but not f, g, h, or i. 4275</pre></td></tr> 4276 4277 4278<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> 4279<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 4280 4281Given: 4282 void f(); 4283 void g() noexcept; 4284 void h() throw(); 4285 void i() throw(int); 4286 void j() noexcept(false); 4287functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4288 match the declarations of g, and h, but not f, i or j. 4289</pre></td></tr> 4290 4291 4292<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> 4293<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4294specific parameter count. 4295 4296Given 4297 void f(int i) {} 4298 void g(int i, int j) {} 4299 void h(int i, int j); 4300 void j(int i); 4301 void k(int x, int y, int z, ...); 4302functionDecl(parameterCountIs(2)) 4303 matches g and h 4304functionProtoType(parameterCountIs(2)) 4305 matches g and h 4306functionProtoType(parameterCountIs(3)) 4307 matches k 4308</pre></td></tr> 4309 4310 4311<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> 4312<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations, 4313 and if constexpr. 4314 4315Given: 4316 constexpr int foo = 42; 4317 constexpr int bar(); 4318 void baz() { if constexpr(1 > 0) {} } 4319varDecl(isConstexpr()) 4320 matches the declaration of foo. 4321functionDecl(isConstexpr()) 4322 matches the declaration of bar. 4323ifStmt(isConstexpr()) 4324 matches the if statement in baz. 4325</pre></td></tr> 4326 4327 4328<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> 4329<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 4330 4331 4332<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> 4333<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 4334 4335Given 4336 f('false, 3.14, 42); 4337characterLiteral(equals(0)) 4338 matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4339 match false 4340floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4341 match 3.14 4342integerLiteral(equals(42)) 4343 matches 42 4344 4345Note that you cannot directly match a negative numeric literal because the 4346minus sign is not part of the literal: It is a unary operator whose operand 4347is the positive numeric literal. Instead, you must use a unaryOperator() 4348matcher to match the minus sign: 4349 4350unaryOperator(hasOperatorName("-"), 4351 hasUnaryOperand(integerLiteral(equals(13)))) 4352 4353Usable 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>>, 4354 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>> 4355</pre></td></tr> 4356 4357 4358<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> 4359<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 4360 4361 4362<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> 4363<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 4364 4365 4366<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> 4367<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 4368to '.'. 4369 4370Member calls on the implicit this pointer match as called with '->'. 4371 4372Given 4373 class Y { 4374 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 4375 template <class T> void f() { this->f<T>(); f<T>(); } 4376 int a; 4377 static int b; 4378 }; 4379 template <class T> 4380 class Z { 4381 void x() { this->m; } 4382 }; 4383memberExpr(isArrow()) 4384 matches this->x, x, y.x, a, this->b 4385cxxDependentScopeMemberExpr(isArrow()) 4386 matches this->m 4387unresolvedMemberExpr(isArrow()) 4388 matches this->f<T>, f<T> 4389</pre></td></tr> 4390 4391 4392<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> 4393<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 4394 4395This matcher is only provided as a performance optimization of hasName. 4396 hasAnyName(a, b, c) 4397 is equivalent to, but faster than 4398 anyOf(hasName(a), hasName(b), hasName(c)) 4399</pre></td></tr> 4400 4401 4402<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> 4403<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 4404 4405Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 4406void f() { 4407 int x; 4408 static int y; 4409} 4410int z; 4411 4412Example matches f() because it has external formal linkage despite being 4413unique to the translation unit as though it has internal likage 4414(matcher = functionDecl(hasExternalFormalLinkage())) 4415 4416namespace { 4417void f() {} 4418} 4419</pre></td></tr> 4420 4421 4422<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> 4423<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 4424 4425Supports specifying enclosing namespaces or classes by prefixing the name 4426with '<enclosing>::'. 4427Does not match typedefs of an underlying type with the given name. 4428 4429Example matches X (Name == "X") 4430 class X; 4431 4432Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 4433 namespace a { namespace b { class X; } } 4434</pre></td></tr> 4435 4436 4437<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 4438<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 4439a substring matched by the given RegExp. 4440 4441Supports specifying enclosing namespaces or classes by 4442prefixing the name with '<enclosing>::'. Does not match typedefs 4443of an underlying type with the given name. 4444 4445Example matches X (regexp == "::X") 4446 class X; 4447 4448Example matches X (regexp is one of "::X", "^foo::.*X", among others) 4449 namespace foo { namespace bar { class X; } } 4450 4451If the matcher is used in clang-query, RegexFlags parameter 4452should be passed as a quoted string. e.g: "NoFlags". 4453Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4454</pre></td></tr> 4455 4456 4457<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> 4458<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 4459 4460Given 4461 namespace n { 4462 namespace {} // #1 4463 } 4464namespaceDecl(isAnonymous()) will match #1 but not ::n. 4465</pre></td></tr> 4466 4467 4468<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> 4469<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 4470the inline keyword. 4471 4472Given 4473 inline void f(); 4474 void g(); 4475 namespace n { 4476 inline namespace m {} 4477 } 4478functionDecl(isInline()) will match ::f(). 4479namespaceDecl(isInline()) will match n::m. 4480</pre></td></tr> 4481 4482 4483<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> 4484<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind 4485specified. 4486 4487Given 4488 4489 #pragma omp parallel 4490 #pragma omp parallel default(none) 4491 #pragma omp parallel default(shared) 4492 #pragma omp parallel default(firstprivate) 4493 4494``ompDefaultClause(isFirstPrivateKind())`` matches only 4495``default(firstprivate)``. 4496</pre></td></tr> 4497 4498 4499<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> 4500<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified. 4501 4502Given 4503 4504 #pragma omp parallel 4505 #pragma omp parallel default(none) 4506 #pragma omp parallel default(shared) 4507 #pragma omp parallel default(firstprivate) 4508 4509``ompDefaultClause(isNoneKind())`` matches only ``default(none)``. 4510</pre></td></tr> 4511 4512 4513<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> 4514<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified. 4515 4516Given 4517 4518 #pragma omp parallel 4519 #pragma omp parallel default(none) 4520 #pragma omp parallel default(shared) 4521 #pragma omp parallel default(firstprivate) 4522 4523``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``. 4524</pre></td></tr> 4525 4526 4527<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> 4528<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP 4529clause kind. 4530 4531Given 4532 4533 #pragma omp parallel 4534 #pragma omp parallel for 4535 #pragma omp for 4536 4537`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches 4538``omp parallel`` and ``omp parallel for``. 4539 4540If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter 4541should be passed as a quoted string. e.g., 4542``isAllowedToContainClauseKind("OMPC_default").`` 4543</pre></td></tr> 4544 4545 4546<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> 4547<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives, 4548i.e., directives that can't have a structured block. 4549 4550Given 4551 4552 #pragma omp parallel 4553 {} 4554 #pragma omp taskyield 4555 4556``ompExecutableDirective(isStandaloneDirective()))`` matches 4557``omp taskyield``. 4558</pre></td></tr> 4559 4560 4561<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> 4562<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 4563</pre></td></tr> 4564 4565 4566<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> 4567<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 4568</pre></td></tr> 4569 4570 4571<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> 4572<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for 4573isSameOrDerivedFrom(hasName(...)). 4574</pre></td></tr> 4575 4576 4577<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> 4578<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has 4579a specific number of arguments (including absent default arguments). 4580 4581Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 4582 void f(int x, int y); 4583 f(0, 0); 4584</pre></td></tr> 4585 4586 4587<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> 4588<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 4589Selector.getAsString() 4590 4591 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 4592 matches both of the expressions below: 4593 [myObj methodA:argA]; 4594 [myObj methodB:argB]; 4595</pre></td></tr> 4596 4597 4598<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> 4599<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 4600 4601objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 4602message expression in 4603 4604 UIWebView *webView = ...; 4605 CGRect bodyFrame = webView.frame; 4606 bodyFrame.size.height = self.bodyContentHeight; 4607 webView.frame = bodyFrame; 4608 // ^---- matches here 4609</pre></td></tr> 4610 4611 4612<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> 4613<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 4614 4615Matches only when the selector of the objCMessageExpr is NULL. This may 4616represent an error condition in the tree! 4617</pre></td></tr> 4618 4619 4620<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> 4621<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 4622 4623 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 4624 matches the outer message expr in the code below, but NOT the message 4625 invocation for self.bodyView. 4626 [self.bodyView loadHTMLString:html baseURL:NULL]; 4627</pre></td></tr> 4628 4629 4630<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> 4631<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 4632 4633 matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 4634 matches self.bodyView in the code below, but NOT the outer message 4635 invocation of "loadHTMLString:baseURL:". 4636 [self.bodyView loadHTMLString:html baseURL:NULL]; 4637</pre></td></tr> 4638 4639 4640<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> 4641<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class. 4642 4643Example 4644matcher = objcMessageExpr(isClassMessage()) 4645matches 4646 [NSString stringWithFormat:@"format"]; 4647but not 4648 NSString *x = @"hello"; 4649 [x containsString:@"h"]; 4650</pre></td></tr> 4651 4652 4653<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> 4654<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance. 4655 4656Example 4657matcher = objcMessageExpr(isInstanceMessage()) 4658matches 4659 NSString *x = @"hello"; 4660 [x containsString:@"h"]; 4661but not 4662 [NSString stringWithFormat:@"format"]; 4663</pre></td></tr> 4664 4665 4666<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> 4667<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 4668a substring matched by the given RegExp. 4669 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 4670 invocation for self.bodyView. 4671 [self.bodyView loadHTMLString:html baseURL:NULL]; 4672 4673If the matcher is used in clang-query, RegexFlags parameter 4674should be passed as a quoted string. e.g: "NoFlags". 4675Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4676</pre></td></tr> 4677 4678 4679<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr> 4680<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 4681 4682 matcher = objCMessageExpr(numSelectorArgs(0)); 4683 matches self.bodyView in the code below 4684 4685 matcher = objCMessageExpr(numSelectorArgs(2)); 4686 matches the invocation of "loadHTMLString:baseURL:" but not that 4687 of self.bodyView 4688 [self.bodyView loadHTMLString:html baseURL:NULL]; 4689</pre></td></tr> 4690 4691 4692<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> 4693<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method. 4694 4695Example 4696matcher = objcMethodDecl(isClassMethod()) 4697matches 4698@interface I + (void)foo; @end 4699but not 4700@interface I - (void)bar; @end 4701</pre></td></tr> 4702 4703 4704<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> 4705<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 4706 4707Example matches A, va, fa 4708 class A {}; 4709 class B; // Doesn't match, as it has no body. 4710 int va; 4711 extern int vb; // Doesn't match, as it doesn't define the variable. 4712 void fa() {} 4713 void fb(); // Doesn't match, as it has no body. 4714 @interface X 4715 - (void)ma; // Doesn't match, interface is declaration. 4716 @end 4717 @implementation X 4718 - (void)ma {} 4719 @end 4720 4721Usable 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>>, 4722 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4723</pre></td></tr> 4724 4725 4726<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> 4727<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method. 4728 4729Example 4730matcher = objcMethodDecl(isInstanceMethod()) 4731matches 4732@interface I - (void)bar; @end 4733but not 4734@interface I + (void)foo; @end 4735</pre></td></tr> 4736 4737 4738<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> 4739<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 4740 4741Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 4742void x(int val) {} 4743void y(int val = 0) {} 4744 4745Deprecated. Use hasInitializer() instead to be able to 4746match on the contents of the default argument. For example: 4747 4748void x(int val = 7) {} 4749void y(int val = 42) {} 4750parmVarDecl(hasInitializer(integerLiteral(equals(42)))) 4751 matches the parameter of y 4752 4753A matcher such as 4754 parmVarDecl(hasInitializer(anything())) 4755is equivalent to parmVarDecl(hasDefaultArgument()). 4756</pre></td></tr> 4757 4758 4759<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> 4760<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter 4761list. The parameter list could be that of either a block, function, or 4762objc-method. 4763 4764 4765Given 4766 4767void f(int a, int b, int c) { 4768} 4769 4770``parmVarDecl(isAtPosition(0))`` matches ``int a``. 4771 4772``parmVarDecl(isAtPosition(1))`` matches ``int b``. 4773</pre></td></tr> 4774 4775 4776<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> 4777<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 4778 4779Given 4780 class Y { public: void x(); }; 4781 void z() { Y* y; y->x(); } 4782cxxMemberCallExpr(on(hasType(asString("class Y *")))) 4783 matches y->x() 4784</pre></td></tr> 4785 4786 4787<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> 4788<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 4789 4790Matches a node if it equals the node previously bound to ID. 4791 4792Given 4793 class X { int a; int b; }; 4794cxxRecordDecl( 4795 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4796 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4797 matches the class X, as a and b have the same type. 4798 4799Note that when multiple matches are involved via forEach* matchers, 4800equalsBoundNodes acts as a filter. 4801For example: 4802compoundStmt( 4803 forEachDescendant(varDecl().bind("d")), 4804 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4805will trigger a match for each combination of variable declaration 4806and reference to that variable declaration within a compound statement. 4807</pre></td></tr> 4808 4809 4810<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> 4811<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 4812the node, not hidden within a typedef. 4813 4814Given 4815 typedef const int const_int; 4816 const_int i; 4817 int *const j; 4818 int *volatile k; 4819 int m; 4820varDecl(hasType(hasLocalQualifiers())) matches only j and k. 4821i is const-qualified but the qualifier is not local. 4822</pre></td></tr> 4823 4824 4825<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr> 4826<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 4827 4828Given 4829 void a(char); 4830 void b(wchar_t); 4831 void c(double); 4832functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 4833matches "a(char)", "b(wchar_t)", but not "c(double)". 4834</pre></td></tr> 4835 4836 4837<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> 4838<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 4839the Objective-C object pointer type, which is different despite being 4840syntactically similar. 4841 4842Given 4843 int *i = nullptr; 4844 4845 @interface Foo 4846 @end 4847 Foo *f; 4848 4849 int j; 4850varDecl(hasType(isAnyPointer())) 4851 matches "int *i" and "Foo *f", but not "int j". 4852</pre></td></tr> 4853 4854 4855<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> 4856<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 4857include "top-level" const. 4858 4859Given 4860 void a(int); 4861 void b(int const); 4862 void c(const int); 4863 void d(const int*); 4864 void e(int const) {}; 4865functionDecl(hasAnyParameter(hasType(isConstQualified()))) 4866 matches "void b(int const)", "void c(const int)" and 4867 "void e(int const) {}". It does not match d as there 4868 is no top-level const on the parameter type "const int *". 4869</pre></td></tr> 4870 4871 4872<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> 4873<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 4874 4875Given 4876 void a(int); 4877 void b(long); 4878 void c(double); 4879functionDecl(hasAnyParameter(hasType(isInteger()))) 4880matches "a(int)", "b(long)", but not "c(double)". 4881</pre></td></tr> 4882 4883 4884<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr> 4885<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 4886 4887Given 4888 void a(int); 4889 void b(unsigned long); 4890 void c(double); 4891functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 4892matches "a(int)", but not "b(unsigned long)" and "c(double)". 4893</pre></td></tr> 4894 4895 4896<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr> 4897<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 4898 4899Given 4900 void a(int); 4901 void b(unsigned long); 4902 void c(double); 4903functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 4904matches "b(unsigned long)", but not "a(int)" and "c(double)". 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('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr> 4909<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 4910include "top-level" volatile. 4911 4912Given 4913 void a(int); 4914 void b(int volatile); 4915 void c(volatile int); 4916 void d(volatile int*); 4917 void e(int volatile) {}; 4918functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 4919 matches "void b(int volatile)", "void c(volatile int)" and 4920 "void e(int volatile) {}". It does not match d as there 4921 is no top-level volatile on the parameter type "volatile int *". 4922</pre></td></tr> 4923 4924 4925<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> 4926<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 4927 4928Matches a node if it equals the node previously bound to ID. 4929 4930Given 4931 class X { int a; int b; }; 4932cxxRecordDecl( 4933 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4934 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4935 matches the class X, as a and b have the same type. 4936 4937Note that when multiple matches are involved via forEach* matchers, 4938equalsBoundNodes acts as a filter. 4939For example: 4940compoundStmt( 4941 forEachDescendant(varDecl().bind("d")), 4942 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4943will trigger a match for each combination of variable declaration 4944and reference to that variable declaration within a compound statement. 4945</pre></td></tr> 4946 4947 4948<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> 4949<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 4950 4951Stmt has pointer identity in the AST. 4952</pre></td></tr> 4953 4954 4955<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> 4956<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro. 4957Does not match if only part of the statement is expanded from that macro or 4958if different parts of the the statement are expanded from different 4959appearances of the macro. 4960</pre></td></tr> 4961 4962 4963<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 4964<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 4965partially matching a given regex. 4966 4967Example matches Y but not X 4968 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 4969 #include "ASTMatcher.h" 4970 class X {}; 4971ASTMatcher.h: 4972 class Y {}; 4973 4974Usable 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>> 4975 4976If the matcher is used in clang-query, RegexFlags parameter 4977should be passed as a quoted string. e.g: "NoFlags". 4978Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4979</pre></td></tr> 4980 4981 4982<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> 4983<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 4984 4985Example matches X but not Y 4986 (matcher = cxxRecordDecl(isExpansionInMainFile()) 4987 #include <Y.h> 4988 class X {}; 4989Y.h: 4990 class Y {}; 4991 4992Usable 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>> 4993</pre></td></tr> 4994 4995 4996<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> 4997<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 4998 4999Example matches Y but not X 5000 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5001 #include <SystemHeader.h> 5002 class X {}; 5003SystemHeader.h: 5004 class Y {}; 5005 5006Usable 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>> 5007</pre></td></tr> 5008 5009 5010<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> 5011<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 5012 5013Given 5014 int j; 5015 template<typename T> void A(T t) { T i; j += 42;} 5016 A(0); 5017 A(0U); 5018declStmt(isInTemplateInstantiation()) 5019 matches 'int i;' and 'unsigned i'. 5020unless(stmt(isInTemplateInstantiation())) 5021 will NOT match j += 42; as it's shared between the template definition and 5022 instantiation. 5023</pre></td></tr> 5024 5025 5026<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> 5027<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 5028 5029Given 5030 int a[42]; 5031 int b[2 * 21]; 5032 int c[41], d[43]; 5033 char *s = "abcd"; 5034 wchar_t *ws = L"abcd"; 5035 char *w = "a"; 5036constantArrayType(hasSize(42)) 5037 matches "int a[42]" and "int b[2 * 21]" 5038stringLiteral(hasSize(4)) 5039 matches "abcd", L"abcd" 5040</pre></td></tr> 5041 5042 5043<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> 5044<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class." 5045 5046Example matches C, but not S, U or E. 5047 struct S {}; 5048 class C {}; 5049 union U {}; 5050 enum E {}; 5051</pre></td></tr> 5052 5053 5054<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> 5055<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 5056 5057Example matches A, va, fa 5058 class A {}; 5059 class B; // Doesn't match, as it has no body. 5060 int va; 5061 extern int vb; // Doesn't match, as it doesn't define the variable. 5062 void fa() {} 5063 void fb(); // Doesn't match, as it has no body. 5064 @interface X 5065 - (void)ma; // Doesn't match, interface is declaration. 5066 @end 5067 @implementation X 5068 - (void)ma {} 5069 @end 5070 5071Usable 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>>, 5072 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5073</pre></td></tr> 5074 5075 5076<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> 5077<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum." 5078 5079Example matches E, but not C, S or U. 5080 struct S {}; 5081 class C {}; 5082 union U {}; 5083 enum E {}; 5084</pre></td></tr> 5085 5086 5087<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> 5088<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct." 5089 5090Example matches S, but not C, U or E. 5091 struct S {}; 5092 class C {}; 5093 union U {}; 5094 enum E {}; 5095</pre></td></tr> 5096 5097 5098<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> 5099<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union." 5100 5101Example matches U, but not C, S or E. 5102 struct S {}; 5103 class C {}; 5104 union U {}; 5105 enum E {}; 5106</pre></td></tr> 5107 5108 5109<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> 5110<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 5111 5112Note that 'Value' is a string as the template argument's value is 5113an arbitrary precision integer. 'Value' must be euqal to the canonical 5114representation of that integral value in base 10. 5115 5116Given 5117 template<int T> struct C {}; 5118 C<42> c; 5119classTemplateSpecializationDecl( 5120 hasAnyTemplateArgument(equalsIntegralValue("42"))) 5121 matches the implicit instantiation of C in C<42>. 5122</pre></td></tr> 5123 5124 5125<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> 5126<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 5127 5128Given 5129 template<int T> struct C {}; 5130 C<42> c; 5131classTemplateSpecializationDecl( 5132 hasAnyTemplateArgument(isIntegral())) 5133 matches the implicit instantiation of C in C<42> 5134 with isIntegral() matching 42. 5135</pre></td></tr> 5136 5137 5138<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> 5139<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 5140 5141Given 5142 template<typename T> struct C {}; 5143 C<int> c; 5144classTemplateSpecializationDecl(templateArgumentCountIs(1)) 5145 matches C<int>. 5146</pre></td></tr> 5147 5148 5149<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> 5150<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro. 5151Does not match if only part of the statement is expanded from that macro or 5152if different parts of the the statement are expanded from different 5153appearances of the macro. 5154</pre></td></tr> 5155 5156 5157<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> 5158<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 5159partially matching a given regex. 5160 5161Example matches Y but not X 5162 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5163 #include "ASTMatcher.h" 5164 class X {}; 5165ASTMatcher.h: 5166 class Y {}; 5167 5168Usable 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>> 5169 5170If the matcher is used in clang-query, RegexFlags parameter 5171should be passed as a quoted string. e.g: "NoFlags". 5172Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5173</pre></td></tr> 5174 5175 5176<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> 5177<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 5178 5179Example matches X but not Y 5180 (matcher = cxxRecordDecl(isExpansionInMainFile()) 5181 #include <Y.h> 5182 class X {}; 5183Y.h: 5184 class Y {}; 5185 5186Usable 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>> 5187</pre></td></tr> 5188 5189 5190<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> 5191<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 5192 5193Example matches Y but not X 5194 (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5195 #include <SystemHeader.h> 5196 class X {}; 5197SystemHeader.h: 5198 class Y {}; 5199 5200Usable 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>> 5201</pre></td></tr> 5202 5203 5204<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> 5205<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 5206 5207Given 5208 struct S { bool func(); }; 5209functionDecl(returns(booleanType())) 5210 matches "bool func();" 5211</pre></td></tr> 5212 5213 5214<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> 5215<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 5216 5217Matches a node if it equals the node previously bound to ID. 5218 5219Given 5220 class X { int a; int b; }; 5221cxxRecordDecl( 5222 has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5223 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5224 matches the class X, as a and b have the same type. 5225 5226Note that when multiple matches are involved via forEach* matchers, 5227equalsBoundNodes acts as a filter. 5228For example: 5229compoundStmt( 5230 forEachDescendant(varDecl().bind("d")), 5231 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5232will trigger a match for each combination of variable declaration 5233and reference to that variable declaration within a compound statement. 5234</pre></td></tr> 5235 5236 5237<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> 5238<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 5239 5240Type has pointer identity in the AST. 5241</pre></td></tr> 5242 5243 5244<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> 5245<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 5246 5247Given 5248 int i; 5249 float f; 5250realFloatingPointType() 5251 matches "float f" but not "int i" 5252</pre></td></tr> 5253 5254 5255<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> 5256<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 5257 5258Given 5259 struct S { void func(); }; 5260functionDecl(returns(voidType())) 5261 matches "void func();" 5262</pre></td></tr> 5263 5264 5265<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> 5266<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 5267 5268Given 5269 int x; 5270 int s = sizeof(x) + alignof(x) 5271unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 5272 matches sizeof(x) 5273 5274If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter 5275should be passed as a quoted string. e.g., ofKind("UETT_SizeOf"). 5276</pre></td></tr> 5277 5278 5279<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> 5280<tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the 5281specified names. 5282 5283 hasAnyOperatorName("+", "-") 5284 Is equivalent to 5285 anyOf(hasOperatorName("+"), hasOperatorName("-")) 5286</pre></td></tr> 5287 5288 5289<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> 5290<tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or 5291unary). 5292 5293Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 5294 !(a || b) 5295</pre></td></tr> 5296 5297 5298<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> 5299<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed 5300to '.'. 5301 5302Member calls on the implicit this pointer match as called with '->'. 5303 5304Given 5305 class Y { 5306 void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 5307 template <class T> void f() { this->f<T>(); f<T>(); } 5308 int a; 5309 static int b; 5310 }; 5311 template <class T> 5312 class Z { 5313 void x() { this->m; } 5314 }; 5315memberExpr(isArrow()) 5316 matches this->x, x, y.x, a, this->b 5317cxxDependentScopeMemberExpr(isArrow()) 5318 matches this->m 5319unresolvedMemberExpr(isArrow()) 5320 matches this->f<T>, f<T> 5321</pre></td></tr> 5322 5323 5324<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> 5325<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 5326 5327Example matches x, but not y, z, or a. 5328(matcher = varDecl(hasAutomaticStorageDuration()) 5329void f() { 5330 int x; 5331 static int y; 5332 thread_local int z; 5333} 5334int a; 5335</pre></td></tr> 5336 5337 5338<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> 5339<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 5340 5341Example matches y and z (matcher = varDecl(hasGlobalStorage()) 5342void f() { 5343 int x; 5344 static int y; 5345} 5346int z; 5347</pre></td></tr> 5348 5349 5350<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> 5351<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 5352non-static local variable. 5353 5354Example matches x (matcher = varDecl(hasLocalStorage()) 5355void f() { 5356 int x; 5357 static int y; 5358} 5359int z; 5360</pre></td></tr> 5361 5362 5363<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> 5364<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 5365It includes the variable declared at namespace scope and those declared 5366with "static" and "extern" storage class specifiers. 5367 5368void f() { 5369 int x; 5370 static int y; 5371 thread_local int z; 5372} 5373int a; 5374static int b; 5375extern int c; 5376varDecl(hasStaticStorageDuration()) 5377 matches the function declaration y, a, b and c. 5378</pre></td></tr> 5379 5380 5381<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> 5382<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 5383 5384Example matches z, but not x, z, or a. 5385(matcher = varDecl(hasThreadStorageDuration()) 5386void f() { 5387 int x; 5388 static int y; 5389 thread_local int z; 5390} 5391int a; 5392</pre></td></tr> 5393 5394 5395<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> 5396<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations, 5397 and if constexpr. 5398 5399Given: 5400 constexpr int foo = 42; 5401 constexpr int bar(); 5402 void baz() { if constexpr(1 > 0) {} } 5403varDecl(isConstexpr()) 5404 matches the declaration of foo. 5405functionDecl(isConstexpr()) 5406 matches the declaration of bar. 5407ifStmt(isConstexpr()) 5408 matches the if statement in baz. 5409</pre></td></tr> 5410 5411 5412<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> 5413<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 5414 5415Example matches A, va, fa 5416 class A {}; 5417 class B; // Doesn't match, as it has no body. 5418 int va; 5419 extern int vb; // Doesn't match, as it doesn't define the variable. 5420 void fa() {} 5421 void fb(); // Doesn't match, as it has no body. 5422 @interface X 5423 - (void)ma; // Doesn't match, interface is declaration. 5424 @end 5425 @implementation X 5426 - (void)ma {} 5427 @end 5428 5429Usable 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>>, 5430 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5431</pre></td></tr> 5432 5433 5434<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> 5435<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 5436a C++ catch block, or an Objective-C statement. 5437 5438Example matches x (matcher = varDecl(isExceptionVariable()) 5439void f(int y) { 5440 try { 5441 } catch (int x) { 5442 } 5443} 5444</pre></td></tr> 5445 5446 5447<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> 5448<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 5449static member variable template instantiations. 5450 5451Given 5452 template<typename T> void A(T t) { } 5453 template<> void A(int N) { } 5454functionDecl(isExplicitTemplateSpecialization()) 5455 matches the specialization A<int>(). 5456 5457Usable 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>> 5458</pre></td></tr> 5459 5460 5461<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> 5462<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 5463 5464Given: 5465 extern "C" void f() {} 5466 extern "C" { void g() {} } 5467 void h() {} 5468 extern "C" int x = 1; 5469 extern "C" int y = 2; 5470 int z = 3; 5471functionDecl(isExternC()) 5472 matches the declaration of f and g, but not the declaration of h. 5473varDecl(isExternC()) 5474 matches the declaration of x and y, but not the declaration of z. 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('isStaticLocal0')"><a name="isStaticLocal0Anchor">isStaticLocal</a></td><td></td></tr> 5479<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope. 5480 5481Example matches y (matcher = varDecl(isStaticLocal())) 5482void f() { 5483 int x; 5484 static int y; 5485} 5486static int z; 5487</pre></td></tr> 5488 5489 5490<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> 5491<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage 5492class specifier ("static" keyword) written in the source. 5493 5494Given: 5495 static void f() {} 5496 static int i = 0; 5497 extern int j; 5498 int k; 5499functionDecl(isStaticStorageClass()) 5500 matches the function declaration f. 5501varDecl(isStaticStorageClass()) 5502 matches the variable declaration i. 5503</pre></td></tr> 5504 5505 5506<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation1')"><a name="isTemplateInstantiation1Anchor">isTemplateInstantiation</a></td><td></td></tr> 5507<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 5508member variable template instantiations. 5509 5510Given 5511 template <typename T> class X {}; class A {}; X<A> x; 5512or 5513 template <typename T> class X {}; class A {}; template class X<A>; 5514or 5515 template <typename T> class X {}; class A {}; extern template class X<A>; 5516cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5517 matches the template instantiation of X<A>. 5518 5519But given 5520 template <typename T> class X {}; class A {}; 5521 template <> class X<A> {}; X<A> x; 5522cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5523 does not match, as X<A> is an explicit template specialization. 5524 5525Usable 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>> 5526</pre></td></tr> 5527 5528<!--END_NARROWING_MATCHERS --> 5529</table> 5530 5531<!-- ======================================================================= --> 5532<h2 id="traversal-matchers">AST Traversal Matchers</h2> 5533<!-- ======================================================================= --> 5534 5535<p>Traversal matchers specify the relationship to other nodes that are 5536reachable from the current node.</p> 5537 5538<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 5539forEachDescendant) which work on all nodes and allow users to write more generic 5540match expressions.</p> 5541 5542<table> 5543<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 5544<!-- START_TRAVERSAL_MATCHERS --> 5545 5546<tr><td>Matcher<*></td><td class="name" onclick="toggle('binaryOperation0')"><a name="binaryOperation0Anchor">binaryOperation</a></td><td>Matcher<*>...Matcher<*></td></tr> 5547<tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators. 5548 5549The code 5550 var1 != var2; 5551might be represented in the clang AST as a binaryOperator, a 5552cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on 5553 5554* whether the types of var1 and var2 are fundamental (binaryOperator) or at 5555 least one is a class type (cxxOperatorCallExpr) 5556* whether the code appears in a template declaration, if at least one of the 5557 vars is a dependent-type (binaryOperator) 5558* whether the code relies on a rewritten binary operator, such as a 5559spaceship operator or an inverted equality operator 5560(cxxRewrittenBinaryOperator) 5561 5562This matcher elides details in places where the matchers for the nodes are 5563compatible. 5564 5565Given 5566 binaryOperation( 5567 hasOperatorName("!="), 5568 hasLHS(expr().bind("lhs")), 5569 hasRHS(expr().bind("rhs")) 5570 ) 5571matches each use of "!=" in: 5572 struct S{ 5573 bool operator!=(const S&) const; 5574 }; 5575 5576 void foo() 5577 { 5578 1 != 2; 5579 S() != S(); 5580 } 5581 5582 template<typename T> 5583 void templ() 5584 { 5585 1 != 2; 5586 T() != S(); 5587 } 5588 struct HasOpEq 5589 { 5590 bool operator==(const HasOpEq &) const; 5591 }; 5592 5593 void inverse() 5594 { 5595 HasOpEq s1; 5596 HasOpEq s2; 5597 if (s1 != s2) 5598 return; 5599 } 5600 5601 struct HasSpaceship 5602 { 5603 bool operator<=>(const HasOpEq &) const; 5604 }; 5605 5606 void use_spaceship() 5607 { 5608 HasSpaceship s1; 5609 HasSpaceship s2; 5610 if (s1 != s2) 5611 return; 5612 } 5613</pre></td></tr> 5614 5615 5616<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 5617<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 5618 5619Unlike anyOf, eachOf will generate a match result for each 5620matching submatcher. 5621 5622For example, in: 5623 class A { int a; int b; }; 5624The matcher: 5625 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 5626 has(fieldDecl(hasName("b")).bind("v")))) 5627will generate two results binding "v", the first of which binds 5628the field declaration of a, the second the field declaration of 5629b. 5630 5631Usable as: Any Matcher 5632</pre></td></tr> 5633 5634 5635<tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr> 5636<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 5637 5638Generates results for each match. 5639 5640For example, in: 5641 class A { class B {}; class C {}; }; 5642The matcher: 5643 cxxRecordDecl(hasName("::A"), 5644 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 5645will generate results for A, B and C. 5646 5647Usable as: Any Matcher 5648</pre></td></tr> 5649 5650 5651<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 5652<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5653provided matcher. 5654 5655Example matches X, A, A::X, B, B::C, B::C::X 5656 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 5657 class X {}; 5658 class A { class X {}; }; // Matches A, because A::X is a class of name 5659 // X inside A. 5660 class B { class C { class X {}; }; }; 5661 5662DescendantT must be an AST base type. 5663 5664As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 5665each result that matches instead of only on the first one. 5666 5667Note: Recursively combined ForEachDescendant can cause many matches: 5668 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 5669 forEachDescendant(cxxRecordDecl()) 5670 ))) 5671will match 10 times (plus injected class name matches) on: 5672 class A { class B { class C { class D { class E {}; }; }; }; }; 5673 5674Usable as: Any Matcher 5675</pre></td></tr> 5676 5677 5678<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 5679<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 5680provided matcher. 5681 5682Example matches X, Y, Y::X, Z::Y, Z::Y::X 5683 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 5684 class X {}; 5685 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X 5686 // inside Y. 5687 class Z { class Y { class X {}; }; }; // Does not match Z. 5688 5689ChildT must be an AST base type. 5690 5691As opposed to 'has', 'forEach' will cause a match for each result that 5692matches instead of only on the first one. 5693 5694Usable as: Any Matcher 5695</pre></td></tr> 5696 5697 5698<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 5699<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 5700matcher. 5701 5702Given 5703void f() { if (true) { int x = 42; } } 5704void g() { for (;;) { int x = 43; } } 5705expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 5706 5707Usable as: Any Matcher 5708</pre></td></tr> 5709 5710 5711<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 5712<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5713provided matcher. 5714 5715Example matches X, Y, Z 5716 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 5717 class X {}; // Matches X, because X::X is a class of name X inside X. 5718 class Y { class X {}; }; 5719 class Z { class Y { class X {}; }; }; 5720 5721DescendantT must be an AST base type. 5722 5723Usable as: Any Matcher 5724</pre></td></tr> 5725 5726 5727<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 5728<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 5729provided matcher. 5730 5731Example matches X, Y 5732 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 5733 class X {}; // Matches X, because X::X is a class of name X inside X. 5734 class Y { class X {}; }; 5735 class Z { class Y { class X {}; }; }; // Does not match Z. 5736 5737ChildT must be an AST base type. 5738 5739Usable as: Any Matcher 5740Note that has is direct matcher, so it also matches things like implicit 5741casts and paren casts. If you are matching with expr then you should 5742probably consider using ignoringParenImpCasts like: 5743has(ignoringParenImpCasts(expr())). 5744</pre></td></tr> 5745 5746 5747<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 5748<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 5749matcher. 5750 5751Given 5752void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 5753compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 5754 5755Usable as: Any Matcher 5756</pre></td></tr> 5757 5758 5759<tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr> 5760<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher. 5761 5762However, optionally will retain any bindings generated by the submatcher. 5763Useful when additional information which may or may not present about a main 5764matching node is desired. 5765 5766For example, in: 5767 class Foo { 5768 int bar; 5769 } 5770The matcher: 5771 cxxRecordDecl( 5772 optionally(has( 5773 fieldDecl(hasName("bar")).bind("var") 5774 ))).bind("record") 5775will produce a result binding for both "record" and "var". 5776The matcher will produce a "record" binding for even if there is no data 5777member named "bar" in that class. 5778 5779Usable as: Any Matcher 5780</pre></td></tr> 5781 5782 5783<tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr> 5784<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind. 5785 5786Given 5787 void foo() 5788 { 5789 int i = 3.0; 5790 } 5791The matcher 5792 traverse(TK_IgnoreUnlessSpelledInSource, 5793 varDecl(hasInitializer(floatLiteral().bind("init"))) 5794 ) 5795matches the variable declaration with "init" bound to the "3.0". 5796</pre></td></tr> 5797 5798 5799<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> 5800<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 5801switch statement or conditional operator. 5802 5803Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5804 if (true) {} 5805</pre></td></tr> 5806 5807 5808<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> 5809<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 5810(binary or ternary). 5811 5812Example matches b 5813 condition ? a : b 5814 condition ?: b 5815</pre></td></tr> 5816 5817 5818<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> 5819<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 5820 5821Example 1 (conditional ternary operator): matches a 5822 condition ? a : b 5823 5824Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 5825 condition ?: b 5826</pre></td></tr> 5827 5828 5829<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> 5830<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 5831matches the given matcher. 5832 5833The associated declaration is: 5834- for type nodes, the declaration of the underlying type 5835- for CallExpr, the declaration of the callee 5836- for MemberExpr, the declaration of the referenced member 5837- for CXXConstructExpr, the declaration of the constructor 5838- for CXXNewExpr, the declaration of the operator new 5839- for ObjCIvarExpr, the declaration of the ivar 5840 5841For type nodes, hasDeclaration will generally match the declaration of the 5842sugared type. Given 5843 class X {}; 5844 typedef X Y; 5845 Y y; 5846in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5847typedefDecl. A common use case is to match the underlying, desugared type. 5848This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5849 varDecl(hasType(hasUnqualifiedDesugaredType( 5850 recordType(hasDeclaration(decl()))))) 5851In this matcher, the decl will match the CXXRecordDecl of class X. 5852 5853Usable 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>>, 5854 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>>, 5855 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>>, 5856 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>>, 5857 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>>, 5858 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>>, 5859 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5860</pre></td></tr> 5861 5862 5863<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> 5864<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 5865 5866Given 5867 int i[5]; 5868 void f() { i[1] = 42; } 5869arraySubscriptExpression(hasBase(implicitCastExpr( 5870 hasSourceExpression(declRefExpr())))) 5871 matches i[1] with the declRefExpr() matching i 5872</pre></td></tr> 5873 5874 5875<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> 5876<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 5877 5878Given 5879 int i[5]; 5880 void f() { i[1] = 42; } 5881arraySubscriptExpression(hasIndex(integerLiteral())) 5882 matches i[1] with the integerLiteral() matching 1 5883</pre></td></tr> 5884 5885 5886<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> 5887<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions. 5888 5889Example matches a (matcher = binaryOperator(hasLHS())) 5890 a || b 5891</pre></td></tr> 5892 5893 5894<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> 5895<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions. 5896 5897Example matches b (matcher = binaryOperator(hasRHS())) 5898 a || b 5899</pre></td></tr> 5900 5901 5902<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> 5903<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 5904type. 5905 5906Given 5907 struct A {}; 5908 A a[7]; 5909 int b[7]; 5910arrayType(hasElementType(builtinType())) 5911 matches "int b[7]" 5912 5913Usable 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>> 5914</pre></td></tr> 5915 5916 5917<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> 5918<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 5919 5920Given 5921 _Atomic(int) i; 5922 _Atomic(float) f; 5923atomicType(hasValueType(isInteger())) 5924 matches "_Atomic(int) i" 5925 5926Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 5927</pre></td></tr> 5928 5929 5930<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> 5931<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 5932 5933Note: There is no TypeLoc for the deduced type and thus no 5934getDeducedLoc() matcher. 5935 5936Given 5937 auto a = 1; 5938 auto b = 2.0; 5939autoType(hasDeducedType(isInteger())) 5940 matches "auto a" 5941 5942Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 5943</pre></td></tr> 5944 5945 5946<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> 5947<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 5948binary operator matches. 5949</pre></td></tr> 5950 5951 5952<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> 5953<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 5954 5955Example matches a (matcher = binaryOperator(hasLHS())) 5956 a || b 5957</pre></td></tr> 5958 5959 5960<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> 5961<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator. 5962 5963Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 5964 integerLiteral(equals(2))) 5965 1 + 2 // Match 5966 2 + 1 // Match 5967 1 + 1 // No match 5968 2 + 2 // No match 5969</pre></td></tr> 5970 5971 5972<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> 5973<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 5974 5975Example matches b (matcher = binaryOperator(hasRHS())) 5976 a || b 5977</pre></td></tr> 5978 5979 5980<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> 5981<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 5982block. 5983 5984Does not match the 'this' parameter of a method. 5985 5986Given 5987 class X { void f(int x, int y, int z) {} }; 5988cxxMethodDecl(hasAnyParameter(hasName("y"))) 5989 matches f(int x, int y, int z) {} 5990with hasAnyParameter(...) 5991 matching int y 5992 5993For ObjectiveC, given 5994 @interface I - (void) f:(int) y; @end 5995 5996the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 5997matches the declaration of method f with hasParameter 5998matching y. 5999 6000For blocks, given 6001 b = ^(int y) { printf("%d", y) }; 6002 6003the matcher blockDecl(hasAnyParameter(hasName("y"))) 6004matches the declaration of the block b with hasParameter 6005matching y. 6006</pre></td></tr> 6007 6008 6009<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> 6010<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 6011declaration or a block. 6012 6013Given 6014 class X { void f(int x) {} }; 6015cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6016 matches f(int x) {} 6017with hasParameter(...) 6018 matching int x 6019 6020For ObjectiveC, given 6021 @interface I - (void) f:(int) y; @end 6022 6023the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6024matches the declaration of method f with hasParameter 6025matching y. 6026</pre></td></tr> 6027 6028 6029<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> 6030<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 6031pointee matches a given matcher. 6032 6033Given 6034 int *a; 6035 int const *b; 6036 float const *f; 6037pointerType(pointee(isConstQualified(), isInteger())) 6038 matches "int const *b" 6039 6040Usable 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>>, 6041 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>> 6042</pre></td></tr> 6043 6044 6045<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasType7')"><a name="hasType7Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6046<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value 6047declaration's type. 6048 6049In case of a value declaration (for example a variable declaration), 6050this resolves one layer of indirection. For example, in the value 6051declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6052X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6053declaration of x. 6054 6055Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6056 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6057 and friend class X (matcher = friendDecl(hasType("X")) 6058 class X {}; 6059 void y(X &x) { x; X z; } 6060 class Y { friend class X; }; 6061 6062Example matches class Derived 6063(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6064class Base {}; 6065class Derived : Base {}; 6066 6067Usable 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>>, 6068Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6069</pre></td></tr> 6070 6071 6072<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> 6073<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 6074 6075Given 6076 void f(int i); 6077 int y; 6078 f(y); 6079callExpr( 6080 forEachArgumentWithParam( 6081 declRefExpr(to(varDecl(hasName("y")))), 6082 parmVarDecl(hasType(isInteger())) 6083)) 6084 matches f(y); 6085with declRefExpr(...) 6086 matching int y 6087and parmVarDecl(...) 6088 matching int i 6089</pre></td></tr> 6090 6091 6092<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> 6093<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or 6094CXXConstructExpr. It is very similar to forEachArgumentWithParam but 6095it works on calls through function pointers as well. 6096 6097The difference is, that function pointers do not provide access to a 6098ParmVarDecl, but only the QualType for each argument. 6099 6100Given 6101 void f(int i); 6102 int y; 6103 f(y); 6104 void (*f_ptr)(int) = f; 6105 f_ptr(y); 6106callExpr( 6107 forEachArgumentWithParamType( 6108 declRefExpr(to(varDecl(hasName("y")))), 6109 qualType(isInteger()).bind("type) 6110)) 6111 matches f(y) and f_ptr(y) 6112with declRefExpr(...) 6113 matching int y 6114and qualType(...) 6115 matching int 6116</pre></td></tr> 6117 6118 6119<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> 6120<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 6121expression, or an ObjC-message-send expression. 6122 6123Given 6124 void x(int, int, int) { int y; x(1, y, 42); } 6125callExpr(hasAnyArgument(declRefExpr())) 6126 matches x(1, y, 42) 6127with hasAnyArgument(...) 6128 matching y 6129 6130For ObjectiveC, given 6131 @interface I - (void) f:(int) y; @end 6132 void foo(I *i) { [i f:12]; } 6133objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6134 matches [i f:12] 6135</pre></td></tr> 6136 6137 6138<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> 6139<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 6140call expression. 6141 6142Example matches y in x(y) 6143 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6144 void x(int) { int y; x(y); } 6145</pre></td></tr> 6146 6147 6148<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> 6149<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 6150matches the given matcher. 6151 6152The associated declaration is: 6153- for type nodes, the declaration of the underlying type 6154- for CallExpr, the declaration of the callee 6155- for MemberExpr, the declaration of the referenced member 6156- for CXXConstructExpr, the declaration of the constructor 6157- for CXXNewExpr, the declaration of the operator new 6158- for ObjCIvarExpr, the declaration of the ivar 6159 6160For type nodes, hasDeclaration will generally match the declaration of the 6161sugared type. Given 6162 class X {}; 6163 typedef X Y; 6164 Y y; 6165in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6166typedefDecl. A common use case is to match the underlying, desugared type. 6167This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6168 varDecl(hasType(hasUnqualifiedDesugaredType( 6169 recordType(hasDeclaration(decl()))))) 6170In this matcher, the decl will match the CXXRecordDecl of class X. 6171 6172Usable 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>>, 6173 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>>, 6174 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>>, 6175 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>>, 6176 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>>, 6177 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>>, 6178 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6179</pre></td></tr> 6180 6181 6182<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> 6183<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 6184 6185Given 6186 class A { A() : i(42), j(42) {} int i; int j; }; 6187cxxConstructorDecl(forEachConstructorInitializer( 6188 forField(decl().bind("x")) 6189)) 6190 will trigger two matches, binding for 'i' and 'j' respectively. 6191</pre></td></tr> 6192 6193 6194<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> 6195<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 6196 6197Given 6198 struct Foo { 6199 Foo() : foo_(1) { } 6200 int foo_; 6201 }; 6202cxxRecordDecl(has(cxxConstructorDecl( 6203 hasAnyConstructorInitializer(anything()) 6204))) 6205 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 6206</pre></td></tr> 6207 6208 6209<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> 6210<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 6211 6212Given 6213 struct Foo { 6214 Foo() : foo_(1) { } 6215 int foo_; 6216 }; 6217cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6218 forField(hasName("foo_")))))) 6219 matches Foo 6220with forField matching foo_ 6221</pre></td></tr> 6222 6223 6224<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> 6225<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 6226 6227Given 6228 struct Foo { 6229 Foo() : foo_(1) { } 6230 int foo_; 6231 }; 6232cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6233 withInitializer(integerLiteral(equals(1))))))) 6234 matches Foo 6235with withInitializer matching (1) 6236</pre></td></tr> 6237 6238 6239<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> 6240<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 6241given matcher. Implicit object expressions are included; that is, it matches 6242use of implicit `this`. 6243 6244Given 6245 struct X { 6246 int m; 6247 int f(X x) { x.m; return m; } 6248 }; 6249memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6250 matches `x.m`, but not `m`; however, 6251memberExpr(hasObjectExpression(hasType(pointsTo( 6252 cxxRecordDecl(hasName("X")))))) 6253 matches `m` (aka. `this->m`), but not `x.m`. 6254</pre></td></tr> 6255 6256 6257<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> 6258<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr> 6259 6260 6261<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> 6262<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer. 6263 6264Given: 6265 void foo() { 6266 if (int i = foobar(); i > 0) {} 6267 switch (int i = foobar(); i) {} 6268 for (auto& a = get_range(); auto& x : a) {} 6269 } 6270 void bar() { 6271 if (foobar() > 0) {} 6272 switch (foobar()) {} 6273 for (auto& x : get_range()) {} 6274 } 6275ifStmt(hasInitStatement(anything())) 6276 matches the if statement in foo but not in bar. 6277switchStmt(hasInitStatement(anything())) 6278 matches the switch statement in foo but not in bar. 6279cxxForRangeStmt(hasInitStatement(anything())) 6280 matches the range for statement in foo but not in bar. 6281</pre></td></tr> 6282 6283 6284<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> 6285<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 6286 6287Example: 6288 forStmt(hasLoopVariable(anything())) 6289matches 'int x' in 6290 for (int x : a) { } 6291</pre></td></tr> 6292 6293 6294<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> 6295<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 6296 6297Example: 6298 forStmt(hasRangeInit(anything())) 6299matches 'a' in 6300 for (int x : a) { } 6301</pre></td></tr> 6302 6303 6304<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> 6305<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 6306`on`, matches the argument directly without stripping away anything. 6307 6308Given 6309 class Y { public: void m(); }; 6310 Y g(); 6311 class X : public Y { void g(); }; 6312 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 6313cxxMemberCallExpr(onImplicitObjectArgument(hasType( 6314 cxxRecordDecl(hasName("Y"))))) 6315 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 6316cxxMemberCallExpr(on(callExpr())) 6317 does not match `(g()).m()`, because the parens are not ignored. 6318 6319FIXME: Overload to allow directly matching types? 6320</pre></td></tr> 6321 6322 6323<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> 6324<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 6325stripping off any parentheses or implicit casts. 6326 6327Given 6328 class Y { public: void m(); }; 6329 Y g(); 6330 class X : public Y {}; 6331 void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 6332cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 6333 matches `y.m()` and `(g()).m()`. 6334cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 6335 matches `x.m()`. 6336cxxMemberCallExpr(on(callExpr())) 6337 matches `(g()).m()`. 6338 6339FIXME: Overload to allow directly matching types? 6340</pre></td></tr> 6341 6342 6343<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> 6344<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 6345</pre></td></tr> 6346 6347 6348<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> 6349<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 6350matches the InnerMatcher, or is a pointer to a type that matches the 6351InnerMatcher. 6352 6353Given 6354 class Y { public: void m(); }; 6355 class X : public Y { void g(); }; 6356 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 6357cxxMemberCallExpr(thisPointerType(hasDeclaration( 6358 cxxRecordDecl(hasName("Y"))))) 6359 matches `y.m()`, `p->m()` and `x.m()`. 6360cxxMemberCallExpr(thisPointerType(hasDeclaration( 6361 cxxRecordDecl(hasName("X"))))) 6362 matches `x.g()`. 6363</pre></td></tr> 6364 6365 6366<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> 6367<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 6368produce multiple matches. 6369 6370Given 6371 class A { virtual void f(); }; 6372 class B : public A { void f(); }; 6373 class C : public B { void f(); }; 6374cxxMethodDecl(ofClass(hasName("C")), 6375 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6376 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 6377 that B::f is not overridden by C::f). 6378 6379The check can produce multiple matches in case of multiple inheritance, e.g. 6380 class A1 { virtual void f(); }; 6381 class A2 { virtual void f(); }; 6382 class C : public A1, public A2 { void f(); }; 6383cxxMethodDecl(ofClass(hasName("C")), 6384 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6385 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 6386 once with "b" binding "A2::f" and "d" binding "C::f". 6387</pre></td></tr> 6388 6389 6390<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> 6391<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 6392belongs to. 6393 6394FIXME: Generalize this for other kinds of declarations. 6395FIXME: What other kind of declarations would we need to generalize 6396this to? 6397 6398Example matches A() in the last line 6399 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 6400 ofClass(hasName("A")))))) 6401 class A { 6402 public: 6403 A(); 6404 }; 6405 A a = A(); 6406</pre></td></tr> 6407 6408 6409<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> 6410<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments. 6411 6412Given: 6413 MyClass *p1 = new (Storage) MyClass(); 6414cxxNewExpr(hasAnyPlacementArg(anything())) 6415 matches the expression 'new (Storage, 16) MyClass()'. 6416</pre></td></tr> 6417 6418 6419<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> 6420<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 6421 6422Given: 6423 MyClass *p1 = new MyClass[10]; 6424cxxNewExpr(hasArraySize(integerLiteral(equals(10)))) 6425 matches the expression 'new MyClass[10]'. 6426</pre></td></tr> 6427 6428 6429<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> 6430<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 6431matches the given matcher. 6432 6433The associated declaration is: 6434- for type nodes, the declaration of the underlying type 6435- for CallExpr, the declaration of the callee 6436- for MemberExpr, the declaration of the referenced member 6437- for CXXConstructExpr, the declaration of the constructor 6438- for CXXNewExpr, the declaration of the operator new 6439- for ObjCIvarExpr, the declaration of the ivar 6440 6441For type nodes, hasDeclaration will generally match the declaration of the 6442sugared type. Given 6443 class X {}; 6444 typedef X Y; 6445 Y y; 6446in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6447typedefDecl. A common use case is to match the underlying, desugared type. 6448This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6449 varDecl(hasType(hasUnqualifiedDesugaredType( 6450 recordType(hasDeclaration(decl()))))) 6451In this matcher, the decl will match the CXXRecordDecl of class X. 6452 6453Usable 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>>, 6454 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>>, 6455 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>>, 6456 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>>, 6457 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>>, 6458 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>>, 6459 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6460</pre></td></tr> 6461 6462 6463<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> 6464<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments. 6465 6466Given: 6467 MyClass *p1 = new (Storage, 16) MyClass(); 6468cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16)))) 6469 matches the expression 'new (Storage, 16) MyClass()'. 6470</pre></td></tr> 6471 6472 6473<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> 6474<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a 6475binary operator matches. 6476</pre></td></tr> 6477 6478 6479<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> 6480<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 6481 6482Example matches a (matcher = binaryOperator(hasLHS())) 6483 a || b 6484</pre></td></tr> 6485 6486 6487<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> 6488<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator. 6489 6490Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6491 integerLiteral(equals(2))) 6492 1 + 2 // Match 6493 2 + 1 // Match 6494 1 + 1 // No match 6495 2 + 2 // No match 6496</pre></td></tr> 6497 6498 6499<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> 6500<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 6501 6502Example matches b (matcher = binaryOperator(hasRHS())) 6503 a || b 6504</pre></td></tr> 6505 6506 6507<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> 6508<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches. 6509 6510Example matches true (matcher = hasUnaryOperand( 6511 cxxBoolLiteral(equals(true)))) 6512 !true 6513</pre></td></tr> 6514 6515 6516<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> 6517<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher. 6518 6519Example: 6520matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6521 class Foo; 6522 class Bar : Foo {}; 6523 class Baz : Bar {}; 6524 class SpecialBase; 6525 class Proxy : SpecialBase {}; // matches Proxy 6526 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived 6527 6528FIXME: Refactor this and isDerivedFrom to reuse implementation. 6529</pre></td></tr> 6530 6531 6532<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> 6533<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher. 6534 6535Example: 6536matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6537 class Foo; 6538 class Bar : Foo {}; 6539 class Baz : Bar {}; 6540 class SpecialBase; 6541 class Proxy : SpecialBase {}; // matches Proxy 6542 class IndirectlyDerived : Proxy {}; // doesn't match 6543</pre></td></tr> 6544 6545 6546<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> 6547<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 6548 6549Given: 6550 class A { void func(); }; 6551 class B { void member(); }; 6552 6553cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 6554A but not B. 6555</pre></td></tr> 6556 6557 6558<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> 6559<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class 6560matching Base, or Objective-C classes that directly or indirectly 6561subclass a class matching Base. 6562 6563Note that a class is not considered to be derived from itself. 6564 6565Example matches Y, Z, C (Base == hasName("X")) 6566 class X; 6567 class Y : public X {}; // directly derived 6568 class Z : public Y {}; // indirectly derived 6569 typedef X A; 6570 typedef A B; 6571 class C : public B {}; // derived from a typedef of X 6572 6573In the following example, Bar matches isDerivedFrom(hasName("X")): 6574 class Foo; 6575 typedef Foo X; 6576 class Bar : public Foo {}; // derived from a type that X is a typedef of 6577 6578In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 6579 @interface NSObject @end 6580 @interface Bar : NSObject @end 6581 6582Usable 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>> 6583</pre></td></tr> 6584 6585 6586<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> 6587<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class 6588matching Base. 6589 6590Note that a class is not considered to be derived from itself. 6591 6592Example matches Y, C (Base == hasName("X")) 6593 class X; 6594 class Y : public X {}; // directly derived 6595 class Z : public Y {}; // indirectly derived 6596 typedef X A; 6597 typedef A B; 6598 class C : public B {}; // derived from a typedef of X 6599 6600In the following example, Bar matches isDerivedFrom(hasName("X")): 6601 class Foo; 6602 typedef Foo X; 6603 class Bar : public Foo {}; // derived from a type that X is a typedef of 6604</pre></td></tr> 6605 6606 6607<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> 6608<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 6609match Base. 6610</pre></td></tr> 6611 6612 6613<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> 6614<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a 6615binary operator matches. 6616</pre></td></tr> 6617 6618 6619<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> 6620<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions. 6621 6622Example matches a (matcher = binaryOperator(hasLHS())) 6623 a || b 6624</pre></td></tr> 6625 6626 6627<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> 6628<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator. 6629 6630Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6631 integerLiteral(equals(2))) 6632 1 + 2 // Match 6633 2 + 1 // Match 6634 1 + 1 // No match 6635 2 + 2 // No match 6636</pre></td></tr> 6637 6638 6639<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> 6640<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions. 6641 6642Example matches b (matcher = binaryOperator(hasRHS())) 6643 a || b 6644</pre></td></tr> 6645 6646 6647<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> 6648<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 6649expression, or an ObjC-message-send expression. 6650 6651Given 6652 void x(int, int, int) { int y; x(1, y, 42); } 6653callExpr(hasAnyArgument(declRefExpr())) 6654 matches x(1, y, 42) 6655with hasAnyArgument(...) 6656 matching y 6657 6658For ObjectiveC, given 6659 @interface I - (void) f:(int) y; @end 6660 void foo(I *i) { [i f:12]; } 6661objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6662 matches [i f:12] 6663</pre></td></tr> 6664 6665 6666<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> 6667<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 6668call expression. 6669 6670Example matches y in x(y) 6671 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6672 void x(int) { int y; x(y); } 6673</pre></td></tr> 6674 6675 6676<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> 6677<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 6678given matcher. 6679 6680Example matches y.x() (matcher = callExpr(callee( 6681 cxxMethodDecl(hasName("x"))))) 6682 class Y { public: void x(); }; 6683 void z() { Y y; y.x(); } 6684</pre></td></tr> 6685 6686 6687<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> 6688<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 6689 6690Given 6691 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 6692 void f() { f(); } 6693callExpr(callee(expr())) 6694 matches this->x(), x(), y.x(), f() 6695with callee(...) 6696 matching this->x, x, y.x, f respectively 6697 6698Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 6699because this introduces ambiguous overloads with calls to Callee taking a 6700internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 6701implemented in terms of implicit casts. 6702</pre></td></tr> 6703 6704 6705<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> 6706<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 6707 6708Given 6709 void f(int i); 6710 int y; 6711 f(y); 6712callExpr( 6713 forEachArgumentWithParam( 6714 declRefExpr(to(varDecl(hasName("y")))), 6715 parmVarDecl(hasType(isInteger())) 6716)) 6717 matches f(y); 6718with declRefExpr(...) 6719 matching int y 6720and parmVarDecl(...) 6721 matching int i 6722</pre></td></tr> 6723 6724 6725<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> 6726<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or 6727CXXConstructExpr. It is very similar to forEachArgumentWithParam but 6728it works on calls through function pointers as well. 6729 6730The difference is, that function pointers do not provide access to a 6731ParmVarDecl, but only the QualType for each argument. 6732 6733Given 6734 void f(int i); 6735 int y; 6736 f(y); 6737 void (*f_ptr)(int) = f; 6738 f_ptr(y); 6739callExpr( 6740 forEachArgumentWithParamType( 6741 declRefExpr(to(varDecl(hasName("y")))), 6742 qualType(isInteger()).bind("type) 6743)) 6744 matches f(y) and f_ptr(y) 6745with declRefExpr(...) 6746 matching int y 6747and qualType(...) 6748 matching int 6749</pre></td></tr> 6750 6751 6752<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> 6753<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 6754expression, or an ObjC-message-send expression. 6755 6756Given 6757 void x(int, int, int) { int y; x(1, y, 42); } 6758callExpr(hasAnyArgument(declRefExpr())) 6759 matches x(1, y, 42) 6760with hasAnyArgument(...) 6761 matching y 6762 6763For ObjectiveC, given 6764 @interface I - (void) f:(int) y; @end 6765 void foo(I *i) { [i f:12]; } 6766objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6767 matches [i f:12] 6768</pre></td></tr> 6769 6770 6771<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> 6772<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 6773call expression. 6774 6775Example matches y in x(y) 6776 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6777 void x(int) { int y; x(y); } 6778</pre></td></tr> 6779 6780 6781<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> 6782<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 6783matches the given matcher. 6784 6785The associated declaration is: 6786- for type nodes, the declaration of the underlying type 6787- for CallExpr, the declaration of the callee 6788- for MemberExpr, the declaration of the referenced member 6789- for CXXConstructExpr, the declaration of the constructor 6790- for CXXNewExpr, the declaration of the operator new 6791- for ObjCIvarExpr, the declaration of the ivar 6792 6793For type nodes, hasDeclaration will generally match the declaration of the 6794sugared type. Given 6795 class X {}; 6796 typedef X Y; 6797 Y y; 6798in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6799typedefDecl. A common use case is to match the underlying, desugared type. 6800This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6801 varDecl(hasType(hasUnqualifiedDesugaredType( 6802 recordType(hasDeclaration(decl()))))) 6803In this matcher, the decl will match the CXXRecordDecl of class X. 6804 6805Usable 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>>, 6806 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>>, 6807 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>>, 6808 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>>, 6809 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>>, 6810 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>>, 6811 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6812</pre></td></tr> 6813 6814 6815<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> 6816<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 6817extension, matches the constant given in the statement. 6818 6819Given 6820 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 6821caseStmt(hasCaseConstant(integerLiteral())) 6822 matches "case 1:" 6823</pre></td></tr> 6824 6825 6826<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> 6827<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 6828or opaque value's source expression matches the given matcher. 6829 6830Example 1: matches "a string" 6831(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 6832class URL { URL(string); }; 6833URL url = "a string"; 6834 6835Example 2: matches 'b' (matcher = 6836opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 6837int a = b ?: 1; 6838</pre></td></tr> 6839 6840 6841<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> 6842<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6843functionDecl that have at least one TemplateArgument matching the given 6844InnerMatcher. 6845 6846Given 6847 template<typename T> class A {}; 6848 template<> class A<double> {}; 6849 A<int> a; 6850 6851 template<typename T> f() {}; 6852 void func() { f<int>(); }; 6853 6854classTemplateSpecializationDecl(hasAnyTemplateArgument( 6855 refersToType(asString("int")))) 6856 matches the specialization A<int> 6857 6858functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 6859 matches the specialization f<int> 6860</pre></td></tr> 6861 6862 6863<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> 6864<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 6865 6866Given 6867 template<typename T> class A {}; #1 6868 template<> class A<int> {}; #2 6869classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 6870 matches '#2' with classTemplateDecl() matching the class template 6871 declaration of 'A' at #1. 6872</pre></td></tr> 6873 6874 6875<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> 6876<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6877functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 6878 6879Given 6880 template<typename T, typename U> class A {}; 6881 A<bool, int> b; 6882 A<int, bool> c; 6883 6884 template<typename T> void f() {} 6885 void func() { f<int>(); }; 6886classTemplateSpecializationDecl(hasTemplateArgument( 6887 1, refersToType(asString("int")))) 6888 matches the specialization A<bool, int> 6889 6890functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 6891 matches the specialization f<int> 6892</pre></td></tr> 6893 6894 6895<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> 6896<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 6897type. 6898 6899Given 6900 struct A {}; 6901 A a[7]; 6902 int b[7]; 6903arrayType(hasElementType(builtinType())) 6904 matches "int b[7]" 6905 6906Usable 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>> 6907</pre></td></tr> 6908 6909 6910<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> 6911<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 6912a given matcher. Also matches StmtExprs that have CompoundStmt as children. 6913 6914Given 6915 { {}; 1+2; } 6916hasAnySubstatement(compoundStmt()) 6917 matches '{ {}; 1+2; }' 6918with compoundStmt() 6919 matching '{}' 6920</pre></td></tr> 6921 6922 6923<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> 6924<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher 6925</pre></td></tr> 6926 6927 6928<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> 6929<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 6930matches the given matcher. 6931 6932The associated declaration is: 6933- for type nodes, the declaration of the underlying type 6934- for CallExpr, the declaration of the callee 6935- for MemberExpr, the declaration of the referenced member 6936- for CXXConstructExpr, the declaration of the constructor 6937- for CXXNewExpr, the declaration of the operator new 6938- for ObjCIvarExpr, the declaration of the ivar 6939 6940For type nodes, hasDeclaration will generally match the declaration of the 6941sugared type. Given 6942 class X {}; 6943 typedef X Y; 6944 Y y; 6945in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6946typedefDecl. A common use case is to match the underlying, desugared type. 6947This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6948 varDecl(hasType(hasUnqualifiedDesugaredType( 6949 recordType(hasDeclaration(decl()))))) 6950In this matcher, the decl will match the CXXRecordDecl of class X. 6951 6952Usable 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>>, 6953 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>>, 6954 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>>, 6955 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>>, 6956 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>>, 6957 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>>, 6958 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6959</pre></td></tr> 6960 6961 6962<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> 6963<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 6964specific using shadow declaration. 6965 6966Given 6967 namespace a { void f() {} } 6968 using a::f; 6969 void g() { 6970 f(); // Matches this .. 6971 a::f(); // .. but not this. 6972 } 6973declRefExpr(throughUsingDecl(anything())) 6974 matches f() 6975</pre></td></tr> 6976 6977 6978<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> 6979<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 6980specified matcher. 6981 6982Example matches x in if(x) 6983 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 6984 bool x; 6985 if (x) {} 6986</pre></td></tr> 6987 6988 6989<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> 6990<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 6991 6992Note that this does not work for global declarations because the AST 6993breaks up multiple-declaration DeclStmt's into multiple single-declaration 6994DeclStmt's. 6995Example: Given non-global declarations 6996 int a, b = 0; 6997 int c; 6998 int d = 2, e; 6999declStmt(containsDeclaration( 7000 0, varDecl(hasInitializer(anything())))) 7001 matches only 'int d = 2, e;', and 7002declStmt(containsDeclaration(1, varDecl())) 7003 matches 'int a, b = 0' as well as 'int d = 2, e;' 7004 but 'int c;' is not matched. 7005</pre></td></tr> 7006 7007 7008<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> 7009<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 7010 7011Given 7012 int a, b; 7013 int c; 7014declStmt(hasSingleDecl(anything())) 7015 matches 'int c;' but not 'int a, b;'. 7016</pre></td></tr> 7017 7018 7019<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc0')"><a name="hasTypeLoc0Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7020<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 7021the inner matcher. 7022 7023Given 7024 int x; 7025declaratorDecl(hasTypeLoc(loc(asString("int")))) 7026 matches int x 7027</pre></td></tr> 7028 7029 7030<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> 7031<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 7032Decl, matches InnerMatcher. 7033 7034Given 7035 namespace N { 7036 namespace M { 7037 class D {}; 7038 } 7039 } 7040 7041cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 7042declaration of class D. 7043</pre></td></tr> 7044 7045 7046<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> 7047<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type. 7048 7049Given 7050 decltype(1) a = 1; 7051 decltype(2.0) b = 2.0; 7052decltypeType(hasUnderlyingType(isInteger())) 7053 matches the type of "a" 7054 7055Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>> 7056</pre></td></tr> 7057 7058 7059<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> 7060<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr> 7061 7062 7063<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> 7064<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 7065switch statement or conditional operator. 7066 7067Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7068 if (true) {} 7069</pre></td></tr> 7070 7071 7072<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> 7073<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 7074matches InnerMatcher if the qualifier exists. 7075 7076Given 7077 namespace N { 7078 namespace M { 7079 class D {}; 7080 } 7081 } 7082 N::M::D d; 7083 7084elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 7085matches the type of the variable declaration of d. 7086</pre></td></tr> 7087 7088 7089<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> 7090<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 7091 7092Given 7093 namespace N { 7094 namespace M { 7095 class D {}; 7096 } 7097 } 7098 N::M::D d; 7099 7100elaboratedType(namesType(recordType( 7101hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 7102declaration of d. 7103</pre></td></tr> 7104 7105 7106<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> 7107<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 7108matches the given matcher. 7109 7110The associated declaration is: 7111- for type nodes, the declaration of the underlying type 7112- for CallExpr, the declaration of the callee 7113- for MemberExpr, the declaration of the referenced member 7114- for CXXConstructExpr, the declaration of the constructor 7115- for CXXNewExpr, the declaration of the operator new 7116- for ObjCIvarExpr, the declaration of the ivar 7117 7118For type nodes, hasDeclaration will generally match the declaration of the 7119sugared type. Given 7120 class X {}; 7121 typedef X Y; 7122 Y y; 7123in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7124typedefDecl. A common use case is to match the underlying, desugared type. 7125This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7126 varDecl(hasType(hasUnqualifiedDesugaredType( 7127 recordType(hasDeclaration(decl()))))) 7128In this matcher, the decl will match the CXXRecordDecl of class X. 7129 7130Usable 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>>, 7131 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>>, 7132 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>>, 7133 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>>, 7134 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>>, 7135 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>>, 7136 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7137</pre></td></tr> 7138 7139 7140<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> 7141<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 7142 7143(Note: Clang's AST refers to other conversions as "casts" too, and calls 7144actual casts "explicit" casts.) 7145</pre></td></tr> 7146 7147 7148<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7149<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value 7150declaration's type. 7151 7152In case of a value declaration (for example a variable declaration), 7153this resolves one layer of indirection. For example, in the value 7154declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7155X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7156declaration of x. 7157 7158Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7159 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7160 and friend class X (matcher = friendDecl(hasType("X")) 7161 class X {}; 7162 void y(X &x) { x; X z; } 7163 class Y { friend class X; }; 7164 7165Example matches class Derived 7166(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7167class Base {}; 7168class Derived : Base {}; 7169 7170Usable 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>>, 7171Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7172</pre></td></tr> 7173 7174 7175<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> 7176<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 7177matcher. 7178 7179Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7180 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7181 and U (matcher = typedefDecl(hasType(asString("int"))) 7182 and friend class X (matcher = friendDecl(hasType("X")) 7183 class X {}; 7184 void y(X &x) { x; X z; } 7185 typedef int U; 7186 class Y { friend class X; }; 7187</pre></td></tr> 7188 7189 7190<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> 7191<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 7192elidable constructor and other corresponding bookkeeping nodes. 7193 7194In C++17, elidable copy constructors are no longer being generated in the 7195AST as it is not permitted by the standard. They are, however, part of the 7196AST in C++14 and earlier. So, a matcher must abstract over these differences 7197to work in all language modes. This matcher skips elidable constructor-call 7198AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 7199various implicit nodes inside the constructor calls, all of which will not 7200appear in the C++17 AST. 7201 7202Given 7203 7204struct H {}; 7205H G(); 7206void f() { 7207 H D = G(); 7208} 7209 7210``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 7211matches ``H D = G()`` in C++11 through C++17 (and beyond). 7212</pre></td></tr> 7213 7214 7215<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> 7216<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 7217are stripped off. 7218 7219Parentheses and explicit casts are not discarded. 7220Given 7221 int arr[5]; 7222 int a = 0; 7223 char b = 0; 7224 const int c = a; 7225 int *d = arr; 7226 long e = (long) 0l; 7227The matchers 7228 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 7229 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 7230would match the declarations for a, b, c, and d, but not e. 7231While 7232 varDecl(hasInitializer(integerLiteral())) 7233 varDecl(hasInitializer(declRefExpr())) 7234only match the declarations for b, c, and d. 7235</pre></td></tr> 7236 7237 7238<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> 7239<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 7240nodes are stripped off. 7241 7242Parentheses and explicit casts are not discarded. 7243Given 7244 class C {}; 7245 C a = C(); 7246 C b; 7247 C c = b; 7248The matchers 7249 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 7250would match the declarations for a, b, and c. 7251While 7252 varDecl(hasInitializer(cxxConstructExpr())) 7253only match the declarations for b and c. 7254</pre></td></tr> 7255 7256 7257<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> 7258<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 7259casts are stripped off. 7260 7261Implicit and non-C Style casts are also discarded. 7262Given 7263 int a = 0; 7264 char b = (0); 7265 void* c = reinterpret_cast<char*>(0); 7266 char d = char(0); 7267The matcher 7268 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 7269would match the declarations for a, b, c, and d. 7270while 7271 varDecl(hasInitializer(integerLiteral())) 7272only match the declaration for a. 7273</pre></td></tr> 7274 7275 7276<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('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> 7277<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 7278parentheses are stripped off. 7279 7280Explicit casts are not discarded. 7281Given 7282 int arr[5]; 7283 int a = 0; 7284 char b = (0); 7285 const int c = a; 7286 int *d = (arr); 7287 long e = ((long) 0l); 7288The matchers 7289 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 7290 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 7291would match the declarations for a, b, c, and d, but not e. 7292while 7293 varDecl(hasInitializer(integerLiteral())) 7294 varDecl(hasInitializer(declRefExpr())) 7295would only match the declaration for a. 7296</pre></td></tr> 7297 7298 7299<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> 7300<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 7301 7302Given 7303 const char* str = ("my-string"); 7304The matcher 7305 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 7306would match the implicit cast resulting from the assignment. 7307</pre></td></tr> 7308 7309 7310<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> 7311<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 7312 7313Given 7314 class C { 7315 int a = 2; 7316 int b = 3; 7317 int c; 7318 }; 7319fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 7320 matches 'int a;' but not 'int b;'. 7321fieldDecl(hasInClassInitializer(anything())) 7322 matches 'int a;' and 'int b;' but not 'int c;'. 7323</pre></td></tr> 7324 7325 7326<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> 7327<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr> 7328 7329 7330<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> 7331<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 7332switch statement or conditional operator. 7333 7334Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7335 if (true) {} 7336</pre></td></tr> 7337 7338 7339<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> 7340<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 7341 7342Example: 7343 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 7344matches '++x' in 7345 for (x; x < N; ++x) { } 7346</pre></td></tr> 7347 7348 7349<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> 7350<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 7351 7352Example: 7353 forStmt(hasLoopInit(declStmt())) 7354matches 'int x = 0' in 7355 for (int x = 0; x < N; ++x) { } 7356</pre></td></tr> 7357 7358 7359<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>></td><td class="name" onclick="toggle('hasType5')"><a name="hasType5Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7360<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 7361declaration's type. 7362 7363In case of a value declaration (for example a variable declaration), 7364this resolves one layer of indirection. For example, in the value 7365declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7366X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7367declaration of x. 7368 7369Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7370 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7371 and friend class X (matcher = friendDecl(hasType("X")) 7372 class X {}; 7373 void y(X &x) { x; X z; } 7374 class Y { friend class X; }; 7375 7376Example matches class Derived 7377(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7378class Base {}; 7379class Derived : Base {}; 7380 7381Usable 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>>, 7382Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7383</pre></td></tr> 7384 7385 7386<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> 7387<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 7388matcher. 7389 7390Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7391 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7392 and U (matcher = typedefDecl(hasType(asString("int"))) 7393 and friend class X (matcher = friendDecl(hasType("X")) 7394 class X {}; 7395 void y(X &x) { x; X z; } 7396 typedef int U; 7397 class Y { friend class X; }; 7398</pre></td></tr> 7399 7400 7401<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> 7402<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST. 7403Note that this matcher matches all the declarations of a function whose 7404body is present in the AST. 7405 7406Given 7407 void f(); 7408 void f() {} 7409 void g(); 7410hasAnyBody(functionDecl()) 7411 matches both 'void f();' 7412 and 'void f() {}' 7413with compoundStmt() 7414 matching '{}' 7415 but does not match 'void g();' 7416</pre></td></tr> 7417 7418 7419<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> 7420<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 7421block. 7422 7423Does not match the 'this' parameter of a method. 7424 7425Given 7426 class X { void f(int x, int y, int z) {} }; 7427cxxMethodDecl(hasAnyParameter(hasName("y"))) 7428 matches f(int x, int y, int z) {} 7429with hasAnyParameter(...) 7430 matching int y 7431 7432For ObjectiveC, given 7433 @interface I - (void) f:(int) y; @end 7434 7435the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 7436matches the declaration of method f with hasParameter 7437matching y. 7438 7439For blocks, given 7440 b = ^(int y) { printf("%d", y) }; 7441 7442the matcher blockDecl(hasAnyParameter(hasName("y"))) 7443matches the declaration of the block b with hasParameter 7444matching y. 7445</pre></td></tr> 7446 7447 7448<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> 7449<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7450functionDecl that have at least one TemplateArgument matching the given 7451InnerMatcher. 7452 7453Given 7454 template<typename T> class A {}; 7455 template<> class A<double> {}; 7456 A<int> a; 7457 7458 template<typename T> f() {}; 7459 void func() { f<int>(); }; 7460 7461classTemplateSpecializationDecl(hasAnyTemplateArgument( 7462 refersToType(asString("int")))) 7463 matches the specialization A<int> 7464 7465functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7466 matches the specialization f<int> 7467</pre></td></tr> 7468 7469 7470<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> 7471<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr> 7472 7473 7474<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> 7475<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 7476declaration. 7477 7478Given 7479 template<bool b> 7480 struct S { 7481 S(int); // #1 7482 explicit S(double); // #2 7483 operator int(); // #3 7484 explicit operator bool(); // #4 7485 explicit(false) S(bool) // # 7 7486 explicit(true) S(char) // # 8 7487 explicit(b) S(S) // # 9 7488 }; 7489 S(int) -> S<true> // #5 7490 explicit S(double) -> S<false> // #6 7491cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 7492cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 7493cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 7494</pre></td></tr> 7495 7496 7497<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> 7498<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 7499declaration or a block. 7500 7501Given 7502 class X { void f(int x) {} }; 7503cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 7504 matches f(int x) {} 7505with hasParameter(...) 7506 matching int x 7507 7508For ObjectiveC, given 7509 @interface I - (void) f:(int) y; @end 7510 7511the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 7512matches the declaration of method f with hasParameter 7513matching y. 7514</pre></td></tr> 7515 7516 7517<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> 7518<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7519functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7520 7521Given 7522 template<typename T, typename U> class A {}; 7523 A<bool, int> b; 7524 A<int, bool> c; 7525 7526 template<typename T> void f() {} 7527 void func() { f<int>(); }; 7528classTemplateSpecializationDecl(hasTemplateArgument( 7529 1, refersToType(asString("int")))) 7530 matches the specialization A<bool, int> 7531 7532functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7533 matches the specialization f<int> 7534</pre></td></tr> 7535 7536 7537<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> 7538<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 7539 7540Given: 7541 class X { int f() { return 1; } }; 7542cxxMethodDecl(returns(asString("int"))) 7543 matches int f() { return 1; } 7544</pre></td></tr> 7545 7546 7547<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> 7548<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 7549switch statement or conditional operator. 7550 7551Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7552 if (true) {} 7553</pre></td></tr> 7554 7555 7556<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> 7557<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 7558 7559Given 7560 if (A* a = GetAPointer()) {} 7561hasConditionVariableStatement(...) 7562 matches 'A* a = GetAPointer()'. 7563</pre></td></tr> 7564 7565 7566<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> 7567<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 7568 7569Examples matches the if statement 7570 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 7571 if (false) false; else true; 7572</pre></td></tr> 7573 7574 7575<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> 7576<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 7577 7578Given: 7579 void foo() { 7580 if (int i = foobar(); i > 0) {} 7581 switch (int i = foobar(); i) {} 7582 for (auto& a = get_range(); auto& x : a) {} 7583 } 7584 void bar() { 7585 if (foobar() > 0) {} 7586 switch (foobar()) {} 7587 for (auto& x : get_range()) {} 7588 } 7589ifStmt(hasInitStatement(anything())) 7590 matches the if statement in foo but not in bar. 7591switchStmt(hasInitStatement(anything())) 7592 matches the switch statement in foo but not in bar. 7593cxxForRangeStmt(hasInitStatement(anything())) 7594 matches the range for statement in foo but not in bar. 7595</pre></td></tr> 7596 7597 7598<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> 7599<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 7600 7601Examples matches the if statement 7602 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 7603 if (false) true; else false; 7604</pre></td></tr> 7605 7606 7607<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> 7608<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 7609matcher. 7610 7611FIXME: Unit test this matcher 7612</pre></td></tr> 7613 7614 7615<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> 7616<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 7617 7618Example matches y. 7619 (matcher = initListExpr(hasInit(0, expr()))) 7620 int x{y}. 7621</pre></td></tr> 7622 7623 7624<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> 7625<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 7626(if expression have it). 7627</pre></td></tr> 7628 7629 7630<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> 7631<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 7632matches the given matcher. 7633 7634The associated declaration is: 7635- for type nodes, the declaration of the underlying type 7636- for CallExpr, the declaration of the callee 7637- for MemberExpr, the declaration of the referenced member 7638- for CXXConstructExpr, the declaration of the constructor 7639- for CXXNewExpr, the declaration of the operator new 7640- for ObjCIvarExpr, the declaration of the ivar 7641 7642For type nodes, hasDeclaration will generally match the declaration of the 7643sugared type. Given 7644 class X {}; 7645 typedef X Y; 7646 Y y; 7647in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7648typedefDecl. A common use case is to match the underlying, desugared type. 7649This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7650 varDecl(hasType(hasUnqualifiedDesugaredType( 7651 recordType(hasDeclaration(decl()))))) 7652In this matcher, the decl will match the CXXRecordDecl of class X. 7653 7654Usable 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>>, 7655 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>>, 7656 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>>, 7657 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>>, 7658 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>>, 7659 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>>, 7660 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7661</pre></td></tr> 7662 7663 7664<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> 7665<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 7666matches the given matcher. 7667 7668The associated declaration is: 7669- for type nodes, the declaration of the underlying type 7670- for CallExpr, the declaration of the callee 7671- for MemberExpr, the declaration of the referenced member 7672- for CXXConstructExpr, the declaration of the constructor 7673- for CXXNewExpr, the declaration of the operator new 7674- for ObjCIvarExpr, the declaration of the ivar 7675 7676For type nodes, hasDeclaration will generally match the declaration of the 7677sugared type. Given 7678 class X {}; 7679 typedef X Y; 7680 Y y; 7681in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7682typedefDecl. A common use case is to match the underlying, desugared type. 7683This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7684 varDecl(hasType(hasUnqualifiedDesugaredType( 7685 recordType(hasDeclaration(decl()))))) 7686In this matcher, the decl will match the CXXRecordDecl of class X. 7687 7688Usable 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>>, 7689 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>>, 7690 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>>, 7691 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>>, 7692 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>>, 7693 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>>, 7694 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7695</pre></td></tr> 7696 7697 7698<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> 7699<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression. 7700 7701Given 7702 struct foo { 7703 void bar() { 7704 auto f = [this](){}; 7705 } 7706 } 7707lambdaExpr(hasAnyCapture(cxxThisExpr())) 7708 matches [this](){}; 7709</pre></td></tr> 7710 7711 7712<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> 7713<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression. 7714 7715Given 7716 void foo() { 7717 int x; 7718 auto f = [x](){}; 7719 } 7720lambdaExpr(hasAnyCapture(anything())) 7721 matches [x](){}; 7722</pre></td></tr> 7723 7724 7725<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> 7726<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 7727matches the given matcher. 7728 7729The associated declaration is: 7730- for type nodes, the declaration of the underlying type 7731- for CallExpr, the declaration of the callee 7732- for MemberExpr, the declaration of the referenced member 7733- for CXXConstructExpr, the declaration of the constructor 7734- for CXXNewExpr, the declaration of the operator new 7735- for ObjCIvarExpr, the declaration of the ivar 7736 7737For type nodes, hasDeclaration will generally match the declaration of the 7738sugared type. Given 7739 class X {}; 7740 typedef X Y; 7741 Y y; 7742in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7743typedefDecl. A common use case is to match the underlying, desugared type. 7744This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7745 varDecl(hasType(hasUnqualifiedDesugaredType( 7746 recordType(hasDeclaration(decl()))))) 7747In this matcher, the decl will match the CXXRecordDecl of class X. 7748 7749Usable 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>>, 7750 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>>, 7751 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>>, 7752 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>>, 7753 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>>, 7754 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>>, 7755 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7756</pre></td></tr> 7757 7758 7759<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> 7760<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 7761given matcher. Implicit object expressions are included; that is, it matches 7762use of implicit `this`. 7763 7764Given 7765 struct X { 7766 int m; 7767 int f(X x) { x.m; return m; } 7768 }; 7769memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 7770 matches `x.m`, but not `m`; however, 7771memberExpr(hasObjectExpression(hasType(pointsTo( 7772 cxxRecordDecl(hasName("X")))))) 7773 matches `m` (aka. `this->m`), but not `x.m`. 7774</pre></td></tr> 7775 7776 7777<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> 7778<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 7779given matcher. 7780 7781Given 7782 struct { int first, second; } first, second; 7783 int i(second.first); 7784 int j(first.second); 7785memberExpr(member(hasName("first"))) 7786 matches second.first 7787 but not first.second (because the member name there is "second"). 7788</pre></td></tr> 7789 7790 7791<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> 7792<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 7793pointee matches a given matcher. 7794 7795Given 7796 int *a; 7797 int const *b; 7798 float const *f; 7799pointerType(pointee(isConstQualified(), isInteger())) 7800 matches "int const *b" 7801 7802Usable 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>>, 7803 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>> 7804</pre></td></tr> 7805 7806 7807<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> 7808<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 7809matcher. 7810 7811Given 7812 namespace N { template<class T> void f(T t); } 7813 template <class T> void g() { using N::f; f(T()); } 7814unresolvedLookupExpr(hasAnyDeclaration( 7815 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 7816 matches the use of f in g() . 7817</pre></td></tr> 7818 7819 7820<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> 7821<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 7822 7823Given 7824 struct A { struct B { struct C {}; }; }; 7825 A::B::C c; 7826nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 7827 matches "A::" 7828</pre></td></tr> 7829 7830 7831<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> 7832<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 7833NestedNameSpecifier-matcher matches. 7834</pre></td></tr> 7835 7836 7837<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> 7838<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 7839given TypeLoc. 7840 7841Given 7842 struct A { struct B { struct C {}; }; }; 7843 A::B::C c; 7844nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 7845 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 7846 matches "A::" 7847</pre></td></tr> 7848 7849 7850<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> 7851<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 7852 7853Given 7854 struct A { struct B { struct C {}; }; }; 7855 A::B::C c; 7856nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 7857 matches "A::" 7858</pre></td></tr> 7859 7860 7861<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> 7862<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 7863given namespace matcher. 7864 7865Given 7866 namespace ns { struct A {}; } 7867 ns::A a; 7868nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 7869 matches "ns::" 7870</pre></td></tr> 7871 7872 7873<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> 7874<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 7875given QualType matcher without qualifiers. 7876 7877Given 7878 struct A { struct B { struct C {}; }; }; 7879 A::B::C c; 7880nestedNameSpecifier(specifiesType( 7881 hasDeclaration(cxxRecordDecl(hasName("A"))) 7882)) 7883 matches "A::" 7884</pre></td></tr> 7885 7886 7887<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> 7888<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 7889 7890Given 7891 7892 #pragma omp parallel 7893 #pragma omp parallel default(none) 7894 7895``ompExecutableDirective(hasAnyClause(anything()))`` matches 7896``omp parallel default(none)``. 7897</pre></td></tr> 7898 7899 7900<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> 7901<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 7902 7903Prerequisite: the executable directive must not be standalone directive. 7904If it is, it will never match. 7905 7906Given 7907 7908 #pragma omp parallel 7909 ; 7910 #pragma omp parallel 7911 {} 7912 7913``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 7914</pre></td></tr> 7915 7916 7917<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> 7918<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 7919matching Base, or Objective-C classes that directly or indirectly 7920subclass a class matching Base. 7921 7922Note that a class is not considered to be derived from itself. 7923 7924Example matches Y, Z, C (Base == hasName("X")) 7925 class X; 7926 class Y : public X {}; // directly derived 7927 class Z : public Y {}; // indirectly derived 7928 typedef X A; 7929 typedef A B; 7930 class C : public B {}; // derived from a typedef of X 7931 7932In the following example, Bar matches isDerivedFrom(hasName("X")): 7933 class Foo; 7934 typedef Foo X; 7935 class Bar : public Foo {}; // derived from a type that X is a typedef of 7936 7937In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 7938 @interface NSObject @end 7939 @interface Bar : NSObject @end 7940 7941Usable 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>> 7942</pre></td></tr> 7943 7944 7945<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> 7946<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 7947matching Base. 7948 7949Note that a class is not considered to be derived from itself. 7950 7951Example matches Y, C (Base == hasName("X")) 7952 class X; 7953 class Y : public X {}; // directly derived 7954 class Z : public Y {}; // indirectly derived 7955 typedef X A; 7956 typedef A B; 7957 class C : public B {}; // derived from a typedef of X 7958 7959In the following example, Bar matches isDerivedFrom(hasName("X")): 7960 class Foo; 7961 typedef Foo X; 7962 class Bar : public Foo {}; // derived from a type that X is a typedef of 7963</pre></td></tr> 7964 7965 7966<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> 7967<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 7968match Base. 7969</pre></td></tr> 7970 7971 7972<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> 7973<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 7974expression, or an ObjC-message-send expression. 7975 7976Given 7977 void x(int, int, int) { int y; x(1, y, 42); } 7978callExpr(hasAnyArgument(declRefExpr())) 7979 matches x(1, y, 42) 7980with hasAnyArgument(...) 7981 matching y 7982 7983For ObjectiveC, given 7984 @interface I - (void) f:(int) y; @end 7985 void foo(I *i) { [i f:12]; } 7986objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 7987 matches [i f:12] 7988</pre></td></tr> 7989 7990 7991<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> 7992<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor 7993call expression. 7994 7995Example matches y in x(y) 7996 (matcher = callExpr(hasArgument(0, declRefExpr()))) 7997 void x(int) { int y; x(y); } 7998</pre></td></tr> 7999 8000 8001<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> 8002<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 8003and the inner matcher matches on that instance. 8004 8005For example the method call in 8006 NSString *x = @"hello"; 8007 [x containsString:@"h"]; 8008is matched by 8009objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 8010</pre></td></tr> 8011 8012 8013<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> 8014<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 8015 8016Example 8017matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 8018matches the [webView ...] message invocation. 8019 NSString *webViewJavaScript = ... 8020 UIWebView *webView = ... 8021 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 8022</pre></td></tr> 8023 8024 8025<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> 8026<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 8027block. 8028 8029Does not match the 'this' parameter of a method. 8030 8031Given 8032 class X { void f(int x, int y, int z) {} }; 8033cxxMethodDecl(hasAnyParameter(hasName("y"))) 8034 matches f(int x, int y, int z) {} 8035with hasAnyParameter(...) 8036 matching int y 8037 8038For ObjectiveC, given 8039 @interface I - (void) f:(int) y; @end 8040 8041the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 8042matches the declaration of method f with hasParameter 8043matching y. 8044 8045For blocks, given 8046 b = ^(int y) { printf("%d", y) }; 8047 8048the matcher blockDecl(hasAnyParameter(hasName("y"))) 8049matches the declaration of the block b with hasParameter 8050matching y. 8051</pre></td></tr> 8052 8053 8054<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> 8055<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 8056declaration or a block. 8057 8058Given 8059 class X { void f(int x) {} }; 8060cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 8061 matches f(int x) {} 8062with hasParameter(...) 8063 matching int x 8064 8065For ObjectiveC, given 8066 @interface I - (void) f:(int) y; @end 8067 8068the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 8069matches the declaration of method f with hasParameter 8070matching y. 8071</pre></td></tr> 8072 8073 8074<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> 8075<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 8076or opaque value's source expression matches the given matcher. 8077 8078Example 1: matches "a string" 8079(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 8080class URL { URL(string); }; 8081URL url = "a string"; 8082 8083Example 2: matches 'b' (matcher = 8084opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 8085int a = b ?: 1; 8086</pre></td></tr> 8087 8088 8089<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> 8090<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 8091overloads matches the given matcher. 8092 8093Given 8094 template <typename T> void foo(T); 8095 template <typename T> void bar(T); 8096 template <typename T> void baz(T t) { 8097 foo(t); 8098 bar(t); 8099 } 8100unresolvedLookupExpr(hasAnyDeclaration( 8101 functionTemplateDecl(hasName("foo")))) 8102 matches foo in foo(t); but not bar in bar(t); 8103</pre></td></tr> 8104 8105 8106<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> 8107<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 8108 8109Given 8110 int (*ptr_to_array)[4]; 8111 int (*ptr_to_func)(int); 8112 8113varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 8114ptr_to_func but not ptr_to_array. 8115 8116Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 8117</pre></td></tr> 8118 8119 8120<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> 8121<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 8122pointee matches a given matcher. 8123 8124Given 8125 int *a; 8126 int const *b; 8127 float const *f; 8128pointerType(pointee(isConstQualified(), isInteger())) 8129 matches "int const *b" 8130 8131Usable 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>>, 8132 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>> 8133</pre></td></tr> 8134 8135 8136<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> 8137<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 8138 8139Given: 8140 typedef int &int_ref; 8141 int a; 8142 int_ref b = a; 8143 8144varDecl(hasType(qualType(referenceType()))))) will not match the 8145declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 8146</pre></td></tr> 8147 8148 8149<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> 8150<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 8151matches the given matcher. 8152 8153The associated declaration is: 8154- for type nodes, the declaration of the underlying type 8155- for CallExpr, the declaration of the callee 8156- for MemberExpr, the declaration of the referenced member 8157- for CXXConstructExpr, the declaration of the constructor 8158- for CXXNewExpr, the declaration of the operator new 8159- for ObjCIvarExpr, the declaration of the ivar 8160 8161For type nodes, hasDeclaration will generally match the declaration of the 8162sugared type. Given 8163 class X {}; 8164 typedef X Y; 8165 Y y; 8166in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8167typedefDecl. A common use case is to match the underlying, desugared type. 8168This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8169 varDecl(hasType(hasUnqualifiedDesugaredType( 8170 recordType(hasDeclaration(decl()))))) 8171In this matcher, the decl will match the CXXRecordDecl of class X. 8172 8173Usable 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>>, 8174 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>>, 8175 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>>, 8176 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>>, 8177 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>>, 8178 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>>, 8179 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8180</pre></td></tr> 8181 8182 8183<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> 8184<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 8185 8186Given 8187 void (*fp)(void); 8188The matcher 8189 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 8190would match the declaration for fp. 8191</pre></td></tr> 8192 8193 8194<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> 8195<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 8196</pre></td></tr> 8197 8198 8199<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> 8200<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 8201matches the specified matcher. 8202 8203Example matches y->x() 8204 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 8205 cxxRecordDecl(hasName("Y"))))))) 8206 class Y { public: void x(); }; 8207 void z() { Y *y; y->x(); } 8208</pre></td></tr> 8209 8210 8211<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> 8212<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 8213</pre></td></tr> 8214 8215 8216<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> 8217<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 8218type matches the specified matcher. 8219 8220Example matches X &x and const X &y 8221 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 8222 class X { 8223 void a(X b) { 8224 X &x = b; 8225 const X &y = b; 8226 } 8227 }; 8228</pre></td></tr> 8229 8230 8231<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> 8232<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 8233matches the given matcher. 8234 8235The associated declaration is: 8236- for type nodes, the declaration of the underlying type 8237- for CallExpr, the declaration of the callee 8238- for MemberExpr, the declaration of the referenced member 8239- for CXXConstructExpr, the declaration of the constructor 8240- for CXXNewExpr, the declaration of the operator new 8241- for ObjCIvarExpr, the declaration of the ivar 8242 8243For type nodes, hasDeclaration will generally match the declaration of the 8244sugared type. Given 8245 class X {}; 8246 typedef X Y; 8247 Y y; 8248in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8249typedefDecl. A common use case is to match the underlying, desugared type. 8250This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8251 varDecl(hasType(hasUnqualifiedDesugaredType( 8252 recordType(hasDeclaration(decl()))))) 8253In this matcher, the decl will match the CXXRecordDecl of class X. 8254 8255Usable 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>>, 8256 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>>, 8257 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>>, 8258 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>>, 8259 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>>, 8260 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>>, 8261 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8262</pre></td></tr> 8263 8264 8265<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> 8266<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 8267pointee matches a given matcher. 8268 8269Given 8270 int *a; 8271 int const *b; 8272 float const *f; 8273pointerType(pointee(isConstQualified(), isInteger())) 8274 matches "int const *b" 8275 8276Usable 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>>, 8277 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>> 8278</pre></td></tr> 8279 8280 8281<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> 8282<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 8283 8284Given 8285 return a + b; 8286hasReturnValue(binaryOperator()) 8287 matches 'return a + b' 8288with binaryOperator() 8289 matching 'a + b' 8290</pre></td></tr> 8291 8292 8293<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> 8294<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 8295a given matcher. Also matches StmtExprs that have CompoundStmt as children. 8296 8297Given 8298 { {}; 1+2; } 8299hasAnySubstatement(compoundStmt()) 8300 matches '{ {}; 1+2; }' 8301with compoundStmt() 8302 matching '{}' 8303</pre></td></tr> 8304 8305 8306<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> 8307<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8308alignof. 8309</pre></td></tr> 8310 8311 8312<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> 8313<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to 8314 8315Given: 8316F& operator=(const F& o) { 8317 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 8318 return *this; 8319} 8320returnStmt(forFunction(hasName("operator="))) 8321 matches 'return *this' 8322 but does not match 'return v > 0' 8323</pre></td></tr> 8324 8325 8326<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> 8327<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8328sizeof. 8329</pre></td></tr> 8330 8331 8332<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> 8333<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 8334type that matches the provided matcher. 8335 8336Given 8337 template <typename T> 8338 double F(T t); 8339 int i; 8340 double j = F(i); 8341 8342substTemplateTypeParmType(hasReplacementType(type())) matches int 8343</pre></td></tr> 8344 8345 8346<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> 8347<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 8348statement. This matcher may produce multiple matches. 8349 8350Given 8351 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 8352switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 8353 matches four times, with "c" binding each of "case 1:", "case 2:", 8354"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 8355"switch (1)", "switch (2)" and "switch (2)". 8356</pre></td></tr> 8357 8358 8359<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> 8360<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 8361switch statement or conditional operator. 8362 8363Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8364 if (true) {} 8365</pre></td></tr> 8366 8367 8368<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> 8369<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 8370 8371Given: 8372 void foo() { 8373 if (int i = foobar(); i > 0) {} 8374 switch (int i = foobar(); i) {} 8375 for (auto& a = get_range(); auto& x : a) {} 8376 } 8377 void bar() { 8378 if (foobar() > 0) {} 8379 switch (foobar()) {} 8380 for (auto& x : get_range()) {} 8381 } 8382ifStmt(hasInitStatement(anything())) 8383 matches the if statement in foo but not in bar. 8384switchStmt(hasInitStatement(anything())) 8385 matches the switch statement in foo but not in bar. 8386cxxForRangeStmt(hasInitStatement(anything())) 8387 matches the range for statement in foo but not in bar. 8388</pre></td></tr> 8389 8390 8391<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> 8392<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 8393matches the given matcher. 8394 8395The associated declaration is: 8396- for type nodes, the declaration of the underlying type 8397- for CallExpr, the declaration of the callee 8398- for MemberExpr, the declaration of the referenced member 8399- for CXXConstructExpr, the declaration of the constructor 8400- for CXXNewExpr, the declaration of the operator new 8401- for ObjCIvarExpr, the declaration of the ivar 8402 8403For type nodes, hasDeclaration will generally match the declaration of the 8404sugared type. Given 8405 class X {}; 8406 typedef X Y; 8407 Y y; 8408in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8409typedefDecl. A common use case is to match the underlying, desugared type. 8410This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8411 varDecl(hasType(hasUnqualifiedDesugaredType( 8412 recordType(hasDeclaration(decl()))))) 8413In this matcher, the decl will match the CXXRecordDecl of class X. 8414 8415Usable 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>>, 8416 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>>, 8417 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>>, 8418 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>>, 8419 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>>, 8420 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>>, 8421 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8422</pre></td></tr> 8423 8424 8425<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> 8426<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 8427 8428Given 8429 struct B { int next; }; 8430 template<int(B::*next_ptr)> struct A {}; 8431 A<&B::next> a; 8432templateSpecializationType(hasAnyTemplateArgument( 8433 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 8434 matches the specialization A<&B::next> with fieldDecl(...) matching 8435 B::next 8436</pre></td></tr> 8437 8438 8439<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> 8440<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 8441declaration. 8442 8443Given 8444 struct B { int next; }; 8445 template<int(B::*next_ptr)> struct A {}; 8446 A<&B::next> a; 8447classTemplateSpecializationDecl(hasAnyTemplateArgument( 8448 refersToDeclaration(fieldDecl(hasName("next"))))) 8449 matches the specialization A<&B::next> with fieldDecl(...) matching 8450 B::next 8451</pre></td></tr> 8452 8453 8454<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> 8455<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type. 8456 8457Given 8458 template<int T> struct C {}; 8459 C<42> c; 8460classTemplateSpecializationDecl( 8461 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 8462 matches the implicit instantiation of C in C<42>. 8463</pre></td></tr> 8464 8465 8466<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> 8467<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 8468 8469Given 8470 template<template <typename> class S> class X {}; 8471 template<typename T> class Y {}; 8472 X<Y> xi; 8473classTemplateSpecializationDecl(hasAnyTemplateArgument( 8474 refersToTemplate(templateName()))) 8475 matches the specialization X<Y> 8476</pre></td></tr> 8477 8478 8479<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> 8480<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 8481 8482Given 8483 struct X {}; 8484 template<typename T> struct A {}; 8485 A<X> a; 8486classTemplateSpecializationDecl(hasAnyTemplateArgument( 8487 refersToType(class(hasName("X"))))) 8488 matches the specialization A<X> 8489</pre></td></tr> 8490 8491 8492<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> 8493<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8494functionDecl that have at least one TemplateArgument matching the given 8495InnerMatcher. 8496 8497Given 8498 template<typename T> class A {}; 8499 template<> class A<double> {}; 8500 A<int> a; 8501 8502 template<typename T> f() {}; 8503 void func() { f<int>(); }; 8504 8505classTemplateSpecializationDecl(hasAnyTemplateArgument( 8506 refersToType(asString("int")))) 8507 matches the specialization A<int> 8508 8509functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 8510 matches the specialization f<int> 8511</pre></td></tr> 8512 8513 8514<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> 8515<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 8516matches the given matcher. 8517 8518The associated declaration is: 8519- for type nodes, the declaration of the underlying type 8520- for CallExpr, the declaration of the callee 8521- for MemberExpr, the declaration of the referenced member 8522- for CXXConstructExpr, the declaration of the constructor 8523- for CXXNewExpr, the declaration of the operator new 8524- for ObjCIvarExpr, the declaration of the ivar 8525 8526For type nodes, hasDeclaration will generally match the declaration of the 8527sugared type. Given 8528 class X {}; 8529 typedef X Y; 8530 Y y; 8531in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8532typedefDecl. A common use case is to match the underlying, desugared type. 8533This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8534 varDecl(hasType(hasUnqualifiedDesugaredType( 8535 recordType(hasDeclaration(decl()))))) 8536In this matcher, the decl will match the CXXRecordDecl of class X. 8537 8538Usable 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>>, 8539 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>>, 8540 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>>, 8541 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>>, 8542 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>>, 8543 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>>, 8544 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8545</pre></td></tr> 8546 8547 8548<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> 8549<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8550functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 8551 8552Given 8553 template<typename T, typename U> class A {}; 8554 A<bool, int> b; 8555 A<int, bool> c; 8556 8557 template<typename T> void f() {} 8558 void func() { f<int>(); }; 8559classTemplateSpecializationDecl(hasTemplateArgument( 8560 1, refersToType(asString("int")))) 8561 matches the specialization A<bool, int> 8562 8563functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 8564 matches the specialization f<int> 8565</pre></td></tr> 8566 8567 8568<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> 8569<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 8570matches the given matcher. 8571 8572The associated declaration is: 8573- for type nodes, the declaration of the underlying type 8574- for CallExpr, the declaration of the callee 8575- for MemberExpr, the declaration of the referenced member 8576- for CXXConstructExpr, the declaration of the constructor 8577- for CXXNewExpr, the declaration of the operator new 8578- for ObjCIvarExpr, the declaration of the ivar 8579 8580For type nodes, hasDeclaration will generally match the declaration of the 8581sugared type. Given 8582 class X {}; 8583 typedef X Y; 8584 Y y; 8585in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8586typedefDecl. A common use case is to match the underlying, desugared type. 8587This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8588 varDecl(hasType(hasUnqualifiedDesugaredType( 8589 recordType(hasDeclaration(decl()))))) 8590In this matcher, the decl will match the CXXRecordDecl of class X. 8591 8592Usable 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>>, 8593 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>>, 8594 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>>, 8595 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>>, 8596 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>>, 8597 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>>, 8598 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8599</pre></td></tr> 8600 8601 8602<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> 8603<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 8604QualType-matcher matches. 8605</pre></td></tr> 8606 8607 8608<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> 8609<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 8610matcher. 8611 8612Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8613 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8614 and U (matcher = typedefDecl(hasType(asString("int"))) 8615 and friend class X (matcher = friendDecl(hasType("X")) 8616 class X {}; 8617 void y(X &x) { x; X z; } 8618 typedef int U; 8619 class Y { friend class X; }; 8620</pre></td></tr> 8621 8622 8623<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> 8624<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 8625matches the given matcher. 8626 8627The associated declaration is: 8628- for type nodes, the declaration of the underlying type 8629- for CallExpr, the declaration of the callee 8630- for MemberExpr, the declaration of the referenced member 8631- for CXXConstructExpr, the declaration of the constructor 8632- for CXXNewExpr, the declaration of the operator new 8633- for ObjCIvarExpr, the declaration of the ivar 8634 8635For type nodes, hasDeclaration will generally match the declaration of the 8636sugared type. Given 8637 class X {}; 8638 typedef X Y; 8639 Y y; 8640in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8641typedefDecl. A common use case is to match the underlying, desugared type. 8642This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8643 varDecl(hasType(hasUnqualifiedDesugaredType( 8644 recordType(hasDeclaration(decl()))))) 8645In this matcher, the decl will match the CXXRecordDecl of class X. 8646 8647Usable 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>>, 8648 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>>, 8649 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>>, 8650 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>>, 8651 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>>, 8652 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>>, 8653 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8654</pre></td></tr> 8655 8656 8657<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> 8658<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 8659type of the matched node. 8660 8661For example, in: 8662 class A {}; 8663 using B = A; 8664The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 8665both B and A. 8666</pre></td></tr> 8667 8668 8669<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> 8670<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 8671 8672Given 8673 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 8674unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 8675 matches sizeof(a) and alignof(c) 8676</pre></td></tr> 8677 8678 8679<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> 8680<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 8681 8682Example matches true (matcher = hasUnaryOperand( 8683 cxxBoolLiteral(equals(true)))) 8684 !true 8685</pre></td></tr> 8686 8687 8688<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> 8689<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 8690given matcher. Implicit object expressions are included; that is, it matches 8691use of implicit `this`. 8692 8693Given 8694 struct X { 8695 int m; 8696 int f(X x) { x.m; return m; } 8697 }; 8698memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 8699 matches `x.m`, but not `m`; however, 8700memberExpr(hasObjectExpression(hasType(pointsTo( 8701 cxxRecordDecl(hasName("X")))))) 8702 matches `m` (aka. `this->m`), but not `x.m`. 8703</pre></td></tr> 8704 8705 8706<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> 8707<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 8708matches the given matcher. 8709 8710The associated declaration is: 8711- for type nodes, the declaration of the underlying type 8712- for CallExpr, the declaration of the callee 8713- for MemberExpr, the declaration of the referenced member 8714- for CXXConstructExpr, the declaration of the constructor 8715- for CXXNewExpr, the declaration of the operator new 8716- for ObjCIvarExpr, the declaration of the ivar 8717 8718For type nodes, hasDeclaration will generally match the declaration of the 8719sugared type. Given 8720 class X {}; 8721 typedef X Y; 8722 Y y; 8723in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8724typedefDecl. A common use case is to match the underlying, desugared type. 8725This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8726 varDecl(hasType(hasUnqualifiedDesugaredType( 8727 recordType(hasDeclaration(decl()))))) 8728In this matcher, the decl will match the CXXRecordDecl of class X. 8729 8730Usable 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>>, 8731 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>>, 8732 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>>, 8733 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>>, 8734 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>>, 8735 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>>, 8736 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8737</pre></td></tr> 8738 8739 8740<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> 8741<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 8742 8743Given 8744 namespace X { void b(); } 8745 using X::b; 8746usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 8747 matches using X::b </pre></td></tr> 8748 8749 8750<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> 8751<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 8752matched by the given matcher. 8753 8754Given 8755 namespace X { int a; void b(); } 8756 using X::a; 8757 using X::b; 8758usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 8759 matches using X::b but not using X::a </pre></td></tr> 8760 8761 8762<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>></td><td class="name" onclick="toggle('hasType6')"><a name="hasType6Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8763<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 8764declaration's type. 8765 8766In case of a value declaration (for example a variable declaration), 8767this resolves one layer of indirection. For example, in the value 8768declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 8769X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 8770declaration of x. 8771 8772Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8773 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8774 and friend class X (matcher = friendDecl(hasType("X")) 8775 class X {}; 8776 void y(X &x) { x; X z; } 8777 class Y { friend class X; }; 8778 8779Example matches class Derived 8780(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 8781class Base {}; 8782class Derived : Base {}; 8783 8784Usable 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>>, 8785Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 8786</pre></td></tr> 8787 8788 8789<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> 8790<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 8791matcher. 8792 8793Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8794 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8795 and U (matcher = typedefDecl(hasType(asString("int"))) 8796 and friend class X (matcher = friendDecl(hasType("X")) 8797 class X {}; 8798 void y(X &x) { x; X z; } 8799 typedef int U; 8800 class Y { friend class X; }; 8801</pre></td></tr> 8802 8803 8804<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> 8805<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 8806that matches the given matcher. 8807 8808Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 8809 bool y() { return true; } 8810 bool x = y(); 8811</pre></td></tr> 8812 8813 8814<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> 8815<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 8816expression. 8817 8818Given 8819 void f(int b) { 8820 int a[b]; 8821 } 8822variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 8823 varDecl(hasName("b"))))))) 8824 matches "int a[b]" 8825</pre></td></tr> 8826 8827 8828<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> 8829<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr> 8830 8831 8832<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> 8833<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 8834switch statement or conditional operator. 8835 8836Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8837 if (true) {} 8838</pre></td></tr> 8839 8840<!--END_TRAVERSAL_MATCHERS --> 8841</table> 8842 8843</div> 8844</body> 8845</html> 8846 8847 8848