1*67e74705SXin Li<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 2*67e74705SXin Li "http://www.w3.org/TR/html4/strict.dtd"> 3*67e74705SXin Li<html> 4*67e74705SXin Li<head> 5*67e74705SXin Li<title>AST Matcher Reference</title> 6*67e74705SXin Li<link type="text/css" rel="stylesheet" href="../menu.css" /> 7*67e74705SXin Li<link type="text/css" rel="stylesheet" href="../content.css" /> 8*67e74705SXin Li<style type="text/css"> 9*67e74705SXin Litd { 10*67e74705SXin Li padding: .33em; 11*67e74705SXin Li} 12*67e74705SXin Litd.doc { 13*67e74705SXin Li display: none; 14*67e74705SXin Li border-bottom: 1px solid black; 15*67e74705SXin Li} 16*67e74705SXin Litd.name:hover { 17*67e74705SXin Li color: blue; 18*67e74705SXin Li cursor: pointer; 19*67e74705SXin Li} 20*67e74705SXin Li</style> 21*67e74705SXin Li<script type="text/javascript"> 22*67e74705SXin Lifunction toggle(id) { 23*67e74705SXin Li if (!id) return; 24*67e74705SXin Li row = document.getElementById(id); 25*67e74705SXin Li if (row.style.display != 'table-cell') 26*67e74705SXin Li row.style.display = 'table-cell'; 27*67e74705SXin Li else 28*67e74705SXin Li row.style.display = 'none'; 29*67e74705SXin Li} 30*67e74705SXin Li</script> 31*67e74705SXin Li</head> 32*67e74705SXin Li<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))"> 33*67e74705SXin Li 34*67e74705SXin Li<!--#include virtual="../menu.html.incl"--> 35*67e74705SXin Li 36*67e74705SXin Li<div id="content"> 37*67e74705SXin Li 38*67e74705SXin Li<h1>AST Matcher Reference</h1> 39*67e74705SXin Li 40*67e74705SXin Li<p>This document shows all currently implemented matchers. The matchers are grouped 41*67e74705SXin Liby category and node type they match. You can click on matcher names to show the 42*67e74705SXin Limatcher's source documentation.</p> 43*67e74705SXin Li 44*67e74705SXin Li<p>There are three different basic categories of matchers: 45*67e74705SXin Li<ul> 46*67e74705SXin Li<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li> 47*67e74705SXin Li<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li> 48*67e74705SXin Li<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li> 49*67e74705SXin Li</ul> 50*67e74705SXin Li</p> 51*67e74705SXin Li 52*67e74705SXin Li<p>Within each category the matchers are ordered by node type they match on. 53*67e74705SXin LiNote that if a matcher can match multiple node types, it will it will appear 54*67e74705SXin Limultiple times. This means that by searching for Matcher<Stmt> you can 55*67e74705SXin Lifind all matchers that can be used to match on Stmt nodes.</p> 56*67e74705SXin Li 57*67e74705SXin Li<p>The exception to that rule are matchers that can match on any node. Those 58*67e74705SXin Liare marked with a * and are listed in the beginning of each category.</p> 59*67e74705SXin Li 60*67e74705SXin Li<p>Note that the categorization of matchers is a great help when you combine 61*67e74705SXin Lithem into matcher expressions. You will usually want to form matcher expressions 62*67e74705SXin Lithat read like english sentences by alternating between node matchers and 63*67e74705SXin Linarrowing or traversal matchers, like this: 64*67e74705SXin Li<pre> 65*67e74705SXin LirecordDecl(hasDescendant( 66*67e74705SXin Li ifStmt(hasTrueExpression( 67*67e74705SXin Li expr(hasDescendant( 68*67e74705SXin Li ifStmt())))))) 69*67e74705SXin Li</pre> 70*67e74705SXin Li</p> 71*67e74705SXin Li 72*67e74705SXin Li<!-- ======================================================================= --> 73*67e74705SXin Li<h2 id="decl-matchers">Node Matchers</h2> 74*67e74705SXin Li<!-- ======================================================================= --> 75*67e74705SXin Li 76*67e74705SXin Li<p>Node matchers are at the core of matcher expressions - they specify the type 77*67e74705SXin Liof node that is expected. Every match expression starts with a node matcher, 78*67e74705SXin Liwhich can then be further refined with a narrowing or traversal matcher. All 79*67e74705SXin Litraversal matchers take node matchers as their arguments.</p> 80*67e74705SXin Li 81*67e74705SXin Li<p>For convenience, all node matchers take an arbitrary number of arguments 82*67e74705SXin Liand implicitly act as allOf matchers.</p> 83*67e74705SXin Li 84*67e74705SXin Li<p>Node matchers are the only matchers that support the bind("id") call to 85*67e74705SXin Libind the matched node to the given string, to be later retrieved from the 86*67e74705SXin Limatch callback.</p> 87*67e74705SXin Li 88*67e74705SXin Li<p>It is important to remember that the arguments to node matchers are 89*67e74705SXin Lipredicates on the same node, just with additional information about the type. 90*67e74705SXin LiThis is often useful to make matcher expression more readable by inlining bind 91*67e74705SXin Licalls into redundant node matchers inside another node matcher: 92*67e74705SXin Li<pre> 93*67e74705SXin Li// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on 94*67e74705SXin Li// the same node. 95*67e74705SXin LirecordDecl(decl().bind("id"), hasName("::MyClass")) 96*67e74705SXin Li</pre> 97*67e74705SXin Li</p> 98*67e74705SXin Li 99*67e74705SXin Li<table> 100*67e74705SXin Li<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 101*67e74705SXin Li<!-- START_DECL_MATCHERS --> 102*67e74705SXin Li 103*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>...</td></tr> 104*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers. 105*67e74705SXin Li 106*67e74705SXin LiExamples matches i(42). 107*67e74705SXin Li class C { 108*67e74705SXin Li C() : i(42) {} 109*67e74705SXin Li int i; 110*67e74705SXin Li }; 111*67e74705SXin Li</pre></td></tr> 112*67e74705SXin Li 113*67e74705SXin Li 114*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>>...</td></tr> 115*67e74705SXin Li<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations. 116*67e74705SXin Li 117*67e74705SXin LiGiven 118*67e74705SXin Li class C { 119*67e74705SXin Li public: 120*67e74705SXin Li int a; 121*67e74705SXin Li }; 122*67e74705SXin LiaccessSpecDecl() 123*67e74705SXin Li matches 'public:' 124*67e74705SXin Li</pre></td></tr> 125*67e74705SXin Li 126*67e74705SXin Li 127*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>>...</td></tr> 128*67e74705SXin Li<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations. 129*67e74705SXin Li 130*67e74705SXin LiExample matches Z 131*67e74705SXin Li template<class T> class Z {}; 132*67e74705SXin Li</pre></td></tr> 133*67e74705SXin Li 134*67e74705SXin Li 135*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>...</td></tr> 136*67e74705SXin Li<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations. 137*67e74705SXin Li 138*67e74705SXin LiGiven 139*67e74705SXin Li template<typename T> class A {}; 140*67e74705SXin Li template<> class A<double> {}; 141*67e74705SXin Li A<int> a; 142*67e74705SXin LiclassTemplateSpecializationDecl() 143*67e74705SXin Li matches the specializations A<int> and A<double> 144*67e74705SXin Li</pre></td></tr> 145*67e74705SXin Li 146*67e74705SXin Li 147*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>>...</td></tr> 148*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. 149*67e74705SXin Li 150*67e74705SXin LiExample matches Foo::Foo() and Foo::Foo(int) 151*67e74705SXin Li class Foo { 152*67e74705SXin Li public: 153*67e74705SXin Li Foo(); 154*67e74705SXin Li Foo(int); 155*67e74705SXin Li int DoSomething(); 156*67e74705SXin Li }; 157*67e74705SXin Li</pre></td></tr> 158*67e74705SXin Li 159*67e74705SXin Li 160*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>>...</td></tr> 161*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations. 162*67e74705SXin Li 163*67e74705SXin LiExample matches the operator. 164*67e74705SXin Li class X { operator int() const; }; 165*67e74705SXin Li</pre></td></tr> 166*67e74705SXin Li 167*67e74705SXin Li 168*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>>...</td></tr> 169*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations. 170*67e74705SXin Li 171*67e74705SXin LiExample matches Foo::~Foo() 172*67e74705SXin Li class Foo { 173*67e74705SXin Li public: 174*67e74705SXin Li virtual ~Foo(); 175*67e74705SXin Li }; 176*67e74705SXin Li</pre></td></tr> 177*67e74705SXin Li 178*67e74705SXin Li 179*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>...</td></tr> 180*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations. 181*67e74705SXin Li 182*67e74705SXin LiExample matches y 183*67e74705SXin Li class X { void y(); }; 184*67e74705SXin Li</pre></td></tr> 185*67e74705SXin Li 186*67e74705SXin Li 187*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>...</td></tr> 188*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations. 189*67e74705SXin Li 190*67e74705SXin LiExample matches X, Z 191*67e74705SXin Li class X; 192*67e74705SXin Li template<class T> class Z {}; 193*67e74705SXin Li</pre></td></tr> 194*67e74705SXin Li 195*67e74705SXin Li 196*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>...</td></tr> 197*67e74705SXin Li<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 198*67e74705SXin Li 199*67e74705SXin LiExamples matches X, C, and the friend declaration inside C; 200*67e74705SXin Li void X(); 201*67e74705SXin Li class C { 202*67e74705SXin Li friend X; 203*67e74705SXin Li }; 204*67e74705SXin Li</pre></td></tr> 205*67e74705SXin Li 206*67e74705SXin Li 207*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>...</td></tr> 208*67e74705SXin Li<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 209*67e74705SXin Liand non-type template parameter declarations). 210*67e74705SXin Li 211*67e74705SXin LiGiven 212*67e74705SXin Li class X { int y; }; 213*67e74705SXin LideclaratorDecl() 214*67e74705SXin Li matches int y. 215*67e74705SXin Li</pre></td></tr> 216*67e74705SXin Li 217*67e74705SXin Li 218*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>>...</td></tr> 219*67e74705SXin Li<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 220*67e74705SXin Li 221*67e74705SXin LiExample matches A, B, C 222*67e74705SXin Li enum X { 223*67e74705SXin Li A, B, C 224*67e74705SXin Li }; 225*67e74705SXin Li</pre></td></tr> 226*67e74705SXin Li 227*67e74705SXin Li 228*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>>...</td></tr> 229*67e74705SXin Li<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 230*67e74705SXin Li 231*67e74705SXin LiExample matches X 232*67e74705SXin Li enum X { 233*67e74705SXin Li A, B, C 234*67e74705SXin Li }; 235*67e74705SXin Li</pre></td></tr> 236*67e74705SXin Li 237*67e74705SXin Li 238*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>>...</td></tr> 239*67e74705SXin Li<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 240*67e74705SXin Li 241*67e74705SXin LiGiven 242*67e74705SXin Li class X { int m; }; 243*67e74705SXin LifieldDecl() 244*67e74705SXin Li matches 'm'. 245*67e74705SXin Li</pre></td></tr> 246*67e74705SXin Li 247*67e74705SXin Li 248*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>...</td></tr> 249*67e74705SXin Li<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 250*67e74705SXin Li 251*67e74705SXin LiGiven 252*67e74705SXin Li class X { friend void foo(); }; 253*67e74705SXin LifriendDecl() 254*67e74705SXin Li matches 'friend void foo()'. 255*67e74705SXin Li</pre></td></tr> 256*67e74705SXin Li 257*67e74705SXin Li 258*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>...</td></tr> 259*67e74705SXin Li<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 260*67e74705SXin Li 261*67e74705SXin LiExample matches f 262*67e74705SXin Li void f(); 263*67e74705SXin Li</pre></td></tr> 264*67e74705SXin Li 265*67e74705SXin Li 266*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>>...</td></tr> 267*67e74705SXin Li<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 268*67e74705SXin Li 269*67e74705SXin LiExample matches f 270*67e74705SXin Li template<class T> void f(T t) {} 271*67e74705SXin Li</pre></td></tr> 272*67e74705SXin Li 273*67e74705SXin Li 274*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>>...</td></tr> 275*67e74705SXin Li<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label. 276*67e74705SXin Li 277*67e74705SXin LiGiven 278*67e74705SXin Li goto FOO; 279*67e74705SXin Li FOO: bar(); 280*67e74705SXin LilabelDecl() 281*67e74705SXin Li matches 'FOO:' 282*67e74705SXin Li</pre></td></tr> 283*67e74705SXin Li 284*67e74705SXin Li 285*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>>...</td></tr> 286*67e74705SXin Li<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification. 287*67e74705SXin Li 288*67e74705SXin LiGiven 289*67e74705SXin Li extern "C" {} 290*67e74705SXin LilinkageSpecDecl() 291*67e74705SXin Li matches "extern "C" {}" 292*67e74705SXin Li</pre></td></tr> 293*67e74705SXin Li 294*67e74705SXin Li 295*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>>...</td></tr> 296*67e74705SXin Li<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 297*67e74705SXin Li 298*67e74705SXin LiExample matches X, S, the anonymous union type, i, and U; 299*67e74705SXin Li typedef int X; 300*67e74705SXin Li struct S { 301*67e74705SXin Li union { 302*67e74705SXin Li int i; 303*67e74705SXin Li } U; 304*67e74705SXin Li }; 305*67e74705SXin Li</pre></td></tr> 306*67e74705SXin Li 307*67e74705SXin Li 308*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>>...</td></tr> 309*67e74705SXin Li<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias. 310*67e74705SXin Li 311*67e74705SXin LiGiven 312*67e74705SXin Li namespace test {} 313*67e74705SXin Li namespace alias = ::test; 314*67e74705SXin LinamespaceAliasDecl() 315*67e74705SXin Li matches "namespace alias" but not "namespace test" 316*67e74705SXin Li</pre></td></tr> 317*67e74705SXin Li 318*67e74705SXin Li 319*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>>...</td></tr> 320*67e74705SXin Li<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 321*67e74705SXin Li 322*67e74705SXin LiGiven 323*67e74705SXin Li namespace {} 324*67e74705SXin Li namespace test {} 325*67e74705SXin LinamespaceDecl() 326*67e74705SXin Li matches "namespace {}" and "namespace test {}" 327*67e74705SXin Li</pre></td></tr> 328*67e74705SXin Li 329*67e74705SXin Li 330*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>>...</td></tr> 331*67e74705SXin Li<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations. 332*67e74705SXin Li 333*67e74705SXin LiGiven 334*67e74705SXin Li template <typename T, int N> struct C {}; 335*67e74705SXin LinonTypeTemplateParmDecl() 336*67e74705SXin Li matches 'N', but not 'T'. 337*67e74705SXin Li</pre></td></tr> 338*67e74705SXin Li 339*67e74705SXin Li 340*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>...</td></tr> 341*67e74705SXin Li<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 342*67e74705SXin Li 343*67e74705SXin LiExample matches Foo 344*67e74705SXin Li @interface Foo 345*67e74705SXin Li @end 346*67e74705SXin Li</pre></td></tr> 347*67e74705SXin Li 348*67e74705SXin Li 349*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>>...</td></tr> 350*67e74705SXin Li<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 351*67e74705SXin Li 352*67e74705SXin LiGiven 353*67e74705SXin Li void f(int x); 354*67e74705SXin LiparmVarDecl() 355*67e74705SXin Li matches int x. 356*67e74705SXin Li</pre></td></tr> 357*67e74705SXin Li 358*67e74705SXin Li 359*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>>...</td></tr> 360*67e74705SXin Li<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 361*67e74705SXin Li 362*67e74705SXin LiExample matches X, Z, U, and S 363*67e74705SXin Li class X; 364*67e74705SXin Li template<class T> class Z {}; 365*67e74705SXin Li struct S {}; 366*67e74705SXin Li union U {}; 367*67e74705SXin Li</pre></td></tr> 368*67e74705SXin Li 369*67e74705SXin Li 370*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>>...</td></tr> 371*67e74705SXin Li<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 372*67e74705SXin Li 373*67e74705SXin LiExample: 374*67e74705SXin Li staticAssertExpr() 375*67e74705SXin Limatches 376*67e74705SXin Li static_assert(sizeof(S) == sizeof(int)) 377*67e74705SXin Liin 378*67e74705SXin Li struct S { 379*67e74705SXin Li int x; 380*67e74705SXin Li }; 381*67e74705SXin Li static_assert(sizeof(S) == sizeof(int)); 382*67e74705SXin Li</pre></td></tr> 383*67e74705SXin Li 384*67e74705SXin Li 385*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>>...</td></tr> 386*67e74705SXin Li<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 387*67e74705SXin Li 388*67e74705SXin LiGiven 389*67e74705SXin Li template <typename T, int N> struct C {}; 390*67e74705SXin LitemplateTypeParmDecl() 391*67e74705SXin Li matches 'T', but not 'N'. 392*67e74705SXin Li</pre></td></tr> 393*67e74705SXin Li 394*67e74705SXin Li 395*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>>...</td></tr> 396*67e74705SXin Li<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 397*67e74705SXin Li 398*67e74705SXin LiGiven 399*67e74705SXin Li int X; 400*67e74705SXin Li namespace NS { 401*67e74705SXin Li int Y; 402*67e74705SXin Li } namespace NS 403*67e74705SXin Lidecl(hasDeclContext(translationUnitDecl())) 404*67e74705SXin Li matches "int X", but not "int Y". 405*67e74705SXin Li</pre></td></tr> 406*67e74705SXin Li 407*67e74705SXin Li 408*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>>...</td></tr> 409*67e74705SXin Li<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations. 410*67e74705SXin Li 411*67e74705SXin LiGiven 412*67e74705SXin Li typedef int X; 413*67e74705SXin Li using Y = int; 414*67e74705SXin LitypeAliasDecl() 415*67e74705SXin Li matches "using Y = int", but not "typedef int X" 416*67e74705SXin Li</pre></td></tr> 417*67e74705SXin Li 418*67e74705SXin Li 419*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>>...</td></tr> 420*67e74705SXin Li<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 421*67e74705SXin Li 422*67e74705SXin LiGiven 423*67e74705SXin Li typedef int X; 424*67e74705SXin Li using Y = int; 425*67e74705SXin LitypedefDecl() 426*67e74705SXin Li matches "typedef int X", but not "using Y = int" 427*67e74705SXin Li</pre></td></tr> 428*67e74705SXin Li 429*67e74705SXin Li 430*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>...</td></tr> 431*67e74705SXin Li<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations. 432*67e74705SXin Li 433*67e74705SXin LiGiven 434*67e74705SXin Li typedef int X; 435*67e74705SXin Li using Y = int; 436*67e74705SXin LitypedefNameDecl() 437*67e74705SXin Li matches "typedef int X" and "using Y = int" 438*67e74705SXin Li</pre></td></tr> 439*67e74705SXin Li 440*67e74705SXin Li 441*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>>...</td></tr> 442*67e74705SXin Li<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 443*67e74705SXin Litypename. 444*67e74705SXin Li 445*67e74705SXin LiGiven 446*67e74705SXin Li template <typename T> 447*67e74705SXin Li struct Base { typedef T Foo; }; 448*67e74705SXin Li 449*67e74705SXin Li template<typename T> 450*67e74705SXin Li struct S : private Base<T> { 451*67e74705SXin Li using typename Base<T>::Foo; 452*67e74705SXin Li }; 453*67e74705SXin LiunresolvedUsingTypenameDecl() 454*67e74705SXin Li matches using Base<T>::Foo </pre></td></tr> 455*67e74705SXin Li 456*67e74705SXin Li 457*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>>...</td></tr> 458*67e74705SXin Li<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 459*67e74705SXin Li 460*67e74705SXin LiGiven 461*67e74705SXin Li template<typename X> 462*67e74705SXin Li class C : private X { 463*67e74705SXin Li using X::x; 464*67e74705SXin Li }; 465*67e74705SXin LiunresolvedUsingValueDecl() 466*67e74705SXin Li matches using X::x </pre></td></tr> 467*67e74705SXin Li 468*67e74705SXin Li 469*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>>...</td></tr> 470*67e74705SXin Li<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 471*67e74705SXin Li 472*67e74705SXin LiGiven 473*67e74705SXin Li namespace X { int x; } 474*67e74705SXin Li using X::x; 475*67e74705SXin LiusingDecl() 476*67e74705SXin Li matches using X::x </pre></td></tr> 477*67e74705SXin Li 478*67e74705SXin Li 479*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>>...</td></tr> 480*67e74705SXin Li<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 481*67e74705SXin Li 482*67e74705SXin LiGiven 483*67e74705SXin Li namespace X { int x; } 484*67e74705SXin Li using namespace X; 485*67e74705SXin LiusingDirectiveDecl() 486*67e74705SXin Li matches using namespace X </pre></td></tr> 487*67e74705SXin Li 488*67e74705SXin Li 489*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>...</td></tr> 490*67e74705SXin Li<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 491*67e74705SXin Li 492*67e74705SXin LiExample matches A, B, C and F 493*67e74705SXin Li enum X { A, B, C }; 494*67e74705SXin Li void F(); 495*67e74705SXin Li</pre></td></tr> 496*67e74705SXin Li 497*67e74705SXin Li 498*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>...</td></tr> 499*67e74705SXin Li<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 500*67e74705SXin Li 501*67e74705SXin LiNote: this does not match declarations of member variables, which are 502*67e74705SXin Li"field" declarations in Clang parlance. 503*67e74705SXin Li 504*67e74705SXin LiExample matches a 505*67e74705SXin Li int a; 506*67e74705SXin Li</pre></td></tr> 507*67e74705SXin Li 508*67e74705SXin Li 509*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>>...</td></tr> 510*67e74705SXin Li<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 511*67e74705SXin Li</pre></td></tr> 512*67e74705SXin Li 513*67e74705SXin Li 514*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>>...</td></tr> 515*67e74705SXin Li<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 516*67e74705SXin Li 517*67e74705SXin LiGiven 518*67e74705SXin Li namespace ns { 519*67e74705SXin Li struct A { static void f(); }; 520*67e74705SXin Li void A::f() {} 521*67e74705SXin Li void g() { A::f(); } 522*67e74705SXin Li } 523*67e74705SXin Li ns::A a; 524*67e74705SXin LinestedNameSpecifier() 525*67e74705SXin Li matches "ns::" and both "A::" 526*67e74705SXin Li</pre></td></tr> 527*67e74705SXin Li 528*67e74705SXin Li 529*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>...</td></tr> 530*67e74705SXin Li<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 531*67e74705SXin Li</pre></td></tr> 532*67e74705SXin Li 533*67e74705SXin Li 534*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>...</td></tr> 535*67e74705SXin Li<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension). 536*67e74705SXin Li 537*67e74705SXin LiGiven 538*67e74705SXin Li FOO: bar(); 539*67e74705SXin Li void *ptr = &&FOO; 540*67e74705SXin Li goto *bar; 541*67e74705SXin LiaddrLabelExpr() 542*67e74705SXin Li matches '&&FOO' 543*67e74705SXin Li</pre></td></tr> 544*67e74705SXin Li 545*67e74705SXin Li 546*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>>...</td></tr> 547*67e74705SXin Li<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 548*67e74705SXin Li 549*67e74705SXin LiGiven 550*67e74705SXin Li int i = a[1]; 551*67e74705SXin LiarraySubscriptExpr() 552*67e74705SXin Li matches "a[1]" 553*67e74705SXin Li</pre></td></tr> 554*67e74705SXin Li 555*67e74705SXin Li 556*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>>...</td></tr> 557*67e74705SXin Li<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 558*67e74705SXin Li 559*67e74705SXin Li int i = 100; 560*67e74705SXin Li __asm("mov al, 2"); 561*67e74705SXin LiasmStmt() 562*67e74705SXin Li matches '__asm("mov al, 2")' 563*67e74705SXin Li</pre></td></tr> 564*67e74705SXin Li 565*67e74705SXin Li 566*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>>...</td></tr> 567*67e74705SXin Li<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins. 568*67e74705SXin LiExample matches __atomic_load_n(ptr, 1) 569*67e74705SXin Li void foo() { int *ptr; __atomic_load_n(ptr, 1); } 570*67e74705SXin Li</pre></td></tr> 571*67e74705SXin Li 572*67e74705SXin Li 573*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>>...</td></tr> 574*67e74705SXin Li<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension). 575*67e74705SXin Li 576*67e74705SXin LiExample matches a ?: b 577*67e74705SXin Li (a ?: b) + 42; 578*67e74705SXin Li</pre></td></tr> 579*67e74705SXin Li 580*67e74705SXin Li 581*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>>...</td></tr> 582*67e74705SXin Li<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 583*67e74705SXin Li 584*67e74705SXin LiExample matches a || b 585*67e74705SXin Li !(a || b) 586*67e74705SXin Li</pre></td></tr> 587*67e74705SXin Li 588*67e74705SXin Li 589*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>>...</td></tr> 590*67e74705SXin Li<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 591*67e74705SXin Li 592*67e74705SXin LiGiven 593*67e74705SXin Li while (true) { break; } 594*67e74705SXin LibreakStmt() 595*67e74705SXin Li matches 'break' 596*67e74705SXin Li</pre></td></tr> 597*67e74705SXin Li 598*67e74705SXin Li 599*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>>...</td></tr> 600*67e74705SXin Li<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 601*67e74705SXin Li 602*67e74705SXin LiExample: Matches (int*) 2.2f in 603*67e74705SXin Li int i = (int) 2.2f; 604*67e74705SXin Li</pre></td></tr> 605*67e74705SXin Li 606*67e74705SXin Li 607*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>...</td></tr> 608*67e74705SXin Li<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 609*67e74705SXin Li 610*67e74705SXin LiExample matches x.y() and y() 611*67e74705SXin Li X x; 612*67e74705SXin Li x.y(); 613*67e74705SXin Li y(); 614*67e74705SXin Li</pre></td></tr> 615*67e74705SXin Li 616*67e74705SXin Li 617*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>>...</td></tr> 618*67e74705SXin Li<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 619*67e74705SXin Li 620*67e74705SXin LiGiven 621*67e74705SXin Li switch(a) { case 42: break; default: break; } 622*67e74705SXin LicaseStmt() 623*67e74705SXin Li matches 'case 42: break;'. 624*67e74705SXin Li</pre></td></tr> 625*67e74705SXin Li 626*67e74705SXin Li 627*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>>...</td></tr> 628*67e74705SXin Li<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 629*67e74705SXin Li 630*67e74705SXin LiExample: castExpr() matches each of the following: 631*67e74705SXin Li (int) 3; 632*67e74705SXin Li const_cast<Expr *>(SubExpr); 633*67e74705SXin Li char c = 0; 634*67e74705SXin Libut does not match 635*67e74705SXin Li int i = (0); 636*67e74705SXin Li int k = 0; 637*67e74705SXin Li</pre></td></tr> 638*67e74705SXin Li 639*67e74705SXin Li 640*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>...</td></tr> 641*67e74705SXin Li<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 642*67e74705SXin Li 643*67e74705SXin LiNot matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 644*67e74705SXin Lithough. 645*67e74705SXin Li 646*67e74705SXin LiExample matches 'a', L'a' 647*67e74705SXin Li char ch = 'a'; 648*67e74705SXin Li wchar_t chw = L'a'; 649*67e74705SXin Li</pre></td></tr> 650*67e74705SXin Li 651*67e74705SXin Li 652*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>...</td></tr> 653*67e74705SXin Li<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 654*67e74705SXin Li 655*67e74705SXin LiExample match: {1}, (1, 2) 656*67e74705SXin Li int array[4] = {1}; 657*67e74705SXin Li vector int myvec = (vector int)(1, 2); 658*67e74705SXin Li</pre></td></tr> 659*67e74705SXin Li 660*67e74705SXin Li 661*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>>...</td></tr> 662*67e74705SXin Li<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 663*67e74705SXin Li 664*67e74705SXin LiExample matches '{}' and '{{}}'in 'for (;;) {{}}' 665*67e74705SXin Li for (;;) {{}} 666*67e74705SXin Li</pre></td></tr> 667*67e74705SXin Li 668*67e74705SXin Li 669*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>>...</td></tr> 670*67e74705SXin Li<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 671*67e74705SXin Li 672*67e74705SXin LiExample matches a ? b : c 673*67e74705SXin Li (a ? b : c) + 42 674*67e74705SXin Li</pre></td></tr> 675*67e74705SXin Li 676*67e74705SXin Li 677*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>>...</td></tr> 678*67e74705SXin Li<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 679*67e74705SXin Li 680*67e74705SXin LiGiven 681*67e74705SXin Li while (true) { continue; } 682*67e74705SXin LicontinueStmt() 683*67e74705SXin Li matches 'continue' 684*67e74705SXin Li</pre></td></tr> 685*67e74705SXin Li 686*67e74705SXin Li 687*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>>...</td></tr> 688*67e74705SXin Li<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 689*67e74705SXin Li 690*67e74705SXin LiExample matches, 691*67e74705SXin Li kernel<<<i,j>>>(); 692*67e74705SXin Li</pre></td></tr> 693*67e74705SXin Li 694*67e74705SXin Li 695*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>>...</td></tr> 696*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 697*67e74705SXin Li 698*67e74705SXin LiExample matches FunctionTakesString(GetStringByValue()) 699*67e74705SXin Li (matcher = cxxBindTemporaryExpr()) 700*67e74705SXin Li FunctionTakesString(GetStringByValue()); 701*67e74705SXin Li FunctionTakesStringByPointer(GetStringPointer()); 702*67e74705SXin Li</pre></td></tr> 703*67e74705SXin Li 704*67e74705SXin Li 705*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>...</td></tr> 706*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 707*67e74705SXin Li 708*67e74705SXin LiExample matches true 709*67e74705SXin Li true 710*67e74705SXin Li</pre></td></tr> 711*67e74705SXin Li 712*67e74705SXin Li 713*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>>...</td></tr> 714*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 715*67e74705SXin Li 716*67e74705SXin Li try {} catch(int i) {} 717*67e74705SXin LicxxCatchStmt() 718*67e74705SXin Li matches 'catch(int i)' 719*67e74705SXin Li</pre></td></tr> 720*67e74705SXin Li 721*67e74705SXin Li 722*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>>...</td></tr> 723*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 724*67e74705SXin Li 725*67e74705SXin LiExample: Matches const_cast<int*>(&r) in 726*67e74705SXin Li int n = 42; 727*67e74705SXin Li const int &r(n); 728*67e74705SXin Li int* p = const_cast<int*>(&r); 729*67e74705SXin Li</pre></td></tr> 730*67e74705SXin Li 731*67e74705SXin Li 732*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>...</td></tr> 733*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 734*67e74705SXin Li 735*67e74705SXin LiExample matches string(ptr, n) and ptr within arguments of f 736*67e74705SXin Li (matcher = cxxConstructExpr()) 737*67e74705SXin Li void f(const string &a, const string &b); 738*67e74705SXin Li char *ptr; 739*67e74705SXin Li int n; 740*67e74705SXin Li f(string(ptr, n), ptr); 741*67e74705SXin Li</pre></td></tr> 742*67e74705SXin Li 743*67e74705SXin Li 744*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>>...</td></tr> 745*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 746*67e74705SXin Li 747*67e74705SXin LiExample matches the CXXDefaultArgExpr placeholder inserted for the 748*67e74705SXin Li default value of the second parameter in the call expression f(42) 749*67e74705SXin Li (matcher = cxxDefaultArgExpr()) 750*67e74705SXin Li void f(int x, int y = 0); 751*67e74705SXin Li f(42); 752*67e74705SXin Li</pre></td></tr> 753*67e74705SXin Li 754*67e74705SXin Li 755*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>>...</td></tr> 756*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 757*67e74705SXin Li 758*67e74705SXin LiGiven 759*67e74705SXin Li delete X; 760*67e74705SXin LicxxDeleteExpr() 761*67e74705SXin Li matches 'delete X'. 762*67e74705SXin Li</pre></td></tr> 763*67e74705SXin Li 764*67e74705SXin Li 765*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>>...</td></tr> 766*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 767*67e74705SXin Li 768*67e74705SXin LiExample: 769*67e74705SXin Li cxxDynamicCastExpr() 770*67e74705SXin Limatches 771*67e74705SXin Li dynamic_cast<D*>(&b); 772*67e74705SXin Liin 773*67e74705SXin Li struct B { virtual ~B() {} }; struct D : B {}; 774*67e74705SXin Li B b; 775*67e74705SXin Li D* p = dynamic_cast<D*>(&b); 776*67e74705SXin Li</pre></td></tr> 777*67e74705SXin Li 778*67e74705SXin Li 779*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>>...</td></tr> 780*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 781*67e74705SXin Li 782*67e74705SXin LicxxForRangeStmt() matches 'for (auto a : i)' 783*67e74705SXin Li int i[] = {1, 2, 3}; for (auto a : i); 784*67e74705SXin Li for(int j = 0; j < 5; ++j); 785*67e74705SXin Li</pre></td></tr> 786*67e74705SXin Li 787*67e74705SXin Li 788*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>...</td></tr> 789*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 790*67e74705SXin Li 791*67e74705SXin LiExample: Matches Foo(bar); 792*67e74705SXin Li Foo f = bar; 793*67e74705SXin Li Foo g = (Foo) bar; 794*67e74705SXin Li Foo h = Foo(bar); 795*67e74705SXin Li</pre></td></tr> 796*67e74705SXin Li 797*67e74705SXin Li 798*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr> 799*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 800*67e74705SXin Li 801*67e74705SXin LiExample matches x.y() 802*67e74705SXin Li X x; 803*67e74705SXin Li x.y(); 804*67e74705SXin Li</pre></td></tr> 805*67e74705SXin Li 806*67e74705SXin Li 807*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>...</td></tr> 808*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 809*67e74705SXin Li 810*67e74705SXin LiGiven 811*67e74705SXin Li new X; 812*67e74705SXin LicxxNewExpr() 813*67e74705SXin Li matches 'new X'. 814*67e74705SXin Li</pre></td></tr> 815*67e74705SXin Li 816*67e74705SXin Li 817*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>>...</td></tr> 818*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 819*67e74705SXin Li</pre></td></tr> 820*67e74705SXin Li 821*67e74705SXin Li 822*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr> 823*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 824*67e74705SXin Li 825*67e74705SXin LiNote that if an operator isn't overloaded, it won't match. Instead, use 826*67e74705SXin LibinaryOperator matcher. 827*67e74705SXin LiCurrently it does not match operators such as new delete. 828*67e74705SXin LiFIXME: figure out why these do not match? 829*67e74705SXin Li 830*67e74705SXin LiExample matches both operator<<((o << b), c) and operator<<(o, b) 831*67e74705SXin Li (matcher = cxxOperatorCallExpr()) 832*67e74705SXin Li ostream &operator<< (ostream &out, int i) { }; 833*67e74705SXin Li ostream &o; int b = 1, c = 1; 834*67e74705SXin Li o << b << c; 835*67e74705SXin Li</pre></td></tr> 836*67e74705SXin Li 837*67e74705SXin Li 838*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>>...</td></tr> 839*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 840*67e74705SXin Li 841*67e74705SXin LiEither the source expression or the destination type can be matched 842*67e74705SXin Liusing has(), but hasDestinationType() is more specific and can be 843*67e74705SXin Limore readable. 844*67e74705SXin Li 845*67e74705SXin LiExample matches reinterpret_cast<char*>(&p) in 846*67e74705SXin Li void* p = reinterpret_cast<char*>(&p); 847*67e74705SXin Li</pre></td></tr> 848*67e74705SXin Li 849*67e74705SXin Li 850*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>>...</td></tr> 851*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 852*67e74705SXin Li 853*67e74705SXin LiSee also: hasDestinationType 854*67e74705SXin LiSee also: reinterpretCast 855*67e74705SXin Li 856*67e74705SXin LiExample: 857*67e74705SXin Li cxxStaticCastExpr() 858*67e74705SXin Limatches 859*67e74705SXin Li static_cast<long>(8) 860*67e74705SXin Liin 861*67e74705SXin Li long eight(static_cast<long>(8)); 862*67e74705SXin Li</pre></td></tr> 863*67e74705SXin Li 864*67e74705SXin Li 865*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>...</td></tr> 866*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 867*67e74705SXin Li 868*67e74705SXin LiExample: Matches Foo(bar, bar) 869*67e74705SXin Li Foo h = Foo(bar, bar); 870*67e74705SXin Li</pre></td></tr> 871*67e74705SXin Li 872*67e74705SXin Li 873*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>>...</td></tr> 874*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 875*67e74705SXin Li 876*67e74705SXin LiExample matches the implicit this expression in "return i". 877*67e74705SXin Li (matcher = cxxThisExpr()) 878*67e74705SXin Listruct foo { 879*67e74705SXin Li int i; 880*67e74705SXin Li int f() { return i; } 881*67e74705SXin Li}; 882*67e74705SXin Li</pre></td></tr> 883*67e74705SXin Li 884*67e74705SXin Li 885*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>>...</td></tr> 886*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 887*67e74705SXin Li 888*67e74705SXin Li try { throw 5; } catch(int i) {} 889*67e74705SXin LicxxThrowExpr() 890*67e74705SXin Li matches 'throw 5' 891*67e74705SXin Li</pre></td></tr> 892*67e74705SXin Li 893*67e74705SXin Li 894*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>>...</td></tr> 895*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 896*67e74705SXin Li 897*67e74705SXin Li try {} catch(int i) {} 898*67e74705SXin LicxxTryStmt() 899*67e74705SXin Li matches 'try {}' 900*67e74705SXin Li</pre></td></tr> 901*67e74705SXin Li 902*67e74705SXin Li 903*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>...</td></tr> 904*67e74705SXin Li<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 905*67e74705SXin Li 906*67e74705SXin LiExample matches T(t) in return statement of f 907*67e74705SXin Li (matcher = cxxUnresolvedConstructExpr()) 908*67e74705SXin Li template <typename T> 909*67e74705SXin Li void f(const T& t) { return T(t); } 910*67e74705SXin Li</pre></td></tr> 911*67e74705SXin Li 912*67e74705SXin Li 913*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>...</td></tr> 914*67e74705SXin Li<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 915*67e74705SXin Li 916*67e74705SXin LiExample matches x in if (x) 917*67e74705SXin Li bool x; 918*67e74705SXin Li if (x) {} 919*67e74705SXin Li</pre></td></tr> 920*67e74705SXin Li 921*67e74705SXin Li 922*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>>...</td></tr> 923*67e74705SXin Li<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 924*67e74705SXin Li 925*67e74705SXin LiGiven 926*67e74705SXin Li int a; 927*67e74705SXin LideclStmt() 928*67e74705SXin Li matches 'int a'. 929*67e74705SXin Li</pre></td></tr> 930*67e74705SXin Li 931*67e74705SXin Li 932*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>>...</td></tr> 933*67e74705SXin Li<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 934*67e74705SXin Li 935*67e74705SXin LiGiven 936*67e74705SXin Li switch(a) { case 42: break; default: break; } 937*67e74705SXin LidefaultStmt() 938*67e74705SXin Li matches 'default: break;'. 939*67e74705SXin Li</pre></td></tr> 940*67e74705SXin Li 941*67e74705SXin Li 942*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>>...</td></tr> 943*67e74705SXin Li<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8]. 944*67e74705SXin Li 945*67e74705SXin LiExample: Matches { [2].y = 1.0, [0].x = 1.0 } 946*67e74705SXin Li point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 947*67e74705SXin Li</pre></td></tr> 948*67e74705SXin Li 949*67e74705SXin Li 950*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>>...</td></tr> 951*67e74705SXin Li<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 952*67e74705SXin Li 953*67e74705SXin LiGiven 954*67e74705SXin Li do {} while (true); 955*67e74705SXin LidoStmt() 956*67e74705SXin Li matches 'do {} while(true)' 957*67e74705SXin Li</pre></td></tr> 958*67e74705SXin Li 959*67e74705SXin Li 960*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>...</td></tr> 961*67e74705SXin Li<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 962*67e74705SXin Li 963*67e74705SXin LiMatches any cast expression written in user code, whether it be a 964*67e74705SXin LiC-style cast, a functional-style cast, or a keyword cast. 965*67e74705SXin Li 966*67e74705SXin LiDoes not match implicit conversions. 967*67e74705SXin Li 968*67e74705SXin LiNote: the name "explicitCast" is chosen to match Clang's terminology, as 969*67e74705SXin LiClang uses the term "cast" to apply to implicit conversions as well as to 970*67e74705SXin Liactual cast expressions. 971*67e74705SXin Li 972*67e74705SXin LiSee also: hasDestinationType. 973*67e74705SXin Li 974*67e74705SXin LiExample: matches all five of the casts in 975*67e74705SXin Li int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 976*67e74705SXin Libut does not match the implicit conversion in 977*67e74705SXin Li long ell = 42; 978*67e74705SXin Li</pre></td></tr> 979*67e74705SXin Li 980*67e74705SXin Li 981*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>...</td></tr> 982*67e74705SXin Li<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 983*67e74705SXin Li 984*67e74705SXin LiExample matches x() 985*67e74705SXin Li void f() { x(); } 986*67e74705SXin Li</pre></td></tr> 987*67e74705SXin Li 988*67e74705SXin Li 989*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>>...</td></tr> 990*67e74705SXin Li<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 991*67e74705SXin Liof the sub-expression's evaluation. 992*67e74705SXin Li 993*67e74705SXin LiExample matches std::string() 994*67e74705SXin Li const std::string str = std::string(); 995*67e74705SXin Li</pre></td></tr> 996*67e74705SXin Li 997*67e74705SXin Li 998*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>...</td></tr> 999*67e74705SXin Li<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g. 1000*67e74705SXin Li1.0, 1.0f, 1.0L and 1e10. 1001*67e74705SXin Li 1002*67e74705SXin LiDoes not match implicit conversions such as 1003*67e74705SXin Li float a = 10; 1004*67e74705SXin Li</pre></td></tr> 1005*67e74705SXin Li 1006*67e74705SXin Li 1007*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>>...</td></tr> 1008*67e74705SXin Li<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 1009*67e74705SXin Li 1010*67e74705SXin LiExample matches 'for (;;) {}' 1011*67e74705SXin Li for (;;) {} 1012*67e74705SXin Li int i[] = {1, 2, 3}; for (auto a : i); 1013*67e74705SXin Li</pre></td></tr> 1014*67e74705SXin Li 1015*67e74705SXin Li 1016*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>>...</td></tr> 1017*67e74705SXin Li<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 1018*67e74705SXin Li</pre></td></tr> 1019*67e74705SXin Li 1020*67e74705SXin Li 1021*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>>...</td></tr> 1022*67e74705SXin Li<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 1023*67e74705SXin Li 1024*67e74705SXin LiGiven 1025*67e74705SXin Li goto FOO; 1026*67e74705SXin Li FOO: bar(); 1027*67e74705SXin LigotoStmt() 1028*67e74705SXin Li matches 'goto FOO' 1029*67e74705SXin Li</pre></td></tr> 1030*67e74705SXin Li 1031*67e74705SXin Li 1032*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>>...</td></tr> 1033*67e74705SXin Li<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 1034*67e74705SXin Li 1035*67e74705SXin LiExample matches 'if (x) {}' 1036*67e74705SXin Li if (x) {} 1037*67e74705SXin Li</pre></td></tr> 1038*67e74705SXin Li 1039*67e74705SXin Li 1040*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>>...</td></tr> 1041*67e74705SXin Li<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 1042*67e74705SXin Li 1043*67e74705SXin LiThis matches many different places, including function call return value 1044*67e74705SXin Lieliding, as well as any type conversions. 1045*67e74705SXin Li</pre></td></tr> 1046*67e74705SXin Li 1047*67e74705SXin Li 1048*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>>...</td></tr> 1049*67e74705SXin Li<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions. 1050*67e74705SXin Li 1051*67e74705SXin LiGiven 1052*67e74705SXin Li point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 1053*67e74705SXin LiimplicitValueInitExpr() 1054*67e74705SXin Li matches "[0].y" (implicitly) 1055*67e74705SXin Li</pre></td></tr> 1056*67e74705SXin Li 1057*67e74705SXin Li 1058*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>>...</td></tr> 1059*67e74705SXin Li<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 1060*67e74705SXin Li 1061*67e74705SXin LiGiven 1062*67e74705SXin Li int a[] = { 1, 2 }; 1063*67e74705SXin Li struct B { int x, y; }; 1064*67e74705SXin Li B b = { 5, 6 }; 1065*67e74705SXin LiinitListExpr() 1066*67e74705SXin Li matches "{ 1, 2 }" and "{ 5, 6 }" 1067*67e74705SXin Li</pre></td></tr> 1068*67e74705SXin Li 1069*67e74705SXin Li 1070*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>...</td></tr> 1071*67e74705SXin Li<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g. 1072*67e74705SXin Li1, 1L, 0x1 and 1U. 1073*67e74705SXin Li 1074*67e74705SXin LiDoes not match character-encoded integers such as L'a'. 1075*67e74705SXin Li</pre></td></tr> 1076*67e74705SXin Li 1077*67e74705SXin Li 1078*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>...</td></tr> 1079*67e74705SXin Li<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 1080*67e74705SXin Li 1081*67e74705SXin LiGiven 1082*67e74705SXin Li goto FOO; 1083*67e74705SXin Li FOO: bar(); 1084*67e74705SXin LilabelStmt() 1085*67e74705SXin Li matches 'FOO:' 1086*67e74705SXin Li</pre></td></tr> 1087*67e74705SXin Li 1088*67e74705SXin Li 1089*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>>...</td></tr> 1090*67e74705SXin Li<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1091*67e74705SXin Li 1092*67e74705SXin LiExample matches [&](){return 5;} 1093*67e74705SXin Li [&](){return 5;} 1094*67e74705SXin Li</pre></td></tr> 1095*67e74705SXin Li 1096*67e74705SXin Li 1097*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>>...</td></tr> 1098*67e74705SXin Li<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1099*67e74705SXin Li 1100*67e74705SXin LiExample: Given 1101*67e74705SXin Li struct T {void func()}; 1102*67e74705SXin Li T f(); 1103*67e74705SXin Li void g(T); 1104*67e74705SXin LimaterializeTemporaryExpr() matches 'f()' in these statements 1105*67e74705SXin Li T u(f()); 1106*67e74705SXin Li g(f()); 1107*67e74705SXin Libut does not match 1108*67e74705SXin Li f(); 1109*67e74705SXin Li f().func(); 1110*67e74705SXin Li</pre></td></tr> 1111*67e74705SXin Li 1112*67e74705SXin Li 1113*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>...</td></tr> 1114*67e74705SXin Li<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1115*67e74705SXin Li 1116*67e74705SXin LiGiven 1117*67e74705SXin Li class Y { 1118*67e74705SXin Li void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1119*67e74705SXin Li int a; static int b; 1120*67e74705SXin Li }; 1121*67e74705SXin LimemberExpr() 1122*67e74705SXin Li matches this->x, x, y.x, a, this->b 1123*67e74705SXin Li</pre></td></tr> 1124*67e74705SXin Li 1125*67e74705SXin Li 1126*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>>...</td></tr> 1127*67e74705SXin Li<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1128*67e74705SXin Li 1129*67e74705SXin Li foo();; 1130*67e74705SXin LinullStmt() 1131*67e74705SXin Li matches the second ';' 1132*67e74705SXin Li</pre></td></tr> 1133*67e74705SXin Li 1134*67e74705SXin Li 1135*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>>...</td></tr> 1136*67e74705SXin Li<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 1137*67e74705SXin Li 1138*67e74705SXin LiThe innermost message send invokes the "alloc" class method on the 1139*67e74705SXin LiNSString class, while the outermost message send invokes the 1140*67e74705SXin Li"initWithString" instance method on the object returned from 1141*67e74705SXin LiNSString's "alloc". This matcher should match both message sends. 1142*67e74705SXin Li [[NSString alloc] initWithString:@"Hello"] 1143*67e74705SXin Li</pre></td></tr> 1144*67e74705SXin Li 1145*67e74705SXin Li 1146*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>>...</td></tr> 1147*67e74705SXin Li<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers 1148*67e74705SXin Lito reference another expressions and can be met 1149*67e74705SXin Liin BinaryConditionalOperators, for example. 1150*67e74705SXin Li 1151*67e74705SXin LiExample matches 'a' 1152*67e74705SXin Li (a ?: c) + 42; 1153*67e74705SXin Li</pre></td></tr> 1154*67e74705SXin Li 1155*67e74705SXin Li 1156*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>>...</td></tr> 1157*67e74705SXin Li<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions. 1158*67e74705SXin Li 1159*67e74705SXin LiExample matches (foo() + 1) 1160*67e74705SXin Li int foo() { return 1; } 1161*67e74705SXin Li int a = (foo() + 1); 1162*67e74705SXin Li</pre></td></tr> 1163*67e74705SXin Li 1164*67e74705SXin Li 1165*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>>...</td></tr> 1166*67e74705SXin Li<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions. 1167*67e74705SXin LiParenListExprs don't have a predefined type and are used for late parsing. 1168*67e74705SXin LiIn the final AST, they can be met in template declarations. 1169*67e74705SXin Li 1170*67e74705SXin LiGiven 1171*67e74705SXin Li template<typename T> class X { 1172*67e74705SXin Li void f() { 1173*67e74705SXin Li X x(*this); 1174*67e74705SXin Li int a = 0, b = 1; int i = (a, b); 1175*67e74705SXin Li } 1176*67e74705SXin Li }; 1177*67e74705SXin LiparenListExpr() matches "*this" but NOT matches (a, b) because (a, b) 1178*67e74705SXin Lihas a predefined type and is a ParenExpr, not a ParenListExpr. 1179*67e74705SXin Li</pre></td></tr> 1180*67e74705SXin Li 1181*67e74705SXin Li 1182*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>>...</td></tr> 1183*67e74705SXin Li<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2]. 1184*67e74705SXin Li 1185*67e74705SXin LiExample: Matches __func__ 1186*67e74705SXin Li printf("%s", __func__); 1187*67e74705SXin Li</pre></td></tr> 1188*67e74705SXin Li 1189*67e74705SXin Li 1190*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>>...</td></tr> 1191*67e74705SXin Li<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 1192*67e74705SXin Li 1193*67e74705SXin LiGiven 1194*67e74705SXin Li return 1; 1195*67e74705SXin LireturnStmt() 1196*67e74705SXin Li matches 'return 1' 1197*67e74705SXin Li</pre></td></tr> 1198*67e74705SXin Li 1199*67e74705SXin Li 1200*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>...</td></tr> 1201*67e74705SXin Li<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 1202*67e74705SXin Li 1203*67e74705SXin LiGiven 1204*67e74705SXin Li { ++a; } 1205*67e74705SXin Listmt() 1206*67e74705SXin Li matches both the compound statement '{ ++a; }' and '++a'. 1207*67e74705SXin Li</pre></td></tr> 1208*67e74705SXin Li 1209*67e74705SXin Li 1210*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>>...</td></tr> 1211*67e74705SXin Li<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension). 1212*67e74705SXin Li 1213*67e74705SXin LiExample match: ({ int X = 4; X; }) 1214*67e74705SXin Li int C = ({ int X = 4; X; }); 1215*67e74705SXin Li</pre></td></tr> 1216*67e74705SXin Li 1217*67e74705SXin Li 1218*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>>...</td></tr> 1219*67e74705SXin Li<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 1220*67e74705SXin Li 1221*67e74705SXin LiExample matches "abcd", L"abcd" 1222*67e74705SXin Li char *s = "abcd"; 1223*67e74705SXin Li wchar_t *ws = L"abcd"; 1224*67e74705SXin Li</pre></td></tr> 1225*67e74705SXin Li 1226*67e74705SXin Li 1227*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>>...</td></tr> 1228*67e74705SXin Li<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 1229*67e74705SXin Li 1230*67e74705SXin LiGiven 1231*67e74705SXin Li template <int N> 1232*67e74705SXin Li struct A { static const int n = N; }; 1233*67e74705SXin Li struct B : public A<42> {}; 1234*67e74705SXin LisubstNonTypeTemplateParmExpr() 1235*67e74705SXin Li matches "N" in the right-hand side of "static const int n = N;" 1236*67e74705SXin Li</pre></td></tr> 1237*67e74705SXin Li 1238*67e74705SXin Li 1239*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>>...</td></tr> 1240*67e74705SXin Li<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 1241*67e74705SXin Li 1242*67e74705SXin LiGiven 1243*67e74705SXin Li switch(a) { case 42: break; default: break; } 1244*67e74705SXin LiswitchCase() 1245*67e74705SXin Li matches 'case 42: break;' and 'default: break;'. 1246*67e74705SXin Li</pre></td></tr> 1247*67e74705SXin Li 1248*67e74705SXin Li 1249*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>>...</td></tr> 1250*67e74705SXin Li<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 1251*67e74705SXin Li 1252*67e74705SXin LiGiven 1253*67e74705SXin Li switch(a) { case 42: break; default: break; } 1254*67e74705SXin LiswitchStmt() 1255*67e74705SXin Li matches 'switch(a)'. 1256*67e74705SXin Li</pre></td></tr> 1257*67e74705SXin Li 1258*67e74705SXin Li 1259*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>>...</td></tr> 1260*67e74705SXin Li<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 1261*67e74705SXin Li 1262*67e74705SXin LiGiven 1263*67e74705SXin Li Foo x = bar; 1264*67e74705SXin Li int y = sizeof(x) + alignof(x); 1265*67e74705SXin LiunaryExprOrTypeTraitExpr() 1266*67e74705SXin Li matches sizeof(x) and alignof(x) 1267*67e74705SXin Li</pre></td></tr> 1268*67e74705SXin Li 1269*67e74705SXin Li 1270*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>>...</td></tr> 1271*67e74705SXin Li<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 1272*67e74705SXin Li 1273*67e74705SXin LiExample matches !a 1274*67e74705SXin Li !a || b 1275*67e74705SXin Li</pre></td></tr> 1276*67e74705SXin Li 1277*67e74705SXin Li 1278*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>>...</td></tr> 1279*67e74705SXin Li<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing 1280*67e74705SXin Libut could not be resolved to a specific declaration. 1281*67e74705SXin Li 1282*67e74705SXin LiGiven 1283*67e74705SXin Li template<typename T> 1284*67e74705SXin Li T foo() { T a; return a; } 1285*67e74705SXin Li template<typename T> 1286*67e74705SXin Li void bar() { 1287*67e74705SXin Li foo<T>(); 1288*67e74705SXin Li } 1289*67e74705SXin LiunresolvedLookupExpr() 1290*67e74705SXin Li matches foo<T>() </pre></td></tr> 1291*67e74705SXin Li 1292*67e74705SXin Li 1293*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>>...</td></tr> 1294*67e74705SXin Li<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 1295*67e74705SXin Li 1296*67e74705SXin LiExample match: "foo"_suffix 1297*67e74705SXin Li</pre></td></tr> 1298*67e74705SXin Li 1299*67e74705SXin Li 1300*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>>...</td></tr> 1301*67e74705SXin Li<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 1302*67e74705SXin Li 1303*67e74705SXin LiGiven 1304*67e74705SXin Li while (true) {} 1305*67e74705SXin LiwhileStmt() 1306*67e74705SXin Li matches 'while (true) {}'. 1307*67e74705SXin Li</pre></td></tr> 1308*67e74705SXin Li 1309*67e74705SXin Li 1310*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>>...</td></tr> 1311*67e74705SXin Li<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 1312*67e74705SXin Li 1313*67e74705SXin LiGiven 1314*67e74705SXin Li template <typename T> struct C {}; 1315*67e74705SXin Li C<int> c; 1316*67e74705SXin LitemplateArgument() 1317*67e74705SXin Li matches 'int' in C<int>. 1318*67e74705SXin Li</pre></td></tr> 1319*67e74705SXin Li 1320*67e74705SXin Li 1321*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>...</td></tr> 1322*67e74705SXin Li<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 1323*67e74705SXin Li</pre></td></tr> 1324*67e74705SXin Li 1325*67e74705SXin Li 1326*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>...</td></tr> 1327*67e74705SXin Li<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 1328*67e74705SXin Li 1329*67e74705SXin LiGiven 1330*67e74705SXin Li int a[] = { 2, 3 }; 1331*67e74705SXin Li int b[4]; 1332*67e74705SXin Li void f() { int c[a[0]]; } 1333*67e74705SXin LiarrayType() 1334*67e74705SXin Li matches "int a[]", "int b[4]" and "int c[a[0]]"; 1335*67e74705SXin Li</pre></td></tr> 1336*67e74705SXin Li 1337*67e74705SXin Li 1338*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>>...</td></tr> 1339*67e74705SXin Li<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 1340*67e74705SXin Li 1341*67e74705SXin LiGiven 1342*67e74705SXin Li _Atomic(int) i; 1343*67e74705SXin LiatomicType() 1344*67e74705SXin Li matches "_Atomic(int) i" 1345*67e74705SXin Li</pre></td></tr> 1346*67e74705SXin Li 1347*67e74705SXin Li 1348*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>>...</td></tr> 1349*67e74705SXin Li<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 1350*67e74705SXin Li 1351*67e74705SXin LiGiven: 1352*67e74705SXin Li auto n = 4; 1353*67e74705SXin Li int v[] = { 2, 3 } 1354*67e74705SXin Li for (auto i : v) { } 1355*67e74705SXin LiautoType() 1356*67e74705SXin Li matches "auto n" and "auto i" 1357*67e74705SXin Li</pre></td></tr> 1358*67e74705SXin Li 1359*67e74705SXin Li 1360*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>...</td></tr> 1361*67e74705SXin Li<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 1362*67e74705SXin Li"void (^)(int)". 1363*67e74705SXin Li 1364*67e74705SXin LiThe pointee is always required to be a FunctionType. 1365*67e74705SXin Li</pre></td></tr> 1366*67e74705SXin Li 1367*67e74705SXin Li 1368*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>>...</td></tr> 1369*67e74705SXin Li<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 1370*67e74705SXin Li 1371*67e74705SXin LiGiven 1372*67e74705SXin Li struct A {}; 1373*67e74705SXin Li A a; 1374*67e74705SXin Li int b; 1375*67e74705SXin Li float c; 1376*67e74705SXin Li bool d; 1377*67e74705SXin LibuiltinType() 1378*67e74705SXin Li matches "int b", "float c" and "bool d" 1379*67e74705SXin Li</pre></td></tr> 1380*67e74705SXin Li 1381*67e74705SXin Li 1382*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>>...</td></tr> 1383*67e74705SXin Li<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 1384*67e74705SXin Li 1385*67e74705SXin LiGiven 1386*67e74705SXin Li _Complex float f; 1387*67e74705SXin LicomplexType() 1388*67e74705SXin Li matches "_Complex float f" 1389*67e74705SXin Li</pre></td></tr> 1390*67e74705SXin Li 1391*67e74705SXin Li 1392*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>>...</td></tr> 1393*67e74705SXin Li<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 1394*67e74705SXin Li 1395*67e74705SXin LiGiven 1396*67e74705SXin Li void() { 1397*67e74705SXin Li int a[2]; 1398*67e74705SXin Li int b[] = { 2, 3 }; 1399*67e74705SXin Li int c[b[0]]; 1400*67e74705SXin Li } 1401*67e74705SXin LiconstantArrayType() 1402*67e74705SXin Li matches "int a[2]" 1403*67e74705SXin Li</pre></td></tr> 1404*67e74705SXin Li 1405*67e74705SXin Li 1406*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>>...</td></tr> 1407*67e74705SXin Li<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 1408*67e74705SXin LiExample matches i[] in declaration of f. 1409*67e74705SXin Li (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 1410*67e74705SXin LiExample matches i[1]. 1411*67e74705SXin Li (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 1412*67e74705SXin Li void f(int i[]) { 1413*67e74705SXin Li i[1] = 0; 1414*67e74705SXin Li } 1415*67e74705SXin Li</pre></td></tr> 1416*67e74705SXin Li 1417*67e74705SXin Li 1418*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>>...</td></tr> 1419*67e74705SXin Li<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 1420*67e74705SXin Li 1421*67e74705SXin LiGiven 1422*67e74705SXin Li template<typename T, int Size> 1423*67e74705SXin Li class array { 1424*67e74705SXin Li T data[Size]; 1425*67e74705SXin Li }; 1426*67e74705SXin LidependentSizedArrayType 1427*67e74705SXin Li matches "T data[Size]" 1428*67e74705SXin Li</pre></td></tr> 1429*67e74705SXin Li 1430*67e74705SXin Li 1431*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>>...</td></tr> 1432*67e74705SXin Li<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 1433*67e74705SXin Liqualified name. 1434*67e74705SXin Li 1435*67e74705SXin LiGiven 1436*67e74705SXin Li namespace N { 1437*67e74705SXin Li namespace M { 1438*67e74705SXin Li class D {}; 1439*67e74705SXin Li } 1440*67e74705SXin Li } 1441*67e74705SXin Li class C {}; 1442*67e74705SXin Li 1443*67e74705SXin Li class C c; 1444*67e74705SXin Li N::M::D d; 1445*67e74705SXin Li 1446*67e74705SXin LielaboratedType() matches the type of the variable declarations of both 1447*67e74705SXin Lic and d. 1448*67e74705SXin Li</pre></td></tr> 1449*67e74705SXin Li 1450*67e74705SXin Li 1451*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>...</td></tr> 1452*67e74705SXin Li<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types. 1453*67e74705SXin Li 1454*67e74705SXin LiGiven 1455*67e74705SXin Li enum C { Green }; 1456*67e74705SXin Li enum class S { Red }; 1457*67e74705SXin Li 1458*67e74705SXin Li C c; 1459*67e74705SXin Li S s; 1460*67e74705SXin Li 1461*67e74705SXin LienumType() matches the type of the variable declarations of both c and 1462*67e74705SXin Lis. 1463*67e74705SXin Li</pre></td></tr> 1464*67e74705SXin Li 1465*67e74705SXin Li 1466*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>>...</td></tr> 1467*67e74705SXin Li<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes. 1468*67e74705SXin Li 1469*67e74705SXin LiGiven 1470*67e74705SXin Li int (*f)(int); 1471*67e74705SXin Li void g(); 1472*67e74705SXin LifunctionProtoType() 1473*67e74705SXin Li matches "int (*f)(int)" and the type of "g" in C++ mode. 1474*67e74705SXin Li In C mode, "g" is not matched because it does not contain a prototype. 1475*67e74705SXin Li</pre></td></tr> 1476*67e74705SXin Li 1477*67e74705SXin Li 1478*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>>...</td></tr> 1479*67e74705SXin Li<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 1480*67e74705SXin Li 1481*67e74705SXin LiGiven 1482*67e74705SXin Li int (*f)(int); 1483*67e74705SXin Li void g(); 1484*67e74705SXin LifunctionType() 1485*67e74705SXin Li matches "int (*f)(int)" and the type of "g". 1486*67e74705SXin Li</pre></td></tr> 1487*67e74705SXin Li 1488*67e74705SXin Li 1489*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>>...</td></tr> 1490*67e74705SXin Li<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 1491*67e74705SXin Li 1492*67e74705SXin LiGiven 1493*67e74705SXin Li int a[] = { 2, 3 }; 1494*67e74705SXin Li int b[42]; 1495*67e74705SXin Li void f(int c[]) { int d[a[0]]; }; 1496*67e74705SXin LiincompleteArrayType() 1497*67e74705SXin Li matches "int a[]" and "int c[]" 1498*67e74705SXin Li</pre></td></tr> 1499*67e74705SXin Li 1500*67e74705SXin Li 1501*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>...</td></tr> 1502*67e74705SXin Li<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 1503*67e74705SXin Li 1504*67e74705SXin LiExample matches S s, but not S<T> s. 1505*67e74705SXin Li (matcher = parmVarDecl(hasType(injectedClassNameType()))) 1506*67e74705SXin Li template <typename T> struct S { 1507*67e74705SXin Li void f(S s); 1508*67e74705SXin Li void g(S<T> s); 1509*67e74705SXin Li }; 1510*67e74705SXin Li</pre></td></tr> 1511*67e74705SXin Li 1512*67e74705SXin Li 1513*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>>...</td></tr> 1514*67e74705SXin Li<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 1515*67e74705SXin Li 1516*67e74705SXin LiGiven: 1517*67e74705SXin Li int *a; 1518*67e74705SXin Li int &b = *a; 1519*67e74705SXin Li int &&c = 1; 1520*67e74705SXin Li auto &d = b; 1521*67e74705SXin Li auto &&e = c; 1522*67e74705SXin Li auto &&f = 2; 1523*67e74705SXin Li int g = 5; 1524*67e74705SXin Li 1525*67e74705SXin LilValueReferenceType() matches the types of b, d, and e. e is 1526*67e74705SXin Limatched since the type is deduced as int& by reference collapsing rules. 1527*67e74705SXin Li</pre></td></tr> 1528*67e74705SXin Li 1529*67e74705SXin Li 1530*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>...</td></tr> 1531*67e74705SXin Li<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 1532*67e74705SXin LiGiven 1533*67e74705SXin Li struct A { int i; } 1534*67e74705SXin Li A::* ptr = A::i; 1535*67e74705SXin LimemberPointerType() 1536*67e74705SXin Li matches "A::* ptr" 1537*67e74705SXin Li</pre></td></tr> 1538*67e74705SXin Li 1539*67e74705SXin Li 1540*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>>...</td></tr> 1541*67e74705SXin Li<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 1542*67e74705SXin Lia pointer type, despite being syntactically similar. 1543*67e74705SXin Li 1544*67e74705SXin LiGiven 1545*67e74705SXin Li int *a; 1546*67e74705SXin Li 1547*67e74705SXin Li @interface Foo 1548*67e74705SXin Li @end 1549*67e74705SXin Li Foo *f; 1550*67e74705SXin LipointerType() 1551*67e74705SXin Li matches "Foo *f", but does not match "int *a". 1552*67e74705SXin Li</pre></td></tr> 1553*67e74705SXin Li 1554*67e74705SXin Li 1555*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>>...</td></tr> 1556*67e74705SXin Li<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 1557*67e74705SXin Li 1558*67e74705SXin LiGiven 1559*67e74705SXin Li int (*ptr_to_array)[4]; 1560*67e74705SXin Li int *array_of_ptrs[4]; 1561*67e74705SXin Li 1562*67e74705SXin LivarDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 1563*67e74705SXin Liarray_of_ptrs. 1564*67e74705SXin Li</pre></td></tr> 1565*67e74705SXin Li 1566*67e74705SXin Li 1567*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>...</td></tr> 1568*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 1569*67e74705SXin Litypes. 1570*67e74705SXin Li 1571*67e74705SXin LiGiven 1572*67e74705SXin Li int *a; 1573*67e74705SXin Li int &b = *a; 1574*67e74705SXin Li int c = 5; 1575*67e74705SXin Li 1576*67e74705SXin Li @interface Foo 1577*67e74705SXin Li @end 1578*67e74705SXin Li Foo *f; 1579*67e74705SXin LipointerType() 1580*67e74705SXin Li matches "int *a", but does not match "Foo *f". 1581*67e74705SXin Li</pre></td></tr> 1582*67e74705SXin Li 1583*67e74705SXin Li 1584*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>>...</td></tr> 1585*67e74705SXin Li<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 1586*67e74705SXin Li 1587*67e74705SXin LiGiven: 1588*67e74705SXin Li int *a; 1589*67e74705SXin Li int &b = *a; 1590*67e74705SXin Li int &&c = 1; 1591*67e74705SXin Li auto &d = b; 1592*67e74705SXin Li auto &&e = c; 1593*67e74705SXin Li auto &&f = 2; 1594*67e74705SXin Li int g = 5; 1595*67e74705SXin Li 1596*67e74705SXin LirValueReferenceType() matches the types of c and f. e is not 1597*67e74705SXin Limatched as it is deduced to int& by reference collapsing rules. 1598*67e74705SXin Li</pre></td></tr> 1599*67e74705SXin Li 1600*67e74705SXin Li 1601*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>...</td></tr> 1602*67e74705SXin Li<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 1603*67e74705SXin Li 1604*67e74705SXin LiGiven 1605*67e74705SXin Li class C {}; 1606*67e74705SXin Li struct S {}; 1607*67e74705SXin Li 1608*67e74705SXin Li C c; 1609*67e74705SXin Li S s; 1610*67e74705SXin Li 1611*67e74705SXin LirecordType() matches the type of the variable declarations of both c 1612*67e74705SXin Liand s. 1613*67e74705SXin Li</pre></td></tr> 1614*67e74705SXin Li 1615*67e74705SXin Li 1616*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>...</td></tr> 1617*67e74705SXin Li<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 1618*67e74705SXin Li 1619*67e74705SXin LiGiven 1620*67e74705SXin Li int *a; 1621*67e74705SXin Li int &b = *a; 1622*67e74705SXin Li int &&c = 1; 1623*67e74705SXin Li auto &d = b; 1624*67e74705SXin Li auto &&e = c; 1625*67e74705SXin Li auto &&f = 2; 1626*67e74705SXin Li int g = 5; 1627*67e74705SXin Li 1628*67e74705SXin LireferenceType() matches the types of b, c, d, e, and f. 1629*67e74705SXin Li</pre></td></tr> 1630*67e74705SXin Li 1631*67e74705SXin Li 1632*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>>...</td></tr> 1633*67e74705SXin Li<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 1634*67e74705SXin Litemplate type parameter. 1635*67e74705SXin Li 1636*67e74705SXin LiGiven 1637*67e74705SXin Li template <typename T> 1638*67e74705SXin Li void F(T t) { 1639*67e74705SXin Li int i = 1 + t; 1640*67e74705SXin Li } 1641*67e74705SXin Li 1642*67e74705SXin LisubstTemplateTypeParmType() matches the type of 't' but not '1' 1643*67e74705SXin Li</pre></td></tr> 1644*67e74705SXin Li 1645*67e74705SXin Li 1646*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>...</td></tr> 1647*67e74705SXin Li<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 1648*67e74705SXin Li 1649*67e74705SXin LiGiven 1650*67e74705SXin Li template <typename T> 1651*67e74705SXin Li class C { }; 1652*67e74705SXin Li 1653*67e74705SXin Li template class C<int>; A 1654*67e74705SXin Li C<char> var; B 1655*67e74705SXin Li 1656*67e74705SXin LitemplateSpecializationType() matches the type of the explicit 1657*67e74705SXin Liinstantiation in A and the type of the variable declaration in B. 1658*67e74705SXin Li</pre></td></tr> 1659*67e74705SXin Li 1660*67e74705SXin Li 1661*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>...</td></tr> 1662*67e74705SXin Li<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 1663*67e74705SXin Li 1664*67e74705SXin LiExample matches T, but not int. 1665*67e74705SXin Li (matcher = templateTypeParmType()) 1666*67e74705SXin Li template <typename T> void f(int i); 1667*67e74705SXin Li</pre></td></tr> 1668*67e74705SXin Li 1669*67e74705SXin Li 1670*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>>...</td></tr> 1671*67e74705SXin Li<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 1672*67e74705SXin Li</pre></td></tr> 1673*67e74705SXin Li 1674*67e74705SXin Li 1675*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>...</td></tr> 1676*67e74705SXin Li<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 1677*67e74705SXin Li 1678*67e74705SXin LiGiven 1679*67e74705SXin Li typedef int X; 1680*67e74705SXin LitypedefType() 1681*67e74705SXin Li matches "typedef int X" 1682*67e74705SXin Li</pre></td></tr> 1683*67e74705SXin Li 1684*67e74705SXin Li 1685*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>>...</td></tr> 1686*67e74705SXin Li<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 1687*67e74705SXin Li 1688*67e74705SXin LiGiven: 1689*67e74705SXin Li typedef __underlying_type(T) type; 1690*67e74705SXin LiunaryTransformType() 1691*67e74705SXin Li matches "__underlying_type(T)" 1692*67e74705SXin Li</pre></td></tr> 1693*67e74705SXin Li 1694*67e74705SXin Li 1695*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>>...</td></tr> 1696*67e74705SXin Li<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 1697*67e74705SXin Liinteger-constant-expression. 1698*67e74705SXin Li 1699*67e74705SXin LiGiven 1700*67e74705SXin Li void f() { 1701*67e74705SXin Li int a[] = { 2, 3 } 1702*67e74705SXin Li int b[42]; 1703*67e74705SXin Li int c[a[0]]; 1704*67e74705SXin Li } 1705*67e74705SXin LivariableArrayType() 1706*67e74705SXin Li matches "int c[a[0]]" 1707*67e74705SXin Li</pre></td></tr> 1708*67e74705SXin Li 1709*67e74705SXin Li<!--END_DECL_MATCHERS --> 1710*67e74705SXin Li</table> 1711*67e74705SXin Li 1712*67e74705SXin Li<!-- ======================================================================= --> 1713*67e74705SXin Li<h2 id="narrowing-matchers">Narrowing Matchers</h2> 1714*67e74705SXin Li<!-- ======================================================================= --> 1715*67e74705SXin Li 1716*67e74705SXin Li<p>Narrowing matchers match certain attributes on the current node, thus 1717*67e74705SXin Linarrowing down the set of nodes of the current type to match on.</p> 1718*67e74705SXin Li 1719*67e74705SXin Li<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 1720*67e74705SXin Liwhich allow users to create more powerful match expressions.</p> 1721*67e74705SXin Li 1722*67e74705SXin Li<table> 1723*67e74705SXin Li<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 1724*67e74705SXin Li<!-- START_NARROWING_MATCHERS --> 1725*67e74705SXin Li 1726*67e74705SXin Li<tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 1727*67e74705SXin Li<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 1728*67e74705SXin Li 1729*67e74705SXin LiUsable as: Any Matcher 1730*67e74705SXin Li</pre></td></tr> 1731*67e74705SXin Li 1732*67e74705SXin Li 1733*67e74705SXin Li<tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 1734*67e74705SXin Li<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 1735*67e74705SXin Li 1736*67e74705SXin LiUsable as: Any Matcher 1737*67e74705SXin Li</pre></td></tr> 1738*67e74705SXin Li 1739*67e74705SXin Li 1740*67e74705SXin Li<tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 1741*67e74705SXin Li<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 1742*67e74705SXin Li 1743*67e74705SXin LiUseful when another matcher requires a child matcher, but there's no 1744*67e74705SXin Liadditional constraint. This will often be used with an explicit conversion 1745*67e74705SXin Lito an internal::Matcher<> type such as TypeMatcher. 1746*67e74705SXin Li 1747*67e74705SXin LiExample: DeclarationMatcher(anything()) matches all declarations, e.g., 1748*67e74705SXin Li"int* p" and "void f()" in 1749*67e74705SXin Li int* p; 1750*67e74705SXin Li void f(); 1751*67e74705SXin Li 1752*67e74705SXin LiUsable as: Any Matcher 1753*67e74705SXin Li</pre></td></tr> 1754*67e74705SXin Li 1755*67e74705SXin Li 1756*67e74705SXin Li<tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 1757*67e74705SXin Li<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 1758*67e74705SXin Li 1759*67e74705SXin LiExample matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 1760*67e74705SXin Li class X {}; 1761*67e74705SXin Li class Y {}; 1762*67e74705SXin Li 1763*67e74705SXin LiUsable as: Any Matcher 1764*67e74705SXin Li</pre></td></tr> 1765*67e74705SXin Li 1766*67e74705SXin Li 1767*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 1768*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 1769*67e74705SXin Liunary). 1770*67e74705SXin Li 1771*67e74705SXin LiExample matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 1772*67e74705SXin Li !(a || b) 1773*67e74705SXin Li</pre></td></tr> 1774*67e74705SXin Li 1775*67e74705SXin Li 1776*67e74705SXin Li<tr><td>Matcher<CXXBoolLiteral></td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT Value</td></tr> 1777*67e74705SXin Li<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value. 1778*67e74705SXin Li 1779*67e74705SXin LiExample matches true (matcher = cxxBoolLiteral(equals(true))) 1780*67e74705SXin Li true 1781*67e74705SXin Li 1782*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 1783*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 1784*67e74705SXin Li</pre></td></tr> 1785*67e74705SXin Li 1786*67e74705SXin Li 1787*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 1788*67e74705SXin Li<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 1789*67e74705SXin Li 1790*67e74705SXin LiGiven 1791*67e74705SXin Li try { 1792*67e74705SXin Li ... 1793*67e74705SXin Li } catch (int) { 1794*67e74705SXin Li ... 1795*67e74705SXin Li } catch (...) { 1796*67e74705SXin Li ... 1797*67e74705SXin Li } 1798*67e74705SXin Liendcode 1799*67e74705SXin LicxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 1800*67e74705SXin Li</pre></td></tr> 1801*67e74705SXin Li 1802*67e74705SXin Li 1803*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 1804*67e74705SXin Li<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 1805*67e74705SXin Lia specific number of arguments (including absent default arguments). 1806*67e74705SXin Li 1807*67e74705SXin LiExample matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 1808*67e74705SXin Li void f(int x, int y); 1809*67e74705SXin Li f(0, 0); 1810*67e74705SXin Li</pre></td></tr> 1811*67e74705SXin Li 1812*67e74705SXin Li 1813*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 1814*67e74705SXin Li<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 1815*67e74705SXin Li</pre></td></tr> 1816*67e74705SXin Li 1817*67e74705SXin Li 1818*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 1819*67e74705SXin Li<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 1820*67e74705SXin Lizero initialization. 1821*67e74705SXin Li 1822*67e74705SXin LiGiven 1823*67e74705SXin Livoid foo() { 1824*67e74705SXin Li struct point { double x; double y; }; 1825*67e74705SXin Li point pt[2] = { { 1.0, 2.0 } }; 1826*67e74705SXin Li} 1827*67e74705SXin LiinitListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 1828*67e74705SXin Liwill match the implicit array filler for pt[1]. 1829*67e74705SXin Li</pre></td></tr> 1830*67e74705SXin Li 1831*67e74705SXin Li 1832*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 1833*67e74705SXin Li<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 1834*67e74705SXin Li 1835*67e74705SXin LiGiven 1836*67e74705SXin Li struct S { 1837*67e74705SXin Li S(); #1 1838*67e74705SXin Li S(const S &); #2 1839*67e74705SXin Li S(S &&); #3 1840*67e74705SXin Li }; 1841*67e74705SXin LicxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 1842*67e74705SXin Li</pre></td></tr> 1843*67e74705SXin Li 1844*67e74705SXin Li 1845*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 1846*67e74705SXin Li<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 1847*67e74705SXin Li 1848*67e74705SXin LiGiven 1849*67e74705SXin Li struct S { 1850*67e74705SXin Li S(); #1 1851*67e74705SXin Li S(const S &); #2 1852*67e74705SXin Li S(S &&); #3 1853*67e74705SXin Li }; 1854*67e74705SXin LicxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 1855*67e74705SXin Li</pre></td></tr> 1856*67e74705SXin Li 1857*67e74705SXin Li 1858*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 1859*67e74705SXin Li<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 1860*67e74705SXin Li 1861*67e74705SXin LiGiven 1862*67e74705SXin Li struct S { 1863*67e74705SXin Li S(); #1 1864*67e74705SXin Li S(int) {} #2 1865*67e74705SXin Li S(S &&) : S() {} #3 1866*67e74705SXin Li }; 1867*67e74705SXin Li S::S() : S(0) {} #4 1868*67e74705SXin LicxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 1869*67e74705SXin Li#1 or #2. 1870*67e74705SXin Li</pre></td></tr> 1871*67e74705SXin Li 1872*67e74705SXin Li 1873*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 1874*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with 1875*67e74705SXin Lithe explicit keyword. 1876*67e74705SXin Li 1877*67e74705SXin LiGiven 1878*67e74705SXin Li struct S { 1879*67e74705SXin Li S(int); #1 1880*67e74705SXin Li explicit S(double); #2 1881*67e74705SXin Li operator int(); #3 1882*67e74705SXin Li explicit operator bool(); #4 1883*67e74705SXin Li }; 1884*67e74705SXin LicxxConstructorDecl(isExplicit()) will match #2, but not #1. 1885*67e74705SXin LicxxConversionDecl(isExplicit()) will match #4, but not #3. 1886*67e74705SXin Li</pre></td></tr> 1887*67e74705SXin Li 1888*67e74705SXin Li 1889*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 1890*67e74705SXin Li<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 1891*67e74705SXin Li 1892*67e74705SXin LiGiven 1893*67e74705SXin Li struct S { 1894*67e74705SXin Li S(); #1 1895*67e74705SXin Li S(const S &); #2 1896*67e74705SXin Li S(S &&); #3 1897*67e74705SXin Li }; 1898*67e74705SXin LicxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 1899*67e74705SXin Li</pre></td></tr> 1900*67e74705SXin Li 1901*67e74705SXin Li 1902*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 1903*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with 1904*67e74705SXin Lithe explicit keyword. 1905*67e74705SXin Li 1906*67e74705SXin LiGiven 1907*67e74705SXin Li struct S { 1908*67e74705SXin Li S(int); #1 1909*67e74705SXin Li explicit S(double); #2 1910*67e74705SXin Li operator int(); #3 1911*67e74705SXin Li explicit operator bool(); #4 1912*67e74705SXin Li }; 1913*67e74705SXin LicxxConstructorDecl(isExplicit()) will match #2, but not #1. 1914*67e74705SXin LicxxConversionDecl(isExplicit()) will match #4, but not #3. 1915*67e74705SXin Li</pre></td></tr> 1916*67e74705SXin Li 1917*67e74705SXin Li 1918*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 1919*67e74705SXin Li<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 1920*67e74705SXin Liopposed to a member. 1921*67e74705SXin Li 1922*67e74705SXin LiGiven 1923*67e74705SXin Li struct B {}; 1924*67e74705SXin Li struct D : B { 1925*67e74705SXin Li int I; 1926*67e74705SXin Li D(int i) : I(i) {} 1927*67e74705SXin Li }; 1928*67e74705SXin Li struct E : B { 1929*67e74705SXin Li E() : B() {} 1930*67e74705SXin Li }; 1931*67e74705SXin LicxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 1932*67e74705SXin Li will match E(), but not match D(int). 1933*67e74705SXin Li</pre></td></tr> 1934*67e74705SXin Li 1935*67e74705SXin Li 1936*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 1937*67e74705SXin Li<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 1938*67e74705SXin Liopposed to a base. 1939*67e74705SXin Li 1940*67e74705SXin LiGiven 1941*67e74705SXin Li struct B {}; 1942*67e74705SXin Li struct D : B { 1943*67e74705SXin Li int I; 1944*67e74705SXin Li D(int i) : I(i) {} 1945*67e74705SXin Li }; 1946*67e74705SXin Li struct E : B { 1947*67e74705SXin Li E() : B() {} 1948*67e74705SXin Li }; 1949*67e74705SXin LicxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 1950*67e74705SXin Li will match D(int), but not match E(). 1951*67e74705SXin Li</pre></td></tr> 1952*67e74705SXin Li 1953*67e74705SXin Li 1954*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 1955*67e74705SXin Li<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 1956*67e74705SXin Licode (as opposed to implicitly added by the compiler). 1957*67e74705SXin Li 1958*67e74705SXin LiGiven 1959*67e74705SXin Li struct Foo { 1960*67e74705SXin Li Foo() { } 1961*67e74705SXin Li Foo(int) : foo_("A") { } 1962*67e74705SXin Li string foo_; 1963*67e74705SXin Li }; 1964*67e74705SXin LicxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 1965*67e74705SXin Li will match Foo(int), but not Foo() 1966*67e74705SXin Li</pre></td></tr> 1967*67e74705SXin Li 1968*67e74705SXin Li 1969*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 1970*67e74705SXin Li<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 1971*67e74705SXin Li 1972*67e74705SXin LiGiven 1973*67e74705SXin Listruct A { 1974*67e74705SXin Li void foo() const; 1975*67e74705SXin Li void bar(); 1976*67e74705SXin Li}; 1977*67e74705SXin Li 1978*67e74705SXin LicxxMethodDecl(isConst()) matches A::foo() but not A::bar() 1979*67e74705SXin Li</pre></td></tr> 1980*67e74705SXin Li 1981*67e74705SXin Li 1982*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 1983*67e74705SXin Li<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 1984*67e74705SXin Lioperator. 1985*67e74705SXin Li 1986*67e74705SXin LiGiven 1987*67e74705SXin Listruct A { 1988*67e74705SXin Li A &operator=(const A &); 1989*67e74705SXin Li A &operator=(A &&); 1990*67e74705SXin Li}; 1991*67e74705SXin Li 1992*67e74705SXin LicxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 1993*67e74705SXin Lithe second one. 1994*67e74705SXin Li</pre></td></tr> 1995*67e74705SXin Li 1996*67e74705SXin Li 1997*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 1998*67e74705SXin Li<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 1999*67e74705SXin Li 2000*67e74705SXin LiGiven: 2001*67e74705SXin Li class A final {}; 2002*67e74705SXin Li 2003*67e74705SXin Li struct B { 2004*67e74705SXin Li virtual void f(); 2005*67e74705SXin Li }; 2006*67e74705SXin Li 2007*67e74705SXin Li struct C : B { 2008*67e74705SXin Li void f() final; 2009*67e74705SXin Li }; 2010*67e74705SXin Limatches A and C::f, but not B, C, or B::f 2011*67e74705SXin Li</pre></td></tr> 2012*67e74705SXin Li 2013*67e74705SXin Li 2014*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2015*67e74705SXin Li<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 2016*67e74705SXin Lioperator. 2017*67e74705SXin Li 2018*67e74705SXin LiGiven 2019*67e74705SXin Listruct A { 2020*67e74705SXin Li A &operator=(const A &); 2021*67e74705SXin Li A &operator=(A &&); 2022*67e74705SXin Li}; 2023*67e74705SXin Li 2024*67e74705SXin LicxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 2025*67e74705SXin Lithe first one. 2026*67e74705SXin Li</pre></td></tr> 2027*67e74705SXin Li 2028*67e74705SXin Li 2029*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2030*67e74705SXin Li<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 2031*67e74705SXin Li 2032*67e74705SXin LiGiven 2033*67e74705SXin Li class A { 2034*67e74705SXin Li public: 2035*67e74705SXin Li virtual void x(); 2036*67e74705SXin Li }; 2037*67e74705SXin Li class B : public A { 2038*67e74705SXin Li public: 2039*67e74705SXin Li virtual void x(); 2040*67e74705SXin Li }; 2041*67e74705SXin Li matches B::x 2042*67e74705SXin Li</pre></td></tr> 2043*67e74705SXin Li 2044*67e74705SXin Li 2045*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2046*67e74705SXin Li<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 2047*67e74705SXin Li 2048*67e74705SXin LiGiven 2049*67e74705SXin Li class A { 2050*67e74705SXin Li public: 2051*67e74705SXin Li virtual void x() = 0; 2052*67e74705SXin Li }; 2053*67e74705SXin Li matches A::x 2054*67e74705SXin Li</pre></td></tr> 2055*67e74705SXin Li 2056*67e74705SXin Li 2057*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2058*67e74705SXin Li<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 2059*67e74705SXin Li 2060*67e74705SXin LiGiven 2061*67e74705SXin Li struct S { 2062*67e74705SXin Li S(); #1 2063*67e74705SXin Li S(const S &) = default; #2 2064*67e74705SXin Li S(S &&) = delete; #3 2065*67e74705SXin Li }; 2066*67e74705SXin LicxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 2067*67e74705SXin Li</pre></td></tr> 2068*67e74705SXin Li 2069*67e74705SXin Li 2070*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2071*67e74705SXin Li<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual. 2072*67e74705SXin Li 2073*67e74705SXin LiGiven 2074*67e74705SXin Li class A { 2075*67e74705SXin Li public: 2076*67e74705SXin Li virtual void x(); 2077*67e74705SXin Li }; 2078*67e74705SXin Li matches A::x 2079*67e74705SXin Li</pre></td></tr> 2080*67e74705SXin Li 2081*67e74705SXin Li 2082*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2083*67e74705SXin Li<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 2084*67e74705SXin Li 2085*67e74705SXin LiGiven 2086*67e74705SXin Li class A { 2087*67e74705SXin Li public: 2088*67e74705SXin Li virtual void x(); 2089*67e74705SXin Li }; 2090*67e74705SXin Li class B : public A { 2091*67e74705SXin Li public: 2092*67e74705SXin Li void x(); 2093*67e74705SXin Li }; 2094*67e74705SXin Li matches A::x but not B::x 2095*67e74705SXin Li</pre></td></tr> 2096*67e74705SXin Li 2097*67e74705SXin Li 2098*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2099*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 2100*67e74705SXin Li 2101*67e74705SXin LiMatches overloaded operator names specified in strings without the 2102*67e74705SXin Li"operator" prefix: e.g. "<<". 2103*67e74705SXin Li 2104*67e74705SXin LiGiven: 2105*67e74705SXin Li class A { int operator*(); }; 2106*67e74705SXin Li const A &operator<<(const A &a, const A &b); 2107*67e74705SXin Li A a; 2108*67e74705SXin Li a << a; <-- This matches 2109*67e74705SXin Li 2110*67e74705SXin LicxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 2111*67e74705SXin Lispecified line and 2112*67e74705SXin LicxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 2113*67e74705SXin Limatches the declaration of A. 2114*67e74705SXin Li 2115*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 2116*67e74705SXin Li</pre></td></tr> 2117*67e74705SXin Li 2118*67e74705SXin Li 2119*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr> 2120*67e74705SXin Li<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 2121*67e74705SXin Li</pre></td></tr> 2122*67e74705SXin Li 2123*67e74705SXin Li 2124*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2125*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 2126*67e74705SXin Listatic member variable template instantiations. 2127*67e74705SXin Li 2128*67e74705SXin LiGiven 2129*67e74705SXin Li template<typename T> void A(T t) { } 2130*67e74705SXin Li template<> void A(int N) { } 2131*67e74705SXin LifunctionDecl(isExplicitTemplateSpecialization()) 2132*67e74705SXin Li matches the specialization A<int>(). 2133*67e74705SXin Li 2134*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 2135*67e74705SXin Li</pre></td></tr> 2136*67e74705SXin Li 2137*67e74705SXin Li 2138*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2139*67e74705SXin Li<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 2140*67e74705SXin Li 2141*67e74705SXin LiGiven: 2142*67e74705SXin Li class A final {}; 2143*67e74705SXin Li 2144*67e74705SXin Li struct B { 2145*67e74705SXin Li virtual void f(); 2146*67e74705SXin Li }; 2147*67e74705SXin Li 2148*67e74705SXin Li struct C : B { 2149*67e74705SXin Li void f() final; 2150*67e74705SXin Li }; 2151*67e74705SXin Limatches A and C::f, but not B, C, or B::f 2152*67e74705SXin Li</pre></td></tr> 2153*67e74705SXin Li 2154*67e74705SXin Li 2155*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2156*67e74705SXin Li<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 2157*67e74705SXin Li 2158*67e74705SXin LiGiven: 2159*67e74705SXin Li auto x = []{}; 2160*67e74705SXin Li 2161*67e74705SXin LicxxRecordDecl(isLambda()) matches the implicit class declaration of 2162*67e74705SXin Lidecltype(x) 2163*67e74705SXin Li</pre></td></tr> 2164*67e74705SXin Li 2165*67e74705SXin Li 2166*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr> 2167*67e74705SXin Li<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for 2168*67e74705SXin LiisSameOrDerivedFrom(hasName(...)). 2169*67e74705SXin Li</pre></td></tr> 2170*67e74705SXin Li 2171*67e74705SXin Li 2172*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2173*67e74705SXin Li<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 2174*67e74705SXin Limember variable template instantiations. 2175*67e74705SXin Li 2176*67e74705SXin LiGiven 2177*67e74705SXin Li template <typename T> class X {}; class A {}; X<A> x; 2178*67e74705SXin Lior 2179*67e74705SXin Li template <typename T> class X {}; class A {}; template class X<A>; 2180*67e74705SXin LicxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2181*67e74705SXin Li matches the template instantiation of X<A>. 2182*67e74705SXin Li 2183*67e74705SXin LiBut given 2184*67e74705SXin Li template <typename T> class X {}; class A {}; 2185*67e74705SXin Li template <> class X<A> {}; X<A> x; 2186*67e74705SXin LicxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2187*67e74705SXin Li does not match, as X<A> is an explicit template specialization. 2188*67e74705SXin Li 2189*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 2190*67e74705SXin Li</pre></td></tr> 2191*67e74705SXin Li 2192*67e74705SXin Li 2193*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2194*67e74705SXin Li<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 2195*67e74705SXin Lia specific number of arguments (including absent default arguments). 2196*67e74705SXin Li 2197*67e74705SXin LiExample matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2198*67e74705SXin Li void f(int x, int y); 2199*67e74705SXin Li f(0, 0); 2200*67e74705SXin Li</pre></td></tr> 2201*67e74705SXin Li 2202*67e74705SXin Li 2203*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2204*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 2205*67e74705SXin Li 2206*67e74705SXin LiExample: matches the implicit cast around 0 2207*67e74705SXin Li(matcher = castExpr(hasCastKind(CK_NullToPointer))) 2208*67e74705SXin Li int *p = 0; 2209*67e74705SXin Li</pre></td></tr> 2210*67e74705SXin Li 2211*67e74705SXin Li 2212*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>ValueT Value</td></tr> 2213*67e74705SXin Li<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value. 2214*67e74705SXin Li 2215*67e74705SXin LiExample matches true (matcher = cxxBoolLiteral(equals(true))) 2216*67e74705SXin Li true 2217*67e74705SXin Li 2218*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 2219*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 2220*67e74705SXin Li</pre></td></tr> 2221*67e74705SXin Li 2222*67e74705SXin Li 2223*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2224*67e74705SXin Li<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 2225*67e74705SXin Li 2226*67e74705SXin LiGiven 2227*67e74705SXin Li template<typename T> struct C {}; 2228*67e74705SXin Li C<int> c; 2229*67e74705SXin LiclassTemplateSpecializationDecl(templateArgumentCountIs(1)) 2230*67e74705SXin Li matches C<int>. 2231*67e74705SXin Li</pre></td></tr> 2232*67e74705SXin Li 2233*67e74705SXin Li 2234*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2235*67e74705SXin Li<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 2236*67e74705SXin Lichild statements. 2237*67e74705SXin Li 2238*67e74705SXin LiExample: Given 2239*67e74705SXin Li { for (;;) {} } 2240*67e74705SXin LicompoundStmt(statementCountIs(0))) 2241*67e74705SXin Li matches '{}' 2242*67e74705SXin Li but does not match the outer compound statement. 2243*67e74705SXin Li</pre></td></tr> 2244*67e74705SXin Li 2245*67e74705SXin Li 2246*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2247*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 2248*67e74705SXin Li 2249*67e74705SXin LiGiven 2250*67e74705SXin Li int a[42]; 2251*67e74705SXin Li int b[2 * 21]; 2252*67e74705SXin Li int c[41], d[43]; 2253*67e74705SXin Li char *s = "abcd"; 2254*67e74705SXin Li wchar_t *ws = L"abcd"; 2255*67e74705SXin Li char *w = "a"; 2256*67e74705SXin LiconstantArrayType(hasSize(42)) 2257*67e74705SXin Li matches "int a[42]" and "int b[2 * 21]" 2258*67e74705SXin ListringLiteral(hasSize(4)) 2259*67e74705SXin Li matches "abcd", L"abcd" 2260*67e74705SXin Li</pre></td></tr> 2261*67e74705SXin Li 2262*67e74705SXin Li 2263*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2264*67e74705SXin Li<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 2265*67e74705SXin Lideclarations. 2266*67e74705SXin Li 2267*67e74705SXin LiExample: Given 2268*67e74705SXin Li int a, b; 2269*67e74705SXin Li int c; 2270*67e74705SXin Li int d = 2, e; 2271*67e74705SXin LideclCountIs(2) 2272*67e74705SXin Li matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 2273*67e74705SXin Li</pre></td></tr> 2274*67e74705SXin Li 2275*67e74705SXin Li 2276*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2277*67e74705SXin Li<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 2278*67e74705SXin Li 2279*67e74705SXin LiMatches a node if it equals the node previously bound to ID. 2280*67e74705SXin Li 2281*67e74705SXin LiGiven 2282*67e74705SXin Li class X { int a; int b; }; 2283*67e74705SXin LicxxRecordDecl( 2284*67e74705SXin Li has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 2285*67e74705SXin Li has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 2286*67e74705SXin Li matches the class X, as a and b have the same type. 2287*67e74705SXin Li 2288*67e74705SXin LiNote that when multiple matches are involved via forEach* matchers, 2289*67e74705SXin LiequalsBoundNodes acts as a filter. 2290*67e74705SXin LiFor example: 2291*67e74705SXin LicompoundStmt( 2292*67e74705SXin Li forEachDescendant(varDecl().bind("d")), 2293*67e74705SXin Li forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 2294*67e74705SXin Liwill trigger a match for each combination of variable declaration 2295*67e74705SXin Liand reference to that variable declaration within a compound statement. 2296*67e74705SXin Li</pre></td></tr> 2297*67e74705SXin Li 2298*67e74705SXin Li 2299*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2300*67e74705SXin Li<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 2301*67e74705SXin Li 2302*67e74705SXin LiDecl has pointer identity in the AST. 2303*67e74705SXin Li</pre></td></tr> 2304*67e74705SXin Li 2305*67e74705SXin Li 2306*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2307*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 2308*67e74705SXin Li 2309*67e74705SXin LiGiven 2310*67e74705SXin Li __attribute__((device)) void f() { ... } 2311*67e74705SXin Lidecl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 2312*67e74705SXin Lif. If the matcher is use from clang-query, attr::Kind parameter should be 2313*67e74705SXin Lipassed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 2314*67e74705SXin Li</pre></td></tr> 2315*67e74705SXin Li 2316*67e74705SXin Li 2317*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr> 2318*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 2319*67e74705SXin Lipartially matching a given regex. 2320*67e74705SXin Li 2321*67e74705SXin LiExample matches Y but not X 2322*67e74705SXin Li (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 2323*67e74705SXin Li #include "ASTMatcher.h" 2324*67e74705SXin Li class X {}; 2325*67e74705SXin LiASTMatcher.h: 2326*67e74705SXin Li class Y {}; 2327*67e74705SXin Li 2328*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 2329*67e74705SXin Li</pre></td></tr> 2330*67e74705SXin Li 2331*67e74705SXin Li 2332*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2333*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 2334*67e74705SXin Li 2335*67e74705SXin LiExample matches X but not Y 2336*67e74705SXin Li (matcher = cxxRecordDecl(isExpansionInMainFile()) 2337*67e74705SXin Li #include <Y.h> 2338*67e74705SXin Li class X {}; 2339*67e74705SXin LiY.h: 2340*67e74705SXin Li class Y {}; 2341*67e74705SXin Li 2342*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 2343*67e74705SXin Li</pre></td></tr> 2344*67e74705SXin Li 2345*67e74705SXin Li 2346*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2347*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 2348*67e74705SXin Li 2349*67e74705SXin LiExample matches Y but not X 2350*67e74705SXin Li (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 2351*67e74705SXin Li #include <SystemHeader.h> 2352*67e74705SXin Li class X {}; 2353*67e74705SXin LiSystemHeader.h: 2354*67e74705SXin Li class Y {}; 2355*67e74705SXin Li 2356*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 2357*67e74705SXin Li</pre></td></tr> 2358*67e74705SXin Li 2359*67e74705SXin Li 2360*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2361*67e74705SXin Li<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added 2362*67e74705SXin Liby the compiler (eg. implicit defaultcopy constructors). 2363*67e74705SXin Li</pre></td></tr> 2364*67e74705SXin Li 2365*67e74705SXin Li 2366*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2367*67e74705SXin Li<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations. 2368*67e74705SXin Li 2369*67e74705SXin LiGiven 2370*67e74705SXin Li class C { 2371*67e74705SXin Li public: int a; 2372*67e74705SXin Li protected: int b; 2373*67e74705SXin Li private: int c; 2374*67e74705SXin Li }; 2375*67e74705SXin LifieldDecl(isPrivate()) 2376*67e74705SXin Li matches 'int c;' 2377*67e74705SXin Li</pre></td></tr> 2378*67e74705SXin Li 2379*67e74705SXin Li 2380*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2381*67e74705SXin Li<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations. 2382*67e74705SXin Li 2383*67e74705SXin LiGiven 2384*67e74705SXin Li class C { 2385*67e74705SXin Li public: int a; 2386*67e74705SXin Li protected: int b; 2387*67e74705SXin Li private: int c; 2388*67e74705SXin Li }; 2389*67e74705SXin LifieldDecl(isProtected()) 2390*67e74705SXin Li matches 'int b;' 2391*67e74705SXin Li</pre></td></tr> 2392*67e74705SXin Li 2393*67e74705SXin Li 2394*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2395*67e74705SXin Li<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations. 2396*67e74705SXin Li 2397*67e74705SXin LiGiven 2398*67e74705SXin Li class C { 2399*67e74705SXin Li public: int a; 2400*67e74705SXin Li protected: int b; 2401*67e74705SXin Li private: int c; 2402*67e74705SXin Li }; 2403*67e74705SXin LifieldDecl(isPublic()) 2404*67e74705SXin Li matches 'int a;' 2405*67e74705SXin Li</pre></td></tr> 2406*67e74705SXin Li 2407*67e74705SXin Li 2408*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2409*67e74705SXin Li<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 2410*67e74705SXin Lia specific number of designators. 2411*67e74705SXin Li 2412*67e74705SXin LiExample: Given 2413*67e74705SXin Li point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 2414*67e74705SXin Li point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 2415*67e74705SXin LidesignatorCountIs(2) 2416*67e74705SXin Li matches '{ [2].y = 1.0, [0].x = 1.0 }', 2417*67e74705SXin Li but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 2418*67e74705SXin Li</pre></td></tr> 2419*67e74705SXin Li 2420*67e74705SXin Li 2421*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2422*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields. 2423*67e74705SXin Li 2424*67e74705SXin LiGiven 2425*67e74705SXin Li class C { 2426*67e74705SXin Li int a : 2; 2427*67e74705SXin Li int b : 4; 2428*67e74705SXin Li int c : 2; 2429*67e74705SXin Li }; 2430*67e74705SXin LifieldDecl(isBitField()) 2431*67e74705SXin Li matches 'int a;' and 'int c;' but not 'int b;'. 2432*67e74705SXin Li</pre></td></tr> 2433*67e74705SXin Li 2434*67e74705SXin Li 2435*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2436*67e74705SXin Li<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 2437*67e74705SXin Li 2438*67e74705SXin LiGiven 2439*67e74705SXin Li class C { 2440*67e74705SXin Li int a : 2; 2441*67e74705SXin Li int b; 2442*67e74705SXin Li }; 2443*67e74705SXin LifieldDecl(isBitField()) 2444*67e74705SXin Li matches 'int a;' but not 'int b;'. 2445*67e74705SXin Li</pre></td></tr> 2446*67e74705SXin Li 2447*67e74705SXin Li 2448*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>ValueT Value</td></tr> 2449*67e74705SXin Li<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value. 2450*67e74705SXin Li 2451*67e74705SXin LiExample matches true (matcher = cxxBoolLiteral(equals(true))) 2452*67e74705SXin Li true 2453*67e74705SXin Li 2454*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 2455*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 2456*67e74705SXin Li</pre></td></tr> 2457*67e74705SXin Li 2458*67e74705SXin Li 2459*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2460*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 2461*67e74705SXin Li 2462*67e74705SXin LiGiven: 2463*67e74705SXin Li void f(); 2464*67e74705SXin Li void g() noexcept; 2465*67e74705SXin Li void h() noexcept(true); 2466*67e74705SXin Li void i() noexcept(false); 2467*67e74705SXin Li void j() throw(); 2468*67e74705SXin Li void k() throw(int); 2469*67e74705SXin Li void l() throw(...); 2470*67e74705SXin LifunctionDecl(hasDynamicExceptionSpec()) and 2471*67e74705SXin Li functionProtoType(hasDynamicExceptionSpec()) 2472*67e74705SXin Li match the declarations of j, k, and l, but not f, g, h, or i. 2473*67e74705SXin Li</pre></td></tr> 2474*67e74705SXin Li 2475*67e74705SXin Li 2476*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2477*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 2478*67e74705SXin Li 2479*67e74705SXin LiMatches overloaded operator names specified in strings without the 2480*67e74705SXin Li"operator" prefix: e.g. "<<". 2481*67e74705SXin Li 2482*67e74705SXin LiGiven: 2483*67e74705SXin Li class A { int operator*(); }; 2484*67e74705SXin Li const A &operator<<(const A &a, const A &b); 2485*67e74705SXin Li A a; 2486*67e74705SXin Li a << a; <-- This matches 2487*67e74705SXin Li 2488*67e74705SXin LicxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 2489*67e74705SXin Lispecified line and 2490*67e74705SXin LicxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 2491*67e74705SXin Limatches the declaration of A. 2492*67e74705SXin Li 2493*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 2494*67e74705SXin Li</pre></td></tr> 2495*67e74705SXin Li 2496*67e74705SXin Li 2497*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2498*67e74705SXin Li<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations. 2499*67e74705SXin Li 2500*67e74705SXin LiGiven: 2501*67e74705SXin Li constexpr int foo = 42; 2502*67e74705SXin Li constexpr int bar(); 2503*67e74705SXin LivarDecl(isConstexpr()) 2504*67e74705SXin Li matches the declaration of foo. 2505*67e74705SXin LifunctionDecl(isConstexpr()) 2506*67e74705SXin Li matches the declaration of bar. 2507*67e74705SXin Li</pre></td></tr> 2508*67e74705SXin Li 2509*67e74705SXin Li 2510*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2511*67e74705SXin Li<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 2512*67e74705SXin Li 2513*67e74705SXin LiGiven: 2514*67e74705SXin Li class A { ~A(); }; 2515*67e74705SXin Li class B { ~B() = default; }; 2516*67e74705SXin LifunctionDecl(isDefaulted()) 2517*67e74705SXin Li matches the declaration of ~B, but not ~A. 2518*67e74705SXin Li</pre></td></tr> 2519*67e74705SXin Li 2520*67e74705SXin Li 2521*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr> 2522*67e74705SXin Li<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 2523*67e74705SXin Li 2524*67e74705SXin LiExample matches A, va, fa 2525*67e74705SXin Li class A {}; 2526*67e74705SXin Li class B; Doesn't match, as it has no body. 2527*67e74705SXin Li int va; 2528*67e74705SXin Li extern int vb; Doesn't match, as it doesn't define the variable. 2529*67e74705SXin Li void fa() {} 2530*67e74705SXin Li void fb(); Doesn't match, as it has no body. 2531*67e74705SXin Li 2532*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 2533*67e74705SXin Li</pre></td></tr> 2534*67e74705SXin Li 2535*67e74705SXin Li 2536*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2537*67e74705SXin Li<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 2538*67e74705SXin Li 2539*67e74705SXin LiGiven: 2540*67e74705SXin Li void Func(); 2541*67e74705SXin Li void DeletedFunc() = delete; 2542*67e74705SXin LifunctionDecl(isDeleted()) 2543*67e74705SXin Li matches the declaration of DeletedFunc, but not Func. 2544*67e74705SXin Li</pre></td></tr> 2545*67e74705SXin Li 2546*67e74705SXin Li 2547*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2548*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 2549*67e74705SXin Listatic member variable template instantiations. 2550*67e74705SXin Li 2551*67e74705SXin LiGiven 2552*67e74705SXin Li template<typename T> void A(T t) { } 2553*67e74705SXin Li template<> void A(int N) { } 2554*67e74705SXin LifunctionDecl(isExplicitTemplateSpecialization()) 2555*67e74705SXin Li matches the specialization A<int>(). 2556*67e74705SXin Li 2557*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 2558*67e74705SXin Li</pre></td></tr> 2559*67e74705SXin Li 2560*67e74705SXin Li 2561*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2562*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations. 2563*67e74705SXin Li 2564*67e74705SXin LiGiven: 2565*67e74705SXin Li extern "C" void f() {} 2566*67e74705SXin Li extern "C" { void g() {} } 2567*67e74705SXin Li void h() {} 2568*67e74705SXin LifunctionDecl(isExternC()) 2569*67e74705SXin Li matches the declaration of f and g, but not the declaration h 2570*67e74705SXin Li</pre></td></tr> 2571*67e74705SXin Li 2572*67e74705SXin Li 2573*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2574*67e74705SXin Li<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 2575*67e74705SXin Lithe inline keyword. 2576*67e74705SXin Li 2577*67e74705SXin LiGiven 2578*67e74705SXin Li inline void f(); 2579*67e74705SXin Li void g(); 2580*67e74705SXin Li namespace n { 2581*67e74705SXin Li inline namespace m {} 2582*67e74705SXin Li } 2583*67e74705SXin LifunctionDecl(isInline()) will match ::f(). 2584*67e74705SXin LinamespaceDecl(isInline()) will match n::m. 2585*67e74705SXin Li</pre></td></tr> 2586*67e74705SXin Li 2587*67e74705SXin Li 2588*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2589*67e74705SXin Li<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 2590*67e74705SXin Li 2591*67e74705SXin LiGiven: 2592*67e74705SXin Li void f(); 2593*67e74705SXin Li void g() noexcept; 2594*67e74705SXin Li void h() throw(); 2595*67e74705SXin Li void i() throw(int); 2596*67e74705SXin Li void j() noexcept(false); 2597*67e74705SXin LifunctionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 2598*67e74705SXin Li match the declarations of g, and h, but not f, i or j. 2599*67e74705SXin Li</pre></td></tr> 2600*67e74705SXin Li 2601*67e74705SXin Li 2602*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2603*67e74705SXin Li<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 2604*67e74705SXin Limember variable template instantiations. 2605*67e74705SXin Li 2606*67e74705SXin LiGiven 2607*67e74705SXin Li template <typename T> class X {}; class A {}; X<A> x; 2608*67e74705SXin Lior 2609*67e74705SXin Li template <typename T> class X {}; class A {}; template class X<A>; 2610*67e74705SXin LicxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2611*67e74705SXin Li matches the template instantiation of X<A>. 2612*67e74705SXin Li 2613*67e74705SXin LiBut given 2614*67e74705SXin Li template <typename T> class X {}; class A {}; 2615*67e74705SXin Li template <> class X<A> {}; X<A> x; 2616*67e74705SXin LicxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 2617*67e74705SXin Li does not match, as X<A> is an explicit template specialization. 2618*67e74705SXin Li 2619*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 2620*67e74705SXin Li</pre></td></tr> 2621*67e74705SXin Li 2622*67e74705SXin Li 2623*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2624*67e74705SXin Li<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 2625*67e74705SXin Li 2626*67e74705SXin LiExample matches f, but not g or h. The function i will not match, even when 2627*67e74705SXin Licompiled in C mode. 2628*67e74705SXin Li void f(...); 2629*67e74705SXin Li void g(int); 2630*67e74705SXin Li template <typename... Ts> void h(Ts...); 2631*67e74705SXin Li void i(); 2632*67e74705SXin Li</pre></td></tr> 2633*67e74705SXin Li 2634*67e74705SXin Li 2635*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2636*67e74705SXin Li<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 2637*67e74705SXin Lispecific parameter count. 2638*67e74705SXin Li 2639*67e74705SXin LiGiven 2640*67e74705SXin Li void f(int i) {} 2641*67e74705SXin Li void g(int i, int j) {} 2642*67e74705SXin Li void h(int i, int j); 2643*67e74705SXin Li void j(int i); 2644*67e74705SXin Li void k(int x, int y, int z, ...); 2645*67e74705SXin LifunctionDecl(parameterCountIs(2)) 2646*67e74705SXin Li matches void g(int i, int j) {} 2647*67e74705SXin LifunctionProtoType(parameterCountIs(2)) 2648*67e74705SXin Li matches void h(int i, int j) 2649*67e74705SXin LifunctionProtoType(parameterCountIs(3)) 2650*67e74705SXin Li matches void k(int x, int y, int z, ...); 2651*67e74705SXin Li</pre></td></tr> 2652*67e74705SXin Li 2653*67e74705SXin Li 2654*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2655*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 2656*67e74705SXin Li 2657*67e74705SXin LiGiven: 2658*67e74705SXin Li void f(); 2659*67e74705SXin Li void g() noexcept; 2660*67e74705SXin Li void h() noexcept(true); 2661*67e74705SXin Li void i() noexcept(false); 2662*67e74705SXin Li void j() throw(); 2663*67e74705SXin Li void k() throw(int); 2664*67e74705SXin Li void l() throw(...); 2665*67e74705SXin LifunctionDecl(hasDynamicExceptionSpec()) and 2666*67e74705SXin Li functionProtoType(hasDynamicExceptionSpec()) 2667*67e74705SXin Li match the declarations of j, k, and l, but not f, g, h, or i. 2668*67e74705SXin Li</pre></td></tr> 2669*67e74705SXin Li 2670*67e74705SXin Li 2671*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2672*67e74705SXin Li<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 2673*67e74705SXin Li 2674*67e74705SXin LiGiven: 2675*67e74705SXin Li void f(); 2676*67e74705SXin Li void g() noexcept; 2677*67e74705SXin Li void h() throw(); 2678*67e74705SXin Li void i() throw(int); 2679*67e74705SXin Li void j() noexcept(false); 2680*67e74705SXin LifunctionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 2681*67e74705SXin Li match the declarations of g, and h, but not f, i or j. 2682*67e74705SXin Li</pre></td></tr> 2683*67e74705SXin Li 2684*67e74705SXin Li 2685*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2686*67e74705SXin Li<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 2687*67e74705SXin Lispecific parameter count. 2688*67e74705SXin Li 2689*67e74705SXin LiGiven 2690*67e74705SXin Li void f(int i) {} 2691*67e74705SXin Li void g(int i, int j) {} 2692*67e74705SXin Li void h(int i, int j); 2693*67e74705SXin Li void j(int i); 2694*67e74705SXin Li void k(int x, int y, int z, ...); 2695*67e74705SXin LifunctionDecl(parameterCountIs(2)) 2696*67e74705SXin Li matches void g(int i, int j) {} 2697*67e74705SXin LifunctionProtoType(parameterCountIs(2)) 2698*67e74705SXin Li matches void h(int i, int j) 2699*67e74705SXin LifunctionProtoType(parameterCountIs(3)) 2700*67e74705SXin Li matches void k(int x, int y, int z, ...); 2701*67e74705SXin Li</pre></td></tr> 2702*67e74705SXin Li 2703*67e74705SXin Li 2704*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>ValueT Value</td></tr> 2705*67e74705SXin Li<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value. 2706*67e74705SXin Li 2707*67e74705SXin LiExample matches true (matcher = cxxBoolLiteral(equals(true))) 2708*67e74705SXin Li true 2709*67e74705SXin Li 2710*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<CXXBoolLiteral>, 2711*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 2712*67e74705SXin Li</pre></td></tr> 2713*67e74705SXin Li 2714*67e74705SXin Li 2715*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2716*67e74705SXin Li<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 2717*67e74705SXin Lito '.'. 2718*67e74705SXin Li 2719*67e74705SXin LiMember calls on the implicit this pointer match as called with '->'. 2720*67e74705SXin Li 2721*67e74705SXin LiGiven 2722*67e74705SXin Li class Y { 2723*67e74705SXin Li void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 2724*67e74705SXin Li int a; 2725*67e74705SXin Li static int b; 2726*67e74705SXin Li }; 2727*67e74705SXin LimemberExpr(isArrow()) 2728*67e74705SXin Li matches this->x, x, y.x, a, this->b 2729*67e74705SXin Li</pre></td></tr> 2730*67e74705SXin Li 2731*67e74705SXin Li 2732*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>std::string Name</td></tr> 2733*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 2734*67e74705SXin Li 2735*67e74705SXin LiSupports specifying enclosing namespaces or classes by prefixing the name 2736*67e74705SXin Liwith '<enclosing>::'. 2737*67e74705SXin LiDoes not match typedefs of an underlying type with the given name. 2738*67e74705SXin Li 2739*67e74705SXin LiExample matches X (Name == "X") 2740*67e74705SXin Li class X; 2741*67e74705SXin Li 2742*67e74705SXin LiExample matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 2743*67e74705SXin Li namespace a { namespace b { class X; } } 2744*67e74705SXin Li</pre></td></tr> 2745*67e74705SXin Li 2746*67e74705SXin Li 2747*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>std::string RegExp</td></tr> 2748*67e74705SXin Li<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 2749*67e74705SXin Lia substring matched by the given RegExp. 2750*67e74705SXin Li 2751*67e74705SXin LiSupports specifying enclosing namespaces or classes by 2752*67e74705SXin Liprefixing the name with '<enclosing>::'. Does not match typedefs 2753*67e74705SXin Liof an underlying type with the given name. 2754*67e74705SXin Li 2755*67e74705SXin LiExample matches X (regexp == "::X") 2756*67e74705SXin Li class X; 2757*67e74705SXin Li 2758*67e74705SXin LiExample matches X (regexp is one of "::X", "^foo::.*X", among others) 2759*67e74705SXin Li namespace foo { namespace bar { class X; } } 2760*67e74705SXin Li</pre></td></tr> 2761*67e74705SXin Li 2762*67e74705SXin Li 2763*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2764*67e74705SXin Li<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 2765*67e74705SXin Li 2766*67e74705SXin LiGiven 2767*67e74705SXin Li namespace n { 2768*67e74705SXin Li namespace {} #1 2769*67e74705SXin Li } 2770*67e74705SXin LinamespaceDecl(isAnonymous()) will match #1 but not ::n. 2771*67e74705SXin Li</pre></td></tr> 2772*67e74705SXin Li 2773*67e74705SXin Li 2774*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2775*67e74705SXin Li<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 2776*67e74705SXin Lithe inline keyword. 2777*67e74705SXin Li 2778*67e74705SXin LiGiven 2779*67e74705SXin Li inline void f(); 2780*67e74705SXin Li void g(); 2781*67e74705SXin Li namespace n { 2782*67e74705SXin Li inline namespace m {} 2783*67e74705SXin Li } 2784*67e74705SXin LifunctionDecl(isInline()) will match ::f(). 2785*67e74705SXin LinamespaceDecl(isInline()) will match n::m. 2786*67e74705SXin Li</pre></td></tr> 2787*67e74705SXin Li 2788*67e74705SXin Li 2789*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 2790*67e74705SXin Li<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 2791*67e74705SXin Lia specific number of arguments (including absent default arguments). 2792*67e74705SXin Li 2793*67e74705SXin LiExample matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2794*67e74705SXin Li void f(int x, int y); 2795*67e74705SXin Li f(0, 0); 2796*67e74705SXin Li</pre></td></tr> 2797*67e74705SXin Li 2798*67e74705SXin Li 2799*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2800*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 2801*67e74705SXin Li 2802*67e74705SXin LiobjCMessageExpr(hasKeywordSelector()) matches the generated setFrame 2803*67e74705SXin Limessage expression in 2804*67e74705SXin Li 2805*67e74705SXin Li UIWebView *webView = ...; 2806*67e74705SXin Li CGRect bodyFrame = webView.frame; 2807*67e74705SXin Li bodyFrame.size.height = self.bodyContentHeight; 2808*67e74705SXin Li webView.frame = bodyFrame; 2809*67e74705SXin Li ^---- matches here 2810*67e74705SXin Li</pre></td></tr> 2811*67e74705SXin Li 2812*67e74705SXin Li 2813*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2814*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 2815*67e74705SXin Li 2816*67e74705SXin LiMatches only when the selector of the objCMessageExpr is NULL. This may 2817*67e74705SXin Lirepresent an error condition in the tree! 2818*67e74705SXin Li</pre></td></tr> 2819*67e74705SXin Li 2820*67e74705SXin Li 2821*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2822*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 2823*67e74705SXin Li 2824*67e74705SXin Li matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 2825*67e74705SXin Li matches the outer message expr in the code below, but NOT the message 2826*67e74705SXin Li invocation for self.bodyView. 2827*67e74705SXin Li [self.bodyView loadHTMLString:html baseURL:NULL]; 2828*67e74705SXin Li</pre></td></tr> 2829*67e74705SXin Li 2830*67e74705SXin Li 2831*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2832*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 2833*67e74705SXin Li 2834*67e74705SXin Li matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 2835*67e74705SXin Li matches self.bodyView in the code below, but NOT the outer message 2836*67e74705SXin Li invocation of "loadHTMLString:baseURL:". 2837*67e74705SXin Li [self.bodyView loadHTMLString:html baseURL:NULL]; 2838*67e74705SXin Li</pre></td></tr> 2839*67e74705SXin Li 2840*67e74705SXin Li 2841*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>std::string RegExp</td></tr> 2842*67e74705SXin Li<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 2843*67e74705SXin Lia substring matched by the given RegExp. 2844*67e74705SXin Li matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 2845*67e74705SXin Li invocation for self.bodyView. 2846*67e74705SXin Li [self.bodyView loadHTMLString:html baseURL:NULL]; 2847*67e74705SXin Li</pre></td></tr> 2848*67e74705SXin Li 2849*67e74705SXin Li 2850*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2851*67e74705SXin Li<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 2852*67e74705SXin Li 2853*67e74705SXin Li matcher = objCMessageExpr(numSelectorArgs(0)); 2854*67e74705SXin Li matches self.bodyView in the code below 2855*67e74705SXin Li 2856*67e74705SXin Li matcher = objCMessageExpr(numSelectorArgs(2)); 2857*67e74705SXin Li matches the invocation of "loadHTMLString:baseURL:" but not that 2858*67e74705SXin Li of self.bodyView 2859*67e74705SXin Li [self.bodyView loadHTMLString:html baseURL:NULL]; 2860*67e74705SXin Li</pre></td></tr> 2861*67e74705SXin Li 2862*67e74705SXin Li 2863*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2864*67e74705SXin Li<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 2865*67e74705SXin Li 2866*67e74705SXin LiGiven 2867*67e74705SXin Li class Y { public: void x(); }; 2868*67e74705SXin Li void z() { Y* y; y->x(); } 2869*67e74705SXin LicxxMemberCallExpr(on(hasType(asString("class Y *")))) 2870*67e74705SXin Li matches y->x() 2871*67e74705SXin Li</pre></td></tr> 2872*67e74705SXin Li 2873*67e74705SXin Li 2874*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2875*67e74705SXin Li<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 2876*67e74705SXin Li 2877*67e74705SXin LiMatches a node if it equals the node previously bound to ID. 2878*67e74705SXin Li 2879*67e74705SXin LiGiven 2880*67e74705SXin Li class X { int a; int b; }; 2881*67e74705SXin LicxxRecordDecl( 2882*67e74705SXin Li has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 2883*67e74705SXin Li has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 2884*67e74705SXin Li matches the class X, as a and b have the same type. 2885*67e74705SXin Li 2886*67e74705SXin LiNote that when multiple matches are involved via forEach* matchers, 2887*67e74705SXin LiequalsBoundNodes acts as a filter. 2888*67e74705SXin LiFor example: 2889*67e74705SXin LicompoundStmt( 2890*67e74705SXin Li forEachDescendant(varDecl().bind("d")), 2891*67e74705SXin Li forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 2892*67e74705SXin Liwill trigger a match for each combination of variable declaration 2893*67e74705SXin Liand reference to that variable declaration within a compound statement. 2894*67e74705SXin Li</pre></td></tr> 2895*67e74705SXin Li 2896*67e74705SXin Li 2897*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2898*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 2899*67e74705SXin Lithe node, not hidden within a typedef. 2900*67e74705SXin Li 2901*67e74705SXin LiGiven 2902*67e74705SXin Li typedef const int const_int; 2903*67e74705SXin Li const_int i; 2904*67e74705SXin Li int *const j; 2905*67e74705SXin Li int *volatile k; 2906*67e74705SXin Li int m; 2907*67e74705SXin LivarDecl(hasType(hasLocalQualifiers())) matches only j and k. 2908*67e74705SXin Lii is const-qualified but the qualifier is not local. 2909*67e74705SXin Li</pre></td></tr> 2910*67e74705SXin Li 2911*67e74705SXin Li 2912*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2913*67e74705SXin Li<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 2914*67e74705SXin Li 2915*67e74705SXin LiGiven 2916*67e74705SXin Li void a(char); 2917*67e74705SXin Li void b(wchar_t); 2918*67e74705SXin Li void c(double); 2919*67e74705SXin LifunctionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 2920*67e74705SXin Limatches "a(char)", "b(wchar_t)", but not "c(double)". 2921*67e74705SXin Li</pre></td></tr> 2922*67e74705SXin Li 2923*67e74705SXin Li 2924*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2925*67e74705SXin Li<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 2926*67e74705SXin Lithe Objective-C object pointer type, which is different despite being 2927*67e74705SXin Lisyntactically similar. 2928*67e74705SXin Li 2929*67e74705SXin LiGiven 2930*67e74705SXin Li int *i = nullptr; 2931*67e74705SXin Li 2932*67e74705SXin Li @interface Foo 2933*67e74705SXin Li @end 2934*67e74705SXin Li Foo *f; 2935*67e74705SXin Li 2936*67e74705SXin Li int j; 2937*67e74705SXin LivarDecl(hasType(isAnyPointer())) 2938*67e74705SXin Li matches "int *i" and "Foo *f", but not "int j". 2939*67e74705SXin Li</pre></td></tr> 2940*67e74705SXin Li 2941*67e74705SXin Li 2942*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2943*67e74705SXin Li<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 2944*67e74705SXin Liinclude "top-level" const. 2945*67e74705SXin Li 2946*67e74705SXin LiGiven 2947*67e74705SXin Li void a(int); 2948*67e74705SXin Li void b(int const); 2949*67e74705SXin Li void c(const int); 2950*67e74705SXin Li void d(const int*); 2951*67e74705SXin Li void e(int const) {}; 2952*67e74705SXin LifunctionDecl(hasAnyParameter(hasType(isConstQualified()))) 2953*67e74705SXin Li matches "void b(int const)", "void c(const int)" and 2954*67e74705SXin Li "void e(int const) {}". It does not match d as there 2955*67e74705SXin Li is no top-level const on the parameter type "const int *". 2956*67e74705SXin Li</pre></td></tr> 2957*67e74705SXin Li 2958*67e74705SXin Li 2959*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2960*67e74705SXin Li<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 2961*67e74705SXin Li 2962*67e74705SXin LiGiven 2963*67e74705SXin Li void a(int); 2964*67e74705SXin Li void b(long); 2965*67e74705SXin Li void c(double); 2966*67e74705SXin LifunctionDecl(hasAnyParameter(hasType(isInteger()))) 2967*67e74705SXin Limatches "a(int)", "b(long)", but not "c(double)". 2968*67e74705SXin Li</pre></td></tr> 2969*67e74705SXin Li 2970*67e74705SXin Li 2971*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2972*67e74705SXin Li<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 2973*67e74705SXin Li 2974*67e74705SXin LiGiven 2975*67e74705SXin Li void a(int); 2976*67e74705SXin Li void b(unsigned long); 2977*67e74705SXin Li void c(double); 2978*67e74705SXin LifunctionDecl(hasAnyParameter(hasType(isInteger()))) 2979*67e74705SXin Limatches "a(int)", but not "b(unsigned long)" and "c(double)". 2980*67e74705SXin Li</pre></td></tr> 2981*67e74705SXin Li 2982*67e74705SXin Li 2983*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2984*67e74705SXin Li<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 2985*67e74705SXin Li 2986*67e74705SXin LiGiven 2987*67e74705SXin Li void a(int); 2988*67e74705SXin Li void b(unsigned long); 2989*67e74705SXin Li void c(double); 2990*67e74705SXin LifunctionDecl(hasAnyParameter(hasType(isInteger()))) 2991*67e74705SXin Limatches "b(unsigned long)", but not "a(int)" and "c(double)". 2992*67e74705SXin Li</pre></td></tr> 2993*67e74705SXin Li 2994*67e74705SXin Li 2995*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 2996*67e74705SXin Li<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 2997*67e74705SXin Liinclude "top-level" volatile. 2998*67e74705SXin Li 2999*67e74705SXin LiGiven 3000*67e74705SXin Li void a(int); 3001*67e74705SXin Li void b(int volatile); 3002*67e74705SXin Li void c(volatile int); 3003*67e74705SXin Li void d(volatile int*); 3004*67e74705SXin Li void e(int volatile) {}; 3005*67e74705SXin LifunctionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 3006*67e74705SXin Li matches "void b(int volatile)", "void c(volatile int)" and 3007*67e74705SXin Li "void e(int volatile) {}". It does not match d as there 3008*67e74705SXin Li is no top-level volatile on the parameter type "volatile int *". 3009*67e74705SXin Li</pre></td></tr> 3010*67e74705SXin Li 3011*67e74705SXin Li 3012*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>></td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr> 3013*67e74705SXin Li<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class." 3014*67e74705SXin Li 3015*67e74705SXin LiExample matches C, but not S or U. 3016*67e74705SXin Li struct S {}; 3017*67e74705SXin Li class C {}; 3018*67e74705SXin Li union U {}; 3019*67e74705SXin Li</pre></td></tr> 3020*67e74705SXin Li 3021*67e74705SXin Li 3022*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>></td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr> 3023*67e74705SXin Li<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct." 3024*67e74705SXin Li 3025*67e74705SXin LiExample matches S, but not C or U. 3026*67e74705SXin Li struct S {}; 3027*67e74705SXin Li class C {}; 3028*67e74705SXin Li union U {}; 3029*67e74705SXin Li</pre></td></tr> 3030*67e74705SXin Li 3031*67e74705SXin Li 3032*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>></td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr> 3033*67e74705SXin Li<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union." 3034*67e74705SXin Li 3035*67e74705SXin LiExample matches U, but not C or S. 3036*67e74705SXin Li struct S {}; 3037*67e74705SXin Li class C {}; 3038*67e74705SXin Li union U {}; 3039*67e74705SXin Li</pre></td></tr> 3040*67e74705SXin Li 3041*67e74705SXin Li 3042*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3043*67e74705SXin Li<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 3044*67e74705SXin Li 3045*67e74705SXin LiMatches a node if it equals the node previously bound to ID. 3046*67e74705SXin Li 3047*67e74705SXin LiGiven 3048*67e74705SXin Li class X { int a; int b; }; 3049*67e74705SXin LicxxRecordDecl( 3050*67e74705SXin Li has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3051*67e74705SXin Li has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3052*67e74705SXin Li matches the class X, as a and b have the same type. 3053*67e74705SXin Li 3054*67e74705SXin LiNote that when multiple matches are involved via forEach* matchers, 3055*67e74705SXin LiequalsBoundNodes acts as a filter. 3056*67e74705SXin LiFor example: 3057*67e74705SXin LicompoundStmt( 3058*67e74705SXin Li forEachDescendant(varDecl().bind("d")), 3059*67e74705SXin Li forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3060*67e74705SXin Liwill trigger a match for each combination of variable declaration 3061*67e74705SXin Liand reference to that variable declaration within a compound statement. 3062*67e74705SXin Li</pre></td></tr> 3063*67e74705SXin Li 3064*67e74705SXin Li 3065*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3066*67e74705SXin Li<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 3067*67e74705SXin Li 3068*67e74705SXin LiStmt has pointer identity in the AST. 3069*67e74705SXin Li</pre></td></tr> 3070*67e74705SXin Li 3071*67e74705SXin Li 3072*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr> 3073*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 3074*67e74705SXin Lipartially matching a given regex. 3075*67e74705SXin Li 3076*67e74705SXin LiExample matches Y but not X 3077*67e74705SXin Li (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3078*67e74705SXin Li #include "ASTMatcher.h" 3079*67e74705SXin Li class X {}; 3080*67e74705SXin LiASTMatcher.h: 3081*67e74705SXin Li class Y {}; 3082*67e74705SXin Li 3083*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3084*67e74705SXin Li</pre></td></tr> 3085*67e74705SXin Li 3086*67e74705SXin Li 3087*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3088*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 3089*67e74705SXin Li 3090*67e74705SXin LiExample matches X but not Y 3091*67e74705SXin Li (matcher = cxxRecordDecl(isExpansionInMainFile()) 3092*67e74705SXin Li #include <Y.h> 3093*67e74705SXin Li class X {}; 3094*67e74705SXin LiY.h: 3095*67e74705SXin Li class Y {}; 3096*67e74705SXin Li 3097*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3098*67e74705SXin Li</pre></td></tr> 3099*67e74705SXin Li 3100*67e74705SXin Li 3101*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3102*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 3103*67e74705SXin Li 3104*67e74705SXin LiExample matches Y but not X 3105*67e74705SXin Li (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3106*67e74705SXin Li #include <SystemHeader.h> 3107*67e74705SXin Li class X {}; 3108*67e74705SXin LiSystemHeader.h: 3109*67e74705SXin Li class Y {}; 3110*67e74705SXin Li 3111*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3112*67e74705SXin Li</pre></td></tr> 3113*67e74705SXin Li 3114*67e74705SXin Li 3115*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3116*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 3117*67e74705SXin Li 3118*67e74705SXin LiGiven 3119*67e74705SXin Li int a[42]; 3120*67e74705SXin Li int b[2 * 21]; 3121*67e74705SXin Li int c[41], d[43]; 3122*67e74705SXin Li char *s = "abcd"; 3123*67e74705SXin Li wchar_t *ws = L"abcd"; 3124*67e74705SXin Li char *w = "a"; 3125*67e74705SXin LiconstantArrayType(hasSize(42)) 3126*67e74705SXin Li matches "int a[42]" and "int b[2 * 21]" 3127*67e74705SXin ListringLiteral(hasSize(4)) 3128*67e74705SXin Li matches "abcd", L"abcd" 3129*67e74705SXin Li</pre></td></tr> 3130*67e74705SXin Li 3131*67e74705SXin Li 3132*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3133*67e74705SXin Li<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 3134*67e74705SXin Li 3135*67e74705SXin LiExample matches A, va, fa 3136*67e74705SXin Li class A {}; 3137*67e74705SXin Li class B; Doesn't match, as it has no body. 3138*67e74705SXin Li int va; 3139*67e74705SXin Li extern int vb; Doesn't match, as it doesn't define the variable. 3140*67e74705SXin Li void fa() {} 3141*67e74705SXin Li void fb(); Doesn't match, as it has no body. 3142*67e74705SXin Li 3143*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 3144*67e74705SXin Li</pre></td></tr> 3145*67e74705SXin Li 3146*67e74705SXin Li 3147*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3148*67e74705SXin Li<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 3149*67e74705SXin Li 3150*67e74705SXin LiNote that 'Value' is a string as the template argument's value is 3151*67e74705SXin Lian arbitrary precision integer. 'Value' must be euqal to the canonical 3152*67e74705SXin Lirepresentation of that integral value in base 10. 3153*67e74705SXin Li 3154*67e74705SXin LiGiven 3155*67e74705SXin Li template<int T> struct A {}; 3156*67e74705SXin Li C<42> c; 3157*67e74705SXin LiclassTemplateSpecializationDecl( 3158*67e74705SXin Li hasAnyTemplateArgument(equalsIntegralValue("42"))) 3159*67e74705SXin Li matches the implicit instantiation of C in C<42>. 3160*67e74705SXin Li</pre></td></tr> 3161*67e74705SXin Li 3162*67e74705SXin Li 3163*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3164*67e74705SXin Li<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 3165*67e74705SXin Li 3166*67e74705SXin LiGiven 3167*67e74705SXin Li template<int T> struct A {}; 3168*67e74705SXin Li C<42> c; 3169*67e74705SXin LiclassTemplateSpecializationDecl( 3170*67e74705SXin Li hasAnyTemplateArgument(isIntegral())) 3171*67e74705SXin Li matches the implicit instantiation of C in C<42> 3172*67e74705SXin Li with isIntegral() matching 42. 3173*67e74705SXin Li</pre></td></tr> 3174*67e74705SXin Li 3175*67e74705SXin Li 3176*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3177*67e74705SXin Li<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 3178*67e74705SXin Li 3179*67e74705SXin LiGiven 3180*67e74705SXin Li template<typename T> struct C {}; 3181*67e74705SXin Li C<int> c; 3182*67e74705SXin LiclassTemplateSpecializationDecl(templateArgumentCountIs(1)) 3183*67e74705SXin Li matches C<int>. 3184*67e74705SXin Li</pre></td></tr> 3185*67e74705SXin Li 3186*67e74705SXin Li 3187*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr> 3188*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 3189*67e74705SXin Lipartially matching a given regex. 3190*67e74705SXin Li 3191*67e74705SXin LiExample matches Y but not X 3192*67e74705SXin Li (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3193*67e74705SXin Li #include "ASTMatcher.h" 3194*67e74705SXin Li class X {}; 3195*67e74705SXin LiASTMatcher.h: 3196*67e74705SXin Li class Y {}; 3197*67e74705SXin Li 3198*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3199*67e74705SXin Li</pre></td></tr> 3200*67e74705SXin Li 3201*67e74705SXin Li 3202*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3203*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 3204*67e74705SXin Li 3205*67e74705SXin LiExample matches X but not Y 3206*67e74705SXin Li (matcher = cxxRecordDecl(isExpansionInMainFile()) 3207*67e74705SXin Li #include <Y.h> 3208*67e74705SXin Li class X {}; 3209*67e74705SXin LiY.h: 3210*67e74705SXin Li class Y {}; 3211*67e74705SXin Li 3212*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3213*67e74705SXin Li</pre></td></tr> 3214*67e74705SXin Li 3215*67e74705SXin Li 3216*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3217*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 3218*67e74705SXin Li 3219*67e74705SXin LiExample matches Y but not X 3220*67e74705SXin Li (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3221*67e74705SXin Li #include <SystemHeader.h> 3222*67e74705SXin Li class X {}; 3223*67e74705SXin LiSystemHeader.h: 3224*67e74705SXin Li class Y {}; 3225*67e74705SXin Li 3226*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3227*67e74705SXin Li</pre></td></tr> 3228*67e74705SXin Li 3229*67e74705SXin Li 3230*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3231*67e74705SXin Li<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 3232*67e74705SXin Li 3233*67e74705SXin LiGiven 3234*67e74705SXin Li struct S { bool func(); }; 3235*67e74705SXin LifunctionDecl(returns(booleanType())) 3236*67e74705SXin Li matches "bool func();" 3237*67e74705SXin Li</pre></td></tr> 3238*67e74705SXin Li 3239*67e74705SXin Li 3240*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3241*67e74705SXin Li<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 3242*67e74705SXin Li 3243*67e74705SXin LiMatches a node if it equals the node previously bound to ID. 3244*67e74705SXin Li 3245*67e74705SXin LiGiven 3246*67e74705SXin Li class X { int a; int b; }; 3247*67e74705SXin LicxxRecordDecl( 3248*67e74705SXin Li has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3249*67e74705SXin Li has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3250*67e74705SXin Li matches the class X, as a and b have the same type. 3251*67e74705SXin Li 3252*67e74705SXin LiNote that when multiple matches are involved via forEach* matchers, 3253*67e74705SXin LiequalsBoundNodes acts as a filter. 3254*67e74705SXin LiFor example: 3255*67e74705SXin LicompoundStmt( 3256*67e74705SXin Li forEachDescendant(varDecl().bind("d")), 3257*67e74705SXin Li forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3258*67e74705SXin Liwill trigger a match for each combination of variable declaration 3259*67e74705SXin Liand reference to that variable declaration within a compound statement. 3260*67e74705SXin Li</pre></td></tr> 3261*67e74705SXin Li 3262*67e74705SXin Li 3263*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3264*67e74705SXin Li<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 3265*67e74705SXin Li 3266*67e74705SXin LiType has pointer identity in the AST. 3267*67e74705SXin Li</pre></td></tr> 3268*67e74705SXin Li 3269*67e74705SXin Li 3270*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3271*67e74705SXin Li<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 3272*67e74705SXin Li 3273*67e74705SXin LiGiven 3274*67e74705SXin Li int i; 3275*67e74705SXin Li float f; 3276*67e74705SXin LirealFloatingPointType() 3277*67e74705SXin Li matches "float f" but not "int i" 3278*67e74705SXin Li</pre></td></tr> 3279*67e74705SXin Li 3280*67e74705SXin Li 3281*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3282*67e74705SXin Li<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 3283*67e74705SXin Li 3284*67e74705SXin LiGiven 3285*67e74705SXin Li struct S { void func(); }; 3286*67e74705SXin LifunctionDecl(returns(voidType())) 3287*67e74705SXin Li matches "void func();" 3288*67e74705SXin Li</pre></td></tr> 3289*67e74705SXin Li 3290*67e74705SXin Li 3291*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3292*67e74705SXin Li<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 3293*67e74705SXin Li 3294*67e74705SXin LiGiven 3295*67e74705SXin Li int x; 3296*67e74705SXin Li int s = sizeof(x) + alignof(x) 3297*67e74705SXin LiunaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 3298*67e74705SXin Li matches sizeof(x) 3299*67e74705SXin Li</pre></td></tr> 3300*67e74705SXin Li 3301*67e74705SXin Li 3302*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 3303*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 3304*67e74705SXin Liunary). 3305*67e74705SXin Li 3306*67e74705SXin LiExample matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3307*67e74705SXin Li !(a || b) 3308*67e74705SXin Li</pre></td></tr> 3309*67e74705SXin Li 3310*67e74705SXin Li 3311*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3312*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 3313*67e74705SXin Li 3314*67e74705SXin LiExample matches x, but not y, z, or a. 3315*67e74705SXin Li(matcher = varDecl(hasAutomaticStorageDuration()) 3316*67e74705SXin Livoid f() { 3317*67e74705SXin Li int x; 3318*67e74705SXin Li static int y; 3319*67e74705SXin Li thread_local int z; 3320*67e74705SXin Li} 3321*67e74705SXin Liint a; 3322*67e74705SXin Li</pre></td></tr> 3323*67e74705SXin Li 3324*67e74705SXin Li 3325*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3326*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 3327*67e74705SXin Li 3328*67e74705SXin LiExample matches y and z (matcher = varDecl(hasGlobalStorage()) 3329*67e74705SXin Livoid f() { 3330*67e74705SXin Li int x; 3331*67e74705SXin Li static int y; 3332*67e74705SXin Li} 3333*67e74705SXin Liint z; 3334*67e74705SXin Li</pre></td></tr> 3335*67e74705SXin Li 3336*67e74705SXin Li 3337*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3338*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 3339*67e74705SXin Linon-static local variable. 3340*67e74705SXin Li 3341*67e74705SXin LiExample matches x (matcher = varDecl(hasLocalStorage()) 3342*67e74705SXin Livoid f() { 3343*67e74705SXin Li int x; 3344*67e74705SXin Li static int y; 3345*67e74705SXin Li} 3346*67e74705SXin Liint z; 3347*67e74705SXin Li</pre></td></tr> 3348*67e74705SXin Li 3349*67e74705SXin Li 3350*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3351*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 3352*67e74705SXin Li 3353*67e74705SXin LiExample matches y and a, but not x or z. 3354*67e74705SXin Li(matcher = varDecl(hasStaticStorageDuration()) 3355*67e74705SXin Livoid f() { 3356*67e74705SXin Li int x; 3357*67e74705SXin Li static int y; 3358*67e74705SXin Li thread_local int z; 3359*67e74705SXin Li} 3360*67e74705SXin Liint a; 3361*67e74705SXin Li</pre></td></tr> 3362*67e74705SXin Li 3363*67e74705SXin Li 3364*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3365*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 3366*67e74705SXin Li 3367*67e74705SXin LiExample matches z, but not x, z, or a. 3368*67e74705SXin Li(matcher = varDecl(hasThreadStorageDuration()) 3369*67e74705SXin Livoid f() { 3370*67e74705SXin Li int x; 3371*67e74705SXin Li static int y; 3372*67e74705SXin Li thread_local int z; 3373*67e74705SXin Li} 3374*67e74705SXin Liint a; 3375*67e74705SXin Li</pre></td></tr> 3376*67e74705SXin Li 3377*67e74705SXin Li 3378*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3379*67e74705SXin Li<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations. 3380*67e74705SXin Li 3381*67e74705SXin LiGiven: 3382*67e74705SXin Li constexpr int foo = 42; 3383*67e74705SXin Li constexpr int bar(); 3384*67e74705SXin LivarDecl(isConstexpr()) 3385*67e74705SXin Li matches the declaration of foo. 3386*67e74705SXin LifunctionDecl(isConstexpr()) 3387*67e74705SXin Li matches the declaration of bar. 3388*67e74705SXin Li</pre></td></tr> 3389*67e74705SXin Li 3390*67e74705SXin Li 3391*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3392*67e74705SXin Li<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 3393*67e74705SXin Li 3394*67e74705SXin LiExample matches A, va, fa 3395*67e74705SXin Li class A {}; 3396*67e74705SXin Li class B; Doesn't match, as it has no body. 3397*67e74705SXin Li int va; 3398*67e74705SXin Li extern int vb; Doesn't match, as it doesn't define the variable. 3399*67e74705SXin Li void fa() {} 3400*67e74705SXin Li void fb(); Doesn't match, as it has no body. 3401*67e74705SXin Li 3402*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 3403*67e74705SXin Li</pre></td></tr> 3404*67e74705SXin Li 3405*67e74705SXin Li 3406*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3407*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 3408*67e74705SXin Lia C++ catch block, or an Objective-C statement. 3409*67e74705SXin Li 3410*67e74705SXin LiExample matches x (matcher = varDecl(isExceptionVariable()) 3411*67e74705SXin Livoid f(int y) { 3412*67e74705SXin Li try { 3413*67e74705SXin Li } catch (int x) { 3414*67e74705SXin Li } 3415*67e74705SXin Li} 3416*67e74705SXin Li</pre></td></tr> 3417*67e74705SXin Li 3418*67e74705SXin Li 3419*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3420*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 3421*67e74705SXin Listatic member variable template instantiations. 3422*67e74705SXin Li 3423*67e74705SXin LiGiven 3424*67e74705SXin Li template<typename T> void A(T t) { } 3425*67e74705SXin Li template<> void A(int N) { } 3426*67e74705SXin LifunctionDecl(isExplicitTemplateSpecialization()) 3427*67e74705SXin Li matches the specialization A<int>(). 3428*67e74705SXin Li 3429*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 3430*67e74705SXin Li</pre></td></tr> 3431*67e74705SXin Li 3432*67e74705SXin Li 3433*67e74705SXin Li<tr><td>Matcher<<a href="http://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> 3434*67e74705SXin Li<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 3435*67e74705SXin Limember variable template instantiations. 3436*67e74705SXin Li 3437*67e74705SXin LiGiven 3438*67e74705SXin Li template <typename T> class X {}; class A {}; X<A> x; 3439*67e74705SXin Lior 3440*67e74705SXin Li template <typename T> class X {}; class A {}; template class X<A>; 3441*67e74705SXin LicxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3442*67e74705SXin Li matches the template instantiation of X<A>. 3443*67e74705SXin Li 3444*67e74705SXin LiBut given 3445*67e74705SXin Li template <typename T> class X {}; class A {}; 3446*67e74705SXin Li template <> class X<A> {}; X<A> x; 3447*67e74705SXin LicxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3448*67e74705SXin Li does not match, as X<A> is an explicit template specialization. 3449*67e74705SXin Li 3450*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 3451*67e74705SXin Li</pre></td></tr> 3452*67e74705SXin Li 3453*67e74705SXin Li 3454*67e74705SXin Li<tr><td>Matcher<internal::Matcher<<a href="http://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> 3455*67e74705SXin Li<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3456*67e74705SXin Litemplate instantiations. 3457*67e74705SXin Li 3458*67e74705SXin LiGiven 3459*67e74705SXin Li template<typename T> void A(T t) { T i; } 3460*67e74705SXin Li A(0); 3461*67e74705SXin Li A(0U); 3462*67e74705SXin LifunctionDecl(isInstantiated()) 3463*67e74705SXin Li matches 'A(int) {...};' and 'A(unsigned) {...}'. 3464*67e74705SXin Li</pre></td></tr> 3465*67e74705SXin Li 3466*67e74705SXin Li 3467*67e74705SXin Li<tr><td>Matcher<internal::Matcher<<a href="http://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> 3468*67e74705SXin Li<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 3469*67e74705SXin LiGNU's __null, C++11's nullptr, or C's NULL macro. 3470*67e74705SXin Li 3471*67e74705SXin LiGiven: 3472*67e74705SXin Li void *v1 = NULL; 3473*67e74705SXin Li void *v2 = nullptr; 3474*67e74705SXin Li void *v3 = __null; GNU extension 3475*67e74705SXin Li char *cp = (char *)0; 3476*67e74705SXin Li int *ip = 0; 3477*67e74705SXin Li int i = 0; 3478*67e74705SXin Liexpr(nullPointerConstant()) 3479*67e74705SXin Li matches the initializer for v1, v2, v3, cp, and ip. Does not match the 3480*67e74705SXin Li initializer for i. 3481*67e74705SXin Li</pre></td></tr> 3482*67e74705SXin Li 3483*67e74705SXin Li 3484*67e74705SXin Li<tr><td>Matcher<internal::Matcher<<a href="http://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> 3485*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 3486*67e74705SXin Li 3487*67e74705SXin LiThis matcher is only provided as a performance optimization of hasName. 3488*67e74705SXin Li hasAnyName(a, b, c) 3489*67e74705SXin Li is equivalent to, but faster than 3490*67e74705SXin Li anyOf(hasName(a), hasName(b), hasName(c)) 3491*67e74705SXin Li</pre></td></tr> 3492*67e74705SXin Li 3493*67e74705SXin Li 3494*67e74705SXin Li<tr><td>Matcher<internal::Matcher<<a href="http://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> 3495*67e74705SXin Li<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 3496*67e74705SXin Li 3497*67e74705SXin LiGiven 3498*67e74705SXin Li int j; 3499*67e74705SXin Li template<typename T> void A(T t) { T i; j += 42;} 3500*67e74705SXin Li A(0); 3501*67e74705SXin Li A(0U); 3502*67e74705SXin LideclStmt(isInTemplateInstantiation()) 3503*67e74705SXin Li matches 'int i;' and 'unsigned i'. 3504*67e74705SXin Liunless(stmt(isInTemplateInstantiation())) 3505*67e74705SXin Li will NOT match j += 42; as it's shared between the template definition and 3506*67e74705SXin Li instantiation. 3507*67e74705SXin Li</pre></td></tr> 3508*67e74705SXin Li 3509*67e74705SXin Li<!--END_NARROWING_MATCHERS --> 3510*67e74705SXin Li</table> 3511*67e74705SXin Li 3512*67e74705SXin Li<!-- ======================================================================= --> 3513*67e74705SXin Li<h2 id="traversal-matchers">AST Traversal Matchers</h2> 3514*67e74705SXin Li<!-- ======================================================================= --> 3515*67e74705SXin Li 3516*67e74705SXin Li<p>Traversal matchers specify the relationship to other nodes that are 3517*67e74705SXin Lireachable from the current node.</p> 3518*67e74705SXin Li 3519*67e74705SXin Li<p>Note that there are special traversal matchers (has, hasDescendant, forEach and 3520*67e74705SXin LiforEachDescendant) which work on all nodes and allow users to write more generic 3521*67e74705SXin Limatch expressions.</p> 3522*67e74705SXin Li 3523*67e74705SXin Li<table> 3524*67e74705SXin Li<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 3525*67e74705SXin Li<!-- START_TRAVERSAL_MATCHERS --> 3526*67e74705SXin Li 3527*67e74705SXin Li<tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 3528*67e74705SXin Li<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 3529*67e74705SXin Li 3530*67e74705SXin LiUnlike anyOf, eachOf will generate a match result for each 3531*67e74705SXin Limatching submatcher. 3532*67e74705SXin Li 3533*67e74705SXin LiFor example, in: 3534*67e74705SXin Li class A { int a; int b; }; 3535*67e74705SXin LiThe matcher: 3536*67e74705SXin Li cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 3537*67e74705SXin Li has(fieldDecl(hasName("b")).bind("v")))) 3538*67e74705SXin Liwill generate two results binding "v", the first of which binds 3539*67e74705SXin Lithe field declaration of a, the second the field declaration of 3540*67e74705SXin Lib. 3541*67e74705SXin Li 3542*67e74705SXin LiUsable as: Any Matcher 3543*67e74705SXin Li</pre></td></tr> 3544*67e74705SXin Li 3545*67e74705SXin Li 3546*67e74705SXin Li<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 3547*67e74705SXin Li<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 3548*67e74705SXin Liprovided matcher. 3549*67e74705SXin Li 3550*67e74705SXin LiExample matches X, A, B, C 3551*67e74705SXin Li (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 3552*67e74705SXin Li class X {}; Matches X, because X::X is a class of name X inside X. 3553*67e74705SXin Li class A { class X {}; }; 3554*67e74705SXin Li class B { class C { class X {}; }; }; 3555*67e74705SXin Li 3556*67e74705SXin LiDescendantT must be an AST base type. 3557*67e74705SXin Li 3558*67e74705SXin LiAs opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 3559*67e74705SXin Lieach result that matches instead of only on the first one. 3560*67e74705SXin Li 3561*67e74705SXin LiNote: Recursively combined ForEachDescendant can cause many matches: 3562*67e74705SXin Li cxxRecordDecl(forEachDescendant(cxxRecordDecl( 3563*67e74705SXin Li forEachDescendant(cxxRecordDecl()) 3564*67e74705SXin Li ))) 3565*67e74705SXin Liwill match 10 times (plus injected class name matches) on: 3566*67e74705SXin Li class A { class B { class C { class D { class E {}; }; }; }; }; 3567*67e74705SXin Li 3568*67e74705SXin LiUsable as: Any Matcher 3569*67e74705SXin Li</pre></td></tr> 3570*67e74705SXin Li 3571*67e74705SXin Li 3572*67e74705SXin Li<tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 3573*67e74705SXin Li<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 3574*67e74705SXin Liprovided matcher. 3575*67e74705SXin Li 3576*67e74705SXin LiExample matches X, Y 3577*67e74705SXin Li (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 3578*67e74705SXin Li class X {}; Matches X, because X::X is a class of name X inside X. 3579*67e74705SXin Li class Y { class X {}; }; 3580*67e74705SXin Li class Z { class Y { class X {}; }; }; Does not match Z. 3581*67e74705SXin Li 3582*67e74705SXin LiChildT must be an AST base type. 3583*67e74705SXin Li 3584*67e74705SXin LiAs opposed to 'has', 'forEach' will cause a match for each result that 3585*67e74705SXin Limatches instead of only on the first one. 3586*67e74705SXin Li 3587*67e74705SXin LiUsable as: Any Matcher 3588*67e74705SXin Li</pre></td></tr> 3589*67e74705SXin Li 3590*67e74705SXin Li 3591*67e74705SXin Li<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 3592*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 3593*67e74705SXin Limatcher. 3594*67e74705SXin Li 3595*67e74705SXin LiGiven 3596*67e74705SXin Livoid f() { if (true) { int x = 42; } } 3597*67e74705SXin Livoid g() { for (;;) { int x = 43; } } 3598*67e74705SXin Liexpr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 3599*67e74705SXin Li 3600*67e74705SXin LiUsable as: Any Matcher 3601*67e74705SXin Li</pre></td></tr> 3602*67e74705SXin Li 3603*67e74705SXin Li 3604*67e74705SXin Li<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 3605*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 3606*67e74705SXin Liprovided matcher. 3607*67e74705SXin Li 3608*67e74705SXin LiExample matches X, Y, Z 3609*67e74705SXin Li (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 3610*67e74705SXin Li class X {}; Matches X, because X::X is a class of name X inside X. 3611*67e74705SXin Li class Y { class X {}; }; 3612*67e74705SXin Li class Z { class Y { class X {}; }; }; 3613*67e74705SXin Li 3614*67e74705SXin LiDescendantT must be an AST base type. 3615*67e74705SXin Li 3616*67e74705SXin LiUsable as: Any Matcher 3617*67e74705SXin Li</pre></td></tr> 3618*67e74705SXin Li 3619*67e74705SXin Li 3620*67e74705SXin Li<tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 3621*67e74705SXin Li<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 3622*67e74705SXin Liprovided matcher. 3623*67e74705SXin Li 3624*67e74705SXin LiExample matches X, Y 3625*67e74705SXin Li (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 3626*67e74705SXin Li class X {}; Matches X, because X::X is a class of name X inside X. 3627*67e74705SXin Li class Y { class X {}; }; 3628*67e74705SXin Li class Z { class Y { class X {}; }; }; Does not match Z. 3629*67e74705SXin Li 3630*67e74705SXin LiChildT must be an AST base type. 3631*67e74705SXin Li 3632*67e74705SXin LiUsable as: Any Matcher 3633*67e74705SXin LiNote that has is direct matcher, so it also matches things like implicit 3634*67e74705SXin Licasts and paren casts. If you are matching with expr then you should 3635*67e74705SXin Liprobably consider using ignoringParenImpCasts like: 3636*67e74705SXin Lihas(ignoringParenImpCasts(expr())). 3637*67e74705SXin Li</pre></td></tr> 3638*67e74705SXin Li 3639*67e74705SXin Li 3640*67e74705SXin Li<tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 3641*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 3642*67e74705SXin Limatcher. 3643*67e74705SXin Li 3644*67e74705SXin LiGiven 3645*67e74705SXin Livoid f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 3646*67e74705SXin LicompoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 3647*67e74705SXin Li 3648*67e74705SXin LiUsable as: Any Matcher 3649*67e74705SXin Li</pre></td></tr> 3650*67e74705SXin Li 3651*67e74705SXin Li 3652*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3653*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 3654*67e74705SXin Liswitch statement or conditional operator. 3655*67e74705SXin Li 3656*67e74705SXin LiExample matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 3657*67e74705SXin Li if (true) {} 3658*67e74705SXin Li</pre></td></tr> 3659*67e74705SXin Li 3660*67e74705SXin Li 3661*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3662*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 3663*67e74705SXin Li(binary or ternary). 3664*67e74705SXin Li 3665*67e74705SXin LiExample matches b 3666*67e74705SXin Li condition ? a : b 3667*67e74705SXin Li condition ?: b 3668*67e74705SXin Li</pre></td></tr> 3669*67e74705SXin Li 3670*67e74705SXin Li 3671*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3672*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 3673*67e74705SXin Li 3674*67e74705SXin LiExample 1 (conditional ternary operator): matches a 3675*67e74705SXin Li condition ? a : b 3676*67e74705SXin Li 3677*67e74705SXin LiExample 2 (conditional binary operator): matches opaqueValueExpr(condition) 3678*67e74705SXin Li condition ?: b 3679*67e74705SXin Li</pre></td></tr> 3680*67e74705SXin Li 3681*67e74705SXin Li 3682*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>></td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 3683*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 3684*67e74705SXin Limatches the given matcher. 3685*67e74705SXin Li 3686*67e74705SXin LiThe associated declaration is: 3687*67e74705SXin Li- for type nodes, the declaration of the underlying type 3688*67e74705SXin Li- for CallExpr, the declaration of the callee 3689*67e74705SXin Li- for MemberExpr, the declaration of the referenced member 3690*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor 3691*67e74705SXin Li 3692*67e74705SXin LiAlso usable as Matcher<T> for any T supporting the getDecl() member 3693*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions. 3694*67e74705SXin Li 3695*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 3696*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 3697*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 3698*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 3699*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 3700*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 3701*67e74705SXin Li</pre></td></tr> 3702*67e74705SXin Li 3703*67e74705SXin Li 3704*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3705*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 3706*67e74705SXin Li 3707*67e74705SXin LiGiven 3708*67e74705SXin Li int i[5]; 3709*67e74705SXin Li void f() { i[1] = 42; } 3710*67e74705SXin LiarraySubscriptExpression(hasBase(implicitCastExpr( 3711*67e74705SXin Li hasSourceExpression(declRefExpr())))) 3712*67e74705SXin Li matches i[1] with the declRefExpr() matching i 3713*67e74705SXin Li</pre></td></tr> 3714*67e74705SXin Li 3715*67e74705SXin Li 3716*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3717*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 3718*67e74705SXin Li 3719*67e74705SXin LiGiven 3720*67e74705SXin Li int i[5]; 3721*67e74705SXin Li void f() { i[1] = 42; } 3722*67e74705SXin LiarraySubscriptExpression(hasIndex(integerLiteral())) 3723*67e74705SXin Li matches i[1] with the integerLiteral() matching 1 3724*67e74705SXin Li</pre></td></tr> 3725*67e74705SXin Li 3726*67e74705SXin Li 3727*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasLHS1')"><a name="hasLHS1Anchor">hasLHS</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3728*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 3729*67e74705SXin Li 3730*67e74705SXin LiExample matches a (matcher = binaryOperator(hasLHS())) 3731*67e74705SXin Li a || b 3732*67e74705SXin Li</pre></td></tr> 3733*67e74705SXin Li 3734*67e74705SXin Li 3735*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasRHS1')"><a name="hasRHS1Anchor">hasRHS</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3736*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 3737*67e74705SXin Li 3738*67e74705SXin LiExample matches b (matcher = binaryOperator(hasRHS())) 3739*67e74705SXin Li a || b 3740*67e74705SXin Li</pre></td></tr> 3741*67e74705SXin Li 3742*67e74705SXin Li 3743*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayTypeLoc.html">ArrayTypeLoc</a>></td><td class="name" onclick="toggle('hasElementTypeLoc0')"><a name="hasElementTypeLoc0Anchor">hasElementTypeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 3744*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element 3745*67e74705SXin Litype. 3746*67e74705SXin Li 3747*67e74705SXin LiGiven 3748*67e74705SXin Li struct A {}; 3749*67e74705SXin Li A a[7]; 3750*67e74705SXin Li int b[7]; 3751*67e74705SXin LiarrayType(hasElementType(builtinType())) 3752*67e74705SXin Li matches "int b[7]" 3753*67e74705SXin Li 3754*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 3755*67e74705SXin Li</pre></td></tr> 3756*67e74705SXin Li 3757*67e74705SXin Li 3758*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 3759*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 3760*67e74705SXin Litype. 3761*67e74705SXin Li 3762*67e74705SXin LiGiven 3763*67e74705SXin Li struct A {}; 3764*67e74705SXin Li A a[7]; 3765*67e74705SXin Li int b[7]; 3766*67e74705SXin LiarrayType(hasElementType(builtinType())) 3767*67e74705SXin Li matches "int b[7]" 3768*67e74705SXin Li 3769*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 3770*67e74705SXin Li</pre></td></tr> 3771*67e74705SXin Li 3772*67e74705SXin Li 3773*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicTypeLoc.html">AtomicTypeLoc</a>></td><td class="name" onclick="toggle('hasValueTypeLoc0')"><a name="hasValueTypeLoc0Anchor">hasValueTypeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 3774*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type. 3775*67e74705SXin Li 3776*67e74705SXin LiGiven 3777*67e74705SXin Li _Atomic(int) i; 3778*67e74705SXin Li _Atomic(float) f; 3779*67e74705SXin LiatomicType(hasValueType(isInteger())) 3780*67e74705SXin Li matches "_Atomic(int) i" 3781*67e74705SXin Li 3782*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 3783*67e74705SXin Li</pre></td></tr> 3784*67e74705SXin Li 3785*67e74705SXin Li 3786*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 3787*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 3788*67e74705SXin Li 3789*67e74705SXin LiGiven 3790*67e74705SXin Li _Atomic(int) i; 3791*67e74705SXin Li _Atomic(float) f; 3792*67e74705SXin LiatomicType(hasValueType(isInteger())) 3793*67e74705SXin Li matches "_Atomic(int) i" 3794*67e74705SXin Li 3795*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 3796*67e74705SXin Li</pre></td></tr> 3797*67e74705SXin Li 3798*67e74705SXin Li 3799*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 3800*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 3801*67e74705SXin Li 3802*67e74705SXin LiNote: There is no TypeLoc for the deduced type and thus no 3803*67e74705SXin LigetDeducedLoc() matcher. 3804*67e74705SXin Li 3805*67e74705SXin LiGiven 3806*67e74705SXin Li auto a = 1; 3807*67e74705SXin Li auto b = 2.0; 3808*67e74705SXin LiautoType(hasDeducedType(isInteger())) 3809*67e74705SXin Li matches "auto a" 3810*67e74705SXin Li 3811*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 3812*67e74705SXin Li</pre></td></tr> 3813*67e74705SXin Li 3814*67e74705SXin Li 3815*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3816*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 3817*67e74705SXin Libinary operator matches. 3818*67e74705SXin Li</pre></td></tr> 3819*67e74705SXin Li 3820*67e74705SXin Li 3821*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3822*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 3823*67e74705SXin Li 3824*67e74705SXin LiExample matches a (matcher = binaryOperator(hasLHS())) 3825*67e74705SXin Li a || b 3826*67e74705SXin Li</pre></td></tr> 3827*67e74705SXin Li 3828*67e74705SXin Li 3829*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3830*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 3831*67e74705SXin Li 3832*67e74705SXin LiExample matches b (matcher = binaryOperator(hasRHS())) 3833*67e74705SXin Li a || b 3834*67e74705SXin Li</pre></td></tr> 3835*67e74705SXin Li 3836*67e74705SXin Li 3837*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerTypeLoc.html">BlockPointerTypeLoc</a>></td><td class="name" onclick="toggle('pointeeLoc0')"><a name="pointeeLoc0Anchor">pointeeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 3838*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the 3839*67e74705SXin Lipointee matches a given matcher. 3840*67e74705SXin Li 3841*67e74705SXin LiGiven 3842*67e74705SXin Li int *a; 3843*67e74705SXin Li int const *b; 3844*67e74705SXin Li float const *f; 3845*67e74705SXin LipointerType(pointee(isConstQualified(), isInteger())) 3846*67e74705SXin Li matches "int const *b" 3847*67e74705SXin Li 3848*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 3849*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 3850*67e74705SXin Li</pre></td></tr> 3851*67e74705SXin Li 3852*67e74705SXin Li 3853*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 3854*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 3855*67e74705SXin Lipointee matches a given matcher. 3856*67e74705SXin Li 3857*67e74705SXin LiGiven 3858*67e74705SXin Li int *a; 3859*67e74705SXin Li int const *b; 3860*67e74705SXin Li float const *f; 3861*67e74705SXin LipointerType(pointee(isConstQualified(), isInteger())) 3862*67e74705SXin Li matches "int const *b" 3863*67e74705SXin Li 3864*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 3865*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 3866*67e74705SXin Li</pre></td></tr> 3867*67e74705SXin Li 3868*67e74705SXin Li 3869*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> ParamMatcher</td></tr> 3870*67e74705SXin Li<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 3871*67e74705SXin Li 3872*67e74705SXin LiGiven 3873*67e74705SXin Li void f(int i); 3874*67e74705SXin Li int y; 3875*67e74705SXin Li f(y); 3876*67e74705SXin LicallExpr( 3877*67e74705SXin Li forEachArgumentWithParam( 3878*67e74705SXin Li declRefExpr(to(varDecl(hasName("y")))), 3879*67e74705SXin Li parmVarDecl(hasType(isInteger())) 3880*67e74705SXin Li)) 3881*67e74705SXin Li matches f(y); 3882*67e74705SXin Liwith declRefExpr(...) 3883*67e74705SXin Li matching int y 3884*67e74705SXin Liand parmVarDecl(...) 3885*67e74705SXin Li matching int i 3886*67e74705SXin Li</pre></td></tr> 3887*67e74705SXin Li 3888*67e74705SXin Li 3889*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3890*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 3891*67e74705SXin Liexpression. 3892*67e74705SXin Li 3893*67e74705SXin LiGiven 3894*67e74705SXin Li void x(int, int, int) { int y; x(1, y, 42); } 3895*67e74705SXin LicallExpr(hasAnyArgument(declRefExpr())) 3896*67e74705SXin Li matches x(1, y, 42) 3897*67e74705SXin Liwith hasAnyArgument(...) 3898*67e74705SXin Li matching y 3899*67e74705SXin Li</pre></td></tr> 3900*67e74705SXin Li 3901*67e74705SXin Li 3902*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3903*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 3904*67e74705SXin Licall expression. 3905*67e74705SXin Li 3906*67e74705SXin LiExample matches y in x(y) 3907*67e74705SXin Li (matcher = callExpr(hasArgument(0, declRefExpr()))) 3908*67e74705SXin Li void x(int) { int y; x(y); } 3909*67e74705SXin Li</pre></td></tr> 3910*67e74705SXin Li 3911*67e74705SXin Li 3912*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 3913*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 3914*67e74705SXin Limatches the given matcher. 3915*67e74705SXin Li 3916*67e74705SXin LiThe associated declaration is: 3917*67e74705SXin Li- for type nodes, the declaration of the underlying type 3918*67e74705SXin Li- for CallExpr, the declaration of the callee 3919*67e74705SXin Li- for MemberExpr, the declaration of the referenced member 3920*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor 3921*67e74705SXin Li 3922*67e74705SXin LiAlso usable as Matcher<T> for any T supporting the getDecl() member 3923*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions. 3924*67e74705SXin Li 3925*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 3926*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 3927*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 3928*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 3929*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 3930*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 3931*67e74705SXin Li</pre></td></tr> 3932*67e74705SXin Li 3933*67e74705SXin Li 3934*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>> InnerMatcher</td></tr> 3935*67e74705SXin Li<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 3936*67e74705SXin Li 3937*67e74705SXin LiGiven 3938*67e74705SXin Li class A { A() : i(42), j(42) {} int i; int j; }; 3939*67e74705SXin LicxxConstructorDecl(forEachConstructorInitializer( 3940*67e74705SXin Li forField(decl().bind("x")) 3941*67e74705SXin Li)) 3942*67e74705SXin Li will trigger two matches, binding for 'i' and 'j' respectively. 3943*67e74705SXin Li</pre></td></tr> 3944*67e74705SXin Li 3945*67e74705SXin Li 3946*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>> InnerMatcher</td></tr> 3947*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 3948*67e74705SXin Li 3949*67e74705SXin LiGiven 3950*67e74705SXin Li struct Foo { 3951*67e74705SXin Li Foo() : foo_(1) { } 3952*67e74705SXin Li int foo_; 3953*67e74705SXin Li }; 3954*67e74705SXin LicxxRecordDecl(has(cxxConstructorDecl( 3955*67e74705SXin Li hasAnyConstructorInitializer(anything()) 3956*67e74705SXin Li))) 3957*67e74705SXin Li record matches Foo, hasAnyConstructorInitializer matches foo_(1) 3958*67e74705SXin Li</pre></td></tr> 3959*67e74705SXin Li 3960*67e74705SXin Li 3961*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>> InnerMatcher</td></tr> 3962*67e74705SXin Li<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 3963*67e74705SXin Li 3964*67e74705SXin LiGiven 3965*67e74705SXin Li struct Foo { 3966*67e74705SXin Li Foo() : foo_(1) { } 3967*67e74705SXin Li int foo_; 3968*67e74705SXin Li }; 3969*67e74705SXin LicxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 3970*67e74705SXin Li forField(hasName("foo_")))))) 3971*67e74705SXin Li matches Foo 3972*67e74705SXin Liwith forField matching foo_ 3973*67e74705SXin Li</pre></td></tr> 3974*67e74705SXin Li 3975*67e74705SXin Li 3976*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 3977*67e74705SXin Li<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 3978*67e74705SXin Li 3979*67e74705SXin LiGiven 3980*67e74705SXin Li struct Foo { 3981*67e74705SXin Li Foo() : foo_(1) { } 3982*67e74705SXin Li int foo_; 3983*67e74705SXin Li }; 3984*67e74705SXin LicxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 3985*67e74705SXin Li withInitializer(integerLiteral(equals(1))))))) 3986*67e74705SXin Li matches Foo 3987*67e74705SXin Liwith withInitializer matching (1) 3988*67e74705SXin Li</pre></td></tr> 3989*67e74705SXin Li 3990*67e74705SXin Li 3991*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 3992*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function 3993*67e74705SXin Lidefinition that has a given body. 3994*67e74705SXin Li 3995*67e74705SXin LiGiven 3996*67e74705SXin Li for (;;) {} 3997*67e74705SXin LihasBody(compoundStmt()) 3998*67e74705SXin Li matches 'for (;;) {}' 3999*67e74705SXin Liwith compoundStmt() 4000*67e74705SXin Li matching '{}' 4001*67e74705SXin Li</pre></td></tr> 4002*67e74705SXin Li 4003*67e74705SXin Li 4004*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>> InnerMatcher</td></tr> 4005*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 4006*67e74705SXin Li 4007*67e74705SXin LiExample: 4008*67e74705SXin Li forStmt(hasLoopVariable(anything())) 4009*67e74705SXin Limatches 'int x' in 4010*67e74705SXin Li for (int x : a) { } 4011*67e74705SXin Li</pre></td></tr> 4012*67e74705SXin Li 4013*67e74705SXin Li 4014*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4015*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 4016*67e74705SXin Li 4017*67e74705SXin LiExample: 4018*67e74705SXin Li forStmt(hasRangeInit(anything())) 4019*67e74705SXin Limatches 'a' in 4020*67e74705SXin Li for (int x : a) { } 4021*67e74705SXin Li</pre></td></tr> 4022*67e74705SXin Li 4023*67e74705SXin Li 4024*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4025*67e74705SXin Li<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr> 4026*67e74705SXin Li 4027*67e74705SXin Li 4028*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4029*67e74705SXin Li<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression. 4030*67e74705SXin Li 4031*67e74705SXin LiExample matches y.x() 4032*67e74705SXin Li (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))) 4033*67e74705SXin Li class Y { public: void x(); }; 4034*67e74705SXin Li void z() { Y y; y.x(); }", 4035*67e74705SXin Li 4036*67e74705SXin LiFIXME: Overload to allow directly matching types? 4037*67e74705SXin Li</pre></td></tr> 4038*67e74705SXin Li 4039*67e74705SXin Li 4040*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4041*67e74705SXin Li<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 4042*67e74705SXin Li</pre></td></tr> 4043*67e74705SXin Li 4044*67e74705SXin Li 4045*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4046*67e74705SXin Li<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified 4047*67e74705SXin Limatcher, or is a pointer to a type that matches the InnerMatcher. 4048*67e74705SXin Li</pre></td></tr> 4049*67e74705SXin Li 4050*67e74705SXin Li 4051*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>> InnerMatcher</td></tr> 4052*67e74705SXin Li<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overriden by the given method. This matcher may 4053*67e74705SXin Liproduce multiple matches. 4054*67e74705SXin Li 4055*67e74705SXin LiGiven 4056*67e74705SXin Li class A { virtual void f(); }; 4057*67e74705SXin Li class B : public A { void f(); }; 4058*67e74705SXin Li class C : public B { void f(); }; 4059*67e74705SXin LicxxMethodDecl(ofClass(hasName("C")), 4060*67e74705SXin Li forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 4061*67e74705SXin Li matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 4062*67e74705SXin Li that B::f is not overridden by C::f). 4063*67e74705SXin Li 4064*67e74705SXin LiThe check can produce multiple matches in case of multiple inheritance, e.g. 4065*67e74705SXin Li class A1 { virtual void f(); }; 4066*67e74705SXin Li class A2 { virtual void f(); }; 4067*67e74705SXin Li class C : public A1, public A2 { void f(); }; 4068*67e74705SXin LicxxMethodDecl(ofClass(hasName("C")), 4069*67e74705SXin Li forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 4070*67e74705SXin Li matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 4071*67e74705SXin Li once with "b" binding "A2::f" and "d" binding "C::f". 4072*67e74705SXin Li</pre></td></tr> 4073*67e74705SXin Li 4074*67e74705SXin Li 4075*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> InnerMatcher</td></tr> 4076*67e74705SXin Li<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 4077*67e74705SXin Libelongs to. 4078*67e74705SXin Li 4079*67e74705SXin LiFIXME: Generalize this for other kinds of declarations. 4080*67e74705SXin LiFIXME: What other kind of declarations would we need to generalize 4081*67e74705SXin Lithis to? 4082*67e74705SXin Li 4083*67e74705SXin LiExample matches A() in the last line 4084*67e74705SXin Li (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 4085*67e74705SXin Li ofClass(hasName("A")))))) 4086*67e74705SXin Li class A { 4087*67e74705SXin Li public: 4088*67e74705SXin Li A(); 4089*67e74705SXin Li }; 4090*67e74705SXin Li A a = A(); 4091*67e74705SXin Li</pre></td></tr> 4092*67e74705SXin Li 4093*67e74705SXin Li 4094*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>> InnerMatcher</td></tr> 4095*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 4096*67e74705SXin Li 4097*67e74705SXin LiGiven: 4098*67e74705SXin Li class A { void func(); }; 4099*67e74705SXin Li class B { void member(); }; 4100*67e74705SXin Li 4101*67e74705SXin LicxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 4102*67e74705SXin LiA but not B. 4103*67e74705SXin Li</pre></td></tr> 4104*67e74705SXin Li 4105*67e74705SXin Li 4106*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 4107*67e74705SXin Li<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from 4108*67e74705SXin Lia class matching Base. 4109*67e74705SXin Li 4110*67e74705SXin LiNote that a class is not considered to be derived from itself. 4111*67e74705SXin Li 4112*67e74705SXin LiExample matches Y, Z, C (Base == hasName("X")) 4113*67e74705SXin Li class X; 4114*67e74705SXin Li class Y : public X {}; directly derived 4115*67e74705SXin Li class Z : public Y {}; indirectly derived 4116*67e74705SXin Li typedef X A; 4117*67e74705SXin Li typedef A B; 4118*67e74705SXin Li class C : public B {}; derived from a typedef of X 4119*67e74705SXin Li 4120*67e74705SXin LiIn the following example, Bar matches isDerivedFrom(hasName("X")): 4121*67e74705SXin Li class Foo; 4122*67e74705SXin Li typedef Foo X; 4123*67e74705SXin Li class Bar : public Foo {}; derived from a type that X is a typedef of 4124*67e74705SXin Li</pre></td></tr> 4125*67e74705SXin Li 4126*67e74705SXin Li 4127*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 4128*67e74705SXin Li<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 4129*67e74705SXin Limatch Base. 4130*67e74705SXin Li</pre></td></tr> 4131*67e74705SXin Li 4132*67e74705SXin Li 4133*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4134*67e74705SXin Li<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 4135*67e74705SXin Ligiven matcher. 4136*67e74705SXin Li 4137*67e74705SXin LiExample matches y.x() (matcher = callExpr(callee( 4138*67e74705SXin Li cxxMethodDecl(hasName("x"))))) 4139*67e74705SXin Li class Y { public: void x(); }; 4140*67e74705SXin Li void z() { Y y; y.x(); } 4141*67e74705SXin Li</pre></td></tr> 4142*67e74705SXin Li 4143*67e74705SXin Li 4144*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4145*67e74705SXin Li<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 4146*67e74705SXin Li 4147*67e74705SXin LiGiven 4148*67e74705SXin Li class Y { void x() { this->x(); x(); Y y; y.x(); } }; 4149*67e74705SXin Li void f() { f(); } 4150*67e74705SXin LicallExpr(callee(expr())) 4151*67e74705SXin Li matches this->x(), x(), y.x(), f() 4152*67e74705SXin Liwith callee(...) 4153*67e74705SXin Li matching this->x, x, y.x, f respectively 4154*67e74705SXin Li 4155*67e74705SXin LiNote: Callee cannot take the more general internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 4156*67e74705SXin Libecause this introduces ambiguous overloads with calls to Callee taking a 4157*67e74705SXin Liinternal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 4158*67e74705SXin Liimplemented in terms of implicit casts. 4159*67e74705SXin Li</pre></td></tr> 4160*67e74705SXin Li 4161*67e74705SXin Li 4162*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> ParamMatcher</td></tr> 4163*67e74705SXin Li<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 4164*67e74705SXin Li 4165*67e74705SXin LiGiven 4166*67e74705SXin Li void f(int i); 4167*67e74705SXin Li int y; 4168*67e74705SXin Li f(y); 4169*67e74705SXin LicallExpr( 4170*67e74705SXin Li forEachArgumentWithParam( 4171*67e74705SXin Li declRefExpr(to(varDecl(hasName("y")))), 4172*67e74705SXin Li parmVarDecl(hasType(isInteger())) 4173*67e74705SXin Li)) 4174*67e74705SXin Li matches f(y); 4175*67e74705SXin Liwith declRefExpr(...) 4176*67e74705SXin Li matching int y 4177*67e74705SXin Liand parmVarDecl(...) 4178*67e74705SXin Li matching int i 4179*67e74705SXin Li</pre></td></tr> 4180*67e74705SXin Li 4181*67e74705SXin Li 4182*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4183*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 4184*67e74705SXin Liexpression. 4185*67e74705SXin Li 4186*67e74705SXin LiGiven 4187*67e74705SXin Li void x(int, int, int) { int y; x(1, y, 42); } 4188*67e74705SXin LicallExpr(hasAnyArgument(declRefExpr())) 4189*67e74705SXin Li matches x(1, y, 42) 4190*67e74705SXin Liwith hasAnyArgument(...) 4191*67e74705SXin Li matching y 4192*67e74705SXin Li</pre></td></tr> 4193*67e74705SXin Li 4194*67e74705SXin Li 4195*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4196*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 4197*67e74705SXin Licall expression. 4198*67e74705SXin Li 4199*67e74705SXin LiExample matches y in x(y) 4200*67e74705SXin Li (matcher = callExpr(hasArgument(0, declRefExpr()))) 4201*67e74705SXin Li void x(int) { int y; x(y); } 4202*67e74705SXin Li</pre></td></tr> 4203*67e74705SXin Li 4204*67e74705SXin Li 4205*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4206*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 4207*67e74705SXin Limatches the given matcher. 4208*67e74705SXin Li 4209*67e74705SXin LiThe associated declaration is: 4210*67e74705SXin Li- for type nodes, the declaration of the underlying type 4211*67e74705SXin Li- for CallExpr, the declaration of the callee 4212*67e74705SXin Li- for MemberExpr, the declaration of the referenced member 4213*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor 4214*67e74705SXin Li 4215*67e74705SXin LiAlso usable as Matcher<T> for any T supporting the getDecl() member 4216*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions. 4217*67e74705SXin Li 4218*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4219*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4220*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4221*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4222*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4223*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4224*67e74705SXin Li</pre></td></tr> 4225*67e74705SXin Li 4226*67e74705SXin Li 4227*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4228*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 4229*67e74705SXin Liextension, matches the constant given in the statement. 4230*67e74705SXin Li 4231*67e74705SXin LiGiven 4232*67e74705SXin Li switch (1) { case 1: case 1+1: case 3 ... 4: ; } 4233*67e74705SXin LicaseStmt(hasCaseConstant(integerLiteral())) 4234*67e74705SXin Li matches "case 1:" 4235*67e74705SXin Li</pre></td></tr> 4236*67e74705SXin Li 4237*67e74705SXin Li 4238*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4239*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre></pre></td></tr> 4240*67e74705SXin Li 4241*67e74705SXin Li 4242*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 4243*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one 4244*67e74705SXin LiTemplateArgument matching the given InnerMatcher. 4245*67e74705SXin Li 4246*67e74705SXin LiGiven 4247*67e74705SXin Li template<typename T> class A {}; 4248*67e74705SXin Li template<> class A<double> {}; 4249*67e74705SXin Li A<int> a; 4250*67e74705SXin LiclassTemplateSpecializationDecl(hasAnyTemplateArgument( 4251*67e74705SXin Li refersToType(asString("int")))) 4252*67e74705SXin Li matches the specialization A<int> 4253*67e74705SXin Li</pre></td></tr> 4254*67e74705SXin Li 4255*67e74705SXin Li 4256*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 4257*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument 4258*67e74705SXin Limatches the given InnerMatcher. 4259*67e74705SXin Li 4260*67e74705SXin LiGiven 4261*67e74705SXin Li template<typename T, typename U> class A {}; 4262*67e74705SXin Li A<bool, int> b; 4263*67e74705SXin Li A<int, bool> c; 4264*67e74705SXin LiclassTemplateSpecializationDecl(hasTemplateArgument( 4265*67e74705SXin Li 1, refersToType(asString("int")))) 4266*67e74705SXin Li matches the specialization A<bool, int> 4267*67e74705SXin Li</pre></td></tr> 4268*67e74705SXin Li 4269*67e74705SXin Li 4270*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexTypeLoc.html">ComplexTypeLoc</a>></td><td class="name" onclick="toggle('hasElementTypeLoc1')"><a name="hasElementTypeLoc1Anchor">hasElementTypeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 4271*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element 4272*67e74705SXin Litype. 4273*67e74705SXin Li 4274*67e74705SXin LiGiven 4275*67e74705SXin Li struct A {}; 4276*67e74705SXin Li A a[7]; 4277*67e74705SXin Li int b[7]; 4278*67e74705SXin LiarrayType(hasElementType(builtinType())) 4279*67e74705SXin Li matches "int b[7]" 4280*67e74705SXin Li 4281*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 4282*67e74705SXin Li</pre></td></tr> 4283*67e74705SXin Li 4284*67e74705SXin Li 4285*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 4286*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 4287*67e74705SXin Litype. 4288*67e74705SXin Li 4289*67e74705SXin LiGiven 4290*67e74705SXin Li struct A {}; 4291*67e74705SXin Li A a[7]; 4292*67e74705SXin Li int b[7]; 4293*67e74705SXin LiarrayType(hasElementType(builtinType())) 4294*67e74705SXin Li matches "int b[7]" 4295*67e74705SXin Li 4296*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 4297*67e74705SXin Li</pre></td></tr> 4298*67e74705SXin Li 4299*67e74705SXin Li 4300*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4301*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 4302*67e74705SXin Lia given matcher. Also matches StmtExprs that have CompoundStmt as children. 4303*67e74705SXin Li 4304*67e74705SXin LiGiven 4305*67e74705SXin Li { {}; 1+2; } 4306*67e74705SXin LihasAnySubstatement(compoundStmt()) 4307*67e74705SXin Li matches '{ {}; 1+2; }' 4308*67e74705SXin Liwith compoundStmt() 4309*67e74705SXin Li matching '{}' 4310*67e74705SXin Li</pre></td></tr> 4311*67e74705SXin Li 4312*67e74705SXin Li 4313*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerType</td></tr> 4314*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher 4315*67e74705SXin Li</pre></td></tr> 4316*67e74705SXin Li 4317*67e74705SXin Li 4318*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4319*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 4320*67e74705SXin Limatches the given matcher. 4321*67e74705SXin Li 4322*67e74705SXin LiThe associated declaration is: 4323*67e74705SXin Li- for type nodes, the declaration of the underlying type 4324*67e74705SXin Li- for CallExpr, the declaration of the callee 4325*67e74705SXin Li- for MemberExpr, the declaration of the referenced member 4326*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor 4327*67e74705SXin Li 4328*67e74705SXin LiAlso usable as Matcher<T> for any T supporting the getDecl() member 4329*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions. 4330*67e74705SXin Li 4331*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4332*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4333*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4334*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4335*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4336*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4337*67e74705SXin Li</pre></td></tr> 4338*67e74705SXin Li 4339*67e74705SXin Li 4340*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr> 4341*67e74705SXin Li<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 4342*67e74705SXin Lispecific using shadow declaration. 4343*67e74705SXin Li 4344*67e74705SXin LiGiven 4345*67e74705SXin Li namespace a { void f() {} } 4346*67e74705SXin Li using a::f; 4347*67e74705SXin Li void g() { 4348*67e74705SXin Li f(); Matches this .. 4349*67e74705SXin Li a::f(); .. but not this. 4350*67e74705SXin Li } 4351*67e74705SXin LideclRefExpr(throughUsingDecl(anything())) 4352*67e74705SXin Li matches f() 4353*67e74705SXin Li</pre></td></tr> 4354*67e74705SXin Li 4355*67e74705SXin Li 4356*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4357*67e74705SXin Li<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 4358*67e74705SXin Lispecified matcher. 4359*67e74705SXin Li 4360*67e74705SXin LiExample matches x in if(x) 4361*67e74705SXin Li (matcher = declRefExpr(to(varDecl(hasName("x"))))) 4362*67e74705SXin Li bool x; 4363*67e74705SXin Li if (x) {} 4364*67e74705SXin Li</pre></td></tr> 4365*67e74705SXin Li 4366*67e74705SXin Li 4367*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4368*67e74705SXin Li<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 4369*67e74705SXin Li 4370*67e74705SXin LiNote that this does not work for global declarations because the AST 4371*67e74705SXin Libreaks up multiple-declaration DeclStmt's into multiple single-declaration 4372*67e74705SXin LiDeclStmt's. 4373*67e74705SXin LiExample: Given non-global declarations 4374*67e74705SXin Li int a, b = 0; 4375*67e74705SXin Li int c; 4376*67e74705SXin Li int d = 2, e; 4377*67e74705SXin LideclStmt(containsDeclaration( 4378*67e74705SXin Li 0, varDecl(hasInitializer(anything())))) 4379*67e74705SXin Li matches only 'int d = 2, e;', and 4380*67e74705SXin LideclStmt(containsDeclaration(1, varDecl())) 4381*67e74705SXin Li matches 'int a, b = 0' as well as 'int d = 2, e;' 4382*67e74705SXin Li but 'int c;' is not matched. 4383*67e74705SXin Li</pre></td></tr> 4384*67e74705SXin Li 4385*67e74705SXin Li 4386*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4387*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 4388*67e74705SXin Li 4389*67e74705SXin LiGiven 4390*67e74705SXin Li int a, b; 4391*67e74705SXin Li int c; 4392*67e74705SXin LideclStmt(hasSingleDecl(anything())) 4393*67e74705SXin Li matches 'int c;' but not 'int a, b;'. 4394*67e74705SXin Li</pre></td></tr> 4395*67e74705SXin Li 4396*67e74705SXin Li 4397*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 4398*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches 4399*67e74705SXin Lithe inner matcher. 4400*67e74705SXin Li 4401*67e74705SXin LiGiven 4402*67e74705SXin Li int x; 4403*67e74705SXin LideclaratorDecl(hasTypeLoc(loc(asString("int")))) 4404*67e74705SXin Li matches int x 4405*67e74705SXin Li</pre></td></tr> 4406*67e74705SXin Li 4407*67e74705SXin Li 4408*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4409*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 4410*67e74705SXin LiDecl, matches InnerMatcher. 4411*67e74705SXin Li 4412*67e74705SXin LiGiven 4413*67e74705SXin Li namespace N { 4414*67e74705SXin Li namespace M { 4415*67e74705SXin Li class D {}; 4416*67e74705SXin Li } 4417*67e74705SXin Li } 4418*67e74705SXin Li 4419*67e74705SXin LicxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 4420*67e74705SXin Lideclaration of class D. 4421*67e74705SXin Li</pre></td></tr> 4422*67e74705SXin Li 4423*67e74705SXin Li 4424*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4425*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function 4426*67e74705SXin Lidefinition that has a given body. 4427*67e74705SXin Li 4428*67e74705SXin LiGiven 4429*67e74705SXin Li for (;;) {} 4430*67e74705SXin LihasBody(compoundStmt()) 4431*67e74705SXin Li matches 'for (;;) {}' 4432*67e74705SXin Liwith compoundStmt() 4433*67e74705SXin Li matching '{}' 4434*67e74705SXin Li</pre></td></tr> 4435*67e74705SXin Li 4436*67e74705SXin Li 4437*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4438*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 4439*67e74705SXin Liswitch statement or conditional operator. 4440*67e74705SXin Li 4441*67e74705SXin LiExample matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4442*67e74705SXin Li if (true) {} 4443*67e74705SXin Li</pre></td></tr> 4444*67e74705SXin Li 4445*67e74705SXin Li 4446*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr> 4447*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 4448*67e74705SXin Limatches InnerMatcher if the qualifier exists. 4449*67e74705SXin Li 4450*67e74705SXin LiGiven 4451*67e74705SXin Li namespace N { 4452*67e74705SXin Li namespace M { 4453*67e74705SXin Li class D {}; 4454*67e74705SXin Li } 4455*67e74705SXin Li } 4456*67e74705SXin Li N::M::D d; 4457*67e74705SXin Li 4458*67e74705SXin LielaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 4459*67e74705SXin Limatches the type of the variable declaration of d. 4460*67e74705SXin Li</pre></td></tr> 4461*67e74705SXin Li 4462*67e74705SXin Li 4463*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4464*67e74705SXin Li<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 4465*67e74705SXin Li 4466*67e74705SXin LiGiven 4467*67e74705SXin Li namespace N { 4468*67e74705SXin Li namespace M { 4469*67e74705SXin Li class D {}; 4470*67e74705SXin Li } 4471*67e74705SXin Li } 4472*67e74705SXin Li N::M::D d; 4473*67e74705SXin Li 4474*67e74705SXin LielaboratedType(namesType(recordType( 4475*67e74705SXin LihasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 4476*67e74705SXin Lideclaration of d. 4477*67e74705SXin Li</pre></td></tr> 4478*67e74705SXin Li 4479*67e74705SXin Li 4480*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>></td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4481*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 4482*67e74705SXin Limatches the given matcher. 4483*67e74705SXin Li 4484*67e74705SXin LiThe associated declaration is: 4485*67e74705SXin Li- for type nodes, the declaration of the underlying type 4486*67e74705SXin Li- for CallExpr, the declaration of the callee 4487*67e74705SXin Li- for MemberExpr, the declaration of the referenced member 4488*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor 4489*67e74705SXin Li 4490*67e74705SXin LiAlso usable as Matcher<T> for any T supporting the getDecl() member 4491*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions. 4492*67e74705SXin Li 4493*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4494*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4495*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4496*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4497*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4498*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4499*67e74705SXin Li</pre></td></tr> 4500*67e74705SXin Li 4501*67e74705SXin Li 4502*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4503*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 4504*67e74705SXin Li 4505*67e74705SXin Li(Note: Clang's AST refers to other conversions as "casts" too, and calls 4506*67e74705SXin Liactual casts "explicit" casts.) 4507*67e74705SXin Li</pre></td></tr> 4508*67e74705SXin Li 4509*67e74705SXin Li 4510*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('hasType3')"><a name="hasType3Anchor">hasType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4511*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value 4512*67e74705SXin Lideclaration's type. 4513*67e74705SXin Li 4514*67e74705SXin LiIn case of a value declaration (for example a variable declaration), 4515*67e74705SXin Lithis resolves one layer of indirection. For example, in the value 4516*67e74705SXin Lideclaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 4517*67e74705SXin LiX, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 4518*67e74705SXin Lideclaration of x. 4519*67e74705SXin Li 4520*67e74705SXin LiExample matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 4521*67e74705SXin Li and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 4522*67e74705SXin Li class X {}; 4523*67e74705SXin Li void y(X &x) { x; X z; } 4524*67e74705SXin Li 4525*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> 4526*67e74705SXin Li</pre></td></tr> 4527*67e74705SXin Li 4528*67e74705SXin Li 4529*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4530*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 4531*67e74705SXin Limatcher. 4532*67e74705SXin Li 4533*67e74705SXin LiExample matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 4534*67e74705SXin Li and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 4535*67e74705SXin Li and U (matcher = typedefDecl(hasType(asString("int"))) 4536*67e74705SXin Li class X {}; 4537*67e74705SXin Li void y(X &x) { x; X z; } 4538*67e74705SXin Li typedef int U; 4539*67e74705SXin Li</pre></td></tr> 4540*67e74705SXin Li 4541*67e74705SXin Li 4542*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4543*67e74705SXin Li<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 4544*67e74705SXin Liare stripped off. 4545*67e74705SXin Li 4546*67e74705SXin LiParentheses and explicit casts are not discarded. 4547*67e74705SXin LiGiven 4548*67e74705SXin Li int arr[5]; 4549*67e74705SXin Li int a = 0; 4550*67e74705SXin Li char b = 0; 4551*67e74705SXin Li const int c = a; 4552*67e74705SXin Li int *d = arr; 4553*67e74705SXin Li long e = (long) 0l; 4554*67e74705SXin LiThe matchers 4555*67e74705SXin Li varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 4556*67e74705SXin Li varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 4557*67e74705SXin Liwould match the declarations for a, b, c, and d, but not e. 4558*67e74705SXin LiWhile 4559*67e74705SXin Li varDecl(hasInitializer(integerLiteral())) 4560*67e74705SXin Li varDecl(hasInitializer(declRefExpr())) 4561*67e74705SXin Lionly match the declarations for b, c, and d. 4562*67e74705SXin Li</pre></td></tr> 4563*67e74705SXin Li 4564*67e74705SXin Li 4565*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringImplicit0')"><a name="ignoringImplicit0Anchor">ignoringImplicit</a></td><td>ast_matchers::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4566*67e74705SXin Li<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 4567*67e74705SXin Linodes are stripped off. 4568*67e74705SXin Li 4569*67e74705SXin LiParentheses and explicit casts are not discarded. 4570*67e74705SXin LiGiven 4571*67e74705SXin Li class C {}; 4572*67e74705SXin Li C a = C(); 4573*67e74705SXin Li C b; 4574*67e74705SXin Li C c = b; 4575*67e74705SXin LiThe matchers 4576*67e74705SXin Li varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 4577*67e74705SXin Liwould match the declarations for a, b, and c. 4578*67e74705SXin LiWhile 4579*67e74705SXin Li varDecl(hasInitializer(cxxConstructExpr())) 4580*67e74705SXin Lionly match the declarations for b and c. 4581*67e74705SXin Li</pre></td></tr> 4582*67e74705SXin Li 4583*67e74705SXin Li 4584*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4585*67e74705SXin Li<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 4586*67e74705SXin Licasts are stripped off. 4587*67e74705SXin Li 4588*67e74705SXin LiImplicit and non-C Style casts are also discarded. 4589*67e74705SXin LiGiven 4590*67e74705SXin Li int a = 0; 4591*67e74705SXin Li char b = (0); 4592*67e74705SXin Li void* c = reinterpret_cast<char*>(0); 4593*67e74705SXin Li char d = char(0); 4594*67e74705SXin LiThe matcher 4595*67e74705SXin Li varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 4596*67e74705SXin Liwould match the declarations for a, b, c, and d. 4597*67e74705SXin Liwhile 4598*67e74705SXin Li varDecl(hasInitializer(integerLiteral())) 4599*67e74705SXin Lionly match the declaration for a. 4600*67e74705SXin Li</pre></td></tr> 4601*67e74705SXin Li 4602*67e74705SXin Li 4603*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4604*67e74705SXin Li<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 4605*67e74705SXin Liparentheses are stripped off. 4606*67e74705SXin Li 4607*67e74705SXin LiExplicit casts are not discarded. 4608*67e74705SXin LiGiven 4609*67e74705SXin Li int arr[5]; 4610*67e74705SXin Li int a = 0; 4611*67e74705SXin Li char b = (0); 4612*67e74705SXin Li const int c = a; 4613*67e74705SXin Li int *d = (arr); 4614*67e74705SXin Li long e = ((long) 0l); 4615*67e74705SXin LiThe matchers 4616*67e74705SXin Li varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 4617*67e74705SXin Li varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 4618*67e74705SXin Liwould match the declarations for a, b, c, and d, but not e. 4619*67e74705SXin Liwhile 4620*67e74705SXin Li varDecl(hasInitializer(integerLiteral())) 4621*67e74705SXin Li varDecl(hasInitializer(declRefExpr())) 4622*67e74705SXin Liwould only match the declaration for a. 4623*67e74705SXin Li</pre></td></tr> 4624*67e74705SXin Li 4625*67e74705SXin Li 4626*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4627*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function 4628*67e74705SXin Lidefinition that has a given body. 4629*67e74705SXin Li 4630*67e74705SXin LiGiven 4631*67e74705SXin Li for (;;) {} 4632*67e74705SXin LihasBody(compoundStmt()) 4633*67e74705SXin Li matches 'for (;;) {}' 4634*67e74705SXin Liwith compoundStmt() 4635*67e74705SXin Li matching '{}' 4636*67e74705SXin Li</pre></td></tr> 4637*67e74705SXin Li 4638*67e74705SXin Li 4639*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4640*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 4641*67e74705SXin Liswitch statement or conditional operator. 4642*67e74705SXin Li 4643*67e74705SXin LiExample matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4644*67e74705SXin Li if (true) {} 4645*67e74705SXin Li</pre></td></tr> 4646*67e74705SXin Li 4647*67e74705SXin Li 4648*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4649*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 4650*67e74705SXin Li 4651*67e74705SXin LiExample: 4652*67e74705SXin Li forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 4653*67e74705SXin Limatches '++x' in 4654*67e74705SXin Li for (x; x < N; ++x) { } 4655*67e74705SXin Li</pre></td></tr> 4656*67e74705SXin Li 4657*67e74705SXin Li 4658*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4659*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 4660*67e74705SXin Li 4661*67e74705SXin LiExample: 4662*67e74705SXin Li forStmt(hasLoopInit(declStmt())) 4663*67e74705SXin Limatches 'int x = 0' in 4664*67e74705SXin Li for (int x = 0; x < N; ++x) { } 4665*67e74705SXin Li</pre></td></tr> 4666*67e74705SXin Li 4667*67e74705SXin Li 4668*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 4669*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration. 4670*67e74705SXin Li 4671*67e74705SXin LiDoes not match the 'this' parameter of a method. 4672*67e74705SXin Li 4673*67e74705SXin LiGiven 4674*67e74705SXin Li class X { void f(int x, int y, int z) {} }; 4675*67e74705SXin LicxxMethodDecl(hasAnyParameter(hasName("y"))) 4676*67e74705SXin Li matches f(int x, int y, int z) {} 4677*67e74705SXin Liwith hasAnyParameter(...) 4678*67e74705SXin Li matching int y 4679*67e74705SXin Li</pre></td></tr> 4680*67e74705SXin Li 4681*67e74705SXin Li 4682*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4683*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function 4684*67e74705SXin Lidefinition that has a given body. 4685*67e74705SXin Li 4686*67e74705SXin LiGiven 4687*67e74705SXin Li for (;;) {} 4688*67e74705SXin LihasBody(compoundStmt()) 4689*67e74705SXin Li matches 'for (;;) {}' 4690*67e74705SXin Liwith compoundStmt() 4691*67e74705SXin Li matching '{}' 4692*67e74705SXin Li</pre></td></tr> 4693*67e74705SXin Li 4694*67e74705SXin Li 4695*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 4696*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration. 4697*67e74705SXin Li 4698*67e74705SXin LiGiven 4699*67e74705SXin Li class X { void f(int x) {} }; 4700*67e74705SXin LicxxMethodDecl(hasParameter(0, hasType(varDecl()))) 4701*67e74705SXin Li matches f(int x) {} 4702*67e74705SXin Liwith hasParameter(...) 4703*67e74705SXin Li matching int x 4704*67e74705SXin Li</pre></td></tr> 4705*67e74705SXin Li 4706*67e74705SXin Li 4707*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4708*67e74705SXin Li<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 4709*67e74705SXin Li 4710*67e74705SXin LiGiven: 4711*67e74705SXin Li class X { int f() { return 1; } }; 4712*67e74705SXin LicxxMethodDecl(returns(asString("int"))) 4713*67e74705SXin Li matches int f() { return 1; } 4714*67e74705SXin Li</pre></td></tr> 4715*67e74705SXin Li 4716*67e74705SXin Li 4717*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4718*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 4719*67e74705SXin Liswitch statement or conditional operator. 4720*67e74705SXin Li 4721*67e74705SXin LiExample matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 4722*67e74705SXin Li if (true) {} 4723*67e74705SXin Li</pre></td></tr> 4724*67e74705SXin Li 4725*67e74705SXin Li 4726*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>> InnerMatcher</td></tr> 4727*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 4728*67e74705SXin Li 4729*67e74705SXin LiGiven 4730*67e74705SXin Li if (A* a = GetAPointer()) {} 4731*67e74705SXin LihasConditionVariableStatement(...) 4732*67e74705SXin Li matches 'A* a = GetAPointer()'. 4733*67e74705SXin Li</pre></td></tr> 4734*67e74705SXin Li 4735*67e74705SXin Li 4736*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4737*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 4738*67e74705SXin Li 4739*67e74705SXin LiExamples matches the if statement 4740*67e74705SXin Li (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 4741*67e74705SXin Li if (false) false; else true; 4742*67e74705SXin Li</pre></td></tr> 4743*67e74705SXin Li 4744*67e74705SXin Li 4745*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 4746*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 4747*67e74705SXin Li 4748*67e74705SXin LiExamples matches the if statement 4749*67e74705SXin Li (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 4750*67e74705SXin Li if (false) true; else false; 4751*67e74705SXin Li</pre></td></tr> 4752*67e74705SXin Li 4753*67e74705SXin Li 4754*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4755*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 4756*67e74705SXin Limatcher. 4757*67e74705SXin Li 4758*67e74705SXin LiFIXME: Unit test this matcher 4759*67e74705SXin Li</pre></td></tr> 4760*67e74705SXin Li 4761*67e74705SXin Li 4762*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4763*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 4764*67e74705SXin Li(if expression have it). 4765*67e74705SXin Li</pre></td></tr> 4766*67e74705SXin Li 4767*67e74705SXin Li 4768*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>></td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4769*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 4770*67e74705SXin Limatches the given matcher. 4771*67e74705SXin Li 4772*67e74705SXin LiThe associated declaration is: 4773*67e74705SXin Li- for type nodes, the declaration of the underlying type 4774*67e74705SXin Li- for CallExpr, the declaration of the callee 4775*67e74705SXin Li- for MemberExpr, the declaration of the referenced member 4776*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor 4777*67e74705SXin Li 4778*67e74705SXin LiAlso usable as Matcher<T> for any T supporting the getDecl() member 4779*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions. 4780*67e74705SXin Li 4781*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4782*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4783*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4784*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4785*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4786*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4787*67e74705SXin Li</pre></td></tr> 4788*67e74705SXin Li 4789*67e74705SXin Li 4790*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>></td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4791*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 4792*67e74705SXin Limatches the given matcher. 4793*67e74705SXin Li 4794*67e74705SXin LiThe associated declaration is: 4795*67e74705SXin Li- for type nodes, the declaration of the underlying type 4796*67e74705SXin Li- for CallExpr, the declaration of the callee 4797*67e74705SXin Li- for MemberExpr, the declaration of the referenced member 4798*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor 4799*67e74705SXin Li 4800*67e74705SXin LiAlso usable as Matcher<T> for any T supporting the getDecl() member 4801*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions. 4802*67e74705SXin Li 4803*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4804*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4805*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4806*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4807*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4808*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4809*67e74705SXin Li</pre></td></tr> 4810*67e74705SXin Li 4811*67e74705SXin Li 4812*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 4813*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 4814*67e74705SXin Limatches the given matcher. 4815*67e74705SXin Li 4816*67e74705SXin LiThe associated declaration is: 4817*67e74705SXin Li- for type nodes, the declaration of the underlying type 4818*67e74705SXin Li- for CallExpr, the declaration of the callee 4819*67e74705SXin Li- for MemberExpr, the declaration of the referenced member 4820*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor 4821*67e74705SXin Li 4822*67e74705SXin LiAlso usable as Matcher<T> for any T supporting the getDecl() member 4823*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions. 4824*67e74705SXin Li 4825*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 4826*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 4827*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 4828*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 4829*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 4830*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 4831*67e74705SXin Li</pre></td></tr> 4832*67e74705SXin Li 4833*67e74705SXin Li 4834*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4835*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is 4836*67e74705SXin Limatched by a given matcher. 4837*67e74705SXin Li 4838*67e74705SXin LiGiven 4839*67e74705SXin Li struct X { int m; }; 4840*67e74705SXin Li void f(X x) { x.m; m; } 4841*67e74705SXin LimemberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))))) 4842*67e74705SXin Li matches "x.m" and "m" 4843*67e74705SXin Liwith hasObjectExpression(...) 4844*67e74705SXin Li matching "x" and the implicit object expression of "m" which has type X*. 4845*67e74705SXin Li</pre></td></tr> 4846*67e74705SXin Li 4847*67e74705SXin Li 4848*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> InnerMatcher</td></tr> 4849*67e74705SXin Li<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 4850*67e74705SXin Ligiven matcher. 4851*67e74705SXin Li 4852*67e74705SXin LiGiven 4853*67e74705SXin Li struct { int first, second; } first, second; 4854*67e74705SXin Li int i(second.first); 4855*67e74705SXin Li int j(first.second); 4856*67e74705SXin LimemberExpr(member(hasName("first"))) 4857*67e74705SXin Li matches second.first 4858*67e74705SXin Li but not first.second (because the member name there is "second"). 4859*67e74705SXin Li</pre></td></tr> 4860*67e74705SXin Li 4861*67e74705SXin Li 4862*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerTypeLoc.html">MemberPointerTypeLoc</a>></td><td class="name" onclick="toggle('pointeeLoc1')"><a name="pointeeLoc1Anchor">pointeeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 4863*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the 4864*67e74705SXin Lipointee matches a given matcher. 4865*67e74705SXin Li 4866*67e74705SXin LiGiven 4867*67e74705SXin Li int *a; 4868*67e74705SXin Li int const *b; 4869*67e74705SXin Li float const *f; 4870*67e74705SXin LipointerType(pointee(isConstQualified(), isInteger())) 4871*67e74705SXin Li matches "int const *b" 4872*67e74705SXin Li 4873*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 4874*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 4875*67e74705SXin Li</pre></td></tr> 4876*67e74705SXin Li 4877*67e74705SXin Li 4878*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 4879*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 4880*67e74705SXin Lipointee matches a given matcher. 4881*67e74705SXin Li 4882*67e74705SXin LiGiven 4883*67e74705SXin Li int *a; 4884*67e74705SXin Li int const *b; 4885*67e74705SXin Li float const *f; 4886*67e74705SXin LipointerType(pointee(isConstQualified(), isInteger())) 4887*67e74705SXin Li matches "int const *b" 4888*67e74705SXin Li 4889*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 4890*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 4891*67e74705SXin Li</pre></td></tr> 4892*67e74705SXin Li 4893*67e74705SXin Li 4894*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>> InnerMatcher</td></tr> 4895*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 4896*67e74705SXin Li 4897*67e74705SXin LiGiven 4898*67e74705SXin Li struct A { struct B { struct C {}; }; }; 4899*67e74705SXin Li A::B::C c; 4900*67e74705SXin LinestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 4901*67e74705SXin Li matches "A::" 4902*67e74705SXin Li</pre></td></tr> 4903*67e74705SXin Li 4904*67e74705SXin Li 4905*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> InnerMatcher</td></tr> 4906*67e74705SXin Li<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 4907*67e74705SXin Ligiven TypeLoc. 4908*67e74705SXin Li 4909*67e74705SXin LiGiven 4910*67e74705SXin Li struct A { struct B { struct C {}; }; }; 4911*67e74705SXin Li A::B::C c; 4912*67e74705SXin LinestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 4913*67e74705SXin Li hasDeclaration(cxxRecordDecl(hasName("A"))))))) 4914*67e74705SXin Li matches "A::" 4915*67e74705SXin Li</pre></td></tr> 4916*67e74705SXin Li 4917*67e74705SXin Li 4918*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr> 4919*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 4920*67e74705SXin Li 4921*67e74705SXin LiGiven 4922*67e74705SXin Li struct A { struct B { struct C {}; }; }; 4923*67e74705SXin Li A::B::C c; 4924*67e74705SXin LinestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 4925*67e74705SXin Li matches "A::" 4926*67e74705SXin Li</pre></td></tr> 4927*67e74705SXin Li 4928*67e74705SXin Li 4929*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>> InnerMatcher</td></tr> 4930*67e74705SXin Li<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 4931*67e74705SXin Ligiven namespace matcher. 4932*67e74705SXin Li 4933*67e74705SXin LiGiven 4934*67e74705SXin Li namespace ns { struct A {}; } 4935*67e74705SXin Li ns::A a; 4936*67e74705SXin LinestedNameSpecifier(specifiesNamespace(hasName("ns"))) 4937*67e74705SXin Li matches "ns::" 4938*67e74705SXin Li</pre></td></tr> 4939*67e74705SXin Li 4940*67e74705SXin Li 4941*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4942*67e74705SXin Li<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 4943*67e74705SXin Ligiven QualType matcher without qualifiers. 4944*67e74705SXin Li 4945*67e74705SXin LiGiven 4946*67e74705SXin Li struct A { struct B { struct C {}; }; }; 4947*67e74705SXin Li A::B::C c; 4948*67e74705SXin LinestedNameSpecifier(specifiesType( 4949*67e74705SXin Li hasDeclaration(cxxRecordDecl(hasName("A"))) 4950*67e74705SXin Li)) 4951*67e74705SXin Li matches "A::" 4952*67e74705SXin Li</pre></td></tr> 4953*67e74705SXin Li 4954*67e74705SXin Li 4955*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasArgument2')"><a name="hasArgument2Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4956*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 4957*67e74705SXin Licall expression. 4958*67e74705SXin Li 4959*67e74705SXin LiExample matches y in x(y) 4960*67e74705SXin Li (matcher = callExpr(hasArgument(0, declRefExpr()))) 4961*67e74705SXin Li void x(int) { int y; x(y); } 4962*67e74705SXin Li</pre></td></tr> 4963*67e74705SXin Li 4964*67e74705SXin Li 4965*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 4966*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 4967*67e74705SXin Li 4968*67e74705SXin LiExample 4969*67e74705SXin Limatcher = objCMessageExpr(hasRecieverType(asString("UIWebView *"))); 4970*67e74705SXin Limatches the [webView ...] message invocation. 4971*67e74705SXin Li NSString *webViewJavaScript = ... 4972*67e74705SXin Li UIWebView *webView = ... 4973*67e74705SXin Li [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 4974*67e74705SXin Li</pre></td></tr> 4975*67e74705SXin Li 4976*67e74705SXin Li 4977*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 4978*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre></pre></td></tr> 4979*67e74705SXin Li 4980*67e74705SXin Li 4981*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 4982*67e74705SXin Li<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 4983*67e74705SXin Li 4984*67e74705SXin LiGiven 4985*67e74705SXin Li int (*ptr_to_array)[4]; 4986*67e74705SXin Li int (*ptr_to_func)(int); 4987*67e74705SXin Li 4988*67e74705SXin LivarDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 4989*67e74705SXin Liptr_to_func but not ptr_to_array. 4990*67e74705SXin Li 4991*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 4992*67e74705SXin Li</pre></td></tr> 4993*67e74705SXin Li 4994*67e74705SXin Li 4995*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>></td><td class="name" onclick="toggle('pointeeLoc2')"><a name="pointeeLoc2Anchor">pointeeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 4996*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the 4997*67e74705SXin Lipointee matches a given matcher. 4998*67e74705SXin Li 4999*67e74705SXin LiGiven 5000*67e74705SXin Li int *a; 5001*67e74705SXin Li int const *b; 5002*67e74705SXin Li float const *f; 5003*67e74705SXin LipointerType(pointee(isConstQualified(), isInteger())) 5004*67e74705SXin Li matches "int const *b" 5005*67e74705SXin Li 5006*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 5007*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 5008*67e74705SXin Li</pre></td></tr> 5009*67e74705SXin Li 5010*67e74705SXin Li 5011*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 5012*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 5013*67e74705SXin Lipointee matches a given matcher. 5014*67e74705SXin Li 5015*67e74705SXin LiGiven 5016*67e74705SXin Li int *a; 5017*67e74705SXin Li int const *b; 5018*67e74705SXin Li float const *f; 5019*67e74705SXin LipointerType(pointee(isConstQualified(), isInteger())) 5020*67e74705SXin Li matches "int const *b" 5021*67e74705SXin Li 5022*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 5023*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 5024*67e74705SXin Li</pre></td></tr> 5025*67e74705SXin Li 5026*67e74705SXin Li 5027*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5028*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 5029*67e74705SXin Li 5030*67e74705SXin LiGiven: 5031*67e74705SXin Li typedef int &int_ref; 5032*67e74705SXin Li int a; 5033*67e74705SXin Li int_ref b = a; 5034*67e74705SXin Li 5035*67e74705SXin LivarDecl(hasType(qualType(referenceType()))))) will not match the 5036*67e74705SXin Lideclaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 5037*67e74705SXin Li</pre></td></tr> 5038*67e74705SXin Li 5039*67e74705SXin Li 5040*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5041*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 5042*67e74705SXin Limatches the given matcher. 5043*67e74705SXin Li 5044*67e74705SXin LiThe associated declaration is: 5045*67e74705SXin Li- for type nodes, the declaration of the underlying type 5046*67e74705SXin Li- for CallExpr, the declaration of the callee 5047*67e74705SXin Li- for MemberExpr, the declaration of the referenced member 5048*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor 5049*67e74705SXin Li 5050*67e74705SXin LiAlso usable as Matcher<T> for any T supporting the getDecl() member 5051*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions. 5052*67e74705SXin Li 5053*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 5054*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5055*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5056*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5057*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5058*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5059*67e74705SXin Li</pre></td></tr> 5060*67e74705SXin Li 5061*67e74705SXin Li 5062*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5063*67e74705SXin Li<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 5064*67e74705SXin Li 5065*67e74705SXin LiGiven 5066*67e74705SXin Li void (*fp)(void); 5067*67e74705SXin LiThe matcher 5068*67e74705SXin Li varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 5069*67e74705SXin Liwould match the declaration for fp. 5070*67e74705SXin Li</pre></td></tr> 5071*67e74705SXin Li 5072*67e74705SXin Li 5073*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5074*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 5075*67e74705SXin Li</pre></td></tr> 5076*67e74705SXin Li 5077*67e74705SXin Li 5078*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5079*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 5080*67e74705SXin Limatches the specified matcher. 5081*67e74705SXin Li 5082*67e74705SXin LiExample matches y->x() 5083*67e74705SXin Li (matcher = cxxMemberCallExpr(on(hasType(pointsTo 5084*67e74705SXin Li cxxRecordDecl(hasName("Y"))))))) 5085*67e74705SXin Li class Y { public: void x(); }; 5086*67e74705SXin Li void z() { Y *y; y->x(); } 5087*67e74705SXin Li</pre></td></tr> 5088*67e74705SXin Li 5089*67e74705SXin Li 5090*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5091*67e74705SXin Li<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 5092*67e74705SXin Li</pre></td></tr> 5093*67e74705SXin Li 5094*67e74705SXin Li 5095*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5096*67e74705SXin Li<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 5097*67e74705SXin Litype matches the specified matcher. 5098*67e74705SXin Li 5099*67e74705SXin LiExample matches X &x and const X &y 5100*67e74705SXin Li (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 5101*67e74705SXin Li class X { 5102*67e74705SXin Li void a(X b) { 5103*67e74705SXin Li X &x = b; 5104*67e74705SXin Li const X &y = b; 5105*67e74705SXin Li } 5106*67e74705SXin Li }; 5107*67e74705SXin Li</pre></td></tr> 5108*67e74705SXin Li 5109*67e74705SXin Li 5110*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5111*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 5112*67e74705SXin Limatches the given matcher. 5113*67e74705SXin Li 5114*67e74705SXin LiThe associated declaration is: 5115*67e74705SXin Li- for type nodes, the declaration of the underlying type 5116*67e74705SXin Li- for CallExpr, the declaration of the callee 5117*67e74705SXin Li- for MemberExpr, the declaration of the referenced member 5118*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor 5119*67e74705SXin Li 5120*67e74705SXin LiAlso usable as Matcher<T> for any T supporting the getDecl() member 5121*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions. 5122*67e74705SXin Li 5123*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 5124*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5125*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5126*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5127*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5128*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5129*67e74705SXin Li</pre></td></tr> 5130*67e74705SXin Li 5131*67e74705SXin Li 5132*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>></td><td class="name" onclick="toggle('pointeeLoc3')"><a name="pointeeLoc3Anchor">pointeeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr> 5133*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the 5134*67e74705SXin Lipointee matches a given matcher. 5135*67e74705SXin Li 5136*67e74705SXin LiGiven 5137*67e74705SXin Li int *a; 5138*67e74705SXin Li int const *b; 5139*67e74705SXin Li float const *f; 5140*67e74705SXin LipointerType(pointee(isConstQualified(), isInteger())) 5141*67e74705SXin Li matches "int const *b" 5142*67e74705SXin Li 5143*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 5144*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 5145*67e74705SXin Li</pre></td></tr> 5146*67e74705SXin Li 5147*67e74705SXin Li 5148*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 5149*67e74705SXin Li<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 5150*67e74705SXin Lipointee matches a given matcher. 5151*67e74705SXin Li 5152*67e74705SXin LiGiven 5153*67e74705SXin Li int *a; 5154*67e74705SXin Li int const *b; 5155*67e74705SXin Li float const *f; 5156*67e74705SXin LipointerType(pointee(isConstQualified(), isInteger())) 5157*67e74705SXin Li matches "int const *b" 5158*67e74705SXin Li 5159*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 5160*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 5161*67e74705SXin Li</pre></td></tr> 5162*67e74705SXin Li 5163*67e74705SXin Li 5164*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5165*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 5166*67e74705SXin Li 5167*67e74705SXin LiGiven 5168*67e74705SXin Li return a + b; 5169*67e74705SXin LihasReturnValue(binaryOperator()) 5170*67e74705SXin Li matches 'return a + b' 5171*67e74705SXin Liwith binaryOperator() 5172*67e74705SXin Li matching 'a + b' 5173*67e74705SXin Li</pre></td></tr> 5174*67e74705SXin Li 5175*67e74705SXin Li 5176*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 5177*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 5178*67e74705SXin Lia given matcher. Also matches StmtExprs that have CompoundStmt as children. 5179*67e74705SXin Li 5180*67e74705SXin LiGiven 5181*67e74705SXin Li { {}; 1+2; } 5182*67e74705SXin LihasAnySubstatement(compoundStmt()) 5183*67e74705SXin Li matches '{ {}; 1+2; }' 5184*67e74705SXin Liwith compoundStmt() 5185*67e74705SXin Li matching '{}' 5186*67e74705SXin Li</pre></td></tr> 5187*67e74705SXin Li 5188*67e74705SXin Li 5189*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr> 5190*67e74705SXin Li<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 5191*67e74705SXin Lialignof. 5192*67e74705SXin Li</pre></td></tr> 5193*67e74705SXin Li 5194*67e74705SXin Li 5195*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> InnerMatcher</td></tr> 5196*67e74705SXin Li<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statemenet belongs to 5197*67e74705SXin Li 5198*67e74705SXin LiGiven: 5199*67e74705SXin LiF& operator=(const F& o) { 5200*67e74705SXin Li std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 5201*67e74705SXin Li return *this; 5202*67e74705SXin Li} 5203*67e74705SXin LireturnStmt(forFunction(hasName("operator="))) 5204*67e74705SXin Li matches 'return *this' 5205*67e74705SXin Li but does match 'return > 0' 5206*67e74705SXin Li</pre></td></tr> 5207*67e74705SXin Li 5208*67e74705SXin Li 5209*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr> 5210*67e74705SXin Li<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 5211*67e74705SXin Lisizeof. 5212*67e74705SXin Li</pre></td></tr> 5213*67e74705SXin Li 5214*67e74705SXin Li 5215*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>> InnerMatcher</td></tr> 5216*67e74705SXin Li<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 5217*67e74705SXin Listatement. This matcher may produce multiple matches. 5218*67e74705SXin Li 5219*67e74705SXin LiGiven 5220*67e74705SXin Li switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 5221*67e74705SXin LiswitchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 5222*67e74705SXin Li matches four times, with "c" binding each of "case 1:", "case 2:", 5223*67e74705SXin Li"case 3:" and "case 4:", and "s" respectively binding "switch (1)", 5224*67e74705SXin Li"switch (1)", "switch (2)" and "switch (2)". 5225*67e74705SXin Li</pre></td></tr> 5226*67e74705SXin Li 5227*67e74705SXin Li 5228*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5229*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 5230*67e74705SXin Liswitch statement or conditional operator. 5231*67e74705SXin Li 5232*67e74705SXin LiExample matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5233*67e74705SXin Li if (true) {} 5234*67e74705SXin Li</pre></td></tr> 5235*67e74705SXin Li 5236*67e74705SXin Li 5237*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5238*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 5239*67e74705SXin Limatches the given matcher. 5240*67e74705SXin Li 5241*67e74705SXin LiThe associated declaration is: 5242*67e74705SXin Li- for type nodes, the declaration of the underlying type 5243*67e74705SXin Li- for CallExpr, the declaration of the callee 5244*67e74705SXin Li- for MemberExpr, the declaration of the referenced member 5245*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor 5246*67e74705SXin Li 5247*67e74705SXin LiAlso usable as Matcher<T> for any T supporting the getDecl() member 5248*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions. 5249*67e74705SXin Li 5250*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 5251*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5252*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5253*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5254*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5255*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5256*67e74705SXin Li</pre></td></tr> 5257*67e74705SXin Li 5258*67e74705SXin Li 5259*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5260*67e74705SXin Li<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 5261*67e74705SXin Li 5262*67e74705SXin LiGiven 5263*67e74705SXin Li template<typename T> struct A {}; 5264*67e74705SXin Li struct B { B* next; }; 5265*67e74705SXin Li A<&B::next> a; 5266*67e74705SXin LitemplateSpecializationType(hasAnyTemplateArgument( 5267*67e74705SXin Li isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 5268*67e74705SXin Li matches the specialization A<&B::next> with fieldDecl(...) matching 5269*67e74705SXin Li B::next 5270*67e74705SXin Li</pre></td></tr> 5271*67e74705SXin Li 5272*67e74705SXin Li 5273*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5274*67e74705SXin Li<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 5275*67e74705SXin Lideclaration. 5276*67e74705SXin Li 5277*67e74705SXin LiGiven 5278*67e74705SXin Li template<typename T> struct A {}; 5279*67e74705SXin Li struct B { B* next; }; 5280*67e74705SXin Li A<&B::next> a; 5281*67e74705SXin LiclassTemplateSpecializationDecl(hasAnyTemplateArgument( 5282*67e74705SXin Li refersToDeclaration(fieldDecl(hasName("next")))) 5283*67e74705SXin Li matches the specialization A<&B::next> with fieldDecl(...) matching 5284*67e74705SXin Li B::next 5285*67e74705SXin Li</pre></td></tr> 5286*67e74705SXin Li 5287*67e74705SXin Li 5288*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5289*67e74705SXin Li<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type. 5290*67e74705SXin Li 5291*67e74705SXin LiGiven 5292*67e74705SXin Li template<int T> struct A {}; 5293*67e74705SXin Li C<42> c; 5294*67e74705SXin LiclassTemplateSpecializationDecl( 5295*67e74705SXin Li hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 5296*67e74705SXin Li matches the implicit instantiation of C in C<42>. 5297*67e74705SXin Li</pre></td></tr> 5298*67e74705SXin Li 5299*67e74705SXin Li 5300*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5301*67e74705SXin Li<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 5302*67e74705SXin Li 5303*67e74705SXin LiGiven 5304*67e74705SXin Li struct X {}; 5305*67e74705SXin Li template<typename T> struct A {}; 5306*67e74705SXin Li A<X> a; 5307*67e74705SXin LiclassTemplateSpecializationDecl(hasAnyTemplateArgument( 5308*67e74705SXin Li refersToType(class(hasName("X"))))) 5309*67e74705SXin Li matches the specialization A<X> 5310*67e74705SXin Li</pre></td></tr> 5311*67e74705SXin Li 5312*67e74705SXin Li 5313*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 5314*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations that have at least one 5315*67e74705SXin LiTemplateArgument matching the given InnerMatcher. 5316*67e74705SXin Li 5317*67e74705SXin LiGiven 5318*67e74705SXin Li template<typename T> class A {}; 5319*67e74705SXin Li template<> class A<double> {}; 5320*67e74705SXin Li A<int> a; 5321*67e74705SXin LiclassTemplateSpecializationDecl(hasAnyTemplateArgument( 5322*67e74705SXin Li refersToType(asString("int")))) 5323*67e74705SXin Li matches the specialization A<int> 5324*67e74705SXin Li</pre></td></tr> 5325*67e74705SXin Li 5326*67e74705SXin Li 5327*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5328*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 5329*67e74705SXin Limatches the given matcher. 5330*67e74705SXin Li 5331*67e74705SXin LiThe associated declaration is: 5332*67e74705SXin Li- for type nodes, the declaration of the underlying type 5333*67e74705SXin Li- for CallExpr, the declaration of the callee 5334*67e74705SXin Li- for MemberExpr, the declaration of the referenced member 5335*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor 5336*67e74705SXin Li 5337*67e74705SXin LiAlso usable as Matcher<T> for any T supporting the getDecl() member 5338*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions. 5339*67e74705SXin Li 5340*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 5341*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5342*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5343*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5344*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5345*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5346*67e74705SXin Li</pre></td></tr> 5347*67e74705SXin Li 5348*67e74705SXin Li 5349*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 5350*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument 5351*67e74705SXin Limatches the given InnerMatcher. 5352*67e74705SXin Li 5353*67e74705SXin LiGiven 5354*67e74705SXin Li template<typename T, typename U> class A {}; 5355*67e74705SXin Li A<bool, int> b; 5356*67e74705SXin Li A<int, bool> c; 5357*67e74705SXin LiclassTemplateSpecializationDecl(hasTemplateArgument( 5358*67e74705SXin Li 1, refersToType(asString("int")))) 5359*67e74705SXin Li matches the specialization A<bool, int> 5360*67e74705SXin Li</pre></td></tr> 5361*67e74705SXin Li 5362*67e74705SXin Li 5363*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5364*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 5365*67e74705SXin Limatches the given matcher. 5366*67e74705SXin Li 5367*67e74705SXin LiThe associated declaration is: 5368*67e74705SXin Li- for type nodes, the declaration of the underlying type 5369*67e74705SXin Li- for CallExpr, the declaration of the callee 5370*67e74705SXin Li- for MemberExpr, the declaration of the referenced member 5371*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor 5372*67e74705SXin Li 5373*67e74705SXin LiAlso usable as Matcher<T> for any T supporting the getDecl() member 5374*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions. 5375*67e74705SXin Li 5376*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 5377*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5378*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5379*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5380*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5381*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5382*67e74705SXin Li</pre></td></tr> 5383*67e74705SXin Li 5384*67e74705SXin Li 5385*67e74705SXin Li<tr><td>Matcher<T></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<T> Matcher</td></tr> 5386*67e74705SXin Li<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 5387*67e74705SXin Li 5388*67e74705SXin LiGenerates results for each match. 5389*67e74705SXin Li 5390*67e74705SXin LiFor example, in: 5391*67e74705SXin Li class A { class B {}; class C {}; }; 5392*67e74705SXin LiThe matcher: 5393*67e74705SXin Li cxxRecordDecl(hasName("::A"), 5394*67e74705SXin Li findAll(cxxRecordDecl(isDefinition()).bind("m"))) 5395*67e74705SXin Liwill generate results for A, B and C. 5396*67e74705SXin Li 5397*67e74705SXin LiUsable as: Any Matcher 5398*67e74705SXin Li</pre></td></tr> 5399*67e74705SXin Li 5400*67e74705SXin Li 5401*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>></td><td class="name" onclick="toggle('hasType1')"><a name="hasType1Anchor">hasType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5402*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 5403*67e74705SXin Limatcher. 5404*67e74705SXin Li 5405*67e74705SXin LiExample matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5406*67e74705SXin Li and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5407*67e74705SXin Li and U (matcher = typedefDecl(hasType(asString("int"))) 5408*67e74705SXin Li class X {}; 5409*67e74705SXin Li void y(X &x) { x; X z; } 5410*67e74705SXin Li typedef int U; 5411*67e74705SXin Li</pre></td></tr> 5412*67e74705SXin Li 5413*67e74705SXin Li 5414*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5415*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 5416*67e74705SXin Limatches the given matcher. 5417*67e74705SXin Li 5418*67e74705SXin LiThe associated declaration is: 5419*67e74705SXin Li- for type nodes, the declaration of the underlying type 5420*67e74705SXin Li- for CallExpr, the declaration of the callee 5421*67e74705SXin Li- for MemberExpr, the declaration of the referenced member 5422*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor 5423*67e74705SXin Li 5424*67e74705SXin LiAlso usable as Matcher<T> for any T supporting the getDecl() member 5425*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions. 5426*67e74705SXin Li 5427*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 5428*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5429*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5430*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5431*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5432*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5433*67e74705SXin Li</pre></td></tr> 5434*67e74705SXin Li 5435*67e74705SXin Li 5436*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5437*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 5438*67e74705SXin Li 5439*67e74705SXin LiGiven 5440*67e74705SXin Li int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 5441*67e74705SXin LiunaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 5442*67e74705SXin Li matches sizeof(a) and alignof(c) 5443*67e74705SXin Li</pre></td></tr> 5444*67e74705SXin Li 5445*67e74705SXin Li 5446*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5447*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 5448*67e74705SXin Li 5449*67e74705SXin LiExample matches true (matcher = hasUnaryOperand( 5450*67e74705SXin Li cxxBoolLiteral(equals(true)))) 5451*67e74705SXin Li !true 5452*67e74705SXin Li</pre></td></tr> 5453*67e74705SXin Li 5454*67e74705SXin Li 5455*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5456*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 5457*67e74705SXin Limatches the given matcher. 5458*67e74705SXin Li 5459*67e74705SXin LiThe associated declaration is: 5460*67e74705SXin Li- for type nodes, the declaration of the underlying type 5461*67e74705SXin Li- for CallExpr, the declaration of the callee 5462*67e74705SXin Li- for MemberExpr, the declaration of the referenced member 5463*67e74705SXin Li- for CXXConstructExpr, the declaration of the constructor 5464*67e74705SXin Li 5465*67e74705SXin LiAlso usable as Matcher<T> for any T supporting the getDecl() member 5466*67e74705SXin Lifunction. e.g. various subtypes of clang::Type and various expressions. 5467*67e74705SXin Li 5468*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, 5469*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, 5470*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, 5471*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, 5472*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, 5473*67e74705SXin Li Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5474*67e74705SXin Li</pre></td></tr> 5475*67e74705SXin Li 5476*67e74705SXin Li 5477*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr> 5478*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 5479*67e74705SXin Li 5480*67e74705SXin LiGiven 5481*67e74705SXin Li namespace X { void b(); } 5482*67e74705SXin Li using X::b; 5483*67e74705SXin LiusingDecl(hasAnyUsingShadowDecl(hasName("b")))) 5484*67e74705SXin Li matches using X::b </pre></td></tr> 5485*67e74705SXin Li 5486*67e74705SXin Li 5487*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> InnerMatcher</td></tr> 5488*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 5489*67e74705SXin Limatched by the given matcher. 5490*67e74705SXin Li 5491*67e74705SXin LiGiven 5492*67e74705SXin Li namespace X { int a; void b(); } 5493*67e74705SXin Li using X::a; 5494*67e74705SXin Li using X::b; 5495*67e74705SXin LiusingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 5496*67e74705SXin Li matches using X::b but not using X::a </pre></td></tr> 5497*67e74705SXin Li 5498*67e74705SXin Li 5499*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>></td><td class="name" onclick="toggle('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5500*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value 5501*67e74705SXin Lideclaration's type. 5502*67e74705SXin Li 5503*67e74705SXin LiIn case of a value declaration (for example a variable declaration), 5504*67e74705SXin Lithis resolves one layer of indirection. For example, in the value 5505*67e74705SXin Lideclaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 5506*67e74705SXin LiX, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 5507*67e74705SXin Lideclaration of x. 5508*67e74705SXin Li 5509*67e74705SXin LiExample matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5510*67e74705SXin Li and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5511*67e74705SXin Li class X {}; 5512*67e74705SXin Li void y(X &x) { x; X z; } 5513*67e74705SXin Li 5514*67e74705SXin LiUsable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> 5515*67e74705SXin Li</pre></td></tr> 5516*67e74705SXin Li 5517*67e74705SXin Li 5518*67e74705SXin Li<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>></td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5519*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 5520*67e74705SXin Limatcher. 5521*67e74705SXin Li 5522*67e74705SXin LiExample matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 5523*67e74705SXin Li and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 5524*67e74705SXin Li and U (matcher = typedefDecl(hasType(asString("int"))) 5525*67e74705SXin Li class X {}; 5526*67e74705SXin Li void y(X &x) { x; X z; } 5527*67e74705SXin Li typedef int U; 5528*67e74705SXin Li</pre></td></tr> 5529*67e74705SXin Li 5530*67e74705SXin Li 5531*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5532*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 5533*67e74705SXin Lithat matches the given matcher. 5534*67e74705SXin Li 5535*67e74705SXin LiExample matches x (matcher = varDecl(hasInitializer(callExpr()))) 5536*67e74705SXin Li bool y() { return true; } 5537*67e74705SXin Li bool x = y(); 5538*67e74705SXin Li</pre></td></tr> 5539*67e74705SXin Li 5540*67e74705SXin Li 5541*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5542*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 5543*67e74705SXin Liexpression. 5544*67e74705SXin Li 5545*67e74705SXin LiGiven 5546*67e74705SXin Li void f(int b) { 5547*67e74705SXin Li int a[b]; 5548*67e74705SXin Li } 5549*67e74705SXin LivariableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 5550*67e74705SXin Li varDecl(hasName("b"))))))) 5551*67e74705SXin Li matches "int a[b]" 5552*67e74705SXin Li</pre></td></tr> 5553*67e74705SXin Li 5554*67e74705SXin Li 5555*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 5556*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function 5557*67e74705SXin Lidefinition that has a given body. 5558*67e74705SXin Li 5559*67e74705SXin LiGiven 5560*67e74705SXin Li for (;;) {} 5561*67e74705SXin LihasBody(compoundStmt()) 5562*67e74705SXin Li matches 'for (;;) {}' 5563*67e74705SXin Liwith compoundStmt() 5564*67e74705SXin Li matching '{}' 5565*67e74705SXin Li</pre></td></tr> 5566*67e74705SXin Li 5567*67e74705SXin Li 5568*67e74705SXin Li<tr><td>Matcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5569*67e74705SXin Li<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 5570*67e74705SXin Liswitch statement or conditional operator. 5571*67e74705SXin Li 5572*67e74705SXin LiExample matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5573*67e74705SXin Li if (true) {} 5574*67e74705SXin Li</pre></td></tr> 5575*67e74705SXin Li 5576*67e74705SXin Li 5577*67e74705SXin Li<tr><td>Matcher<internal::BindableMatcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr> 5578*67e74705SXin Li<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 5579*67e74705SXin LiNestedNameSpecifier-matcher matches. 5580*67e74705SXin Li</pre></td></tr> 5581*67e74705SXin Li 5582*67e74705SXin Li 5583*67e74705SXin Li<tr><td>Matcher<internal::BindableMatcher<<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 5584*67e74705SXin Li<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 5585*67e74705SXin LiQualType-matcher matches. 5586*67e74705SXin Li</pre></td></tr> 5587*67e74705SXin Li 5588*67e74705SXin Li<!--END_TRAVERSAL_MATCHERS --> 5589*67e74705SXin Li</table> 5590*67e74705SXin Li 5591*67e74705SXin Li</div> 5592*67e74705SXin Li</body> 5593*67e74705SXin Li</html> 5594*67e74705SXin Li 5595*67e74705SXin Li 5596