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('invocation0')"><a name="invocation0Anchor">invocation</a></td><td>Matcher<*>...Matcher<*></td></tr> 5617<tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls 5618 5619Because CallExpr and CXXConstructExpr do not share a common 5620base class with API accessing arguments etc, AST Matchers for code 5621which should match both are typically duplicated. This matcher 5622removes the need for duplication. 5623 5624Given code 5625struct ConstructorTakesInt 5626{ 5627 ConstructorTakesInt(int i) {} 5628}; 5629 5630void callTakesInt(int i) 5631{ 5632} 5633 5634void doCall() 5635{ 5636 callTakesInt(42); 5637} 5638 5639void doConstruct() 5640{ 5641 ConstructorTakesInt cti(42); 5642} 5643 5644The matcher 5645invocation(hasArgument(0, integerLiteral(equals(42)))) 5646matches the expression in both doCall and doConstruct 5647</pre></td></tr> 5648 5649 5650<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 5651<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 5652 5653Unlike anyOf, eachOf will generate a match result for each 5654matching submatcher. 5655 5656For example, in: 5657 class A { int a; int b; }; 5658The matcher: 5659 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 5660 has(fieldDecl(hasName("b")).bind("v")))) 5661will generate two results binding "v", the first of which binds 5662the field declaration of a, the second the field declaration of 5663b. 5664 5665Usable as: Any Matcher 5666</pre></td></tr> 5667 5668 5669<tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr> 5670<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 5671 5672Generates results for each match. 5673 5674For example, in: 5675 class A { class B {}; class C {}; }; 5676The matcher: 5677 cxxRecordDecl(hasName("::A"), 5678 findAll(cxxRecordDecl(isDefinition()).bind("m"))) 5679will generate results for A, B and C. 5680 5681Usable as: Any Matcher 5682</pre></td></tr> 5683 5684 5685<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 5686<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5687provided matcher. 5688 5689Example matches X, A, A::X, B, B::C, B::C::X 5690 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 5691 class X {}; 5692 class A { class X {}; }; // Matches A, because A::X is a class of name 5693 // X inside A. 5694 class B { class C { class X {}; }; }; 5695 5696DescendantT must be an AST base type. 5697 5698As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 5699each result that matches instead of only on the first one. 5700 5701Note: Recursively combined ForEachDescendant can cause many matches: 5702 cxxRecordDecl(forEachDescendant(cxxRecordDecl( 5703 forEachDescendant(cxxRecordDecl()) 5704 ))) 5705will match 10 times (plus injected class name matches) on: 5706 class A { class B { class C { class D { class E {}; }; }; }; }; 5707 5708Usable as: Any Matcher 5709</pre></td></tr> 5710 5711 5712<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 5713<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 5714provided matcher. 5715 5716Example matches X, Y, Y::X, Z::Y, Z::Y::X 5717 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 5718 class X {}; 5719 class Y { class X {}; }; // Matches Y, because Y::X is a class of name X 5720 // inside Y. 5721 class Z { class Y { class X {}; }; }; // Does not match Z. 5722 5723ChildT must be an AST base type. 5724 5725As opposed to 'has', 'forEach' will cause a match for each result that 5726matches instead of only on the first one. 5727 5728Usable as: Any Matcher 5729</pre></td></tr> 5730 5731 5732<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 5733<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 5734matcher. 5735 5736Given 5737void f() { if (true) { int x = 42; } } 5738void g() { for (;;) { int x = 43; } } 5739expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 5740 5741Usable as: Any Matcher 5742</pre></td></tr> 5743 5744 5745<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 5746<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5747provided matcher. 5748 5749Example matches X, Y, Z 5750 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 5751 class X {}; // Matches X, because X::X is a class of name X inside X. 5752 class Y { class X {}; }; 5753 class Z { class Y { class X {}; }; }; 5754 5755DescendantT must be an AST base type. 5756 5757Usable as: Any Matcher 5758</pre></td></tr> 5759 5760 5761<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 5762<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 5763provided matcher. 5764 5765Example matches X, Y 5766 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 5767 class X {}; // Matches X, because X::X is a class of name X inside X. 5768 class Y { class X {}; }; 5769 class Z { class Y { class X {}; }; }; // Does not match Z. 5770 5771ChildT must be an AST base type. 5772 5773Usable as: Any Matcher 5774Note that has is direct matcher, so it also matches things like implicit 5775casts and paren casts. If you are matching with expr then you should 5776probably consider using ignoringParenImpCasts like: 5777has(ignoringParenImpCasts(expr())). 5778</pre></td></tr> 5779 5780 5781<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 5782<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 5783matcher. 5784 5785Given 5786void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 5787compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 5788 5789Usable as: Any Matcher 5790</pre></td></tr> 5791 5792 5793<tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr> 5794<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher. 5795 5796However, optionally will retain any bindings generated by the submatcher. 5797Useful when additional information which may or may not present about a main 5798matching node is desired. 5799 5800For example, in: 5801 class Foo { 5802 int bar; 5803 } 5804The matcher: 5805 cxxRecordDecl( 5806 optionally(has( 5807 fieldDecl(hasName("bar")).bind("var") 5808 ))).bind("record") 5809will produce a result binding for both "record" and "var". 5810The matcher will produce a "record" binding for even if there is no data 5811member named "bar" in that class. 5812 5813Usable as: Any Matcher 5814</pre></td></tr> 5815 5816 5817<tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr> 5818<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind. 5819 5820Given 5821 void foo() 5822 { 5823 int i = 3.0; 5824 } 5825The matcher 5826 traverse(TK_IgnoreUnlessSpelledInSource, 5827 varDecl(hasInitializer(floatLiteral().bind("init"))) 5828 ) 5829matches the variable declaration with "init" bound to the "3.0". 5830</pre></td></tr> 5831 5832 5833<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> 5834<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 5835switch statement or conditional operator. 5836 5837Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5838 if (true) {} 5839</pre></td></tr> 5840 5841 5842<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> 5843<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 5844(binary or ternary). 5845 5846Example matches b 5847 condition ? a : b 5848 condition ?: b 5849</pre></td></tr> 5850 5851 5852<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> 5853<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 5854 5855Example 1 (conditional ternary operator): matches a 5856 condition ? a : b 5857 5858Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 5859 condition ?: b 5860</pre></td></tr> 5861 5862 5863<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> 5864<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 5865matches the given matcher. 5866 5867The associated declaration is: 5868- for type nodes, the declaration of the underlying type 5869- for CallExpr, the declaration of the callee 5870- for MemberExpr, the declaration of the referenced member 5871- for CXXConstructExpr, the declaration of the constructor 5872- for CXXNewExpr, the declaration of the operator new 5873- for ObjCIvarExpr, the declaration of the ivar 5874 5875For type nodes, hasDeclaration will generally match the declaration of the 5876sugared type. Given 5877 class X {}; 5878 typedef X Y; 5879 Y y; 5880in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5881typedefDecl. A common use case is to match the underlying, desugared type. 5882This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5883 varDecl(hasType(hasUnqualifiedDesugaredType( 5884 recordType(hasDeclaration(decl()))))) 5885In this matcher, the decl will match the CXXRecordDecl of class X. 5886 5887Usable 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>>, 5888 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>>, 5889 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>>, 5890 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>>, 5891 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>>, 5892 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>>, 5893 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5894</pre></td></tr> 5895 5896 5897<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> 5898<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 5899 5900Given 5901 int i[5]; 5902 void f() { i[1] = 42; } 5903arraySubscriptExpression(hasBase(implicitCastExpr( 5904 hasSourceExpression(declRefExpr())))) 5905 matches i[1] with the declRefExpr() matching i 5906</pre></td></tr> 5907 5908 5909<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> 5910<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 5911 5912Given 5913 int i[5]; 5914 void f() { i[1] = 42; } 5915arraySubscriptExpression(hasIndex(integerLiteral())) 5916 matches i[1] with the integerLiteral() matching 1 5917</pre></td></tr> 5918 5919 5920<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> 5921<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions. 5922 5923Example matches a (matcher = binaryOperator(hasLHS())) 5924 a || b 5925</pre></td></tr> 5926 5927 5928<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> 5929<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions. 5930 5931Example matches b (matcher = binaryOperator(hasRHS())) 5932 a || b 5933</pre></td></tr> 5934 5935 5936<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> 5937<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 5938type. 5939 5940Given 5941 struct A {}; 5942 A a[7]; 5943 int b[7]; 5944arrayType(hasElementType(builtinType())) 5945 matches "int b[7]" 5946 5947Usable 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>> 5948</pre></td></tr> 5949 5950 5951<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> 5952<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 5953 5954Given 5955 _Atomic(int) i; 5956 _Atomic(float) f; 5957atomicType(hasValueType(isInteger())) 5958 matches "_Atomic(int) i" 5959 5960Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 5961</pre></td></tr> 5962 5963 5964<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> 5965<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 5966 5967Note: There is no TypeLoc for the deduced type and thus no 5968getDeducedLoc() matcher. 5969 5970Given 5971 auto a = 1; 5972 auto b = 2.0; 5973autoType(hasDeducedType(isInteger())) 5974 matches "auto a" 5975 5976Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 5977</pre></td></tr> 5978 5979 5980<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> 5981<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 5982binary operator matches. 5983</pre></td></tr> 5984 5985 5986<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> 5987<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 5988 5989Example matches a (matcher = binaryOperator(hasLHS())) 5990 a || b 5991</pre></td></tr> 5992 5993 5994<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> 5995<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator. 5996 5997Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 5998 integerLiteral(equals(2))) 5999 1 + 2 // Match 6000 2 + 1 // Match 6001 1 + 1 // No match 6002 2 + 2 // No match 6003</pre></td></tr> 6004 6005 6006<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> 6007<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 6008 6009Example matches b (matcher = binaryOperator(hasRHS())) 6010 a || b 6011</pre></td></tr> 6012 6013 6014<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> 6015<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 6016block. 6017 6018Does not match the 'this' parameter of a method. 6019 6020Given 6021 class X { void f(int x, int y, int z) {} }; 6022cxxMethodDecl(hasAnyParameter(hasName("y"))) 6023 matches f(int x, int y, int z) {} 6024with hasAnyParameter(...) 6025 matching int y 6026 6027For ObjectiveC, given 6028 @interface I - (void) f:(int) y; @end 6029 6030the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 6031matches the declaration of method f with hasParameter 6032matching y. 6033 6034For blocks, given 6035 b = ^(int y) { printf("%d", y) }; 6036 6037the matcher blockDecl(hasAnyParameter(hasName("y"))) 6038matches the declaration of the block b with hasParameter 6039matching y. 6040</pre></td></tr> 6041 6042 6043<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> 6044<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 6045declaration or a block. 6046 6047Given 6048 class X { void f(int x) {} }; 6049cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6050 matches f(int x) {} 6051with hasParameter(...) 6052 matching int x 6053 6054For ObjectiveC, given 6055 @interface I - (void) f:(int) y; @end 6056 6057the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6058matches the declaration of method f with hasParameter 6059matching y. 6060</pre></td></tr> 6061 6062 6063<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> 6064<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 6065pointee matches a given matcher. 6066 6067Given 6068 int *a; 6069 int const *b; 6070 float const *f; 6071pointerType(pointee(isConstQualified(), isInteger())) 6072 matches "int const *b" 6073 6074Usable 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>>, 6075 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>> 6076</pre></td></tr> 6077 6078 6079<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> 6080<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value 6081declaration's type. 6082 6083In case of a value declaration (for example a variable declaration), 6084this resolves one layer of indirection. For example, in the value 6085declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6086X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6087declaration of x. 6088 6089Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6090 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6091 and friend class X (matcher = friendDecl(hasType("X")) 6092 class X {}; 6093 void y(X &x) { x; X z; } 6094 class Y { friend class X; }; 6095 6096Example matches class Derived 6097(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6098class Base {}; 6099class Derived : Base {}; 6100 6101Usable 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>>, 6102Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6103</pre></td></tr> 6104 6105 6106<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> 6107<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 6108 6109Given 6110 void f(int i); 6111 int y; 6112 f(y); 6113callExpr( 6114 forEachArgumentWithParam( 6115 declRefExpr(to(varDecl(hasName("y")))), 6116 parmVarDecl(hasType(isInteger())) 6117)) 6118 matches f(y); 6119with declRefExpr(...) 6120 matching int y 6121and parmVarDecl(...) 6122 matching int i 6123</pre></td></tr> 6124 6125 6126<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> 6127<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or 6128CXXConstructExpr. It is very similar to forEachArgumentWithParam but 6129it works on calls through function pointers as well. 6130 6131The difference is, that function pointers do not provide access to a 6132ParmVarDecl, but only the QualType for each argument. 6133 6134Given 6135 void f(int i); 6136 int y; 6137 f(y); 6138 void (*f_ptr)(int) = f; 6139 f_ptr(y); 6140callExpr( 6141 forEachArgumentWithParamType( 6142 declRefExpr(to(varDecl(hasName("y")))), 6143 qualType(isInteger()).bind("type) 6144)) 6145 matches f(y) and f_ptr(y) 6146with declRefExpr(...) 6147 matching int y 6148and qualType(...) 6149 matching int 6150</pre></td></tr> 6151 6152 6153<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> 6154<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 6155expression, or an ObjC-message-send expression. 6156 6157Given 6158 void x(int, int, int) { int y; x(1, y, 42); } 6159callExpr(hasAnyArgument(declRefExpr())) 6160 matches x(1, y, 42) 6161with hasAnyArgument(...) 6162 matching y 6163 6164For ObjectiveC, given 6165 @interface I - (void) f:(int) y; @end 6166 void foo(I *i) { [i f:12]; } 6167objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6168 matches [i f:12] 6169</pre></td></tr> 6170 6171 6172<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> 6173<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 6174call expression. 6175 6176Example matches y in x(y) 6177 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6178 void x(int) { int y; x(y); } 6179</pre></td></tr> 6180 6181 6182<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> 6183<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 6184matches the given matcher. 6185 6186The associated declaration is: 6187- for type nodes, the declaration of the underlying type 6188- for CallExpr, the declaration of the callee 6189- for MemberExpr, the declaration of the referenced member 6190- for CXXConstructExpr, the declaration of the constructor 6191- for CXXNewExpr, the declaration of the operator new 6192- for ObjCIvarExpr, the declaration of the ivar 6193 6194For type nodes, hasDeclaration will generally match the declaration of the 6195sugared type. Given 6196 class X {}; 6197 typedef X Y; 6198 Y y; 6199in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6200typedefDecl. A common use case is to match the underlying, desugared type. 6201This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6202 varDecl(hasType(hasUnqualifiedDesugaredType( 6203 recordType(hasDeclaration(decl()))))) 6204In this matcher, the decl will match the CXXRecordDecl of class X. 6205 6206Usable 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>>, 6207 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>>, 6208 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>>, 6209 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>>, 6210 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>>, 6211 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>>, 6212 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6213</pre></td></tr> 6214 6215 6216<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> 6217<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 6218 6219Given 6220 class A { A() : i(42), j(42) {} int i; int j; }; 6221cxxConstructorDecl(forEachConstructorInitializer( 6222 forField(decl().bind("x")) 6223)) 6224 will trigger two matches, binding for 'i' and 'j' respectively. 6225</pre></td></tr> 6226 6227 6228<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> 6229<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 6230 6231Given 6232 struct Foo { 6233 Foo() : foo_(1) { } 6234 int foo_; 6235 }; 6236cxxRecordDecl(has(cxxConstructorDecl( 6237 hasAnyConstructorInitializer(anything()) 6238))) 6239 record matches Foo, hasAnyConstructorInitializer matches foo_(1) 6240</pre></td></tr> 6241 6242 6243<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> 6244<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 6245 6246Given 6247 struct Foo { 6248 Foo() : foo_(1) { } 6249 int foo_; 6250 }; 6251cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6252 forField(hasName("foo_")))))) 6253 matches Foo 6254with forField matching foo_ 6255</pre></td></tr> 6256 6257 6258<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> 6259<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 6260 6261Given 6262 struct Foo { 6263 Foo() : foo_(1) { } 6264 int foo_; 6265 }; 6266cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6267 withInitializer(integerLiteral(equals(1))))))) 6268 matches Foo 6269with withInitializer matching (1) 6270</pre></td></tr> 6271 6272 6273<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> 6274<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 6275given matcher. Implicit object expressions are included; that is, it matches 6276use of implicit `this`. 6277 6278Given 6279 struct X { 6280 int m; 6281 int f(X x) { x.m; return m; } 6282 }; 6283memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6284 matches `x.m`, but not `m`; however, 6285memberExpr(hasObjectExpression(hasType(pointsTo( 6286 cxxRecordDecl(hasName("X")))))) 6287 matches `m` (aka. `this->m`), but not `x.m`. 6288</pre></td></tr> 6289 6290 6291<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> 6292<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr> 6293 6294 6295<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> 6296<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer. 6297 6298Given: 6299 void foo() { 6300 if (int i = foobar(); i > 0) {} 6301 switch (int i = foobar(); i) {} 6302 for (auto& a = get_range(); auto& x : a) {} 6303 } 6304 void bar() { 6305 if (foobar() > 0) {} 6306 switch (foobar()) {} 6307 for (auto& x : get_range()) {} 6308 } 6309ifStmt(hasInitStatement(anything())) 6310 matches the if statement in foo but not in bar. 6311switchStmt(hasInitStatement(anything())) 6312 matches the switch statement in foo but not in bar. 6313cxxForRangeStmt(hasInitStatement(anything())) 6314 matches the range for statement in foo but not in bar. 6315</pre></td></tr> 6316 6317 6318<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> 6319<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 6320 6321Example: 6322 forStmt(hasLoopVariable(anything())) 6323matches 'int x' in 6324 for (int x : a) { } 6325</pre></td></tr> 6326 6327 6328<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> 6329<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 6330 6331Example: 6332 forStmt(hasRangeInit(anything())) 6333matches 'a' in 6334 for (int x : a) { } 6335</pre></td></tr> 6336 6337 6338<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> 6339<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 6340`on`, matches the argument directly without stripping away anything. 6341 6342Given 6343 class Y { public: void m(); }; 6344 Y g(); 6345 class X : public Y { void g(); }; 6346 void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 6347cxxMemberCallExpr(onImplicitObjectArgument(hasType( 6348 cxxRecordDecl(hasName("Y"))))) 6349 matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 6350cxxMemberCallExpr(on(callExpr())) 6351 does not match `(g()).m()`, because the parens are not ignored. 6352 6353FIXME: Overload to allow directly matching types? 6354</pre></td></tr> 6355 6356 6357<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> 6358<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 6359stripping off any parentheses or implicit casts. 6360 6361Given 6362 class Y { public: void m(); }; 6363 Y g(); 6364 class X : public Y {}; 6365 void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 6366cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 6367 matches `y.m()` and `(g()).m()`. 6368cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 6369 matches `x.m()`. 6370cxxMemberCallExpr(on(callExpr())) 6371 matches `(g()).m()`. 6372 6373FIXME: Overload to allow directly matching types? 6374</pre></td></tr> 6375 6376 6377<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> 6378<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 6379</pre></td></tr> 6380 6381 6382<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> 6383<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 6384matches the InnerMatcher, or is a pointer to a type that matches the 6385InnerMatcher. 6386 6387Given 6388 class Y { public: void m(); }; 6389 class X : public Y { void g(); }; 6390 void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 6391cxxMemberCallExpr(thisPointerType(hasDeclaration( 6392 cxxRecordDecl(hasName("Y"))))) 6393 matches `y.m()`, `p->m()` and `x.m()`. 6394cxxMemberCallExpr(thisPointerType(hasDeclaration( 6395 cxxRecordDecl(hasName("X"))))) 6396 matches `x.g()`. 6397</pre></td></tr> 6398 6399 6400<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> 6401<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 6402produce multiple matches. 6403 6404Given 6405 class A { virtual void f(); }; 6406 class B : public A { void f(); }; 6407 class C : public B { void f(); }; 6408cxxMethodDecl(ofClass(hasName("C")), 6409 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6410 matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 6411 that B::f is not overridden by C::f). 6412 6413The check can produce multiple matches in case of multiple inheritance, e.g. 6414 class A1 { virtual void f(); }; 6415 class A2 { virtual void f(); }; 6416 class C : public A1, public A2 { void f(); }; 6417cxxMethodDecl(ofClass(hasName("C")), 6418 forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6419 matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 6420 once with "b" binding "A2::f" and "d" binding "C::f". 6421</pre></td></tr> 6422 6423 6424<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> 6425<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 6426belongs to. 6427 6428FIXME: Generalize this for other kinds of declarations. 6429FIXME: What other kind of declarations would we need to generalize 6430this to? 6431 6432Example matches A() in the last line 6433 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 6434 ofClass(hasName("A")))))) 6435 class A { 6436 public: 6437 A(); 6438 }; 6439 A a = A(); 6440</pre></td></tr> 6441 6442 6443<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> 6444<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments. 6445 6446Given: 6447 MyClass *p1 = new (Storage) MyClass(); 6448cxxNewExpr(hasAnyPlacementArg(anything())) 6449 matches the expression 'new (Storage, 16) MyClass()'. 6450</pre></td></tr> 6451 6452 6453<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> 6454<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 6455 6456Given: 6457 MyClass *p1 = new MyClass[10]; 6458cxxNewExpr(hasArraySize(integerLiteral(equals(10)))) 6459 matches the expression 'new MyClass[10]'. 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('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> 6464<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 6465matches the given matcher. 6466 6467The associated declaration is: 6468- for type nodes, the declaration of the underlying type 6469- for CallExpr, the declaration of the callee 6470- for MemberExpr, the declaration of the referenced member 6471- for CXXConstructExpr, the declaration of the constructor 6472- for CXXNewExpr, the declaration of the operator new 6473- for ObjCIvarExpr, the declaration of the ivar 6474 6475For type nodes, hasDeclaration will generally match the declaration of the 6476sugared type. Given 6477 class X {}; 6478 typedef X Y; 6479 Y y; 6480in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6481typedefDecl. A common use case is to match the underlying, desugared type. 6482This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6483 varDecl(hasType(hasUnqualifiedDesugaredType( 6484 recordType(hasDeclaration(decl()))))) 6485In this matcher, the decl will match the CXXRecordDecl of class X. 6486 6487Usable 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>>, 6488 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>>, 6489 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>>, 6490 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>>, 6491 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>>, 6492 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>>, 6493 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6494</pre></td></tr> 6495 6496 6497<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> 6498<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments. 6499 6500Given: 6501 MyClass *p1 = new (Storage, 16) MyClass(); 6502cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16)))) 6503 matches the expression 'new (Storage, 16) MyClass()'. 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('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> 6508<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a 6509binary operator matches. 6510</pre></td></tr> 6511 6512 6513<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> 6514<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 6515 6516Example matches a (matcher = binaryOperator(hasLHS())) 6517 a || b 6518</pre></td></tr> 6519 6520 6521<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> 6522<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator. 6523 6524Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6525 integerLiteral(equals(2))) 6526 1 + 2 // Match 6527 2 + 1 // Match 6528 1 + 1 // No match 6529 2 + 2 // No match 6530</pre></td></tr> 6531 6532 6533<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> 6534<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 6535 6536Example matches b (matcher = binaryOperator(hasRHS())) 6537 a || b 6538</pre></td></tr> 6539 6540 6541<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> 6542<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches. 6543 6544Example matches true (matcher = hasUnaryOperand( 6545 cxxBoolLiteral(equals(true)))) 6546 !true 6547</pre></td></tr> 6548 6549 6550<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> 6551<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher. 6552 6553Example: 6554matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6555 class Foo; 6556 class Bar : Foo {}; 6557 class Baz : Bar {}; 6558 class SpecialBase; 6559 class Proxy : SpecialBase {}; // matches Proxy 6560 class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived 6561 6562FIXME: Refactor this and isDerivedFrom to reuse implementation. 6563</pre></td></tr> 6564 6565 6566<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> 6567<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher. 6568 6569Example: 6570matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6571 class Foo; 6572 class Bar : Foo {}; 6573 class Baz : Bar {}; 6574 class SpecialBase; 6575 class Proxy : SpecialBase {}; // matches Proxy 6576 class IndirectlyDerived : Proxy {}; // doesn't match 6577</pre></td></tr> 6578 6579 6580<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> 6581<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 6582 6583Given: 6584 class A { void func(); }; 6585 class B { void member(); }; 6586 6587cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 6588A but not B. 6589</pre></td></tr> 6590 6591 6592<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> 6593<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class 6594matching Base, or Objective-C classes that directly or indirectly 6595subclass a class matching Base. 6596 6597Note that a class is not considered to be derived from itself. 6598 6599Example matches Y, Z, C (Base == hasName("X")) 6600 class X; 6601 class Y : public X {}; // directly derived 6602 class Z : public Y {}; // indirectly derived 6603 typedef X A; 6604 typedef A B; 6605 class C : public B {}; // derived from a typedef of X 6606 6607In the following example, Bar matches isDerivedFrom(hasName("X")): 6608 class Foo; 6609 typedef Foo X; 6610 class Bar : public Foo {}; // derived from a type that X is a typedef of 6611 6612In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 6613 @interface NSObject @end 6614 @interface Bar : NSObject @end 6615 6616Usable 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>> 6617</pre></td></tr> 6618 6619 6620<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> 6621<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class 6622matching Base. 6623 6624Note that a class is not considered to be derived from itself. 6625 6626Example matches Y, C (Base == hasName("X")) 6627 class X; 6628 class Y : public X {}; // directly derived 6629 class Z : public Y {}; // indirectly derived 6630 typedef X A; 6631 typedef A B; 6632 class C : public B {}; // derived from a typedef of X 6633 6634In the following example, Bar matches isDerivedFrom(hasName("X")): 6635 class Foo; 6636 typedef Foo X; 6637 class Bar : public Foo {}; // derived from a type that X is a typedef of 6638</pre></td></tr> 6639 6640 6641<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> 6642<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 6643match Base. 6644</pre></td></tr> 6645 6646 6647<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> 6648<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a 6649binary operator matches. 6650</pre></td></tr> 6651 6652 6653<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> 6654<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions. 6655 6656Example matches a (matcher = binaryOperator(hasLHS())) 6657 a || b 6658</pre></td></tr> 6659 6660 6661<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> 6662<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator. 6663 6664Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6665 integerLiteral(equals(2))) 6666 1 + 2 // Match 6667 2 + 1 // Match 6668 1 + 1 // No match 6669 2 + 2 // No match 6670</pre></td></tr> 6671 6672 6673<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> 6674<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions. 6675 6676Example matches b (matcher = binaryOperator(hasRHS())) 6677 a || b 6678</pre></td></tr> 6679 6680 6681<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> 6682<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 6683expression, or an ObjC-message-send expression. 6684 6685Given 6686 void x(int, int, int) { int y; x(1, y, 42); } 6687callExpr(hasAnyArgument(declRefExpr())) 6688 matches x(1, y, 42) 6689with hasAnyArgument(...) 6690 matching y 6691 6692For ObjectiveC, given 6693 @interface I - (void) f:(int) y; @end 6694 void foo(I *i) { [i f:12]; } 6695objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6696 matches [i f:12] 6697</pre></td></tr> 6698 6699 6700<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> 6701<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 6702call expression. 6703 6704Example matches y in x(y) 6705 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6706 void x(int) { int y; x(y); } 6707</pre></td></tr> 6708 6709 6710<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> 6711<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 6712given matcher. 6713 6714Example matches y.x() (matcher = callExpr(callee( 6715 cxxMethodDecl(hasName("x"))))) 6716 class Y { public: void x(); }; 6717 void z() { Y y; y.x(); } 6718</pre></td></tr> 6719 6720 6721<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> 6722<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 6723 6724Given 6725 class Y { void x() { this->x(); x(); Y y; y.x(); } }; 6726 void f() { f(); } 6727callExpr(callee(expr())) 6728 matches this->x(), x(), y.x(), f() 6729with callee(...) 6730 matching this->x, x, y.x, f respectively 6731 6732Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 6733because this introduces ambiguous overloads with calls to Callee taking a 6734internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 6735implemented in terms of implicit casts. 6736</pre></td></tr> 6737 6738 6739<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> 6740<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 6741 6742Given 6743 void f(int i); 6744 int y; 6745 f(y); 6746callExpr( 6747 forEachArgumentWithParam( 6748 declRefExpr(to(varDecl(hasName("y")))), 6749 parmVarDecl(hasType(isInteger())) 6750)) 6751 matches f(y); 6752with declRefExpr(...) 6753 matching int y 6754and parmVarDecl(...) 6755 matching int i 6756</pre></td></tr> 6757 6758 6759<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> 6760<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or 6761CXXConstructExpr. It is very similar to forEachArgumentWithParam but 6762it works on calls through function pointers as well. 6763 6764The difference is, that function pointers do not provide access to a 6765ParmVarDecl, but only the QualType for each argument. 6766 6767Given 6768 void f(int i); 6769 int y; 6770 f(y); 6771 void (*f_ptr)(int) = f; 6772 f_ptr(y); 6773callExpr( 6774 forEachArgumentWithParamType( 6775 declRefExpr(to(varDecl(hasName("y")))), 6776 qualType(isInteger()).bind("type) 6777)) 6778 matches f(y) and f_ptr(y) 6779with declRefExpr(...) 6780 matching int y 6781and qualType(...) 6782 matching int 6783</pre></td></tr> 6784 6785 6786<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> 6787<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 6788expression, or an ObjC-message-send expression. 6789 6790Given 6791 void x(int, int, int) { int y; x(1, y, 42); } 6792callExpr(hasAnyArgument(declRefExpr())) 6793 matches x(1, y, 42) 6794with hasAnyArgument(...) 6795 matching y 6796 6797For ObjectiveC, given 6798 @interface I - (void) f:(int) y; @end 6799 void foo(I *i) { [i f:12]; } 6800objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6801 matches [i f:12] 6802</pre></td></tr> 6803 6804 6805<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> 6806<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 6807call expression. 6808 6809Example matches y in x(y) 6810 (matcher = callExpr(hasArgument(0, declRefExpr()))) 6811 void x(int) { int y; x(y); } 6812</pre></td></tr> 6813 6814 6815<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> 6816<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 6817matches the given matcher. 6818 6819The associated declaration is: 6820- for type nodes, the declaration of the underlying type 6821- for CallExpr, the declaration of the callee 6822- for MemberExpr, the declaration of the referenced member 6823- for CXXConstructExpr, the declaration of the constructor 6824- for CXXNewExpr, the declaration of the operator new 6825- for ObjCIvarExpr, the declaration of the ivar 6826 6827For type nodes, hasDeclaration will generally match the declaration of the 6828sugared type. Given 6829 class X {}; 6830 typedef X Y; 6831 Y y; 6832in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6833typedefDecl. A common use case is to match the underlying, desugared type. 6834This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6835 varDecl(hasType(hasUnqualifiedDesugaredType( 6836 recordType(hasDeclaration(decl()))))) 6837In this matcher, the decl will match the CXXRecordDecl of class X. 6838 6839Usable 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>>, 6840 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>>, 6841 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>>, 6842 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>>, 6843 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>>, 6844 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>>, 6845 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6846</pre></td></tr> 6847 6848 6849<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> 6850<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 6851extension, matches the constant given in the statement. 6852 6853Given 6854 switch (1) { case 1: case 1+1: case 3 ... 4: ; } 6855caseStmt(hasCaseConstant(integerLiteral())) 6856 matches "case 1:" 6857</pre></td></tr> 6858 6859 6860<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> 6861<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 6862or opaque value's source expression matches the given matcher. 6863 6864Example 1: matches "a string" 6865(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 6866class URL { URL(string); }; 6867URL url = "a string"; 6868 6869Example 2: matches 'b' (matcher = 6870opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 6871int a = b ?: 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('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> 6876<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6877functionDecl that have at least one TemplateArgument matching the given 6878InnerMatcher. 6879 6880Given 6881 template<typename T> class A {}; 6882 template<> class A<double> {}; 6883 A<int> a; 6884 6885 template<typename T> f() {}; 6886 void func() { f<int>(); }; 6887 6888classTemplateSpecializationDecl(hasAnyTemplateArgument( 6889 refersToType(asString("int")))) 6890 matches the specialization A<int> 6891 6892functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 6893 matches the specialization f<int> 6894</pre></td></tr> 6895 6896 6897<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> 6898<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 6899 6900Given 6901 template<typename T> class A {}; #1 6902 template<> class A<int> {}; #2 6903classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 6904 matches '#2' with classTemplateDecl() matching the class template 6905 declaration of 'A' at #1. 6906</pre></td></tr> 6907 6908 6909<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> 6910<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 6911functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 6912 6913Given 6914 template<typename T, typename U> class A {}; 6915 A<bool, int> b; 6916 A<int, bool> c; 6917 6918 template<typename T> void f() {} 6919 void func() { f<int>(); }; 6920classTemplateSpecializationDecl(hasTemplateArgument( 6921 1, refersToType(asString("int")))) 6922 matches the specialization A<bool, int> 6923 6924functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 6925 matches the specialization f<int> 6926</pre></td></tr> 6927 6928 6929<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> 6930<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 6931type. 6932 6933Given 6934 struct A {}; 6935 A a[7]; 6936 int b[7]; 6937arrayType(hasElementType(builtinType())) 6938 matches "int b[7]" 6939 6940Usable 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>> 6941</pre></td></tr> 6942 6943 6944<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> 6945<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 6946a given matcher. Also matches StmtExprs that have CompoundStmt as children. 6947 6948Given 6949 { {}; 1+2; } 6950hasAnySubstatement(compoundStmt()) 6951 matches '{ {}; 1+2; }' 6952with compoundStmt() 6953 matching '{}' 6954</pre></td></tr> 6955 6956 6957<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> 6958<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher 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('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> 6963<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 6964matches the given matcher. 6965 6966The associated declaration is: 6967- for type nodes, the declaration of the underlying type 6968- for CallExpr, the declaration of the callee 6969- for MemberExpr, the declaration of the referenced member 6970- for CXXConstructExpr, the declaration of the constructor 6971- for CXXNewExpr, the declaration of the operator new 6972- for ObjCIvarExpr, the declaration of the ivar 6973 6974For type nodes, hasDeclaration will generally match the declaration of the 6975sugared type. Given 6976 class X {}; 6977 typedef X Y; 6978 Y y; 6979in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6980typedefDecl. A common use case is to match the underlying, desugared type. 6981This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6982 varDecl(hasType(hasUnqualifiedDesugaredType( 6983 recordType(hasDeclaration(decl()))))) 6984In this matcher, the decl will match the CXXRecordDecl of class X. 6985 6986Usable 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>>, 6987 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>>, 6988 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>>, 6989 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>>, 6990 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>>, 6991 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>>, 6992 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6993</pre></td></tr> 6994 6995 6996<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> 6997<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 6998specific using shadow declaration. 6999 7000Given 7001 namespace a { void f() {} } 7002 using a::f; 7003 void g() { 7004 f(); // Matches this .. 7005 a::f(); // .. but not this. 7006 } 7007declRefExpr(throughUsingDecl(anything())) 7008 matches f() 7009</pre></td></tr> 7010 7011 7012<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> 7013<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 7014specified matcher. 7015 7016Example matches x in if(x) 7017 (matcher = declRefExpr(to(varDecl(hasName("x"))))) 7018 bool x; 7019 if (x) {} 7020</pre></td></tr> 7021 7022 7023<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> 7024<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 7025 7026Note that this does not work for global declarations because the AST 7027breaks up multiple-declaration DeclStmt's into multiple single-declaration 7028DeclStmt's. 7029Example: Given non-global declarations 7030 int a, b = 0; 7031 int c; 7032 int d = 2, e; 7033declStmt(containsDeclaration( 7034 0, varDecl(hasInitializer(anything())))) 7035 matches only 'int d = 2, e;', and 7036declStmt(containsDeclaration(1, varDecl())) 7037 matches 'int a, b = 0' as well as 'int d = 2, e;' 7038 but 'int c;' is not matched. 7039</pre></td></tr> 7040 7041 7042<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> 7043<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 7044 7045Given 7046 int a, b; 7047 int c; 7048declStmt(hasSingleDecl(anything())) 7049 matches 'int c;' but not 'int a, b;'. 7050</pre></td></tr> 7051 7052 7053<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> 7054<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 7055the inner matcher. 7056 7057Given 7058 int x; 7059declaratorDecl(hasTypeLoc(loc(asString("int")))) 7060 matches int x 7061</pre></td></tr> 7062 7063 7064<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> 7065<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 7066Decl, matches InnerMatcher. 7067 7068Given 7069 namespace N { 7070 namespace M { 7071 class D {}; 7072 } 7073 } 7074 7075cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 7076declaration of class D. 7077</pre></td></tr> 7078 7079 7080<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> 7081<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type. 7082 7083Given 7084 decltype(1) a = 1; 7085 decltype(2.0) b = 2.0; 7086decltypeType(hasUnderlyingType(isInteger())) 7087 matches the type of "a" 7088 7089Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>> 7090</pre></td></tr> 7091 7092 7093<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> 7094<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr> 7095 7096 7097<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> 7098<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 7099switch statement or conditional operator. 7100 7101Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7102 if (true) {} 7103</pre></td></tr> 7104 7105 7106<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> 7107<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 7108matches InnerMatcher if the qualifier exists. 7109 7110Given 7111 namespace N { 7112 namespace M { 7113 class D {}; 7114 } 7115 } 7116 N::M::D d; 7117 7118elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 7119matches the type of the variable declaration of d. 7120</pre></td></tr> 7121 7122 7123<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> 7124<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 7125 7126Given 7127 namespace N { 7128 namespace M { 7129 class D {}; 7130 } 7131 } 7132 N::M::D d; 7133 7134elaboratedType(namesType(recordType( 7135hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 7136declaration of d. 7137</pre></td></tr> 7138 7139 7140<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> 7141<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 7142matches the given matcher. 7143 7144The associated declaration is: 7145- for type nodes, the declaration of the underlying type 7146- for CallExpr, the declaration of the callee 7147- for MemberExpr, the declaration of the referenced member 7148- for CXXConstructExpr, the declaration of the constructor 7149- for CXXNewExpr, the declaration of the operator new 7150- for ObjCIvarExpr, the declaration of the ivar 7151 7152For type nodes, hasDeclaration will generally match the declaration of the 7153sugared type. Given 7154 class X {}; 7155 typedef X Y; 7156 Y y; 7157in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7158typedefDecl. A common use case is to match the underlying, desugared type. 7159This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7160 varDecl(hasType(hasUnqualifiedDesugaredType( 7161 recordType(hasDeclaration(decl()))))) 7162In this matcher, the decl will match the CXXRecordDecl of class X. 7163 7164Usable 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>>, 7165 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>>, 7166 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>>, 7167 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>>, 7168 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>>, 7169 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>>, 7170 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7171</pre></td></tr> 7172 7173 7174<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> 7175<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 7176 7177(Note: Clang's AST refers to other conversions as "casts" too, and calls 7178actual casts "explicit" casts.) 7179</pre></td></tr> 7180 7181 7182<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> 7183<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value 7184declaration's type. 7185 7186In case of a value declaration (for example a variable declaration), 7187this resolves one layer of indirection. For example, in the value 7188declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7189X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7190declaration of x. 7191 7192Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7193 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7194 and friend class X (matcher = friendDecl(hasType("X")) 7195 class X {}; 7196 void y(X &x) { x; X z; } 7197 class Y { friend class X; }; 7198 7199Example matches class Derived 7200(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7201class Base {}; 7202class Derived : Base {}; 7203 7204Usable 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>>, 7205Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7206</pre></td></tr> 7207 7208 7209<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> 7210<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 7211matcher. 7212 7213Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7214 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7215 and U (matcher = typedefDecl(hasType(asString("int"))) 7216 and friend class X (matcher = friendDecl(hasType("X")) 7217 class X {}; 7218 void y(X &x) { x; X z; } 7219 typedef int U; 7220 class Y { friend class X; }; 7221</pre></td></tr> 7222 7223 7224<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> 7225<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 7226elidable constructor and other corresponding bookkeeping nodes. 7227 7228In C++17, elidable copy constructors are no longer being generated in the 7229AST as it is not permitted by the standard. They are, however, part of the 7230AST in C++14 and earlier. So, a matcher must abstract over these differences 7231to work in all language modes. This matcher skips elidable constructor-call 7232AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 7233various implicit nodes inside the constructor calls, all of which will not 7234appear in the C++17 AST. 7235 7236Given 7237 7238struct H {}; 7239H G(); 7240void f() { 7241 H D = G(); 7242} 7243 7244``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 7245matches ``H D = G()`` in C++11 through C++17 (and beyond). 7246</pre></td></tr> 7247 7248 7249<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> 7250<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 7251are stripped off. 7252 7253Parentheses and explicit casts are not discarded. 7254Given 7255 int arr[5]; 7256 int a = 0; 7257 char b = 0; 7258 const int c = a; 7259 int *d = arr; 7260 long e = (long) 0l; 7261The matchers 7262 varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 7263 varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 7264would match the declarations for a, b, c, and d, but not e. 7265While 7266 varDecl(hasInitializer(integerLiteral())) 7267 varDecl(hasInitializer(declRefExpr())) 7268only match the declarations for b, c, and d. 7269</pre></td></tr> 7270 7271 7272<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> 7273<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 7274nodes are stripped off. 7275 7276Parentheses and explicit casts are not discarded. 7277Given 7278 class C {}; 7279 C a = C(); 7280 C b; 7281 C c = b; 7282The matchers 7283 varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 7284would match the declarations for a, b, and c. 7285While 7286 varDecl(hasInitializer(cxxConstructExpr())) 7287only match the declarations for b and c. 7288</pre></td></tr> 7289 7290 7291<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> 7292<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 7293casts are stripped off. 7294 7295Implicit and non-C Style casts are also discarded. 7296Given 7297 int a = 0; 7298 char b = (0); 7299 void* c = reinterpret_cast<char*>(0); 7300 char d = char(0); 7301The matcher 7302 varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 7303would match the declarations for a, b, c, and d. 7304while 7305 varDecl(hasInitializer(integerLiteral())) 7306only match the declaration for a. 7307</pre></td></tr> 7308 7309 7310<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> 7311<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 7312parentheses are stripped off. 7313 7314Explicit casts are not discarded. 7315Given 7316 int arr[5]; 7317 int a = 0; 7318 char b = (0); 7319 const int c = a; 7320 int *d = (arr); 7321 long e = ((long) 0l); 7322The matchers 7323 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 7324 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 7325would match the declarations for a, b, c, and d, but not e. 7326while 7327 varDecl(hasInitializer(integerLiteral())) 7328 varDecl(hasInitializer(declRefExpr())) 7329would only match the declaration for a. 7330</pre></td></tr> 7331 7332 7333<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> 7334<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 7335 7336Given 7337 const char* str = ("my-string"); 7338The matcher 7339 implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 7340would match the implicit cast resulting from the assignment. 7341</pre></td></tr> 7342 7343 7344<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> 7345<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 7346 7347Given 7348 class C { 7349 int a = 2; 7350 int b = 3; 7351 int c; 7352 }; 7353fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 7354 matches 'int a;' but not 'int b;'. 7355fieldDecl(hasInClassInitializer(anything())) 7356 matches 'int a;' and 'int b;' but not 'int c;'. 7357</pre></td></tr> 7358 7359 7360<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> 7361<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr> 7362 7363 7364<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> 7365<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 7366switch statement or conditional operator. 7367 7368Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7369 if (true) {} 7370</pre></td></tr> 7371 7372 7373<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> 7374<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 7375 7376Example: 7377 forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 7378matches '++x' in 7379 for (x; x < N; ++x) { } 7380</pre></td></tr> 7381 7382 7383<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> 7384<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 7385 7386Example: 7387 forStmt(hasLoopInit(declStmt())) 7388matches 'int x = 0' in 7389 for (int x = 0; x < N; ++x) { } 7390</pre></td></tr> 7391 7392 7393<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> 7394<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 7395declaration's type. 7396 7397In case of a value declaration (for example a variable declaration), 7398this resolves one layer of indirection. For example, in the value 7399declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7400X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7401declaration of x. 7402 7403Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7404 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7405 and friend class X (matcher = friendDecl(hasType("X")) 7406 class X {}; 7407 void y(X &x) { x; X z; } 7408 class Y { friend class X; }; 7409 7410Example matches class Derived 7411(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7412class Base {}; 7413class Derived : Base {}; 7414 7415Usable 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>>, 7416Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7417</pre></td></tr> 7418 7419 7420<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> 7421<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 7422matcher. 7423 7424Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7425 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7426 and U (matcher = typedefDecl(hasType(asString("int"))) 7427 and friend class X (matcher = friendDecl(hasType("X")) 7428 class X {}; 7429 void y(X &x) { x; X z; } 7430 typedef int U; 7431 class Y { friend class X; }; 7432</pre></td></tr> 7433 7434 7435<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> 7436<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST. 7437Note that this matcher matches all the declarations of a function whose 7438body is present in the AST. 7439 7440Given 7441 void f(); 7442 void f() {} 7443 void g(); 7444hasAnyBody(functionDecl()) 7445 matches both 'void f();' 7446 and 'void f() {}' 7447with compoundStmt() 7448 matching '{}' 7449 but does not match 'void g();' 7450</pre></td></tr> 7451 7452 7453<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> 7454<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 7455block. 7456 7457Does not match the 'this' parameter of a method. 7458 7459Given 7460 class X { void f(int x, int y, int z) {} }; 7461cxxMethodDecl(hasAnyParameter(hasName("y"))) 7462 matches f(int x, int y, int z) {} 7463with hasAnyParameter(...) 7464 matching int y 7465 7466For ObjectiveC, given 7467 @interface I - (void) f:(int) y; @end 7468 7469the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 7470matches the declaration of method f with hasParameter 7471matching y. 7472 7473For blocks, given 7474 b = ^(int y) { printf("%d", y) }; 7475 7476the matcher blockDecl(hasAnyParameter(hasName("y"))) 7477matches the declaration of the block b with hasParameter 7478matching y. 7479</pre></td></tr> 7480 7481 7482<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> 7483<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7484functionDecl that have at least one TemplateArgument matching the given 7485InnerMatcher. 7486 7487Given 7488 template<typename T> class A {}; 7489 template<> class A<double> {}; 7490 A<int> a; 7491 7492 template<typename T> f() {}; 7493 void func() { f<int>(); }; 7494 7495classTemplateSpecializationDecl(hasAnyTemplateArgument( 7496 refersToType(asString("int")))) 7497 matches the specialization A<int> 7498 7499functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7500 matches the specialization f<int> 7501</pre></td></tr> 7502 7503 7504<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> 7505<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr> 7506 7507 7508<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> 7509<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 7510declaration. 7511 7512Given 7513 template<bool b> 7514 struct S { 7515 S(int); // #1 7516 explicit S(double); // #2 7517 operator int(); // #3 7518 explicit operator bool(); // #4 7519 explicit(false) S(bool) // # 7 7520 explicit(true) S(char) // # 8 7521 explicit(b) S(S) // # 9 7522 }; 7523 S(int) -> S<true> // #5 7524 explicit S(double) -> S<false> // #6 7525cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 7526cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 7527cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 7528</pre></td></tr> 7529 7530 7531<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> 7532<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 7533declaration or a block. 7534 7535Given 7536 class X { void f(int x) {} }; 7537cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 7538 matches f(int x) {} 7539with hasParameter(...) 7540 matching int x 7541 7542For ObjectiveC, given 7543 @interface I - (void) f:(int) y; @end 7544 7545the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 7546matches the declaration of method f with hasParameter 7547matching y. 7548</pre></td></tr> 7549 7550 7551<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> 7552<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7553functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7554 7555Given 7556 template<typename T, typename U> class A {}; 7557 A<bool, int> b; 7558 A<int, bool> c; 7559 7560 template<typename T> void f() {} 7561 void func() { f<int>(); }; 7562classTemplateSpecializationDecl(hasTemplateArgument( 7563 1, refersToType(asString("int")))) 7564 matches the specialization A<bool, int> 7565 7566functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7567 matches the specialization f<int> 7568</pre></td></tr> 7569 7570 7571<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> 7572<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 7573 7574Given: 7575 class X { int f() { return 1; } }; 7576cxxMethodDecl(returns(asString("int"))) 7577 matches int f() { return 1; } 7578</pre></td></tr> 7579 7580 7581<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> 7582<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 7583switch statement or conditional operator. 7584 7585Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7586 if (true) {} 7587</pre></td></tr> 7588 7589 7590<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> 7591<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 7592 7593Given 7594 if (A* a = GetAPointer()) {} 7595hasConditionVariableStatement(...) 7596 matches 'A* a = GetAPointer()'. 7597</pre></td></tr> 7598 7599 7600<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> 7601<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 7602 7603Examples matches the if statement 7604 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 7605 if (false) false; else true; 7606</pre></td></tr> 7607 7608 7609<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> 7610<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 7611 7612Given: 7613 void foo() { 7614 if (int i = foobar(); i > 0) {} 7615 switch (int i = foobar(); i) {} 7616 for (auto& a = get_range(); auto& x : a) {} 7617 } 7618 void bar() { 7619 if (foobar() > 0) {} 7620 switch (foobar()) {} 7621 for (auto& x : get_range()) {} 7622 } 7623ifStmt(hasInitStatement(anything())) 7624 matches the if statement in foo but not in bar. 7625switchStmt(hasInitStatement(anything())) 7626 matches the switch statement in foo but not in bar. 7627cxxForRangeStmt(hasInitStatement(anything())) 7628 matches the range for statement in foo but not in bar. 7629</pre></td></tr> 7630 7631 7632<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> 7633<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 7634 7635Examples matches the if statement 7636 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 7637 if (false) true; else false; 7638</pre></td></tr> 7639 7640 7641<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> 7642<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 7643matcher. 7644 7645FIXME: Unit test this matcher 7646</pre></td></tr> 7647 7648 7649<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> 7650<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 7651 7652Example matches y. 7653 (matcher = initListExpr(hasInit(0, expr()))) 7654 int x{y}. 7655</pre></td></tr> 7656 7657 7658<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> 7659<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 7660(if expression have it). 7661</pre></td></tr> 7662 7663 7664<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> 7665<tr><td colspan="4" class="doc" id="hasDeclaration9"><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_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> 7699<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 7700matches the given matcher. 7701 7702The associated declaration is: 7703- for type nodes, the declaration of the underlying type 7704- for CallExpr, the declaration of the callee 7705- for MemberExpr, the declaration of the referenced member 7706- for CXXConstructExpr, the declaration of the constructor 7707- for CXXNewExpr, the declaration of the operator new 7708- for ObjCIvarExpr, the declaration of the ivar 7709 7710For type nodes, hasDeclaration will generally match the declaration of the 7711sugared type. Given 7712 class X {}; 7713 typedef X Y; 7714 Y y; 7715in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7716typedefDecl. A common use case is to match the underlying, desugared type. 7717This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7718 varDecl(hasType(hasUnqualifiedDesugaredType( 7719 recordType(hasDeclaration(decl()))))) 7720In this matcher, the decl will match the CXXRecordDecl of class X. 7721 7722Usable 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>>, 7723 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>>, 7724 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>>, 7725 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>>, 7726 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>>, 7727 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>>, 7728 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7729</pre></td></tr> 7730 7731 7732<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> 7733<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression. 7734 7735Given 7736 struct foo { 7737 void bar() { 7738 auto f = [this](){}; 7739 } 7740 } 7741lambdaExpr(hasAnyCapture(cxxThisExpr())) 7742 matches [this](){}; 7743</pre></td></tr> 7744 7745 7746<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> 7747<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression. 7748 7749Given 7750 void foo() { 7751 int x; 7752 auto f = [x](){}; 7753 } 7754lambdaExpr(hasAnyCapture(anything())) 7755 matches [x](){}; 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('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> 7760<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 7761matches the given matcher. 7762 7763The associated declaration is: 7764- for type nodes, the declaration of the underlying type 7765- for CallExpr, the declaration of the callee 7766- for MemberExpr, the declaration of the referenced member 7767- for CXXConstructExpr, the declaration of the constructor 7768- for CXXNewExpr, the declaration of the operator new 7769- for ObjCIvarExpr, the declaration of the ivar 7770 7771For type nodes, hasDeclaration will generally match the declaration of the 7772sugared type. Given 7773 class X {}; 7774 typedef X Y; 7775 Y y; 7776in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7777typedefDecl. A common use case is to match the underlying, desugared type. 7778This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7779 varDecl(hasType(hasUnqualifiedDesugaredType( 7780 recordType(hasDeclaration(decl()))))) 7781In this matcher, the decl will match the CXXRecordDecl of class X. 7782 7783Usable 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>>, 7784 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>>, 7785 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>>, 7786 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>>, 7787 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>>, 7788 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>>, 7789 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7790</pre></td></tr> 7791 7792 7793<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> 7794<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 7795given matcher. Implicit object expressions are included; that is, it matches 7796use of implicit `this`. 7797 7798Given 7799 struct X { 7800 int m; 7801 int f(X x) { x.m; return m; } 7802 }; 7803memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 7804 matches `x.m`, but not `m`; however, 7805memberExpr(hasObjectExpression(hasType(pointsTo( 7806 cxxRecordDecl(hasName("X")))))) 7807 matches `m` (aka. `this->m`), but not `x.m`. 7808</pre></td></tr> 7809 7810 7811<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> 7812<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 7813given matcher. 7814 7815Given 7816 struct { int first, second; } first, second; 7817 int i(second.first); 7818 int j(first.second); 7819memberExpr(member(hasName("first"))) 7820 matches second.first 7821 but not first.second (because the member name there is "second"). 7822</pre></td></tr> 7823 7824 7825<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> 7826<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 7827pointee matches a given matcher. 7828 7829Given 7830 int *a; 7831 int const *b; 7832 float const *f; 7833pointerType(pointee(isConstQualified(), isInteger())) 7834 matches "int const *b" 7835 7836Usable 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>>, 7837 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>> 7838</pre></td></tr> 7839 7840 7841<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> 7842<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 7843matcher. 7844 7845Given 7846 namespace N { template<class T> void f(T t); } 7847 template <class T> void g() { using N::f; f(T()); } 7848unresolvedLookupExpr(hasAnyDeclaration( 7849 namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 7850 matches the use of f in g() . 7851</pre></td></tr> 7852 7853 7854<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> 7855<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 7856 7857Given 7858 struct A { struct B { struct C {}; }; }; 7859 A::B::C c; 7860nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 7861 matches "A::" 7862</pre></td></tr> 7863 7864 7865<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> 7866<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 7867NestedNameSpecifier-matcher matches. 7868</pre></td></tr> 7869 7870 7871<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> 7872<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 7873given TypeLoc. 7874 7875Given 7876 struct A { struct B { struct C {}; }; }; 7877 A::B::C c; 7878nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 7879 hasDeclaration(cxxRecordDecl(hasName("A"))))))) 7880 matches "A::" 7881</pre></td></tr> 7882 7883 7884<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> 7885<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 7886 7887Given 7888 struct A { struct B { struct C {}; }; }; 7889 A::B::C c; 7890nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 7891 matches "A::" 7892</pre></td></tr> 7893 7894 7895<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> 7896<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 7897given namespace matcher. 7898 7899Given 7900 namespace ns { struct A {}; } 7901 ns::A a; 7902nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 7903 matches "ns::" 7904</pre></td></tr> 7905 7906 7907<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> 7908<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 7909given QualType matcher without qualifiers. 7910 7911Given 7912 struct A { struct B { struct C {}; }; }; 7913 A::B::C c; 7914nestedNameSpecifier(specifiesType( 7915 hasDeclaration(cxxRecordDecl(hasName("A"))) 7916)) 7917 matches "A::" 7918</pre></td></tr> 7919 7920 7921<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> 7922<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 7923 7924Given 7925 7926 #pragma omp parallel 7927 #pragma omp parallel default(none) 7928 7929``ompExecutableDirective(hasAnyClause(anything()))`` matches 7930``omp parallel default(none)``. 7931</pre></td></tr> 7932 7933 7934<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> 7935<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 7936 7937Prerequisite: the executable directive must not be standalone directive. 7938If it is, it will never match. 7939 7940Given 7941 7942 #pragma omp parallel 7943 ; 7944 #pragma omp parallel 7945 {} 7946 7947``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 7948</pre></td></tr> 7949 7950 7951<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> 7952<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 7953matching Base, or Objective-C classes that directly or indirectly 7954subclass a class matching Base. 7955 7956Note that a class is not considered to be derived from itself. 7957 7958Example matches Y, Z, C (Base == hasName("X")) 7959 class X; 7960 class Y : public X {}; // directly derived 7961 class Z : public Y {}; // indirectly derived 7962 typedef X A; 7963 typedef A B; 7964 class C : public B {}; // derived from a typedef of X 7965 7966In the following example, Bar matches isDerivedFrom(hasName("X")): 7967 class Foo; 7968 typedef Foo X; 7969 class Bar : public Foo {}; // derived from a type that X is a typedef of 7970 7971In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 7972 @interface NSObject @end 7973 @interface Bar : NSObject @end 7974 7975Usable 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>> 7976</pre></td></tr> 7977 7978 7979<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> 7980<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 7981matching Base. 7982 7983Note that a class is not considered to be derived from itself. 7984 7985Example matches Y, C (Base == hasName("X")) 7986 class X; 7987 class Y : public X {}; // directly derived 7988 class Z : public Y {}; // indirectly derived 7989 typedef X A; 7990 typedef A B; 7991 class C : public B {}; // derived from a typedef of X 7992 7993In the following example, Bar matches isDerivedFrom(hasName("X")): 7994 class Foo; 7995 typedef Foo X; 7996 class Bar : public Foo {}; // derived from a type that X is a typedef of 7997</pre></td></tr> 7998 7999 8000<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> 8001<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 8002match Base. 8003</pre></td></tr> 8004 8005 8006<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> 8007<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 8008expression, or an ObjC-message-send expression. 8009 8010Given 8011 void x(int, int, int) { int y; x(1, y, 42); } 8012callExpr(hasAnyArgument(declRefExpr())) 8013 matches x(1, y, 42) 8014with hasAnyArgument(...) 8015 matching y 8016 8017For ObjectiveC, given 8018 @interface I - (void) f:(int) y; @end 8019 void foo(I *i) { [i f:12]; } 8020objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 8021 matches [i f:12] 8022</pre></td></tr> 8023 8024 8025<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> 8026<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor 8027call expression. 8028 8029Example matches y in x(y) 8030 (matcher = callExpr(hasArgument(0, declRefExpr()))) 8031 void x(int) { int y; x(y); } 8032</pre></td></tr> 8033 8034 8035<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> 8036<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 8037and the inner matcher matches on that instance. 8038 8039For example the method call in 8040 NSString *x = @"hello"; 8041 [x containsString:@"h"]; 8042is matched by 8043objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 8044</pre></td></tr> 8045 8046 8047<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> 8048<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 8049 8050Example 8051matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 8052matches the [webView ...] message invocation. 8053 NSString *webViewJavaScript = ... 8054 UIWebView *webView = ... 8055 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 8056</pre></td></tr> 8057 8058 8059<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> 8060<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 8061block. 8062 8063Does not match the 'this' parameter of a method. 8064 8065Given 8066 class X { void f(int x, int y, int z) {} }; 8067cxxMethodDecl(hasAnyParameter(hasName("y"))) 8068 matches f(int x, int y, int z) {} 8069with hasAnyParameter(...) 8070 matching int y 8071 8072For ObjectiveC, given 8073 @interface I - (void) f:(int) y; @end 8074 8075the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 8076matches the declaration of method f with hasParameter 8077matching y. 8078 8079For blocks, given 8080 b = ^(int y) { printf("%d", y) }; 8081 8082the matcher blockDecl(hasAnyParameter(hasName("y"))) 8083matches the declaration of the block b with hasParameter 8084matching y. 8085</pre></td></tr> 8086 8087 8088<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> 8089<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 8090declaration or a block. 8091 8092Given 8093 class X { void f(int x) {} }; 8094cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 8095 matches f(int x) {} 8096with hasParameter(...) 8097 matching int x 8098 8099For ObjectiveC, given 8100 @interface I - (void) f:(int) y; @end 8101 8102the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 8103matches the declaration of method f with hasParameter 8104matching y. 8105</pre></td></tr> 8106 8107 8108<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> 8109<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 8110or opaque value's source expression matches the given matcher. 8111 8112Example 1: matches "a string" 8113(matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 8114class URL { URL(string); }; 8115URL url = "a string"; 8116 8117Example 2: matches 'b' (matcher = 8118opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 8119int a = b ?: 1; 8120</pre></td></tr> 8121 8122 8123<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> 8124<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 8125overloads matches the given matcher. 8126 8127Given 8128 template <typename T> void foo(T); 8129 template <typename T> void bar(T); 8130 template <typename T> void baz(T t) { 8131 foo(t); 8132 bar(t); 8133 } 8134unresolvedLookupExpr(hasAnyDeclaration( 8135 functionTemplateDecl(hasName("foo")))) 8136 matches foo in foo(t); but not bar in bar(t); 8137</pre></td></tr> 8138 8139 8140<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> 8141<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 8142 8143Given 8144 int (*ptr_to_array)[4]; 8145 int (*ptr_to_func)(int); 8146 8147varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 8148ptr_to_func but not ptr_to_array. 8149 8150Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 8151</pre></td></tr> 8152 8153 8154<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> 8155<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 8156pointee matches a given matcher. 8157 8158Given 8159 int *a; 8160 int const *b; 8161 float const *f; 8162pointerType(pointee(isConstQualified(), isInteger())) 8163 matches "int const *b" 8164 8165Usable 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>>, 8166 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>> 8167</pre></td></tr> 8168 8169 8170<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> 8171<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 8172 8173Given: 8174 typedef int &int_ref; 8175 int a; 8176 int_ref b = a; 8177 8178varDecl(hasType(qualType(referenceType()))))) will not match the 8179declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 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('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> 8184<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 8185matches the given matcher. 8186 8187The associated declaration is: 8188- for type nodes, the declaration of the underlying type 8189- for CallExpr, the declaration of the callee 8190- for MemberExpr, the declaration of the referenced member 8191- for CXXConstructExpr, the declaration of the constructor 8192- for CXXNewExpr, the declaration of the operator new 8193- for ObjCIvarExpr, the declaration of the ivar 8194 8195For type nodes, hasDeclaration will generally match the declaration of the 8196sugared type. Given 8197 class X {}; 8198 typedef X Y; 8199 Y y; 8200in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8201typedefDecl. A common use case is to match the underlying, desugared type. 8202This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8203 varDecl(hasType(hasUnqualifiedDesugaredType( 8204 recordType(hasDeclaration(decl()))))) 8205In this matcher, the decl will match the CXXRecordDecl of class X. 8206 8207Usable 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>>, 8208 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>>, 8209 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>>, 8210 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>>, 8211 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>>, 8212 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>>, 8213 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8214</pre></td></tr> 8215 8216 8217<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> 8218<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 8219 8220Given 8221 void (*fp)(void); 8222The matcher 8223 varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 8224would match the declaration for fp. 8225</pre></td></tr> 8226 8227 8228<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> 8229<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 8230</pre></td></tr> 8231 8232 8233<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> 8234<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 8235matches the specified matcher. 8236 8237Example matches y->x() 8238 (matcher = cxxMemberCallExpr(on(hasType(pointsTo 8239 cxxRecordDecl(hasName("Y"))))))) 8240 class Y { public: void x(); }; 8241 void z() { Y *y; y->x(); } 8242</pre></td></tr> 8243 8244 8245<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> 8246<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 8247</pre></td></tr> 8248 8249 8250<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> 8251<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 8252type matches the specified matcher. 8253 8254Example matches X &x and const X &y 8255 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 8256 class X { 8257 void a(X b) { 8258 X &x = b; 8259 const X &y = b; 8260 } 8261 }; 8262</pre></td></tr> 8263 8264 8265<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> 8266<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 8267matches the given matcher. 8268 8269The associated declaration is: 8270- for type nodes, the declaration of the underlying type 8271- for CallExpr, the declaration of the callee 8272- for MemberExpr, the declaration of the referenced member 8273- for CXXConstructExpr, the declaration of the constructor 8274- for CXXNewExpr, the declaration of the operator new 8275- for ObjCIvarExpr, the declaration of the ivar 8276 8277For type nodes, hasDeclaration will generally match the declaration of the 8278sugared type. Given 8279 class X {}; 8280 typedef X Y; 8281 Y y; 8282in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8283typedefDecl. A common use case is to match the underlying, desugared type. 8284This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8285 varDecl(hasType(hasUnqualifiedDesugaredType( 8286 recordType(hasDeclaration(decl()))))) 8287In this matcher, the decl will match the CXXRecordDecl of class X. 8288 8289Usable 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>>, 8290 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>>, 8291 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>>, 8292 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>>, 8293 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>>, 8294 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>>, 8295 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8296</pre></td></tr> 8297 8298 8299<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> 8300<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 8301pointee matches a given matcher. 8302 8303Given 8304 int *a; 8305 int const *b; 8306 float const *f; 8307pointerType(pointee(isConstQualified(), isInteger())) 8308 matches "int const *b" 8309 8310Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 8311 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 8312</pre></td></tr> 8313 8314 8315<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_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> 8316<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 8317 8318Given 8319 return a + b; 8320hasReturnValue(binaryOperator()) 8321 matches 'return a + b' 8322with binaryOperator() 8323 matching 'a + b' 8324</pre></td></tr> 8325 8326 8327<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> 8328<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 8329a given matcher. Also matches StmtExprs that have CompoundStmt as children. 8330 8331Given 8332 { {}; 1+2; } 8333hasAnySubstatement(compoundStmt()) 8334 matches '{ {}; 1+2; }' 8335with compoundStmt() 8336 matching '{}' 8337</pre></td></tr> 8338 8339 8340<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> 8341<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8342alignof. 8343</pre></td></tr> 8344 8345 8346<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> 8347<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to 8348 8349Given: 8350F& operator=(const F& o) { 8351 std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 8352 return *this; 8353} 8354returnStmt(forFunction(hasName("operator="))) 8355 matches 'return *this' 8356 but does not match 'return v > 0' 8357</pre></td></tr> 8358 8359 8360<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> 8361<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8362sizeof. 8363</pre></td></tr> 8364 8365 8366<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> 8367<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 8368type that matches the provided matcher. 8369 8370Given 8371 template <typename T> 8372 double F(T t); 8373 int i; 8374 double j = F(i); 8375 8376substTemplateTypeParmType(hasReplacementType(type())) matches int 8377</pre></td></tr> 8378 8379 8380<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> 8381<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 8382statement. This matcher may produce multiple matches. 8383 8384Given 8385 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 8386switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 8387 matches four times, with "c" binding each of "case 1:", "case 2:", 8388"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 8389"switch (1)", "switch (2)" and "switch (2)". 8390</pre></td></tr> 8391 8392 8393<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> 8394<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 8395switch statement or conditional operator. 8396 8397Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8398 if (true) {} 8399</pre></td></tr> 8400 8401 8402<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> 8403<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 8404 8405Given: 8406 void foo() { 8407 if (int i = foobar(); i > 0) {} 8408 switch (int i = foobar(); i) {} 8409 for (auto& a = get_range(); auto& x : a) {} 8410 } 8411 void bar() { 8412 if (foobar() > 0) {} 8413 switch (foobar()) {} 8414 for (auto& x : get_range()) {} 8415 } 8416ifStmt(hasInitStatement(anything())) 8417 matches the if statement in foo but not in bar. 8418switchStmt(hasInitStatement(anything())) 8419 matches the switch statement in foo but not in bar. 8420cxxForRangeStmt(hasInitStatement(anything())) 8421 matches the range for statement in foo but not in bar. 8422</pre></td></tr> 8423 8424 8425<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> 8426<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 8427matches the given matcher. 8428 8429The associated declaration is: 8430- for type nodes, the declaration of the underlying type 8431- for CallExpr, the declaration of the callee 8432- for MemberExpr, the declaration of the referenced member 8433- for CXXConstructExpr, the declaration of the constructor 8434- for CXXNewExpr, the declaration of the operator new 8435- for ObjCIvarExpr, the declaration of the ivar 8436 8437For type nodes, hasDeclaration will generally match the declaration of the 8438sugared type. Given 8439 class X {}; 8440 typedef X Y; 8441 Y y; 8442in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8443typedefDecl. A common use case is to match the underlying, desugared type. 8444This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8445 varDecl(hasType(hasUnqualifiedDesugaredType( 8446 recordType(hasDeclaration(decl()))))) 8447In this matcher, the decl will match the CXXRecordDecl of class X. 8448 8449Usable 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>>, 8450 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>>, 8451 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>>, 8452 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>>, 8453 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>>, 8454 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>>, 8455 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8456</pre></td></tr> 8457 8458 8459<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> 8460<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 8461 8462Given 8463 struct B { int next; }; 8464 template<int(B::*next_ptr)> struct A {}; 8465 A<&B::next> a; 8466templateSpecializationType(hasAnyTemplateArgument( 8467 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 8468 matches the specialization A<&B::next> with fieldDecl(...) matching 8469 B::next 8470</pre></td></tr> 8471 8472 8473<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> 8474<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 8475declaration. 8476 8477Given 8478 struct B { int next; }; 8479 template<int(B::*next_ptr)> struct A {}; 8480 A<&B::next> a; 8481classTemplateSpecializationDecl(hasAnyTemplateArgument( 8482 refersToDeclaration(fieldDecl(hasName("next"))))) 8483 matches the specialization A<&B::next> with fieldDecl(...) matching 8484 B::next 8485</pre></td></tr> 8486 8487 8488<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> 8489<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type. 8490 8491Given 8492 template<int T> struct C {}; 8493 C<42> c; 8494classTemplateSpecializationDecl( 8495 hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 8496 matches the implicit instantiation of C in C<42>. 8497</pre></td></tr> 8498 8499 8500<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> 8501<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 8502 8503Given 8504 template<template <typename> class S> class X {}; 8505 template<typename T> class Y {}; 8506 X<Y> xi; 8507classTemplateSpecializationDecl(hasAnyTemplateArgument( 8508 refersToTemplate(templateName()))) 8509 matches the specialization X<Y> 8510</pre></td></tr> 8511 8512 8513<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> 8514<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 8515 8516Given 8517 struct X {}; 8518 template<typename T> struct A {}; 8519 A<X> a; 8520classTemplateSpecializationDecl(hasAnyTemplateArgument( 8521 refersToType(class(hasName("X"))))) 8522 matches the specialization A<X> 8523</pre></td></tr> 8524 8525 8526<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> 8527<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8528functionDecl that have at least one TemplateArgument matching the given 8529InnerMatcher. 8530 8531Given 8532 template<typename T> class A {}; 8533 template<> class A<double> {}; 8534 A<int> a; 8535 8536 template<typename T> f() {}; 8537 void func() { f<int>(); }; 8538 8539classTemplateSpecializationDecl(hasAnyTemplateArgument( 8540 refersToType(asString("int")))) 8541 matches the specialization A<int> 8542 8543functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 8544 matches the specialization f<int> 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('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> 8549<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 8550matches the given matcher. 8551 8552The associated declaration is: 8553- for type nodes, the declaration of the underlying type 8554- for CallExpr, the declaration of the callee 8555- for MemberExpr, the declaration of the referenced member 8556- for CXXConstructExpr, the declaration of the constructor 8557- for CXXNewExpr, the declaration of the operator new 8558- for ObjCIvarExpr, the declaration of the ivar 8559 8560For type nodes, hasDeclaration will generally match the declaration of the 8561sugared type. Given 8562 class X {}; 8563 typedef X Y; 8564 Y y; 8565in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8566typedefDecl. A common use case is to match the underlying, desugared type. 8567This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8568 varDecl(hasType(hasUnqualifiedDesugaredType( 8569 recordType(hasDeclaration(decl()))))) 8570In this matcher, the decl will match the CXXRecordDecl of class X. 8571 8572Usable 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>>, 8573 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>>, 8574 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>>, 8575 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>>, 8576 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>>, 8577 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>>, 8578 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8579</pre></td></tr> 8580 8581 8582<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> 8583<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 8584functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 8585 8586Given 8587 template<typename T, typename U> class A {}; 8588 A<bool, int> b; 8589 A<int, bool> c; 8590 8591 template<typename T> void f() {} 8592 void func() { f<int>(); }; 8593classTemplateSpecializationDecl(hasTemplateArgument( 8594 1, refersToType(asString("int")))) 8595 matches the specialization A<bool, int> 8596 8597functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 8598 matches the specialization f<int> 8599</pre></td></tr> 8600 8601 8602<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> 8603<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 8604matches the given matcher. 8605 8606The associated declaration is: 8607- for type nodes, the declaration of the underlying type 8608- for CallExpr, the declaration of the callee 8609- for MemberExpr, the declaration of the referenced member 8610- for CXXConstructExpr, the declaration of the constructor 8611- for CXXNewExpr, the declaration of the operator new 8612- for ObjCIvarExpr, the declaration of the ivar 8613 8614For type nodes, hasDeclaration will generally match the declaration of the 8615sugared type. Given 8616 class X {}; 8617 typedef X Y; 8618 Y y; 8619in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8620typedefDecl. A common use case is to match the underlying, desugared type. 8621This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8622 varDecl(hasType(hasUnqualifiedDesugaredType( 8623 recordType(hasDeclaration(decl()))))) 8624In this matcher, the decl will match the CXXRecordDecl of class X. 8625 8626Usable 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>>, 8627 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>>, 8628 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>>, 8629 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>>, 8630 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>>, 8631 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>>, 8632 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8633</pre></td></tr> 8634 8635 8636<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> 8637<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 8638QualType-matcher matches. 8639</pre></td></tr> 8640 8641 8642<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> 8643<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 8644matcher. 8645 8646Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8647 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8648 and U (matcher = typedefDecl(hasType(asString("int"))) 8649 and friend class X (matcher = friendDecl(hasType("X")) 8650 class X {}; 8651 void y(X &x) { x; X z; } 8652 typedef int U; 8653 class Y { friend class X; }; 8654</pre></td></tr> 8655 8656 8657<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> 8658<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 8659matches the given matcher. 8660 8661The associated declaration is: 8662- for type nodes, the declaration of the underlying type 8663- for CallExpr, the declaration of the callee 8664- for MemberExpr, the declaration of the referenced member 8665- for CXXConstructExpr, the declaration of the constructor 8666- for CXXNewExpr, the declaration of the operator new 8667- for ObjCIvarExpr, the declaration of the ivar 8668 8669For type nodes, hasDeclaration will generally match the declaration of the 8670sugared type. Given 8671 class X {}; 8672 typedef X Y; 8673 Y y; 8674in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8675typedefDecl. A common use case is to match the underlying, desugared type. 8676This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8677 varDecl(hasType(hasUnqualifiedDesugaredType( 8678 recordType(hasDeclaration(decl()))))) 8679In this matcher, the decl will match the CXXRecordDecl of class X. 8680 8681Usable 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>>, 8682 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>>, 8683 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>>, 8684 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>>, 8685 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>>, 8686 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>>, 8687 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8688</pre></td></tr> 8689 8690 8691<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> 8692<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 8693type of the matched node. 8694 8695For example, in: 8696 class A {}; 8697 using B = A; 8698The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 8699both B and A. 8700</pre></td></tr> 8701 8702 8703<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> 8704<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 8705 8706Given 8707 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 8708unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 8709 matches sizeof(a) and alignof(c) 8710</pre></td></tr> 8711 8712 8713<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> 8714<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 8715 8716Example matches true (matcher = hasUnaryOperand( 8717 cxxBoolLiteral(equals(true)))) 8718 !true 8719</pre></td></tr> 8720 8721 8722<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> 8723<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 8724given matcher. Implicit object expressions are included; that is, it matches 8725use of implicit `this`. 8726 8727Given 8728 struct X { 8729 int m; 8730 int f(X x) { x.m; return m; } 8731 }; 8732memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 8733 matches `x.m`, but not `m`; however, 8734memberExpr(hasObjectExpression(hasType(pointsTo( 8735 cxxRecordDecl(hasName("X")))))) 8736 matches `m` (aka. `this->m`), but not `x.m`. 8737</pre></td></tr> 8738 8739 8740<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> 8741<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 8742matches the given matcher. 8743 8744The associated declaration is: 8745- for type nodes, the declaration of the underlying type 8746- for CallExpr, the declaration of the callee 8747- for MemberExpr, the declaration of the referenced member 8748- for CXXConstructExpr, the declaration of the constructor 8749- for CXXNewExpr, the declaration of the operator new 8750- for ObjCIvarExpr, the declaration of the ivar 8751 8752For type nodes, hasDeclaration will generally match the declaration of the 8753sugared type. Given 8754 class X {}; 8755 typedef X Y; 8756 Y y; 8757in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8758typedefDecl. A common use case is to match the underlying, desugared type. 8759This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8760 varDecl(hasType(hasUnqualifiedDesugaredType( 8761 recordType(hasDeclaration(decl()))))) 8762In this matcher, the decl will match the CXXRecordDecl of class X. 8763 8764Usable 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>>, 8765 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>>, 8766 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>>, 8767 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>>, 8768 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>>, 8769 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>>, 8770 Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8771</pre></td></tr> 8772 8773 8774<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> 8775<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 8776 8777Given 8778 namespace X { void b(); } 8779 using X::b; 8780usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 8781 matches using X::b </pre></td></tr> 8782 8783 8784<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> 8785<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 8786matched by the given matcher. 8787 8788Given 8789 namespace X { int a; void b(); } 8790 using X::a; 8791 using X::b; 8792usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 8793 matches using X::b but not using X::a </pre></td></tr> 8794 8795 8796<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> 8797<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 8798declaration's type. 8799 8800In case of a value declaration (for example a variable declaration), 8801this resolves one layer of indirection. For example, in the value 8802declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 8803X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 8804declaration of x. 8805 8806Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8807 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8808 and friend class X (matcher = friendDecl(hasType("X")) 8809 class X {}; 8810 void y(X &x) { x; X z; } 8811 class Y { friend class X; }; 8812 8813Example matches class Derived 8814(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 8815class Base {}; 8816class Derived : Base {}; 8817 8818Usable 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>>, 8819Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 8820</pre></td></tr> 8821 8822 8823<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> 8824<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 8825matcher. 8826 8827Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 8828 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 8829 and U (matcher = typedefDecl(hasType(asString("int"))) 8830 and friend class X (matcher = friendDecl(hasType("X")) 8831 class X {}; 8832 void y(X &x) { x; X z; } 8833 typedef int U; 8834 class Y { friend class X; }; 8835</pre></td></tr> 8836 8837 8838<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> 8839<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 8840that matches the given matcher. 8841 8842Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 8843 bool y() { return true; } 8844 bool x = y(); 8845</pre></td></tr> 8846 8847 8848<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> 8849<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 8850expression. 8851 8852Given 8853 void f(int b) { 8854 int a[b]; 8855 } 8856variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 8857 varDecl(hasName("b"))))))) 8858 matches "int a[b]" 8859</pre></td></tr> 8860 8861 8862<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> 8863<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr> 8864 8865 8866<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> 8867<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 8868switch statement or conditional operator. 8869 8870Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8871 if (true) {} 8872</pre></td></tr> 8873 8874<!--END_TRAVERSAL_MATCHERS --> 8875</table> 8876 8877</div> 8878</body> 8879</html> 8880 8881 8882